我们在文章 《使用 docker-compose 搭建 prometheus 监控系统》 的基础上,增加 prometheus 的告警功能。
Prometheus 指标的收集存储与告警是分开的,告警功能由 alertmanager 提供。我们需要在 prometheus 定义告警规则,这些规则可以触发事件,然后传播到 alertmanager。接下来,alertmanager 会决定如何处理相应的警报,并确定使用电子邮件,短信等发出警报。Prometheus 和 alertmanager 的关系如下图所示。
为了在 prometheus 增加 alertmanager 的使用,我们在docker-compose.yml
增加 alertmanager 容器:
version: '3'services:centos1:image: centoscontainer_name: centos1restart: alwaysports:- "9101:9100"volumes:- ~/code/docker/prometheus/node_exporter:/rootcommand: /root/node_exportercentos2:image: centoscontainer_name: centos2restart: alwaysports:- "9102:9100"volumes:- ~/code/docker/prometheus/node_exporter:/rootcommand: /root/node_exporterprometheus:image: prom/prometheuscontainer_name: prometheusrestart: alwaysports:- "9090:9090"volumes:- ~/code/docker/prometheus/prometheus:/etc/prometheus- ~/code/docker/prometheus/prometheus_data:/prometheuscommand:- '--config.file=/etc/prometheus/prometheus.yml'- '--storage.tsdb.path=/prometheus'grafana:image: grafana/grafanacontainer_name: grafanarestart: alwaysports:- "3000:3000"volumes:- ~/code/docker/prometheus/grafana_data:/var/lib/grafanaalertmanager:image: prom/alertmanagercontainer_name: alertmanagerrestart: alwaysports:- "9093:9093"volumes:- ~/code/docker/prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.ymlcommand:- '--config.file=/etc/alertmanager/alertmanager.yml'
在docker-compose.yml
文件中,我们指定 alertmanager 的配置文件是/etc/alertmanager/alertmanager.yml
,有关alertmanager.yml
的配置,我们下面再说明。
我们先来看 prometheus 的配置prometheus.yml
:
global:scrape_interval: 5srule_files:- "alert.rules"alerting:alertmanagers:- static_configs:- targets:- 'alertmanager:9093'scrape_configs:- job_name: 'prometheus'static_configs:- targets: ['prometheus:9090']- job_name: 'linux-exporter'metrics_path: /metricsstatic_configs:- targets: ['centos1:9100', 'centos2:9100']
alerting
用于指定 alertmanager 的信息,alertmanager 启动端口为 9093,alertmanager 容器启动信息可以在docker-compose.yml
文件中查看到。
rule_files
用于指定告警规则,这里我们指定alert.rules
文件来用保存告警规则。
alert.rules
文件内容如下:
groups:- name: examplerules:# Alert for any instance that is unreachable for > 1 minutes.- alert: InstanceDownexpr: up == 0for: 1mlabels:severity: pageannotations:summary: "实例 {{ $labels.instance }} 宕机"description: "{{ $labels.instance }} 任务 {{ $labels.job }} 已宕机 1 分钟"
这个告警的规则是指当实例宕机超过 1 分钟时触发告警。
接下来我们来看 alertmanager 的配置文件alertmanager.yml
的内容:
global:resolve_timeout: 2msmtp_smarthost: ':465'smtp_from: 'xxx@xxx.leehao.me' smtp_auth_username: 'xxx@xxx.leehao.me'smtp_auth_password: 'xxxxxx' # 邮箱授权码,注意不是邮箱密码smtp_require_tls: falseroute:group_by: ['alertname']group_wait: 10sgroup_interval: 10srepeat_interval: 4m# 发送重复警报的周期 receiver: 'mail' # 发送警报的接收者的名称,以下 receivers name 的名称receivers:- name: 'mail' # 警报接收者,与上面的配置相对应 email_configs:- to: 'xxxx@'# 接收警报的emailheaders: {Subject: "[WARN] alertmanager 报警邮件"}
其中,有关阿里云 SMTP 的设置需要先在阿里云邮件推送控制台提前配置好。
在阿里云邮件推送的控制台,根据文档提示,创建发信域名,创建发信地址,并设置 SMTP 授权码:
启动 docker-compose:
docker-compose up
在另一个终端关闭 centos1 容器:
docker-compose stop centos1
等待一段时间,打开 prometheus 的 alerts 页面(http://127.0.0.1:9090/alerts),可以看到告警提示:
再打开 alertmanager 页面(http://127.0.0.1:9093/#/alerts),可以看到 alertmanage 已正常接收到 prometheus 的告警:
登录接收告警邮件的邮箱,可以看到 alertmanager 发送的警报邮件: