Grafana 系列-統一展示-3-Prometheus 儀表板

東風微鳴發表於2023-05-08

系列文章

知識儲備

Prometheus Template Variables

你可以使用變數來代替硬編碼的細節,如 server、app 和 pod_name 在 metric 查詢中。Grafana 在儀表盤頂部的下拉選擇框中列出這些變數,幫助你改變儀表盤中顯示的資料。Grafana 將這類變數稱為模板變數。

Query Variables

使用 Query 型別的變數來查詢 Prometheus 的指標 (metrics)、標籤 (labels) 或標籤值 (label values) 的列表。

選擇一個 Prometheus 資料來源查詢型別並輸入所需的輸入:

Variable Syntax

Prometheus 資料來源支援在 Query 欄位中使用兩種變數語法:

  • $<varname>, 如:rate(http_requests_total{job=~"$job"}[$_rate_interval]), 它更容易讀和寫,但不允許你在詞的中間使用變數。一般使用這種變數就夠用了。
  • [[varname]], 如:rate(http_requests_total{job=~"[[job]]"}[$_rate_interval])

如果你啟用了 Multi-valueInclude all 選項,Grafana 會將標籤從純文字轉換為與 regex 相容的字串,這需要你使用=~而不是=。所以推薦在 Grafana 中使用 PromQL 組合 Grafana 變數時,首選 =~.

Annotations

註釋 (Annotations) 在圖表上面疊加豐富的事件資訊。你可以在 Dashboard 選單的 Annotations 檢視中新增註釋查詢。

Prometheus 支援兩種方式來查詢註釋。

  • 一個常規的 metric 查詢
  • 一個 Prometheus 的 pending 和 firing 的告警(詳見 在執行期間檢查警報), 示例為:ALERTS{alertname="<alert name>", alertstate="<pending or firing>", <additional alert labels>}

Step 選項對於限制從你的查詢中返回的事件數量很有用。

Ad Hoc Filters Variable

Prometheus 支援特殊的 ad hoc filters 變數型別,你可以用它來臨時指定任何數量的 標籤/值 過濾器。這些過濾器會自動應用於你所有的 Prometheus 查詢。

實戰

我們直接從 Grafana Dashboards 中選擇一個 Dashboard - JVM(Micrometer) (ID: 4701) 來進行說明演示。

?Notes:

這就是選擇使用 Grafana 的一個巨大好處,它擁有豐富的生態。
我們一般不需要從零開始構建儀表板,可以站在巨人的肩上,再進行部分調整。

最終效果如下:

JVM(Micrometer) (ID: 4701)

細節最佳化

這裡有一些小的儀表板最佳化細節和大家分享:

  • 對於變數,謹慎啟用:Multi-valueInclude all 選項。避免查詢資料量過大。
  • 對於展示 Panel 數量特別多的單一 Dashboard, 可以根據 Panel 的型別新增 Row, 並將部分 Row 收起。實現 Lazy Load, 減少查詢資料量,最佳化使用者體驗。
  • 對於右上角時間範圍,建議在合理範圍內儘可能小;同時如果查詢資料量特別大,建議禁用 auto refresh

配置 JVM Restart Annotation

在這個 Dashboard 裡,可以配置關於 JVM Restart 的 Annotation, 具體配置示例如下:

JVM  Restart Annotation Config

  • Name: Restart Detection
  • Data source: Prometheus
  • Enabled: ✔️
  • Color: Red
  • Query
    • Expr: resets(process_uptime_seconds{app="$app", pod_name="$pod_name"}[1m]) > 0, 這裡是基於 process_uptime_seconds 來實現。
    • Step: 1m
  • Field formats, 這裡 title 和 text 欄位,可以使用變數,如:{{instance}}
    • Title: Restart
    • Tags: restart-tag
    • Text: uptime reset

最終效果如下(這裡一直沒有復現 JVM Restart), 用 Grafana Play 的 Demo 演示:

Annotation Example

變數

Label Value

具體配置如下,如需要根據 app 的值進行選擇,則配置如下:

變數 app

Name: app
Type: Query
Query: label_values(app)

如果要新增另一個變數 pod_name, 需要基於 app 的結果進行過濾,則配置如下:

Name: pod_name
Query: label_values(jvm_memory_used_bytes{app="$app"}, pod_name)

如果需要對變數根據自己的實際情況進行調整,如,需要將 pod_name 變數改為 instance 變數。
Instance 變數如下:

Name: instance
Query: label_values(jvm_memory_used_bytes{app="$app"}, instance)

則可以進入該 Dashboard 的 Settings -> JSON Model, 中,對pod_name pod_name=\"$pod_name\" 等批次替換為 instance instance=\"$instance\"

Interval

也可以設定時間間隔 (Interval) 作為變數。具體如下:

  • Name: interval
  • Type: Interval
  • Values: 不同的時間間隔用,, 如:5s,10s,30s,1m,10m,30m,1h,6h,12h,1d,7d,14d,30d

然後 Dashboard 下的 Query 可以透過 $__interval$__interval_ms 來使用。

EOF

三人行, 必有我師; 知識共享, 天下為公. 本文由東風微鳴技術部落格 EWhisper.cn 編寫.

相關文章