概述
在配置告警通知的時候,通常我們需要知道告警的觸發詳情。例如Nginx通路錯誤告警,我們需要知道錯誤的HTTP Status 分布,錯誤的機器IP等資訊,并且需要将這些資訊展現在通知中,以便在接收到告警通知後,能夠一目了然地知道發生了什麼事情。

那麼在建立告警規則的時候,我們就需要進行合理的配置,使得告警在觸發後,可以将這些資訊放在合适的位置發送給通知服務,進而在通知模闆裡可以被引用到,進而被正确地通知。
基本屬性介紹
在告警規則觸發告警後,我們可以通過如下一些屬性擷取到告警的原始日志資訊,它們分别是:
- labels
- annotations
- results
- fire_results
它們的基本格式以及如何在模闆中引用可以參考
内容模闆變量說明(新版)。下面來分别進行介紹。
自定義标簽
在配置告警規則的時候,我們可以手動添加标簽,例如:
那麼在告警觸發後,告警消息裡就會包含如下資訊:
{
"labels": {
"app": "nginx",
"env": "prod"
}
}
是以在内容模闆裡,就可以通過如下方式引用标簽字段,例如:
應用: {{ alert.labels.app }}
環境: {{ alert.labels.env }}
分組評估
如果設定了分組評估,那麼分組評估的字段會預設添加到标簽中。關于分組評估的介紹,可以參考文檔
。例如下面的配置,根據 status 字段做分組評估,那麼當有錯誤時,不同的錯誤碼是不同的告警,例如 400 的錯誤會是一個告警,404 的錯誤會是另外一個告警,等等。
此時除了自定義的 app 和 env 标簽,還會有一個系統加上去的 stauts 标簽。例如 404 的錯誤觸發的告警會包含如下資訊:
{
"labels": {
"app": "nginx",
"env": "prod",
"status": "404"
}
}
應用: {{ alert.labels.app }}
環境: {{ alert.labels.env }}
錯誤碼: {{ alert.labels.status }}
特别注意:
在設定分組評估的時候,需要特别注意,應當使用可枚舉的字段。例如 http_status,slb_id 等。而對于不可枚舉的随機字段,則不應該作為分組字段,例如 request_time,uuid 等。
自定義标注
在配置告警規則的時候,我們可以添加标注。與标簽相比,标注更加靈活。标注不僅可以配置為固定的文本,還可以引用日志的字段,例如下面配置:
這裡需要注意,預設有兩個标注:
- 标題,即 title 屬性
- 描述,即 desc 屬性
{
"annotations": {
"title": "Nginx通路錯誤告警觸發",
"desc": "狀态碼400錯誤發生了15次"
}
}
是以在内容模闆裡,就可以通過如下方式引用标注字段,例如:
告警标題: {{ alert.annotations.title }}
告警描述: {{ alert.annotations.desc }}
自動添加标注
除了自定義标注,還可以使用自動添加标注功能,例如:
它本質上相當于:
fire_results 表示的是滿足條件的告警記錄。例如告警查詢語句的結果如下:
當告警規則中觸發條件配置為
cnt > 0
的時候:
觸發的告警會有如下屬性:
{
"fire_results": [
{ "status": "401", "ip": "127.0.0.1", "cnt": "3" },
{ "status": "400", "ip": "127.0.0.1", "cnt": "7" },
{ "status": "501", "ip": "127.0.0.1", "cnt": "4" },
{ "status": "404", "ip": "127.0.0.1", "cnt": "4" },
{ "status": "402", "ip": "127.0.0.1", "cnt": "6" },
{ "status": "403", "ip": "127.0.0.1", "cnt": "8" }
]
}
cnt > 5
時:
觸發的告警的 fire_results 如下:
{
"fire_results": [
{ "status": "400", "ip": "127.0.0.1", "cnt": "7" },
{ "status": "402", "ip": "127.0.0.1", "cnt": "6" },
{ "status": "403", "ip": "127.0.0.1", "cnt": "8" }
]
}
然後就可以在模闆變量中引用 fire_results 字段,例如:
告警觸發詳情: {{ alert.fire_results | to_json }}
results 是告警查詢最原始的資料,例如上面的例子,告警觸發後 results 資訊如下:
{
"results": [{
"store_type": "log",
"region": "cn-hangzhou",
"project": "test-alert",
"store": "nginx-access-log",
"query": "status >= 400 | select status, __source__ as ip, count(*) as cnt group by status, ip",
"start_time": 1640006894,
"end_time": 1640007014,
"dashboard_id": "",
"raw_results": [
{ "status": "401", "ip": "127.0.0.1", "cnt": "3" },
{ "status": "400", "ip": "127.0.0.1", "cnt": "7" },
{ "status": "501", "ip": "127.0.0.1", "cnt": "4" },
{ "status": "404", "ip": "127.0.0.1", "cnt": "4" },
{ "status": "402", "ip": "127.0.0.1", "cnt": "6" },
{ "status": "403", "ip": "127.0.0.1", "cnt": "8" }
],
"raw_result_count": 6,
"fire_result": {
"status": "401",
"ip": "127.0.0.1",
"cnt": "3"
},
"has_sql": true,
"truncated": false,
"role_arn": ""
}]
}
之後也可以通過如下方式來引用原始日志:
告警查詢詳情: {{ alert.results[0].raw_results | to_json }}
注意:
- 如果一個告警規則有多個查詢語句,那麼 results 數組就會有多項,每一項對應一個查詢語句。
- results 表示的是查詢語句的原始查詢資料,fire_results 表示的是滿足告警觸發條件的資料,這兩者可能會有所差别的。例如觸發條件是滿足 cnt > 5,那麼 results[0].raw_results 結果可能是 6條,但是 fire_results 結果可能是 3條,因為隻有3條記錄滿足 cnt > 5
模闆變量引用
循環展示觸發日志
上文中
{{ alert.fire_results | to_json }}
會将 fire_results 以 JSON 字元串的形式來進行展示。有時候為了展示更友好,我們會希望通過循環的方式,一行行展示觸發日志,此時可以通過循環來實作,例如:
{%- for result in alert.fire_results %}
- status: {{ alert.status }}, count: {{ alert.cnt }}
{%- endfor %}
更多相關資訊,可以參考
内容模闆文法(新版)。
通過模闆函數進行資料處理
如果需要對告警的字段進行一些格式化或者處理後再展示,可以通過内置函數來實作。具體可以參考: