天天看點

SLS告警最佳實踐——在通知中引用日志内容

概述

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

SLS告警最佳實踐——在通知中引用日志内容

那麼在建立告警規則的時候,我們就需要進行合理的配置,使得告警在觸發後,可以将這些資訊放在合适的位置發送給通知服務,進而在通知模闆裡可以被引用到,進而被正确地通知。

基本屬性介紹

在告警規則觸發告警後,我們可以通過如下一些屬性擷取到告警的原始日志資訊,它們分别是:

  • labels
  • annotations
  • results
  • fire_results

它們的基本格式以及如何在模闆中引用可以參考

内容模闆變量說明(新版)

。下面來分别進行介紹。

自定義标簽

在配置告警規則的時候,我們可以手動添加标簽,例如:

SLS告警最佳實踐——在通知中引用日志内容

那麼在告警觸發後,告警消息裡就會包含如下資訊:

{
    "labels": {
        "app": "nginx",
        "env": "prod"
    }
}      

是以在内容模闆裡,就可以通過如下方式引用标簽字段,例如:

應用: {{ alert.labels.app }}
環境: {{ alert.labels.env }}      

分組評估

如果設定了分組評估,那麼分組評估的字段會預設添加到标簽中。關于分組評估的介紹,可以參考文檔

。例如下面的配置,根據 status 字段做分組評估,那麼當有錯誤時,不同的錯誤碼是不同的告警,例如 400 的錯誤會是一個告警,404 的錯誤會是另外一個告警,等等。

SLS告警最佳實踐——在通知中引用日志内容

此時除了自定義的 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 等。

自定義标注

在配置告警規則的時候,我們可以添加标注。與标簽相比,标注更加靈活。标注不僅可以配置為固定的文本,還可以引用日志的字段,例如下面配置:

SLS告警最佳實踐——在通知中引用日志内容

這裡需要注意,預設有兩個标注:

  • 标題,即 title 屬性
  • 描述,即 desc 屬性
{
    "annotations": {
        "title": "Nginx通路錯誤告警觸發",
        "desc": "狀态碼400錯誤發生了15次"
    }
}      

是以在内容模闆裡,就可以通過如下方式引用标注字段,例如:

告警标題: {{ alert.annotations.title }}
告警描述: {{ alert.annotations.desc }}      

自動添加标注

除了自定義标注,還可以使用自動添加标注功能,例如:

SLS告警最佳實踐——在通知中引用日志内容

它本質上相當于:

SLS告警最佳實踐——在通知中引用日志内容

fire_results 表示的是滿足條件的告警記錄。例如告警查詢語句的結果如下:

SLS告警最佳實踐——在通知中引用日志内容

當告警規則中觸發條件配置為

cnt > 0

的時候:

SLS告警最佳實踐——在通知中引用日志内容

觸發的告警會有如下屬性:

{
    "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

時:

SLS告警最佳實踐——在通知中引用日志内容

觸發的告警的 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 %}      

更多相關資訊,可以參考

内容模闆文法(新版)

通過模闆函數進行資料處理

如果需要對告警的字段進行一些格式化或者處理後再展示,可以通過内置函數來實作。具體可以參考:

繼續閱讀