新版告警支持兩個版本的內容模板語法。本文介紹新版內容模板語法。
概述
相對于舊版的內容模板語法,新版通過類似Python語法的方式,提供更加靈活且高級的自定義渲染邏輯,在定制通知內容(例如Markdown轉義)、自定義內容樣式等方面都做了優化,滿足更多樣化的定制內容需求。例如:
根據告警的嚴重度進行動態的內容渲染,不同嚴重度使用不同顏色的文字進行區分。
對告警的查詢結果進行迭代渲染,在郵件中渲染為列表或者表格。
通過函數對某個字段進行BASE64編碼和解碼、對數值進行數學運算等。
新版的內容模板語法完全兼容舊版,并支持新舊版混合使用。但在不同版本的內容模板語法中使用告警屬性時,其類型、取值和展示形式等存在差異,因此建議您不要混合使用新舊版本的內容模板語法。推薦您使用新版本的內容模板語法。
快速開始
通過新版內容模板定義通知內容的示例如下:
告警內容
{ "alert_id": "test-alert", "alert_name": "PV/UV Alert", "project": "project-1", "status": "firing", "severity": 6, "labels": { "app": "nginx", "host": "host-1" }, "results": [ { "project": "project-1", "logstore": "logstore-1", "query": "* | select count(*) as pv" }, { "project": "project-2", "logstore": "logstore-2", "query": "* | select count(distinct user_id) as uv" } ] }
內容模板配置
- Alert ID: {{ alert.alert_id }} - Alert Name: {{ alert.alert_name }} - Project: {{ alert.project }} - Status: {% if alert.status == "firing" %}FIRING{% else %}RESOLVED{% endif %} - Labels: {%- for key, val in alert.labels.items() %} - {{ key }}: {{ val }} {%- endfor %} - Query: {{ alert.results[0].query }}
輸出結果
- Alert ID: test-alert - Alert Name: PV/UV Alert - Project: project-1 - Status: FIRING - Labels: - app: nginx - host: host-1 - Query: * | select count(*) as pv
基本語法
數據類型
內容模板語法類似于Python語法,支持如下數據類型。
數據類型 | 說明 |
數字 | 包含整數和浮點數。例如3、-1。 |
字符串 | 需要使用單引號('')或者雙引號("")包裹。例如"foo"、'bar'。 當字符串中存在特殊字符時,需使用反斜線(\)進行轉義。例如 |
布爾值 | True、False。 |
空值 | None。 |
列表 | 不同編程語言中的叫法不同,可以為列表、數組、Slice等。例如['foo', 'bar']。 |
字典 | 不同編程語言中的叫法不同,可以為字典、對象等。例如{'foo': 'bar'}。 |
分隔符
分隔符 | 使用場景 | 示例 |
| 在變量或表達式中使用。 |
|
| 用于控制語句。 |
|
| 用于注釋,不會出現在通知內容中。 |
|
清除空字符
默認情況下,在分隔符內部,分隔符與表達式之間的空格會被忽略。例如{{ 23 }} < {{ 45 }}
等同于{{23}} < {{45}}
,渲染結果都為23 < 45
。但是分隔符外部的空字符(空格、Tab、換行等)會被保留,例如{{ 23 }} < {{ 45 }}
的渲染結果為23 < 45
,而不是23<45
。
當您需要刪除多余的空字符時,可以使用清除空字符操作。在分隔符開始或結束的地方添加一個短劃線(-),用于清除該分隔符前面和后面所有緊連著的空字符。例如{{ 23 -}} < {{- 45 }}
的渲染結果為23<45
。
{{-
、{{%-
、{#-
用于刪除分隔符左側緊連著的所有空字符。-}}
、-%}
、-%}
用于刪除分隔符右側緊連著的所有空字符。
短劃線(-)和分隔符之間不能有空格。例如
{{- 3 }}
是有效的,渲染結果為3
;{{ - 3 }}
是無效的,渲染結果為-3
。清除空字符操作只對分隔符外部的空格有效,不影響分隔符內部的空格。例如
{{ "hello " }} {{- "world"}}
渲染結果為hello world
。
條件語句
條件判斷支持對參數或者邏輯比較表達式進行判斷。通過條件判斷,可以進行動態渲染。
如果
if
后面傳入的是常量或者普通變量,則對該值進行真值判斷。其中布爾值false
、數字0
、空字符串""
、空值null
、空數組[]
、空對象{}
都會被判定為假,其它值被判定為真。如果
if
后面傳入的是邏輯比較表達式,則按照比較結果進行判斷。例如{{ if alert.severity >= 8 }}
用于判斷告警嚴重度是否大于等于8。
條件判斷支持如下幾種形式:
使用方式 | 示例 |
if |
|
if-else |
|
if-elif |
|
if-elif-else |
|
嵌套使用 |
|
迭代
循環語句用于對數組和對象進行迭代操作。支持如下幾種使用方式:
使用方式 | 示例 |
數組迭代 |
|
數組迭代,包含下標 | 使用enumerate函數對數組進行下標迭代。關于enumerate函數的更多信息,請參見enumerate函數。
下標默認從0開始。您也可以通過enumerate函數中的start參數自定義起始下標。例如:
|
對象迭代 | 通過items()方法將對象轉為
|
嵌套使用 |
|
轉義
如果您希望特殊字符串(例如{{
)不被內容模板解析和渲染,可對特殊字符串進行轉義。例如:根據如下配置表示保留{% raw %}
和{% endraw %}
之間所有的內容。
內容模板配置
{% raw %} {% for result in alert.results %} {{ result }} {% endfor %} {% endraw %}
結果
{% for result in alert.results %} {{ result }} {% endfor %}
函數
內置模板函數便于您對數據進行各種操作,豐富了通知內容的格式和展示樣式。更多信息,請參見內置模板函數。
例如您要通過Webhook方式發送JSON格式的內容,相關信息如下:
告警的查詢語句(包含一個換行)
* | select count(*) as cnt
不同使用方式的對比說明
對比項
內容模板
結果
說明
不使用函數
{ "query": "{{ alert.results[0].query }}" }
{ "query": "* | select count(*) as pv" }
JSON格式不合法
使用quote函數
{ "query": {{ quote(alert.results[0].query) }} }
{ "query": "* | \nselect count(*) as pv" }
JSON格式合法
過濾器
在函數嵌套使用場景中,通知內容的編輯麻煩且不夠直觀,例如{{ block(to_list(alert.labels)) }}
,此時您可以使用過濾器功能。過濾器使用豎線(|) 操作符,并支持鏈式調用,一般格式為{{ xxx | filiter1 | filter2 | ... }}
。例如{{ blockquote(to_list(alert.labels)) }}
等同于{{ alert.labels | to_list | blockquote }}
。
使用過濾器方式時,請先確認目標內置函數是否支持過濾器方式。大部分內置函數都支持過濾器方式的調用。更多信息,請參見內置模板函數。
如果函數中沒有參數,則只能使用函數方式,不支持過濾器方式。
當函數中只有一個參數時,推薦使用過濾器方式,即使用
{{ arg | fn }}
。例如{{ abs(-1) }}
等同于{{ -1 | abs }}
。如果函數中有多個參數,且從第二個參數開始有默認值,也可以使用過濾器。如果有多個參數值需要傳遞,通過過濾器方式并不直觀。不建議對多參數的函數使用過濾器方式。
操作符
內容模板表達式中支持如下操作符。操作符的優先級說明請參見Operator precedence。
類別 | 操作符 | 說明 |
算數 | + | 加法 |
- | 減法 | |
* | 乘法 | |
/ | 除法,返回值是一個浮點數。 | |
// | 除法,返回整數。 | |
% | 取模 | |
比較 | == | 等于 |
!= | 不等于 | |
> | 大于 | |
>= | 大于等于 | |
< | 小于 | |
<= | 小于等于 | |
邏輯 | and | 且操作 |
or | 或操作 | |
not | 取反 | |
其它 | in | 判斷是否包含,返回布爾類型的結果。
|
() | 操作組合,例如:{{ a > b and (a > c or b > c) }} |
使用告警變量
在新版內容模板中,告警變量的使用形式為alert.xxx
,例如alert.project
。更多信息,請參見內容模板變量說明(新版)。
配置示例
示例1:根據告警狀態展示不同內容
觸發告警后,展示告警狀態、告警嚴重度和觸發結果等信息;告警恢復時,只展示告警狀態。
不使用函數
{% if alert.status == "firing" %} - 狀態: <font color="#E03C39">觸發</font> - 嚴重度:{{ alert.severity | format_severity }} - Results: {{ alert.results | to_json }} {% else %} - 狀態: <font color="#72C140">恢復</font> {% endif %}
使用函數
使用format_status函數和format_severity函數簡化配置。
- 狀態: {{ alert.status | format_status }} {% if alert.status == "firing" %} - 嚴重度:{{ alert.severity | format_severity }} - Results: {{ alert.results | to_json }} {% endif %}
結構化數據展示
將告警標簽的內容轉換為列表形式,內容為Markdown格式。
不使用函數
- 項目: {{ alert.project }} - 告警名稱: {{ alert.alert_name }} - 告警標簽: {%- for key, val in alert.labels.items() %} > - {{ key }}: {{ val }} {%- endfor %}
使用函數
使用to_list函數和blockquote函數簡化配置。
- 項目: {{ alert.project }} - 告警名稱: {{ alert.alert_name }} - 告警標簽: {{ alert.labels | to_list | blockquote }}