天天看點

開放告警接入Prometheus背景介紹Prometheus接入SLS映射規則總結

背景介紹

Prometheus是常用的開源監控告警系統,為開發運維人員提供了資料采集、檢視、告警的一體化解決方案。Prometheus的告警消息會發送到Alertmanager服務進行通知管理,并定義了同Alertmanager的互動協定。使用Prometheus時,使用者需要額外維護Alertmanager服務,并且Alertmanage在界面操作、功能上較為簡單,并不能很好覆寫使用者的大部分使用場景。SLS的告警功能很好的補足了這這方面的不足之處,并推出了開放告警功能,将Prometheus告警消息通過Alertmanager協定收集到SLS中進行管理,并支援通過包括短信、電話、微信、釘釘、郵箱在内的10多種通知管道發送給使用者。

Prometheus接入SLS

要将Prometheus的告警消息接入SLS,主要分為兩個步驟:在SLS中建立開放告警應用;将SLS開放告警作為alertmanager接入Prometheus。建立開放告警應用的具體步驟,可以參考文章

SLS開放告警簡介

。下面介紹下如何将Prometheus的告警消息接入到SLS中。

擷取回調位址

在建立開放告警應用之後,通過點選接口按鈕,打開如下圖所示的回調位址檢視視窗。

開放告警接入Prometheus背景介紹Prometheus接入SLS映射規則總結

回調位址由兩部分構成:域名部分和子路徑部分。其中域名部分屬于SLS的接入位址,和地域相關,每個地域都有各自不同的接入位址;子路徑部分包括用于發送消息的Access Key Id和開放告警應用。如下所示為一個完整的SLS回調位址:

cn-heyuan-intranet.log.aliyuncs.com/event/webhook/RAMAK_{ACCESS_KEY_ID}/a123_asdad

其中"cn-heyuan-intranet.log.aliyuncs.com"為域名部分,屬于SLS通用的接入位址(endpoint);event/webhook/RAMAK_{ACCESS_KEY_ID}/a123_asdad 則為子路徑部分。需要注意的是,使用者需要将子路徑部分中的{ACCESS_KEY_ID}替換為具體阿裡雲RAM賬戶的Access Key Id,并且将權限政策AliyunLogOpenEventWrite賦予該賬戶;a123_asdad則為該開放告警應用的id,用于唯一差別不同的開放告警應用。

配置通知服務

Prometheus定義了向外部發送告警消息的協定:Alertmanager,可以通過在Prometheus配置檔案中添加一個或者多個Alertmanager,将告警消息發送給運維開發人員。Alertmanager的配置規範如下所示:

# Per-target Alertmanager timeout when pushing alerts.
[ timeout: <duration> | default = 10s ]
# The api version of Alertmanager.
[ api_version: <string> | default = v2 ]
# Prefix for the HTTP path alerts are pushed to.
[ path_prefix: <path> | default = / ]
# Configures the protocol scheme used for requests.
[ scheme: <scheme> | default = http ]
# List of labeled statically configured Alertmanagers.
static_configs:
  # The targets specified by the static config.
  - targets:
    [ - '<host>' ]
    # Labels assigned to all metrics scraped from the targets.
  - labels:
    [ <labelname>: <labelvalue> ... ]      

Prometheus允許通過靜态配置和動态發現兩種方式添加Alertmanager,對于SLS開放告警,我們隻需要關心靜态配置即可。如下所示是包含SLS開放告警的Prometheus配置:

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
  alertmanagers:
  - path_prefix: event/webhook/RAMAK_{ACCESS_KEY_ID}/test_test
    api_version: v2
    static_configs:
    - targets:
      - cn-heyuan.log.aliyuncs.com      

scrape_interval和evaluation_interval使用者自行配置即可。使用者需要将path_prefix的内容替換為接口中的路徑部分(注意替換{ACCESS_KEY_ID}占位符),将接口中的域名部分添加到targets中。之後隻需要重新加載Prometheus配置,使配置生效即可。

映射規則

Prometheus告警消息内容示例如下,SLS開放告警會通過内置的規則,将該消息轉為SLS内部的告警消息:

[
    {
        "annotations": {
            "description": "description info",
            "summary": "High request latency"
        },
        "endsAt": "2020-10-28T12:28:52.710Z",
        "startsAt": "2020-10-28T12:23:37.710Z",
        "generatorURL": "http://127.0.0.1:9090/graph?g0.expr=go_threads%7Binstance%3D%22localhost%3A9090%22%2Cjob%3D%22prometheus%22%7D+%3E+0\\u0026g0.tab=1",
        "labels": {
            "alertname": "HighErrorRate",
            "instance": "localhost:9090",
            "job": "prometheus",
            "severity": "page"
        }
    }
]      

告警嚴重程度

如果在Prometheus告警消息的labels/annotations中包含severity字段,開放告警會将該字段映射為告警消息的嚴重程度。目前開放告警支援多種告警消息嚴重程度,使用者可以根據自己的需要進行配置。如果沒有配置,嚴重程度将預設配置為中等。映射關系如下表所示。

告警嚴重度 關鍵字
嚴重 嚴重、緊急、critical、disaster、blocker、immediate、fatal、crit、sev0、'sev 0'、p0
高、進階、E、H、high、err、error、urgent、major、'sev 1'、sev1、p1
中、中級、告警、M、medium、unknown、warn、warning、'not classified'、average、normal、'sev 2'、sev2、p2
低、低級、L、I、info、information、suggestion、minor、informational、'sev 3'、sev3、p3
報告 報告、通知、report、dbg、debug、verbose、trivial、page、ok、'sev 4'、sev4、p4

字段映射

SLS開放告警會通過内置規則,将Prometheus消息轉為SLS内置告警消息。例如将上面的Prometheus消息,轉為如下所示的告警消息:

[{
    "aliuid": "{開放告警應用所屬的阿裡雲賬号ID}",
    "alert_instance_id": "{自動生成}",
    "project": "{告警中心所屬的Project}",
    "region": "{告警消息發送的網絡接口對應的地域}",
    "alert_id": "HighErrorRate",
    "alert_type": "sls_pub",
    "alert_name": "HighErrorRate",
    "next_eval_interval": 78,
    "alert_time": 1603859020,
    "fire_time": 1603859017,
    "resolve_time": 0,
    "status": "firing",
    "labels": {
        "alertname": "HighErrorRate",
        "instance": "localhost:9090",
        "job": "prometheus"
    },
    "annotations": {
        "__pub_alert_region__": "{告警消息發送的網絡接口對應的地域}",
        "__config_app__": "sls_pub_alert",
        "__pub_alert_service__": "{開放告警服務ID}",
        "__pub_alert_app__": "{開放告警應用ID}",
        "__pub_alert_protocol__": "prometheus",
        "severity": "page"
    },
    "severity": 2,
    "policy": {
        "alert_policy_id": "{開放告警應用中配置的告警政策}",
        "action_policy_id": "{開放告警應用中配置的行動政策}",
        "repeat_interval": "{開放告警應用中配置的重複等待時間}"
    },
    "drill_down_query": "http://127.0.0.1:9090/graph?g0.expr=go_threads%7Binstance%3D%22localhost%3A9090%22%2Cjob%3D%22prometheus%22%7D+%3E+0\\u0026g0.tab=1"
}]      

具體的轉換規則,請參考官方文檔

接入Prometheus告警

總結

通過将Prometheus告警消息接入到SLS,使用者不再需要額外維護自己的Alertmanager服務,并且輕松的擴充了告警通知管理能力,進而更為高效的了解以及處理服務出現的問題。

繼續閱讀