19 Prometheus 之告警的艺术
告警是整个监控系统中重要的组成部分,在 Prometheus 监控体系中,指标的采集存储与告警是分开的。告警规则是在 Prometheus server 端定义的,告警规则被触发后,才会将信息发送给独立组件 Alertmanager 上,经过对告警的处理后,最终通过接收器(如 Email)通知用户。
在使用 Prometheus 进行告警时,首要的问题是,什么时候应该发出告警?一个好的告警是在正确的时刻、因正确的理由、踏着正确的节奏发送,并在其中放入真实有用的信息。我们发出告警的时刻一定是重要的系统或服务出现异常,导致最终用户体验不佳或无法正常使用服务,并需要人工检查。要针对最终用户的潜在痛点进行告警,才能使告警的数量保持较小,从而防止对系统或服务进行过度监控。保持小而重要的告警数量,是告警的一个关键原则,也就是说告警应该是重要的、可操作的和真实的。
其次是告警要包含哪些内容?对于面向最终用户提供内容的在线服务,通常尽可能在高延迟和错误率等条件下发出告警;对于容量建议告警,应检测容量何时耗尽,从而导致停机;对于批处理作业,在作业最近未成功时发出告警。当然大家对于告警内容的设定要适应自身应用环境,特别是线上重要业务接口类内容。告警应该链接到相关的仪表盘和控制台,这些仪表盘和控制台中的信息可以回答关于被警报的服务的基本问题,以便随叫随到的管理员可以快速解读潜在问题。
Prometheus server 与 Alertmanager 是相互分离的两个组件。我们使用 Prometheus server 采集各类监控指标,然后基于 PromQL 对这些指标定义阈值告警规则(Rules)。Prometheus server 对告警规则周期性地进行计算,如果满足告警触发条件,便生成一条告警信息,并将其推送到 Alertmanager 组件。收到告警信息后,Alertmanager 会处理告警,进行分组(grouping)并将它们路由(routing)到正确的接收器(receiver),如 Email、PagerDuty 和 HipChat 等,最终把异常事件的通知发送给接收者。
分组机制(Grouping)是指,AlertManager 将同类型的告警进行分组,合并多条告警到一个通知中。在实际环境中,特别是云计算环境中的业务线之间密集耦合时,若出现多台设备宕机,可能会导致成百上千个告警被触发。在这种情况下使用分组机制,可以将这些被触发的告警合并为一个告警进行通知,从而避免瞬间突发性地接收大量的告警通知,使得管理员无法对问题进行快速定位。
Alertmanager 的抑制机制(Inhibition)是指,当某告警已经发出,停止重复发送由此告警引发的其他异常或故障的告警机制。在生产环境中,例如 IDC 托管机柜中,若每个机柜接入层仅仅是单台交换机,那么该机柜接入交换机故障会造成机柜中服务器非 UP 状态告警;再有服务器上部署的应用不可访问也会触发告警。此时,可以配置 Alertmanager 忽略由交换机故障造成的机柜所有服务器及其应用不可访问而产生的告警。
告警静默(Silences)提供了一个简单的机制,可以根据标签快速对告警进行静默处理。对传入的告警进行匹配检查,如果接收到的告警符合静默的配置,Alertmanager 则不会发送告警通知。管理员可以直接在 Alertmanager 的 Web 界面中临时屏蔽指定的告警通知。
看到 alertmanager 配置文件格式通常包括 global(全局配置)、templates(告警模板)、route(告警路由)、receivers(接收器)和 inhibit_rules(抑制规则)等主要配置项模块。
global 即全局配置,在 Alertmanager 配置文件中,只要全局配置项中配置的选项内容均为公共设置,便可以作为其他配置项的默认值,也可以被其他配置项中的设置覆盖掉。
route 告警路由模块描述了在收到 Prometheus server 生成的告警后,将告警发送到 receiver 指定的目的地址的规则。
receivers 接收器是一个统称,每个 receiver 需要设置一个全局唯一名称,并且对应一个或者多个通知方式,包括电子邮箱、微信、PagerDuty、HipChat 和 Webhook 等。
inhibit_rule 模块中设置实现告警抑制功能,我们可以指定在特定条件下要忽略的告警条件。可以使用此选项设置首选项,例如优先处理某些告警,如果同一组中的告警同时发生,则忽略其他告警。
Prometheus 从收集监控目标信息开始,到触发一条告警的过程。
1)定义规则。
在 Prometheus 配置文件中,配置 scrape_interval:15s(默认值是 1min)为收集监控目标信息的采集周期,并且配置对应的告警规则。scrape_interval 可以是全局设置,也可以是单 metric 定义。
2)周期计算。
对相应的表达式进行计算时,在 Prometheus 配置文件中配置 evaluation_interval:15s(默认值是 1min)为告警规则计算周期,evaluation_interval 只是全局计算周期值。
3)告警状态转换。·
当首次发现告警规则条件成立,即表达式为真,并且没有满足告警规则中 for 子句中指定的持续时间时,告警状态切换为 PENDING。
若下一个计算周期中,表达式仍然为真,并且满足告警规则中 for 子句中指定的持续时间时,告警状态转换成 FIRING,即为 active,告警被 Prometheus 发送到 Alertmanager 组件。
若下下个计算周期,表达式还是为真,并且满足告警规则中 for 子句中指定的持续时间时,持续发送告警到 Alertmanager 组件。
直到某个计算周期,表达式为假,告警状态会变为 inactive,并且会有一个 resolve 被发送给 Altermanger,用于说明此告警已解决。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/5d7187edc2ee78533d155612a】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论