系列文章
知識儲備
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-value 或 Include 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 的一個巨大好處,它擁有豐富的生態。
我們一般不需要從零開始構建儀表板,可以站在巨人的肩上,再進行部分調整。
最終效果如下:
細節最佳化
這裡有一些小的儀表板最佳化細節和大家分享:
- 對於變數,謹慎啟用:Multi-value 或 Include all 選項。避免查詢資料量過大。
- 對於展示 Panel 數量特別多的單一 Dashboard, 可以根據 Panel 的型別新增 Row, 並將部分 Row 收起。實現 Lazy Load, 減少查詢資料量,最佳化使用者體驗。
- 對於右上角時間範圍,建議在合理範圍內儘可能小;同時如果查詢資料量特別大,建議禁用 auto refresh
配置 JVM Restart Annotation
在這個 Dashboard 裡,可以配置關於 JVM Restart 的 Annotation, 具體配置示例如下:
- 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
- Expr:
- Field formats, 這裡 title 和 text 欄位,可以使用變數,如:
{{instance}}
- Title: Restart
- Tags: restart-tag
- Text: uptime reset
最終效果如下(這裡一直沒有復現 JVM Restart), 用 Grafana Play 的 Demo 演示:
變數
Label Value
具體配置如下,如需要根據 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 編寫.