最终发送的默认报警邮件信息如下:
从上图可以看到,默认邮件模板 Title 及 Body 会将之前配置的 Labels 及 Annotations 信息均包含在内,而且每隔 5m 会自动发送,直到服务恢复正常,报警解除为止,同时会发送一封报警解除邮件。接下来,我们启动 node-exporter 来恢复服务。
$ docker start node-exporter等待 15s 之后,Prometheus Alerts 页面变成绿色 node-up (0 active) Inactive 状态,同时也收到了报警解除邮件提醒。
这里有几个地方需要解释一下:
每次停止/恢复服务后,15s 之后才会发现 Alert 状态变化,是因为 prometheus.yml中 global -> scrape_interval: 15s 配置决定的,如果觉得等待 15s 时间太长,可以修改小一些,可以全局修改,也可以局部修改。例如局部修改 node-exporter 等待时间为 5s。 ... - job_name: \'node-exporter\' scrape_interval: 5s file_sd_configs: - files: [\'/usr/local/prometheus/groups/nodegroups/*.json\']
Alert 状态变化时会等待 15s 才发生改变,是因为 node-up.rules 中配置了 for: 15s 状态变化等待时间。
报警触发后,每隔 5m 会自动发送报警邮件(服务未恢复正常期间),是因为 alertmanager.yml 中 route -> repeat_interval: 5m 配置决定的。
4.4、AlertManager 配置自定义邮件模板看到上边默认发送的邮件模板,虽然所有核心的信息已经包含了,但是邮件格式内容可以更优雅直观一些,那么,AlertManager 也是支持自定义邮件模板配置的,首先新建一个模板文件 email.tmpl。
$ mkdir -p /root/prometheus/alertmanager-tmpl && cd /root/prometheus/alertmanager-tmpl $ vim email.tmpl {{ define "email.from" }}xxxxxxxx@qq.com{{ end }} {{ define "email.to" }}xxxxxxxx@qq.com{{ end }} {{ define "email.to.html" }} {{ range .Alerts }} =========start==========<br> 告警程序: prometheus_alert <br> 告警级别: {{ .Labels.severity }} 级 <br> 告警类型: {{ .Labels.alertname }} <br> 故障主机: {{ .Labels.instance }} <br> 告警主题: {{ .Annotations.summary }} <br> 告警详情: {{ .Annotations.description }} <br> 触发时间: {{ .StartsAt.Format "2019-08-04 16:58:15" }} <br> =========end==========<br> {{ end }} {{ end }}简单说明一下,上边模板文件配置了 email.from、email.to、email.to.html 三种模板变量,可以在 alertmanager.yml 文件中直接配置引用。这里 email.to.html 就是要发送的邮件内容,支持 Html 和 Text 格式,这里为了显示好看,采用 Html 格式简单显示信息。下边 {{ range .Alerts }} 是个循环语法,用于循环获取匹配的 Alerts 的信息,下边的告警信息跟上边默认邮件显示信息一样,只是提取了部分核心值来展示。然后,需要增加 alertmanager.yml 文件 templates 配置如下:
global: resolve_timeout: 5m smtp_from: \'{{ template "email.from" . }}\' smtp_smarthost: \'smtp.qq.com:465\' smtp_auth_username: \'{{ template "email.from" . }}\' smtp_auth_password: \'xxxxxxxxxxxxxxx\' smtp_require_tls: false smtp_hello: \'qq.com\' templates: - \'/etc/alertmanager-tmpl/email.tmpl\' route: group_by: [\'alertname\'] group_wait: 5s group_interval: 5s repeat_interval: 5m receiver: \'email\' receivers: - name: \'email\' email_configs: - to: \'{{ template "email.to" . }}\' html: \'{{ template "email.to.html" . }}\' send_resolved: true inhibit_rules: - source_match: severity: \'critical\' target_match: severity: \'warning\' equal: [\'alertname\', \'dev\', \'instance\']