微服務(wù)監(jiān)控 - Grafana 使用教程

原文:https://makeoptim.com/service-mesh/prometheus-grafana

前面幾篇文章我們使用 Prometheus 采集了各種各樣的監(jiān)控?cái)?shù)據(jù)指標(biāo),并使用 promQL 語(yǔ)句查詢出了一些數(shù)據(jù),在 Prometheus 的 Dashboard 中進(jìn)行了展示,但是明顯可以感覺(jué)到 Prometheus 的圖表功能相對(duì)較弱,所以一般情況下我們會(huì)一個(gè)第三方的工具來(lái)展示這些數(shù)據(jù),也就是本篇文章要介紹的 Grafana。

簡(jiǎn)介

Grafana 是一個(gè)跨平臺(tái)的度量分析可視化工具,可以通過(guò)將采集的數(shù)據(jù)查詢可視化展示,并及時(shí)警報(bào)

Grafana 具有可插拔數(shù)據(jù)源模型,支持許多流行的時(shí)間序列數(shù)據(jù)庫(kù),如 Graphite,Prometheus,Elasticsearch,OpenTSDB 和 InfluxDB。

特性

可以前往 https://play.grafana.org 體驗(yàn) Grafana 特性。

可視化

快速靈活的可視化以及多種選擇,使你可以以任何方式可視化數(shù)據(jù)。官方庫(kù)中具有豐富的儀表盤(pán)插件,比如熱圖、折線圖、圖表等多種展示方式。

動(dòng)態(tài)儀表盤(pán)

使用模板變量創(chuàng)建動(dòng)態(tài)且可重復(fù)使用的儀表板,這些模板變量顯示在儀表板頂部。

探索指標(biāo)

通過(guò)臨時(shí)查詢和動(dòng)態(tài)明細(xì)瀏覽數(shù)據(jù)。拆分視圖并排比較不同的時(shí)間范圍,查詢和數(shù)據(jù)源。

探索日志

快速搜索所有日志或?qū)崟r(shí)流式傳輸(與 Loki 數(shù)據(jù)源配合使用效果最佳)。

警報(bào)

以可視方式定義最重要指標(biāo)的警報(bào)規(guī)則。Grafana 將不斷評(píng)估并向 Slack,PagerDuty,VictorOps 和 OpsGenie 等系統(tǒng)發(fā)送通知。

混合數(shù)據(jù)源

在同一張圖中混合使用不同的數(shù)據(jù)源!你可以為每個(gè)查詢指定數(shù)據(jù)源(適用于自定義數(shù)據(jù)源)。

注解

使用來(lái)自不同數(shù)據(jù)源的豐富事件注釋圖形。將鼠標(biāo)懸停在事件上會(huì)顯示完整的事件元數(shù)據(jù)和標(biāo)簽。

臨時(shí)過(guò)濾器

臨時(shí)過(guò)濾器允許您即時(shí)創(chuàng)建新的鍵/值過(guò)濾器,這些過(guò)濾器會(huì)自動(dòng)應(yīng)用于使用該數(shù)據(jù)源的所有查詢。

安裝

部署文件

# config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: observability
  labels:
    app.kubernetes.io/name: grafana
    app.kubernetes.io/instance: grafana
    app.kubernetes.io/version: "7.0.5"
data:
  grafana.ini: |
    [analytics]
    check_for_updates = true
    [grafana_net]
    url = https://grafana.net
    [log]
    mode = console
    [paths]
    data = /var/lib/grafana/data
    logs = /var/log/grafana
    plugins = /var/lib/grafana/plugins
    provisioning = /etc/grafana/provisioning

  datasources.yaml: |
    apiVersion: 1
    datasources:
    - access: proxy
      editable: true
      isDefault: true
      jsonData:
        timeInterval: 5s
      name: Prometheus
      orgId: 1
      type: prometheus
      url: http://prometheus:9090

注:

  • url: http://prometheus:9090 指定了 Prometheus 數(shù)據(jù)源地址,因?yàn)樵谕粋€(gè)命名空間下,所以直接使用 service 名稱訪問(wèn)。
# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: observability
  labels:
    app.kubernetes.io/name: grafana
    app.kubernetes.io/instance: grafana
    app.kubernetes.io/version: "7.0.5"
spec:
  type: NodePort
  ports:
    - name: service
      port: 3000
      protocol: TCP
  selector:
    app.kubernetes.io/name: grafana
    app.kubernetes.io/instance: grafana

注:

  • type: NodePort 為了在開(kāi)發(fā)環(huán)境中方便訪問(wèn),這里使用 NodePort 暴露服務(wù)。
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
  namespace: observability
  labels:
    app.kubernetes.io/name: grafana
    app.kubernetes.io/instance: grafana
    app.kubernetes.io/version: "7.0.5"
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: grafana
      app.kubernetes.io/instance: grafana
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app.kubernetes.io/name: grafana
        app.kubernetes.io/instance: grafana
        app: grafana
    spec:
      securityContext:
        fsGroup: 472
        runAsGroup: 472
        runAsUser: 472
      containers:
        - name: grafana
          image: "grafana/grafana:7.0.5"
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: config
              mountPath: "/etc/grafana/grafana.ini"
              subPath: grafana.ini
            - name: storage
              mountPath: "/var/lib/grafana"
            - name: config
              mountPath: "/etc/grafana/provisioning/datasources/datasources.yaml"
              subPath: datasources.yaml
          ports:
            - name: service
              containerPort: 3000
              protocol: TCP
            - name: grafana
              containerPort: 3000
              protocol: TCP
          env:
            - name: "GF_SECURITY_ADMIN_PASSWORD"
              value: "admin123"
            - name: "GF_SECURITY_ADMIN_USER"
              value: "admin"
          livenessProbe:
            failureThreshold: 10
            httpGet:
              path: /api/health
              port: 3000
            initialDelaySeconds: 60
            timeoutSeconds: 30
          readinessProbe:
            httpGet:
              path: /api/health
              port: 3000
          resources: {}
      volumes:
        - name: config
          configMap:
            name: grafana
        - name: storage
          emptyDir: {}

注:

  • GF_SECURITY_ADMIN_USER 用戶名
  • GF_SECURITY_ADMIN_PASSWORD 密碼

部署

$ kubectl apply -f config.yaml
configmap/grafana created
$ kubectl apply -f deployment.yaml
deployment.apps/grafana created
$ kubectl apply -f service.yaml
service/grafana created

檢查

$ kubectl get deployment -n observability
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
grafana      1/1     1            1           4m6s
httpbin      1/1     1            1           2d5h
prometheus   1/1     1            1           6d4h
redis        1/1     1            1           2d6h
$ kubectl get service -n observability
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
grafana         NodePort    10.96.124.67     <none>        3000:31273/TCP      4m10s
httpbin         ClusterIP   10.111.188.30    <none>        8000/TCP            2d5h
node-exporter   NodePort    10.111.82.119    <none>        9100:31672/TCP      3d5h
prometheus      NodePort    10.98.133.13     <none>        9090:31033/TCP      6d4h
redis           ClusterIP   10.104.118.216   <none>        6379/TCP,9121/TCP   2d6h

訪問(wèn)

根據(jù)服務(wù)端口訪問(wèn) Grafana http://localhost:31273,并使用設(shè)置的用戶名和密碼登錄。

image

Dashboard

導(dǎo)入 Dashboard

為了觀察指標(biāo),我們可以根據(jù)自己的需求手動(dòng)新建一個(gè) Dashboard。除此之外,grafana 官網(wǎng)上還有很多公共的 Dashboard 可以選用。

由于在監(jiān)控 Kubernetes 集群中我們講解過(guò)使用 node_exporter 采集服務(wù)器節(jié)點(diǎn)的運(yùn)行指標(biāo),所以下面以 Node Exporter for Prometheus Dashboard 為例講解如何導(dǎo)入公共的 Dashboard。

點(diǎn)擊 Import

image

輸入Node Exporter for Prometheus Dashboard 的 id,并點(diǎn)擊 Load

image

選擇數(shù)據(jù)源并點(diǎn)擊 Import 導(dǎo)入

image

查看 Dashboard

image

指標(biāo)可視化流程

選擇某個(gè)圖表,右鍵選擇 Edit

image

可以看到圖表顯示的值,其實(shí)是將指標(biāo)通過(guò)計(jì)算而來(lái)的。

image

如上圖,總 CPU 使用率是通過(guò) 100 - (avg(irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[5m])) * 100) 計(jì)算得出的結(jié)果。而 node_cpu_seconds_total 便是使用 node_exporter 采集到的服務(wù)器節(jié)點(diǎn)指標(biāo)中的一個(gè)。

所以,指標(biāo)可視化流程是,先配置 Prometheus 采集想要的指標(biāo),然后使用 promQL 語(yǔ)句查詢出想要的數(shù)據(jù),最后通過(guò) Grafana 可視化。

如果grafana 官網(wǎng)的 Dashboard 不能滿足要求,也可以新建一個(gè)自定義 Dashboard,具體的 promQL 語(yǔ)句參考導(dǎo)入的 Dashboard 即可,這里不再贅述。

報(bào)警

報(bào)警是監(jiān)控系統(tǒng)中必不可少的環(huán)節(jié),grafana 支持很多種形式的報(bào)警功能,比如 email、釘釘、slack、webhook 等等,下面我們以釘釘為例。

釘釘

設(shè)置報(bào)警前,需要設(shè)置下釘釘通知參數(shù)。

image

注:這里需要注意的是,Grafana 的釘釘通知沒(méi)有新版機(jī)器人的加簽設(shè)置,所以推薦使用自定義關(guān)鍵詞(由于這里做報(bào)警的,每個(gè)通知消息都會(huì)包含 alert, 所以關(guān)鍵字可設(shè)置為 alert)。

image

Graph

目前,只有 Graph 支持報(bào)警功能。下面新建一個(gè) Dashbaord,在里面創(chuàng)建 Graph。

image

如上圖,設(shè)置的指標(biāo)值為 (1 - avg(irate(node_cpu_seconds_total{job=~"kubernetes-node-exporter",mode="idle"}[5m])) by (instance)) * 100 表示節(jié)點(diǎn) cpu 總平均使用率。然后,點(diǎn)擊 Alert,創(chuàng)建一個(gè)報(bào)警。

image
image

如上圖,為了便于觸發(fā)通知,這里設(shè)置了當(dāng) cpu 總平均使用率高于 10% 的時(shí)候通知到釘釘群。

完成配置后,等到 Rule 周期到的時(shí)候(上面設(shè)置了 5 分鐘),就能在釘釘群中收到報(bào)警。

image

小結(jié)

本篇為大家介紹了如何使用 Grafana 可視化 Prometheus 收集到的指標(biāo),并設(shè)置報(bào)警。

注:本章內(nèi)容涉及的 yaml 文件可前往 https://github.com/MakeOptim/service-mesh/prometheus 獲取。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容