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

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

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

簡介

Grafana 是一個跨平臺的度量分析可視化工具,可以通過將采集的數(shù)據(jù)查詢可視化展示,并及時警報

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

特性

可以前往 https://play.grafana.org 體驗 Grafana 特性。

可視化

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

動態(tài)儀表盤

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

探索指標(biāo)

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

探索日志

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

警報

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

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

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

注解

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

臨時過濾器

臨時過濾器允許您即時創(chuà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ù)源地址,因為在同一個命名空間下,所以直接使用 service 名稱訪問。
# 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 為了在開發(fā)環(huá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

訪問

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

image

Dashboard

導(dǎo)入 Dashboard

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

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

點擊 Import

image

輸入Node Exporter for Prometheus Dashboard 的 id,并點擊 Load

image

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

image

查看 Dashboard

image

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

選擇某個圖表,右鍵選擇 Edit

image

可以看到圖表顯示的值,其實是將指標(biāo)通過計算而來的。

image

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

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

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

報警

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

釘釘

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

image

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

image

Graph

目前,只有 Graph 支持報警功能。下面新建一個 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é)點 cpu 總平均使用率。然后,點擊 Alert,創(chuàng)建一個報警。

image
image

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

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

image

小結(jié)

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內(nèi)容