模板示例
Prometheus 支援在告警的註解(annotations)和標籤(labels)以及提供的控制檯頁面中使用模板。模板能夠針對本地資料庫執行查詢、迭代資料、使用條件判斷、格式化資料等。Prometheus 模板語言基於 Go 模板 系統。
簡單的告警欄位模板
alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: page
annotations:
summary: "Instance {{$labels.instance}} down"
description: "{{$labels.instance}} of job {{$labels.job}} has been down for more than 5 minutes."
告警欄位模板將在每次規則迭代期間針對每個觸發的告警執行,因此請保持查詢和模板輕量。如果您對告警需要更復雜的模板,建議連結到控制檯。
簡單迭代
這會顯示例項列表及其是否正常執行
{{ range query "up" }}
{{ .Labels.instance }} {{ .Value }}
{{ end }}
特殊的 . 變數包含每次迴圈迭代的當前樣本值。
顯示單個值
{{ with query "some_metric{instance='someinstance'}" }}
{{ . | first | value | humanize }}
{{ end }}
Go 和 Go 的模板語言都是強型別的,因此必須檢查是否返回了樣本以避免執行錯誤。例如,如果抓取或規則評估尚未執行,或者主機已宕機,就可能會發生這種情況。
內建的 prom_query_drilldown 模板可以處理此問題,允許對結果進行格式化,並連結到表示式瀏覽器。
使用控制檯 URL 引數
{{ with printf "node_memory_MemTotal{job='node',instance='%s'}" .Params.instance | query }}
{{ . | first | value | humanize1024 }}B
{{ end }}
如果以 console.html?instance=hostname 方式訪問,.Params.instance 的求值結果將為 hostname。
高階迭代
<table>
{{ range printf "node_network_receive_bytes{job='node',instance='%s',device!='lo'}" .Params.instance | query | sortByLabel "device"}}
<tr><th colspan=2>{{ .Labels.device }}</th></tr>
<tr>
<td>Received</td>
<td>{{ with printf "rate(node_network_receive_bytes{job='node',instance='%s',device='%s'}[5m])" .Labels.instance .Labels.device | query }}{{ . | first | value | humanize }}B/s{{end}}</td>
</tr>
<tr>
<td>Transmitted</td>
<td>{{ with printf "rate(node_network_transmit_bytes{job='node',instance='%s',device='%s'}[5m])" .Labels.instance .Labels.device | query }}{{ . | first | value | humanize }}B/s{{end}}</td>
</tr>{{ end }}
</table>
在這裡,我們迭代所有網路裝置並顯示每個裝置的網路流量。
由於 range 操作沒有指定變數,因此在迴圈內部無法使用 .Params.instance,因為此時 . 已成為迴圈變數。
定義可重用的模板
Prometheus 支援定義可重用的模板。當與控制檯庫支援結合使用時,這尤其強大,允許在控制檯之間共享模板。
{{/* Define the template */}}
{{define "myTemplate"}}
do something
{{end}}
{{/* Use the template */}}
{{template "myTemplate"}}
模板僅限一個引數。args 函式可用於包裝多個引數。
{{define "myMultiArgTemplate"}}
First argument: {{.arg0}}
Second argument: {{.arg1}}
{{end}}
{{template "myMultiArgTemplate" (args 1 2)}}