模板示例

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)}}

本頁內容