在前一篇博文中介绍,服务器监控已经部署成功。如果每天都需要人去盯着服务情况,那也不太现实。既然监控平台已经部署好了,是不是可以自动触发报警呢?
在上一篇Prometheus架构中有讲到,核心组件之一:AlertManager,AlertManager即Prometheus体系中的告警处理中心。所以实现告警功能,可以使用该组件,具体如何实现,我们来看。
AlertManager配置 服务部署 拉取镜像使用命令 docker pull prom/alertmanager:latest
服务启动使用如下命令:
docker run -d --name alertmanager -p 9093:9093 \ prom/alertmanager:latest启动服务后,通过地址访问,:9093可以看到默认提供的 UI 页面,不过现在是没有任何告警信息的,因为我们还没有配置报警规则来触发报警。
AlertManager 默认配置文件为 alertmanager.yml,在容器内路径为 /etc/alertmanager/alertmanager.yml,默认配置如下:
global: resolve_timeout: 5m route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'web.hook' receivers: - name: 'web.hook' webhook_configs: - url: 'http://127.0.0.1:5001/' inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']简单介绍一下主要配置的作用:
• global: 全局配置,包括报警解决后的超时时间、SMTP 相关配置、各种渠道通知的 API 地址等等。
• route: 用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配。
• receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
• inhibit_rules: 抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。
alertmanager配置好后,我们来添加告警规则,就是符合规则,才会推送消息,规则配置如下:
mkdir -p /root/prometheus/rules && cd /root/prometheus/rules/ vim host.rules添加如下信息:
groups: - name: node-up rules: - alert: node-up expr: up{job="linux"} == 0 for: 15s labels: severity: 1 team: node annotations: summary: "{{ $labels.instance }} 已停止运行超过 15s!"说明一下:该 rules 目的是监测 node 是否存活,expr 为 PromQL 表达式验证特定节点 job="linux" 是否活着,for 表示报警状态为 Pending 后等待 15s 变成 Firing 状态,一旦变成 Firing 状态则将报警发送到 AlertManager,labels 和 annotations 对该 alert 添加更多的标识说明信息,所有添加的标签注解信息,以及 prometheus.yml 中该 job 已添加 label 都会自动添加到邮件内容中 ,。
prometheus.yml配置文件修改prometheus.yml配置文件,添加 rules 规则文件,已有内容不变,配置文件中添加如下内容:
alerting: alertmanagers: - static_configs: - targets: - 'ip:9093' rule_files: - "/etc/prometheus/rules/*.rules"注意: 这里rule_files为容器内路径,需要将本地host.rules文件挂载到容器内指定路径,修改 Prometheus 启动命令如下,并重启服务。
docker run -d --name prometheus \ -p 9090:9090 \ -v /root/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \ -v /root/prometheus/rules/:/etc/prometheus/rules/ \ prom/prometheus通过ip+端口访问,查看rules,如下所示:
这里说明一下 Prometheus Alert 告警状态有三种状态:Inactive、Pending、Firing。
Inactive:非活动状态,表示正在监控,但是还未有任何警报触发。
Pending:表示这个警报必须被触发。由于警报可以被分组、压抑/抑制或静默/静音,所以等待验证,一旦所有的验证都通过,则将转到 Firing 状态。
Firing:将警报发送到 AlertManager,它将按照配置将警报的发送给所有接收者。一旦警报解除,则将状态转到 Inactive,如此循环。
说了这么多,就用推送邮件来实践下结果。
邮件推送 邮件配置我们来配置一下使用 Email 方式通知报警信息,这里以 QQ 邮箱为例,新建目录 mkdir -p /root/prometheus/alertmanager/ && cd /root/prometheus/alertmanager/
使用vim命令 vim alertmanager.yml,配置文件中添加如下内容:
global: resolve_timeout: 5m smtp_from: '11111111@qq.com' smtp_smarthost: 'smtp.qq.com:465' smtp_auth_username: '11111111@qq.com' smtp_auth_password: 'XXXXXXXXX' smtp_hello: 'qq.com' smtp_require_tls: false route: group_by: ['alertname'] group_wait: 5s group_interval: 5s repeat_interval: 5m receiver: 'email' receivers: - name: 'email' email_configs: - to: '222222222@foxmail.com' send_resolved: true #insecure_skip_verify: true inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']其中几个关键的配置说明一下:
smtp_smarthost: 这里为 QQ 邮箱 SMTP 服务地址,官方地址为 smtp.qq.com 端口为 465 或 587,同时要设置开启 POP3/SMTP 服务。
smtp_auth_password: 这里为第三方登录 QQ 邮箱的授权码,非 QQ 账户登录密码,否则会报错,获取方式在 QQ 邮箱服务端设置开启 POP3/SMTP 服务时会提示。