背景介绍
Prometheus是常用的开源监控告警系统,为开发运维人员提供了数据采集、查看、告警的一体化解决方案。Prometheus的告警消息会发送到Alertmanager服务进行通知管理,并定义了同Alertmanager的交互协议。使用Prometheus时,用户需要额外维护Alertmanager服务,并且Alertmanage在界面操作、功能上较为简单,并不能很好覆盖用户的大部分使用场景。SLS的告警功能很好的补足了这这方面的不足之处,并推出了开放告警功能,将Prometheus告警消息通过Alertmanager协议收集到SLS中进行管理,并支持通过包括短信、电话、微信、钉钉、邮箱在内的10多种通知渠道发送给用户。
Prometheus接入SLS
要将Prometheus的告警消息接入SLS,主要分为两个步骤:在SLS中创建开放告警应用;将SLS开放告警作为alertmanager接入Prometheus。创建开放告警应用的具体步骤,可以参考文章SLS开放告警简介。下面介绍下如何将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服务,并且轻松的扩展了告警通知管理能力,从而更为高效的了解以及处理服务出现的问题。