本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
範本化標籤和註釋
本文件主題是針對支援 Grafana 10.x 版的 Grafana 工作區所設計。
如需支援 Grafana 9.x 版的 Grafana 工作區,請參閱。在 Grafana 第 9 版中工作
如需支援 Grafana 8.x 版的 Grafana 工作區,請參閱。在 Grafana 第 8 版中工作
您可以使用樣板在標示和註解中包括查詢和表示式中的資料。例如,您可能想要根據查詢的值來設定警示的嚴重性標籤,或在摘要註釋中使用查詢中的執行個體標籤,以便知道哪個伺服器的 CPU 使用率很高。
所有模板都應該用文本/
每當評估警示規則時,系統都會評估每個範本,並分別評估每個警示。例如,如果您的警示規則具有範本化摘要註釋,且警示規則有 10 個觸發警示,則範本會針對每個警示執行一次 10 次。您應該盡量避免在模板中進行昂貴的計算。
範例
下面的示例不是在文本/模板上編寫完整的教程,而是試圖展示我們看到的模板最常見的用例。您可以逐字使用這些範例,或根據您的使用案例進行調整。有關如何編寫文本/模板的更多信息,請參閱文本/模板文
打印所有標籤,逗號分隔
要打印所有標籤,逗號分隔,打印$labels
變量:
{{ $labels }}
例如,給定帶有標籤的警報alertname=High CPU
usage
,grafana_folder=CPU alerts
並且instance=server1
,這將打印:
alertname=High CPU usage, grafana_folder=CPU alerts, instance=server1
注意
如果您使用的是傳統條件,則不$labels
會包含查詢中的任何標籤。如需詳細資訊,請參閱 $ 標籤變數。
列印所有標籤,每行一個
要打印所有標籤,每行一個,請使用 a range
遍歷每個鍵/值對並單獨打印它們。這裡$k
指的是名稱和$v
指的是當前標籤的值:
{{ range $k, $v := $labels -}} {{ $k }}={{ $v }} {{ end }}
例如,給定帶有標籤的警報alertname=High CPU
usage
,grafana_folder=CPU alerts
並且instance=server1
,這將打印:
alertname=High CPU usage grafana_folder=CPU alerts instance=server1
注意
如果您使用的是傳統條件,則不$labels
會包含查詢中的任何標籤。如需詳細資訊,請參閱 $ 標籤變數。
列印個別標籤
若要列印個別標籤,請使用具有$labels
變數的index
函數:
The host {{ index $labels "instance" }} has exceeded 80% CPU usage for the last 5 minutes
例如,給定帶有標籤的警報instance=server1
,這將打印:
The host server1 has exceeded 80% CPU usage for the last 5 minutes
注意
如果您使用的是傳統條件,則不$labels
會包含查詢中的任何標籤。如需詳細資訊,請參閱 $ 標籤變數。
打印查詢的值
要打印即時查詢的值,您可以使用index
函$values
數和變量打印其 Ref ID:
{{ index $values "A" }}
例如,給定一個返回值 81.2345 的即時查詢,這將打印:
81.2345
若要列印範圍查詢的值,您必須先將其從時間序列縮減為具有 reduce 運算式的即時向量。然後,您可以改用 Reef ID 來列印 reduce 運算式的結果。例如,如果 reduce 運算式取得 A 的平均值,且具有參考 ID B,您可以寫入:
{{ index $values "B" }}
打印查詢的人性化價值
要打印即時查詢的人性化值,請使用以下humanize
函數:
{{ humanize (index $values "A").Value }}
例如,給定一個返回值 81.2345 的即時查詢,這將打印:
81.234
若要列印範圍查詢的人性化值,您必須先將其從時間序列縮減為具有 reduce 運算式的即時向量。然後,您可以改用 Reef ID 來列印 reduce 運算式的結果。例如,如果 reduce 運算式取得 A 的平均值,且具有參考 ID B,您可以寫入:
{{ humanize (index $values "B").Value }}
以百分比列印查詢的值
要以百分比打印即時查詢的值,請使用以下humanizePercentage
函數:
{{ humanizePercentage (index $values "A").Value }}
該函數期望該值是 0 和 1 之間的十進制數字。如果該值是介於 0 到 100 之間的十進位數字,您可以在查詢中或使用數學運算式將其除以 100。如果查詢是範圍查詢,您必須先將其從時間序列縮減為具有 reduce 運算式的即時向量。
根據查詢的值設定嚴重性
若要從查詢的值設定嚴重性標籤,請使用 if 陳述式和大於比較函數。確保在進行比較時使用小數(80.0
50.0
0.0
,等),$values
因為文本/模板不支持類型強制。您可以在
{{ if (gt $values.A.Value 80.0) -}} high {{ else if (gt $values.A.Value 50.0) -}} medium {{ else -}} low {{- end }}
從經典條件打印所有標籤
如果您使$labels
用傳統條件,則無法使用從查詢列印標籤,$values
而且必須改為使用。原因是傳統條件會捨棄這些標籤以強制執行一維行為 (每個警示規則最多一個警示)。如果傳統條件沒有捨棄這些標籤,則傳回許多時間序列的查詢會導致警示在觸發和不斷解決之間切換,因為每次評估警示規則時,標籤都會變更。
相反地,$values
變數會針對所有觸發的條件,包含所有時間序列的減少值。例如,如果您的警示規則包含傳回兩個時間序列的查詢 A,而傳回兩個條件的傳統條件 B,則$values
會包含B0
B1
、B2
和B3
。如果經典條件 B 只有一個條件,那麼$values
將包含只是B0
和B1
。
要打印所有觸發時間序列的所有標籤,請使用以下模板(如果不同,請確保B
在正則表達式中用經典條件的 Ref ID 替換):
{{ range $k, $v := $values -}} {{ if (match "B[0-9]+" $k) -}} {{ $k }}: {{ $v.Labels }}{{ end }} {{ end }}
例如,超過單一條件的兩個時間序列的傳統條件將會列印:
B0: instance=server1 B1: instance=server2
如果傳統條件具有兩個或多個條件,且時間序列同時超過多個條件,則會針對每個超出的條件複製其標籤:
B0: instance=server1 B1: instance=server2 B2: instance=server1 B3: instance=server2
如果您需要列印唯一的標籤,您應該考慮改為將警示規則從單維變更為多維度。您可以通過使用 reduce 和數學表達式替換經典條件來做到這一點。
從經典條件打印所有值
要打印經典條件中的所有值,請參考前面的示例並$v.Labels
替換為$v.Value
:
{{ range $k, $v := $values -}} {{ if (match "B[0-9]+" $k) -}} {{ $k }}: {{ $v.Value }}{{ end }} {{ end }}
例如,超過單一條件的兩個時間序列的傳統條件將會列印:
B0: 81.2345 B1: 84.5678
如果傳統條件有兩個或更多個條件,且時間序列同時超過多個條件,則$values
會包含所有條件的值:
B0: 81.2345 B1: 92.3456 B2: 84.5678 B3: 95.6789
Variables
對標籤和註釋進行範本化時,您可以使用下列變數:
標籤變量
該$labels
變量包含查詢中的所有標籤。例如,假設您有一個查詢傳回所有伺服器的 CPU 使用率,而且您的警示規則會在過去 5 分鐘內任何伺服器超過 80% 的 CPU 使用率時觸發。您想要將摘要註釋新增至警示,告訴您哪個伺服器的 CPU 使用率過高。使用$labels
變量,您可以編寫一個模板來打印一個人類可讀的句子,例如:
CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes
注意
如果您使用的是傳統條件,則不$labels
會包含查詢中的任何標籤。傳統條件會捨棄這些標籤,以便強制執行一維行為 (每個警示規則最多一個警示)。如果要在模板中使用查詢中的標籤,請按照以前的操作打印經典條件示例中的所有標籤。
值變量
$value
變數是包含所有即時查詢的標籤和值的字串;臨界值、reduce 和數學運算式,以及警示規則中的傳統條件。它不包含範圍查詢的結果,因為這些查詢可以返回從 10 到 10,000 行或指標的任何位置。如果是這樣,對於特別大的查詢,單個警報可以使用 10 MB 的內存,並且 Grafana 很快就會耗盡內存。
要在摘要中打印$value
變量,您可以寫這樣的內容:
CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes: {{ $value }}
它看起來像這樣:
CPU usage for instance1 has exceeded 80% for the last 5 minutes: [ var='A' labels={instance=instance1} value=81.234 ]
這裡var='A'
指的是 Ref ID A 的即時查詢,labels={instance=instance1}
指的是標籤,並value=81.234
指的是過去 5 分鐘的平均 CPU 使用率。
如果你只想打印一些字符串而不是完整的字符串,然後使用$values
變量。它包含與結構化表相同的信息$value
,但在結構化表中,並且編寫正則表達式以匹配所需的文本要容易得多。
值變量
$values
變數是一個資料表,其中包含所有即時查詢和運算式的標籤和浮點值,並以其 Ref ID 編製索引。
若要使用 Ref ID A 列印即時查詢的值,請執行下列動作:
CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes: {{ index $values "A" }}
例如,給定帶有標籤的警報以instance=server1
及帶有該值的即時查詢81.2345
,這將打印:
CPU usage for instance1 has exceeded 80% for the last 5 minutes: 81.2345
如果 Ref ID A 中的查詢是範圍查詢而不是即時查詢,請使用 Ref ID B 添加一個 reduce 表達式並(index $values
"A")
替換為(index $values
"B")
:
CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes: {{ index $values "B" }}
函數
對標籤和註釋進行範本化時,您可以使用以下功能:
參數
該args
函數將對象列表轉換為帶有鍵 arg0,arg1 等的地圖。這是為了允許將多個參數傳遞給模板。
{{define "x"}}{{.arg0}} {{.arg1}}{{end}}{{template "x" (args 1 "2")}}
1 2
外部網址
該externalURL
函數返回 Grafana 服務器的外部 URL。
{{ externalURL }}
https://example.com/grafana
圖形連結
此graphLink
函數會探索在 Grafana 第 10 版針對指定的運算式和資料來源,傳回中圖形檢視的路徑。
{{ graphLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}
/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":false,"range":true}]
人性化
該humanize
函數使十進制數字人性化。
{{ humanize 1000.0 }}
1k
人文化
其humanize1024
作品類似於,humanize
但使用 1024 作為基礎,而不是 1000。
{{ humanize1024 1024.0 }}
1ki
人性化
該humanizeDuration
功能在幾秒鐘內使持續時間變得人性化。
{{ humanizeDuration 60.0 }}
1m 0s
人性百分比
該humanizePercentage
功能使比率值與百分比進行人性化。
{{ humanizePercentage 0.2 }}
20%
人性化時間戳
該humanizeTimestamp
函數人性化了 Unix 時間戳。
{{ humanizeTimestamp 1577836800.0 }}
2020-01-01 00:00:00 +0000 UTC
比賽
該match
函數與正則表達式模式匹配文本。
{{ match "a.*" "abc" }}
true
路徑前綴
該pathPrefix
函數返回 Grafana 服務器的路徑。
{{ pathPrefix }}
/grafana
。表格鏈接
此tableLink
函數會探索在 Grafana 第 10 版針對指定的運算式和資料來源,傳回中表格檢視的路徑。
{{ tableLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}
/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":true,"range":false}]
標題
該title
函數大寫每個單詞的第一個字符。
{{ title "hello, world!" }}
Hello, World!
toLower
該toLower
函數返回小寫的所有文本。
{{ toLower "Hello, world!" }}
hello, world!
toUpper
該toUpper
函數返回大寫的所有文本。
{{ toUpper "Hello, world!" }}
HELLO, WORLD!
reReplaceAll
reReplaceAll
函數會取代符合規則運算式的文字。
{{ reReplaceAll "localhost:(.*)" "example.com:$1" "localhost:8080" }}
example.com:8080