概述
在SLS告警评估、触发到通知的整个生命周期过程中,都会有一些日志记录,通过这些日志我们可以借助告警对系统的整体健康状况、稳定性等有一个相对全面的了解。
在开始使用SLS告警的时候,需要选择一个地域来存储告警相关的数据,该初始化操作会自动创建一个 sls-alert-$uid-$region
形式的project,例如阿里云账号ID是 12345,选择的地域是杭州,那么默认创建出来的 project 就是 sls-alert-12345-cn-hangzhou
。该 Project 下也会自动创建出来一个 internal-alert-center-log
的 LogStore,用于存放告警相关的数据,也就是告警中心日志。
注:该LogStore完全免费,并且已经默认创建索引。
之后我们就可以基于该 LogStore 进行分析。
Topic
告警中心日志根据 __topic__
字段做区分,每个 __topic__
表示告警处理的不同阶段。常见的 __topic__
及其所处的阶段、以及说明如下:
|
说明 |
alert_state |
告警规则评估日志。 |
alert_received |
告警管理服务接收到告警消息。 |
alert_routed |
告警经过告警策略之后,进行路由合并。 |
alert_pre_filter |
告警进入抑制静默流程。 |
alert_silenced |
告警被抑制或者静默。 |
alert_pre_notify |
告警进入通知发送流程 |
alert_notified |
告警通知被发送。 |
system_config |
配置错误,有可能导致告警通知失败。例如配置了不存在的联系人。 |
案例
下面通过一些案例来展示如何基于告警中心日志做自定义的查询分析。
案例一:告警触发统计
查询一段时间内,一共有多少告警触发过,以及触发的次数。
查询分析语句如下:
__topic__: alert_received |select"alert.project"as project,"alert.alert_name"as alert_name,count(*)as cnt groupby project, alert_name orderby cnt desc
结果参考如下:
案例二:通知失败统计
统计一段时间内,各个通知渠道的失败次数。
查询分析语句如下:
__topic__: alert_notified and level: error |select"notifierConfig.type"as notificationType,count(*)as cnt groupby notificationType orderby cnt desc
案例三:通知失败原因
某告警规则没有收到通知,可通过如下方式查询失败原因。
第一步,首先查看是否有配置错误:
__topic__: system_config and alert.alert_id: alert-xxx-yyy |select level, error, msg,"desc"
如果有数据,则说明配置有问题导致无法进行通知。详细的错误说明可以参考下面表格。如果没有配置错误,那么可能是由于通知发送失败了,可以通过如下语句查询是否有通知错误:
__topic__: alert_notified and level: error and alert.alert_id: alert-xxx-yyy |select error
参考结果如下:
此时可以发现是配置的Webhook地址无效导致通知发送失败。
告警内置仪表盘
日志服务告警内置了如下几个仪表盘,用来统计告警的触发情况和通知情况。事实上,这些仪表盘也是基于告警中心日志数据来进行制作的。如果需要一些定制化的图标,也可以自己写查询语句来自定义仪表盘。
监控规则中心
监控规则中心仪表盘主要展示了告警监控规则的执行情况。
告警链路中心
告警链路中心主要包含了了告警在触发、合并、抑制静默、通知等各个阶段的统计。
告警排障中心
告警排障中心主要统计的是告警通知过程中的种种错误。比如由于配置错误导致通知无法发出。通过告警排障,选择相应的项目以及规则名,可以查看该规则相关的配置错误信息,从而快速定位通知收不到的原因。常见的配置错误参考下表。
常见配置错误
告警中心日志中,通过 __topic__: system_config
可以过滤出配置错误导致的通知异常。常见的错误参考如下:
故障级别 |
故障类型 |
故障详情 |
描述 |
详细描述 |
解决方案 |
error |
AlertPolicyNotConfigured |
Alert xxx has no alert policy configured |
this alert will be ignored since it could not be routed |
该告警规则未配置告警策略,导致该告警无法被进行路由分组,因此会被忽略。 |
修改告警规则,配置正确的告警策略。 |
error |
AlertPolicyNotExist |
alert policy xxx not exist |
alerts that use this alert policy will be ignored |
告警策略不存在,使用该告警策略的告警会被忽略。 |
检查该告警策略是否存在,如果不存在的话需要创建出来,或者使用其它的告警策略 |
error |
AlertPolicyInvalid |
alert policy xxx format error |
alerts that use this alert policy will be ignored |
告警策略格式错误,导致无法解析,使用该告警策略的告警会被忽略。 |
修改该告警策略的内容,或者删除重新创建。 |
warn |
AlertPolicyInheritanceLoop |
alert policy xxx has inheritance loop with yyy |
inheritance loop alert policies will be ignored |
告警策略集成有循环,例如 A 继承 B,B 又继承 A。在实际使用的时候,如果配置的是 A,则 B 和 A 生效;如果配置的是 B,则 A 和 B 生效。不会无限解析继承链 |
修改告警策略,避免有循环继承。 |
error |
NoDefaultAlertPolicy |
no default alert policy |
alerts that use default alert policy will be ignored |
没有配置默认告警策略。因此如果告警规则配置使用了默认告警策略,则相应的告警会被忽略。 |
设置默认的告警策略。 |
error |
GroupPolicyEmpty |
Group policy of alert policy xxx is empty |
alerts using this alert policy will be ignored |
告警策略中的分组规则为空,因此告警会被忽略。 |
修改告警策略中的分组规则配置,避免为空。 |
error |
ActionPolicyNotExist |
action policy xxx not exist |
alerts that use default action policy will not be notified |
行动策略不存在,导致使用了该行动策略的告警不会被发送。 |
创建相应的行动策略,或者修改告警策略中的分组规则,使用其它的行动策略。 |
error |
ActionPolicyInvalid |
action policy xxx invalid |
alerts that use default action policy will not be notified |
行动策略格式错误,导致使用了该行动策略的告警不会被发送。 |
修改相应的行动策略,或者删除后重新创建。 |
error |
ActionPolicyEmpty |
Primary(Secondary) policy for action policy xxx is empty |
alerts using this action policy will not be notified |
第一(第二) 行动策略为空,导致使用该行动策略的告警不会被发送。 |
修改相应的行动策略,确保不为空。 |
warn |
UserNotExist |
user xxx not exist |
this user will not be notified |
用户 xxx 不存在,该用户不会被通知。 |
从行动策略中去掉该用户,或者创建该用户。 |
warn |
UserGroupNotExist |
group xxx not exist |
this group will not be notified |
用户组 xxx 不存在,该用户组不会被通知。 |
从行动策略中去掉该用户组,或者创建该用户组。 |
warn |
UserGroupEmpty |
group xxx is empty |
this group will not be notified |
用户组 xxx 为空,因此该用户组不会被通知。 |
为该用户组添加用户。 |
warn |
OncallGroupNotExist |
oncall group xxx not exist |
this oncall group will not be notified |
值班组 xxx 不存在,因此该值班组不会被通知。 |
创建该值班组。 |
warn |
ContentTemplateNotExist |
content template xxx not exist |
notifications that use this content template will be ignored |
内容模板 xxx 不存在,因此使用了该内容模板的通知渠道会被忽略。 |
配置行动策略使用其它的内容模板,或者创建该内容模板。 |
warn |
CalendarNotExist |
calendar xxx not exist |
oncall group that using this calendar will be ignored |
日历 xxx 不存在,因此使用该日历的值班组会被忽略。 |
配置值班组使用其它日历,或者创建该日历。 |
warn |
ChannelQuotaNotExist |
channel quota not exist |
action policies will ignore channel quota |
渠道配额不存在,因此发送通知的时候会忽略 quota 限制。 |
创建渠道配额。 |
warn |
ChannelQuotaInvalid |
channel quota format invalid |
action policies will ignore channel quota |
渠道配额为空,因此会忽略 quota 限制。 |
修改渠道配额的内容,确保限制不为空。 |