1、Altermanager使用
1.1 什么是Alertmanager
Alertmanager 与 Prometheus 是相互分离的两个组件,Prometheus 服务器根据报警规则将警报发送给
Alertmanager,然后 Alertmanager 将 silencing、inhibition、aggregation 等消息通过电子邮件、dingtalk 和
HipChat 发送通知。
实现 prometheus 的告警,需要通过 altermanager 这个组件;在 prometheus 服务端写告警规则,在
altermanager 组件配置邮箱。
Alertmanager 处理由例如 Prometheus 服务器等客户端发来的警报。它负责删除重复数据、分组,并将警报通过
路由发送到正确的接收器,比如电子邮件、Slack、dingtalk 等。Alertmanager 还支持 groups,silencing 和警报
抑制的机制。
1.2 Alertmanager的工作机制
钉钉告警需要接入prometheus-webhook-dingtalk
。
1.3 Alertmanager安装
1.3.1 下载
下载地址:https://prometheus.io/download/
这里选择下载 alertmanager-0.24.0.linux-amd64.tar.gz
https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
本地下载后上传到 linux 服务器。
1.3.2 解压
tar -xvf alertmanager-0.24.0.linux-amd64.tar.gz
1.3.3 启动
# 进入解压后的文件夹
cd /home/zhangshixing/prometheus/alertmanager-0.24.0.linux-amd64
# 前台启动
./alertmanager --config.file=alertmanager.yml
# 后台启动alertmanager,并且重定向输入日志到当前目录的alertmanager.out
nohup ./alertmanager --config.file=alertmanager.yml >> nohup.out 2>&1 &
1.3.4 访问Altermanager
访问:http://192.168.54.195:9093/
,默认端口为 9093
Alertmanager 可以在运行时重新加载其配置,如果新配置格式不正确,则不会应用更改并记录错误。配置重新加
载是通过向 SIGHUP 进程发送 a 或向/-/reload端点发送 HTTP POST 请求来触发的。
1.4 将Altermanager配置为系统服务
1.4.1 进入systemd目录
cd /usr/lib/systemd/system
1.4.2 创建文件
vim alertmanager.service
# 添加如下内容
[Unit]
Description=https://prometheus.io
[Service]
Restart=on-failure
ExecStart=/home/zhangshixing/prometheus/alertmanager-0.24.0.linux-amd64/alertmanager --config.file=/home/zhangshixing/prometheus/alertmanager-0.24.0.linux-amd64/alertmanager.yml
[Install]
WantedBy=multi-user.target
1.4.3 生效系统systemd文件
systemctl daemon-reload
1.4.4 启动和停止服务命令
# 启动
systemctl start alertmanager.service
# 停止
systemctl stop alertmanager.service
# 查看状态
systemctl status alertmanager.service
[root@zsx ~]# systemctl status alertmanager.service
● alertmanager.service - https://prometheus.io
Loaded: loaded (/usr/lib/systemd/system/alertmanager.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2023-03-03 12:19:55 CST; 22s ago
Main PID: 57949 (alertmanager)
Tasks: 6
Memory: 37.6M
CGroup: /system.slice/alertmanager.service
└─57949 /home/zhangshixing/prometheus/alertmanager-0.24.0.linux-amd64/alertmanager --config.fil...
Mar 03 12:19:55 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:55.899Z caller=main.go:231 level=info...11)"
Mar 03 12:19:55 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:55.899Z caller=main.go:232 level=info...33)"
Mar 03 12:19:55 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:55.917Z caller=cluster.go:185 level=i...9094
Mar 03 12:19:55 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:55.946Z caller=cluster.go:680 level=i...l=2s
Mar 03 12:19:56 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:56.007Z caller=coordinator.go:113 lev....yml
Mar 03 12:19:56 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:56.009Z caller=coordinator.go:126 lev....yml
Mar 03 12:19:56 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:56.027Z caller=main.go:535 level=info...9093
Mar 03 12:19:56 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:56.027Z caller=tls_config.go:195 leve...alse
Mar 03 12:19:57 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:57.947Z caller=cluster.go:705 level=i...839s
Mar 03 12:20:05 zsx.com alertmanager[57949]: ts=2023-03-03T04:20:05.952Z caller=cluster.go:697 level=i...007s
Hint: Some lines were ellipsized, use -l to show in full.
1.5 altermanager.yml解读
altermanager.yml
文件的配置可以参考下面的进行配置:
global: # 即为全局设置,在Alertmanager配置文件中,只要全局设置配置了的选项,全部为公共设置,可以让其他设置继承,作为默认值,可以子参数中覆盖其设置。
resolve_timeout: 1m # 用于设置处理超时时间,也是生命警报状态为解决的时间,这个时间会直接影响到警报恢复的通知时间,需要自行结合实际生产场景来设置主机的恢复时间,默认是5分钟。
# 整合邮件
smtp_smarthost: 'smtp.qq.com:465' # 邮箱smtp服务器
smtp_from: '1451578387@qq.com' # 发件用的邮箱地址
smtp_auth_username: '1451578387@qq.com' # 发件人账号
smtp_auth_password: 'dkuuifhdskaduasdsb' # 发件人邮箱密码
smtp_require_tls: false # 不进行tls验证
route: # 路由分组
group_by: ['alertname'] # 报警分组
group_wait: 10s # 组内等待时间,同一分组内收到第一个告警等待多久开始发送,目标是为了同组消息同时发送,不占用告警信息,默认30s。
group_interval: 10s # 当组内已经发送过一个告警,组内若有新增告警需要等待的时间,默认为5m,这条要确定组内信息是影响同一业务才能设置,若分组不合理,可能导致告警延迟,造成影响。
repeat_interval: 1h # 告警已经发送,且无新增告警,若重复告警需要间隔多久,默认4h,属于重复告警,时间间隔应根据告警的严重程度来设置。
receiver: 'webhook' # 告警的接收者,需要和 receivers[n].name 的值一致。
# 上面所有的属性都由所有子路由继承,并且可以在每个子路由上进行覆盖。
# 当报警信息中标签匹配到team:node时会使用email发送报警,否则使用webhook。
routes:
- receiver: 'email'
group_wait: 10s
match:
team: node
# 接收器指定发送人以及发送渠道
# 接收者有多种类型
# email_config
# hipchat_config
# pagerduty_config
# pushover_config
# slack_config
# opsgenie_config
# victorops_config
# webhook_config
# wechat_config
receivers:
# webhook分组的定义
- name: 'webhook'
# 钉钉配置
webhook_configs:
- url: http://localhost:8060/dingtalk/ops_dingding/send
send_resolved: true
- name: 'mail'
# 邮箱配置
email_configs:
# 可以有多个收件人
- to: '18234725647@163.com'
- to: '1239683670@qq.com'
# 如果当前收件人需要接受告警恢复的通知的话,在email_config中定义send_resolved为true即可
send_resolved: true
# 抑制规则
# 合理设置抑制规则可以减少垃圾告警的产生
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning' # 告警级别,如果警报名称相同,则静音
equal: ['alertname', 'dev', 'instance']
# global块配置下的配置选项在本配置文件内的所有配置项下可见。
global:
# 在Alertmanager内管理的每一条告警均有两种状态:"resolved"或者"firing",在altermanager首次发送告警通知后,该告警会一直处于firing状态,设置resolve_timeout可以指定处于firing状态的告警间隔多长时间会被设置为resolved状态,在设置为resolved状态的告警后,altermanager不会再发送firing的告警通知。
resolve_timeout: 1h
# 邮件告警配置
smtp_smarthost: 'smtp.exmail.qq.com:25'
smtp_from: 'dukuan@xxx.com'
smtp_auth_username: 'dukuan@xxx.com'
smtp_auth_password: 'DKxxx'
# HipChat告警配置
hipchat_auth_token: '123456789'
hipchat_auth_url: 'https://hipchat.foobar.org/'
# wechat
wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
wechat_api_secret: 'JJ'
wechat_api_corp_id: 'ww'
# 告警通知模板
templates:
- '/etc/alertmanager/config/*.tmpl'
# route根路由,该模块用于该根路由下的节点及子路由routes的定义,子树节点如果不对相关配置进行配置,则默认会从父路由树继承该配置选项。每一条告警都要进入route,即要求配置选项group_by的值能够匹配到每一条告警的至少一个labelkey(即通过POST请求向altermanager服务接口所发送告警的labels项所携带的<labelname>),告警进入到route后,将会根据子路由routes节点中的配置项match_re或者match来确定能进入该子路由节点的告警(由在match_re或者match下配置的labelkey:labelvalue是否为告警labels的子集决定,是的话则会进入该子路由节点,否则不能接收进入该子路由节点)。
route:
# 例如所有labelkey:labelvalue含cluster=A及altertname=LatencyHigh的labelkey的告警都会被归入单一组中
group_by: ['job', 'altername', 'cluster', 'service','severity']
# 若一组新的告警产生,则会等group_wait后再发送通知,该功能主要用于当告警在很短时间内接连产生时,在group_wait内合并为单一的告警后再发送
group_wait: 30s
# 再次告警时间间隔
group_interval: 5m
# 如果一条告警通知已成功发送,且在间隔repeat_interval后,该告警仍然未被设置为resolved,则会再次发送该告警通知
repeat_interval: 12h
# 默认告警通知接收者,凡未被匹配进入各子路由节点的告警均被发送到此接收者
receiver: 'wechat'
# 上述route的配置会被传递给子路由节点,子路由节点进行重新配置才会被覆盖
# 子路由树
routes:
# 该配置选项使用正则表达式来匹配告警的labels,以确定能否进入该子路由树
# match_re和match均用于匹配labelkey为service,labelvalue分别为指定值的告警,被匹配到的告警会将通知发送到对应的receiver
- match_re:
service: ^(foo1|foo2|baz)$
receiver: 'wechat'
# 在带有service标签的告警同时有severity标签时,他可以有自己的子路由,同时具有severity != critical的告警则被发送给接收者team-ops-mails,对severity == critical的告警则被发送到对应的接收者即team-ops-pager
routes:
- match:
severity: critical
receiver: 'wechat'
# 比如关于数据库服务的告警,如果子路由没有匹配到相应的owner标签,则都默认由team-DB-pager接收
- match:
service: database
receiver: 'wechat'
# 我们也可以先根据标签service:database将数据库服务告警过滤出来,然后进一步将所有同时带labelkey为database
- match:
severity: critical
receiver: 'wechat'
# 抑制规则,当出现critical(关键的)告警时忽略warning。
# 下面的这段配置是指如果出现标签为severity=critical的告警,则抑制severity=warning的告警
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
# 如果警报名称相同,则应用抑制。
# alertname、cluster和service对应的标签值需要相等
equal: ['alertname', 'cluster', 'service']
# 收件人配置
receivers:
- name: 'team-ops-mails'
email_configs:
- to: 'dukuan@xxx.com'
- name: 'wechat'
wechat_configs:
- send_resolved: true
corp_id: 'ww'
api_secret: 'JJ'
to_tag: '1'
agent_id: '1000002'
api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
message: '{{ template "wechat.default.message" . }}'
- name: 'team-X-pager'
email_configs:
- to: 'team-X+alerts-critical@example.org'
pagerduty_configs:
- service_key: <team-X-key>
- name: 'team-Y-mails'
email_configs:
- to: 'team-Y+alerts@example.org'
- name: 'team-Y-pager'
pagerduty_configs:
- service_key: <team-Y-key>
- name: 'team-DB-pager'
pagerduty_configs:
- service_key: <team-DB-key>
- name: 'team-X-hipchat'
hipchat_configs:
- auth_token: <auth_token>
room_id: 85
message_format: html
notify: true
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.163.com:465'
smtp_from: 'kangwei_k@163.com'
smtp_auth_username: 'kangwei_k@163.com'
smtp_auth_password: 'VSFGFMZVREDBZHNQ'
smtp_require_tls: false
templates:
- '/data/alertmanager/template/default.tmpl'
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 20m
repeat_interval: 10m
receiver: 'email'
# 一个匹配规则
routes:
- receiver: 'email'
match:
severity: Disaster
# 多个匹配规则
routes:
- match_re:
resource: ^(memory|cpu|disk)$
receiver: system-pager
continue: false
routes:
- match:
severity: critical
receiver: critical-pager
- match:
resource: net
receiver: net-pager
- match:
resource: host
receiver: system-pager
continue: true
routes:
- match:
severity: crirical
receiver: critical-pager
receivers:
- name: 'email'
email_configs:
- to: 'kangwei_k@163.com'
html: '{{ template "default.html" .}}'
headers: { Subject: "{{ .GroupLabels.SortedPairs.Values }} [{{ .Status | toUpper }}:{{ .Alerts.Firing | len }}]" }
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
其中告警的匹配有两种方式可以选择,一种方式基于字符串验证,通过设置 match 规则判断当前告警中是否存在
标签 labelname 并且其值等于 labelvalue。第二种方式则基于正则表达式,通过设置 match_re 验证当前告警标
签的值是否满足正则表达式的内容。
Alertmanager 可以对告警通知进行分组,将多条告警合并为一个通知。这里我们可以使用 group_by 来定义分
组规则。基于告警中包含的标签,如果满足 group_by 中定义标签名称,那么这些告警将会合并为一个通知发送
给接收器。
group_by 用于合并通知,match/match_re 用于匹配标签。
1.6 添加Altermanager到Prometheus管理
把 alertmanager 添加到 prometheus 的配置里:
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.54.195:9093
rule_files:
- "rule/*.yml"
告警规则读取 prometheus 目录的 rule 下的所有以 yml 结尾的文件。
创建 rule 目录并规定告警项,并定义报警邮件格式,这里制定了一个实例状态和磁盘的告警。
1.7 新建告警规则文件
rule.yml
文件的配置可以参考下面的进行配置:
rules.yml: |
groups:
- name: kubernetes # 组的名字,在这个文件中必须要唯一
rules:
- alert: KubernetesNodeReady # 告警的名字,在组中需要唯一
expr: kube_node_status_condition{condition="Ready",status="true"} == 1 # 表达式,执行结果为true表示需要告警
for: 30s # 超过多少时间才认为需要告警
labels:
severity: critical # 设置告警等
annotations:
summary: Kubernetes Node ready (instance {{ $labels.instance }})
description: "Node {{ $labels.node }} has been unready for a long time\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
- name: example
rules:
- alert: InstanceDown
expr: up == 0
for: 30s
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }} stop"
description: "{{ $labels.instance }}:job{{ $labels.job }} stop"
在告警规则文件中,我们可以将一组相关的规则设置定义在一个group下。在每一个 group 中我们可以定义多个
告警规则(rule)。一条告警规则主要由以下几部分组成:
-
alert
:告警规则的名称。 -
expr
:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。 -
for
:评估等待时间,可选参数。用于在第一次遇到新的触发报警等待一段时间, 只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。
-
labels
:自定义标签,允许用户指定要附加到告警上的一组附加标签。 -
annotations
:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。
groups.name 没什么用处,只是逻辑上的分组,在 Prometheus 页面上显示分组而已。和后面的 Alertmanager
中的 group 没有任何关系。AlertManager 使用的是 prometheus rule 中的 label 再添加上默认的两个标签
alertname和 instance,例如:
# 我们定义的标签规则
groups:
- name: hostStatsAlert
rules:
- alert: hostCpuUsageAlert
expr: sum(avg without (cpu)(irate(node_cpu_seconds_total{mode!='idle'}[5m]))) by (instance) > 0.07
for: 1m
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} CPU usgae high"
description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})"
- alert: hostMemUsageAlert
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes)/node_memory_MemTotal_bytes > 0.85
for: 1m
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} MEM usgae high"
description: "{{ $labels.instance }} MEM usage above 85% (current value: {{ $value }})"
# 实际发送的数据
[
{
"annotations":{
"description":"192.168.1.12:9567 CPU usage above 85% (current value: 0.1308904885691767)",
"summary":"Instance 192.168.1.12:9567 CPU usgae high"
},
"endsAt":"2022-12-09T03:54:48.961Z",
"startsAt":"2022-12-09T03:50:48.961Z",
"generatorURL":"xxx",
"labels":{
"alertname":"hostCpuUsageAlert",
"instance":"192.168.1.12:9567",
"severity":"page"
}
}
]
# 实际webhook收到的报警消息
{
"status": "resolved",
"labels": {
"alertname": "hostCpuUsageAlert",
"instance": "192.168.1.12:9567",
"severity": "page"
},
"annotations": {
"description": "192.168.1.12:9567 CPU usage above 85% (current value: 0.09133333333296416)",
"summary": "Instance 192.168.1.12:9567 CPU usgae high"
},
"startsAt": "2021-12-08T16:21:33.961Z",
"endsAt": "2021-12-08T16:23:18.961Z",
"generatorURL": "xxx",
"fingerprint": "f05d26ab06192e0e"
}
Prometheus 发送给 Alertmanager 的 api 接口可以参考:
https://github.com/prometheus/alertmanager/blob/main/api/v2/openapi.yaml
一般来说,在告警规则文件的 annotations 中使用 summary 描述告警的概要信息,description 用于描述告警的
详细信息。同时 Alertmanager 的 UI 也会根据这两个标签值,显示告警信息。为了让告警信息具有更好的可读
性,Prometheus 支持模板化 label 和 annotations 的中标签的值。
通过 $labels.<labelname>
变量可以访问当前告警实例中指定标签的值,$value
则可以获取当前PromQL表达
式计算的样本值。
# To insert a firing element's label values:
{{ $labels.<labelname> }}
# To insert the numeric expression value of the firing element:
{{ $value }}
本文告警规则的配置:
groups:
- name: node_rule
rules:
- alert: node memory usages
expr: node_memory_usages > 20 # 这里为了调试所以值设置的小了点
for: 10s
labels:
severity: high
annotations:
summary: "{{ $labels.exported_instance }}: 空间使用率异常"
description: "{{ $labels.exported_instance }}: 空间使用率异常,请及时处理。"
1.8 配置告警邮件发送
编辑 alertmanager.yml
文件,定义发送邮箱,这里举例为 163
邮箱。
global:
resolve_timeout: 5m
smtp_from: '15110820283@163.com'
smtp_smarthost: 'smtp.163.com:25'
smtp_auth_username: '15110820283@163.com'
smtp_auth_password: 'GKVAKHJHFFVSCLHG'
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 15s
group_interval: 30s
repeat_interval: 2m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '2420309401@qq.com'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
重启 Prometheus
和 Alertmanager
进行测试。
我们通过向 Pushgetway 发送数据:
# 利用shell脚本完成数据推送
$ vim push.sh
# 内容
node_memory_usages=$(free -m | grep Mem | awk '{print $3/$2*100}')
job_name="memory"
instance_name="192.168.54.195"
cat <<EOF | curl --data-binary @- http://192.168.54.195:9091/metrics/job/$job_name/instance/$instance_name
# TYPE node_memory_usages gauge
node_memory_usages $node_memory_usages
EOF
# 执行
./push.sh
测试结果如下:
收到的邮件:
Alertmanager UI 此时也可以看到 Alertmanager 接收到的告警信息。
Prometheus 首次检测到满足触发条件后,node memory usages alert显示由一条告警处于活动状态。由于告警
规则中设置了 10s
的等待时间,当前告警状态为 PENDING
,如果 10s 后告警条件持续满足,则会实际触发告警
并且告警状态为 FIRING
。
对于已经 pending
或者 firing
的告警,Prometheus也会将它们存储到时间序列ALERTS{}
中。
可以通过表达式,查询告警实例:
ALERTS{alertname="<alert name>", alertstate="pending|firing", <additional alert labels>}
1.9 使用邮件模板
Alertmanager
使用固定的模板进行邮件发送,我们也可以自己自定义模板发送邮件。
编辑alertmanager.yml
文件,修改相关配置信息:
global:
resolve_timeout: 5m
smtp_from: '15110820283@163.com'
smtp_smarthost: 'smtp.163.com:25'
smtp_auth_username: '15110820283@163.com'
smtp_auth_password: 'GKVAKHJHFFVSCLHG'
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 15s
group_interval: 30s
repeat_interval: 2m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '2420309401@qq.com'
html: '{{ template "email.tmpl" .}}'
headers: { Subject: "{{ .GroupLabels.SortedPairs.Values }} [{{ .Status | toUpper }}:{{ .Alerts.Firing | len }}]" }
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
templates:
- '/home/zhangshixing/prometheus/alertmanager-0.24.0.linux-amd64/email.tmpl'
邮件模板:
{{ define "email.tmpl" }}
{{- if gt (len .Alerts.Firing) 0 -}}
[{{ .Status | toUpper }}:{{ .Alerts.Firing | len }}]
{{ range $i, $alert := .Alerts }}
<pre>
告警程序: prometheus_alert <br>
告警级别: {{ .Labels.severity }} 级 <br>
告警类型: {{ .Labels.alertname }} <br>
故障主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
告警详情: {{ .Annotations.description }} <br>
开始时间:{{ $alert.StartsAt.Local }}
</pre>
{{ end }}
{{ end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
[{{ .Status | toUpper }}:{{ .Alerts.Resolved | len }}]
{{ range $i, $alert := .Alerts }}
<pre>
告警程序: prometheus_alert <br>
故障主机: {{ .Labels.instance }}<br>
故障主题: {{ .Annotations.summary }}<br>
告警详情: {{ .Annotations.description }}<br>
告警时间: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }}<br>
恢复时间: {{ .EndsAt.Local.Format "2006-01-02 15:04:05" }}<br>
</pre>
{{ end }}
{{ end }}
{{- end }}
进行测试:
告警之后进行恢复处理:
查看 Prometheus
中自动生成的 Alertmanager
的配置:
global:
resolve_timeout: 5m
http_config:
follow_redirects: true
smtp_from: 15110820283@163.com
smtp_hello: localhost
smtp_smarthost: smtp.163.com:25
smtp_auth_username: 15110820283@163.com
smtp_auth_password: <secret>
smtp_require_tls: false
pagerduty_url: https://events.pagerduty.com/v2/enqueue
opsgenie_api_url: https://api.opsgenie.com/
wechat_api_url: https://qyapi.weixin.qq.com/cgi-bin/
victorops_api_url: https://alert.victorops.com/integrations/generic/20131114/alert/
telegram_api_url: https://api.telegram.org
route:
receiver: email
group_by:
- alertname
continue: false
group_wait: 15s
group_interval: 30s
repeat_interval: 2m
inhibit_rules:
- source_match:
severity: critical
target_match:
severity: warning
equal:
- alertname
- dev
- instance
receivers:
- name: email
email_configs:
- send_resolved: true
to: 2420309401@qq.com
from: 15110820283@163.com
hello: localhost
smarthost: smtp.163.com:25
auth_username: 15110820283@163.com
auth_password: <secret>
headers:
From: 15110820283@163.com
Subject: '{{ .GroupLabels.SortedPairs.Values }} [{{ .Status | toUpper }}:{{
.Alerts.Firing | len }}]'
To: 2420309401@qq.com
html: '{{ template "email.tmpl" .}}'
require_tls: false
templates:
- /home/zhangshixing/prometheus/alertmanager-0.24.0.linux-amd64/email.tmpl
1.10 报警抑制
抑制是一个概念,如果某些其他警报已经触发,则抑制某些警报的通知。
抑制指的是当某类告警产生的时候,于此相关的别的告警就不用发送告警信息了。
我们对某台机器的 CPU 的使用率进行了监控,比如使用到 80% 和 90% 都进行了监控,那么我们可能想如果CPU
使用率达到了90%就不要发送80%的邮件了。
手动拉高系统的CPU使用率的命令:cat /dev/zero>/dev/null
。
1.10.1 告警规则
如果 cpu 在5分钟的使用率超过 80% 则产生告警信息。
如果 cpu 在5分钟的使用率超过 90% 则产生告警信息。
groups:
- name: Cpu
rules:
- alert: Cpu01
expr: "(1 - avg(irate(node_cpu_seconds_total{mode='idle'}[5m])) by (instance,job)) * 100 > 80"
for: 1m
labels:
severity: info # 自定义一个标签info级别
annotations:
summary: "服务 {{ $labels.instance }} cpu 使用率过高"
description: "{{ $labels.instance }} of job {{ $labels.job }} 的 cpu 在过去5分钟内使用过高,cpu 使用率 {{humanize $value}}."
- alert: Cpu02
expr: "(1 - avg(irate(node_cpu_seconds_total{mode='idle'}[5m])) by (instance,job)) * 100 > 90"
for: 1m
labels:
severity: warning # 自定义一个标签warning级别
annotations:
summary: "服务 {{ $labels.instance }} cpu 使用率过高"
description: "{{ $labels.instance }} of job {{ $labels.job }} 的 cpu 在过去5分钟内使用过高,cpu 使用率 {{humanize $value}}."
1.10.2 alertmanager.yml 配置抑制规则
抑制规则:
如果告警的名称为 alertname = Cpu02 并且告警级别 severity = warning,那么抑制住新的告警信息中标签为
severity = info 的告警数据,并且源告警和目标告警数据的 instance 标签的值必须相等。
# 抑制规则,减少告警数据
inhibit_rules:
- source_match: # 匹配当前告警规则后,抑制住target_match的告警规则
alertname: Cpu02 # 标签的告警名称是 Cpu02
severity: warning # 自定义的告警级别是 warning
target_match: # 被抑制的告警规则
severity: info # 抑制住的告警级别
equal:
- instance # source和target告警数据中,instance的标签对应的值需要相等。
1.10.3 邮件发送结果
可以看到 只发送了 warning
级别的告警,没有发送 info
级别的告警。
1.11 告警静默
静默是在给定时间内简单地将警报静音的直接方法,静默是基于匹配器配置的,就像路由树一样。检查传入警报是
否与活动静默的所有相等或正则表达式匹配器匹配。如果他们这样做,则不会发送该警报的通知。
静默是在 Alertmanager 的 Web 界面中配置的。
告警静默指的是处于静默期,不发送告警信息。
比如:我们系统某段时间进行停机维护,由此可能会产生一堆的告警信息,但是这个时候的告警信息是没有意义
的,就可以配置静默规则过滤掉。
配置静默规则需要在 alertmanager 的控制台,或通过 amtool 来操作。
进入Alertmanager UI,点击 New Silence 显示如下内容:
添加信息:
用户可以通过该 UI 定义新的静默规则的开始时间以及持续时间,通过 Matchers 部分可以设置多条匹配规则(字符
串匹配或者正则匹配)。填写当前静默规则的创建者以及创建原因后,点击 Create 按钮即可。
通过 Preview Alerts 可以查看预览当前匹配规则匹配到的告警信息。静默规则创建成功后,Alertmanager会开始
加载该规则并且设置状态为 Pending,当规则生效后则进行到Active状态。
当静默规则生效以后,从 Alertmanager 的 Alerts 页面下用户将不会看到该规则匹配到的告警信息。
对于已经生效的规则,用户可以通过手动点击 Expire 按钮使当前规则过期。
经过上述的配置,就收不到告警信息了。
我们通过发送 http 请求进行告警静默:
# 创建静默规则
$ curl "http://192.168.21.175:9093/api/v2/silences" -X POST -H "Content-Type: application/json" --data-raw "{\"matchers\":[{\"name\":\"severity\",\"value\":\"error\",\"isRegex\":false,\"isEqual\":true}],\"startsAt\":\"2023-07-01T04:50:00.000Z\",\"endsAt\":\"2023-07-02T08:50:00.000Z\",\"createdBy\":\"Admin\",\"comment\":\"\u9759\u9ed8\u544a\u8b66\",\"id\":null}"
# 返回
{"silenceID":"c504294c-cf71-4ad6-92a6-80ca2e636b41"}
# 查看静默规则
$ curl -X GET "http://192.168.21.175:9093/api/v2/silence/c504294c-cf71-4ad6-92a6-80ca2e636b41"
# 返回
{
"id": "c504294c-cf71-4ad6-92a6-80ca2e636b41",
"status": {
"state": "active"
},
"updatedAt": "2023-07-01T05:45:57.669Z",
"comment": "静默告警",
"createdBy": "Admin",
"endsAt": "2023-07-02T08:50:00.000Z",
"matchers": [{
"isEqual": true,
"isRegex": false,
"name": "severity",
"value": "error"
}],
"startsAt": "2023-07-01T05:45:57.669Z"
}
# 查询静默告警
$ curl -X GET "http://192.168.21.175:9093/api/v2/alerts?filter=severity="error"&silenced=true&inhibited=true&active=true"
# 返回
[]
过期:
# 设置静默规则过期
$ curl -X DELETE "http://192.168.21.175:9093/api/v2/silence/c504294c-cf71-4ad6-92a6-80ca2e636b41"
# 查看静默规则
$ curl -X GET "http://192.168.21.175:9093/api/v2/silences?silenced=false&inhibited=false&active=true"
# 返回
[{
"id": "c504294c-cf71-4ad6-92a6-80ca2e636b41",
"status": {
"state": "expired"
},
"updatedAt": "2023-07-01T05:48:52.002Z",
"comment": " 静默告警",
"createdBy": "Admin",
"endsAt": "2023-07-01T05:48:52.002Z",
"matchers": [{
"isEqual": true,
"isRegex": false,
"name": "severity",
"value": "error"
}],
"startsAt": "2023-07-01T05:45:57.669Z"
}]
1.12 告警路由
这里我们再次对 altermanager.yml
文件进行说明。
1.12.1 altermanager.yml配置文件的编写
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: '145xxx8387@qq.com'
smtp_auth_username: '1451578387@qq.com'
smtp_auth_identity: 'xxxxx'
smtp_auth_password: 'xxxxx'
smtp_require_tls: false
# 根路由,不能存在match和match_re,任何告警数据没有匹配到路由时,将会由此根路由进行处理。
route:
group_by: ['job']
group_wait: 10s
group_interval: 10s
repeat_interval: 120s
receiver: 'default-receiver'
routes:
- match_re:
alertname: 'Cpu.*' # 如果告警的名字是以 Cpu 开头的发给 receiver-01
receiver: 'receiver-01'
- match:
alertname: 'InstanceDown' # 如果告警的名字是 InstanceDown 则发送给 receiver-02
receiver: 'receiver-02'
group_by: ['instance'] # 根据 instance 标签分组
continue: true # 为true则还需要去匹配子路由。
routes:
- match:
alertname: 'InstanceDown' # 如果告警的名字是 InstanceDown 则还是需要发送给 receiver-03
receiver: 'receiver-03'
# 定义4个接收人(接收组等等)
receivers:
- name: 'default-receiver'
email_configs:
- to: '145xxx8387@qq.com'
send_resolved: true
- name: 'receiver-01'
email_configs:
- to: '2469xxx193@qq.com'
send_resolved: true
- name: 'receiver-02'
email_configs:
- to: 'weixin145xxx8387@163.com'
send_resolved: true
- name: 'receiver-03'
email_configs:
- to: 'it_xxx_software@163.com'
send_resolved: true
inhibit_rules:
- source_match:
alertname: Cpu02
severity: warning
target_match:
severity: info
equal:
- instance
告警结果:
1、告警名称中存在 Cpu 的发送给 receiver-01(2469xxx193@qq.com)
2、告警名称是 InstanceDown 的需要发送给 receiver-02(weixin145xxx8387@163.com)
和
receiver-03(it_xxx_software@163.com)
。
3、需要注意一下路由中的 continue
参数,为 true
,则需要在继续匹配子路由,为false
,不在匹配它下方的
子路由了。
当告警信息没有匹配到任务路由时,则由根路由 route
进行处理。
访问 https://www.prometheus.io/webtools/alerting/routing-tree-editor/
可以查看告警树。
在该网页我们填写上面的配置文件的内容和配置的标签集,然后点击生路由树:
生成的内容如下:
1.12.2 路由匹配
告警数据从最顶级的route进入路由树,根路由需要匹配所有的告警数据,不可以设置 match 和 match_re。每个
路由下,有自己的子路由。比如:某个告警,如果级别普通,则通知给用户A,如果过段时间还未恢复,变严重
了,则需要通知给张三和李四,那么可以通过子路由实现。
默认情况下,告警从根路由进入之后,会遍历它下方的所有的子路由,如果 route 中的 continue = false,那么在
匹配到第一个符合的路由之后就停止匹配了。 如果 continue = true 那么会继续进行匹配。如果所有的都没有匹配
到,那么走根路由。
1.13 自定义邮件模板
1.13.1 定义告警模板
cat email.template.tmpl
{{ define "email.template.tmpl" }}
{{- if gt (len .Alerts.Firing) 0 -}}{{ range.Alerts }}
告警名称: {{ .Labels.alertname }} <br>
实例名: {{ .Labels.instance }} <br>
摘要: {{ .Annotations.summary }} <br>
详情: {{ .Annotations.description }} <br>
级别: {{ .Labels.severity }} <br>
开始时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
{{ end }}{{ end -}}
{{- if gt (len .Alerts.Resolved) 0 -}}{{ range.Alerts }}
Resolved-告警恢复了。<br>
告警名称: {{ .Labels.alertname }} <br>
实例名: {{ .Labels.instance }} <br>
摘要: {{ .Annotations.summary }} <br>
详情: {{ .Annotations.description }} <br>
级别: {{ .Labels.severity }} <br>
开始时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
恢复时间: {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
{{ end }}{{ end -}}
{{- end }}
1.13.2 修改alertmanager.yml配置文件
1、加载告警模板的位置
global:
resolve_timeout: 5m
templates:
- '....../prometheus/alertmanager-0.21.0/templates/*.tmpl'
配置 templates
选项
2、接收人使用邮件模板
receivers:
- name: 'default-receiver'
email_configs:
- to: 'it_xxx_software@163.com'
send_resolved: true
html: '{{template "email.template.tmpl" . }}'
注意:
html: '{{template "email.template.tmpl" . }}'
中的 template 中的值为
{{ define "email.template.tmpl" }}
中的值。
1.13.3 其它邮件模板
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="viewport" content="width=device-width" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>{{ template "__subject" . }}</title>
<style>
/* -------------------------------------
GLOBAL
A very basic CSS reset
------------------------------------- */
* {
margin: 0;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
box-sizing: border-box;
font-size: 14px;
}
img {
max-width: 100%;
}
body {
-webkit-font-smoothing: antialiased;
-webkit-text-size-adjust: none;
width: 100% !important;
height: 100%;
line-height: 1.6em;
/* 1.6em * 14px = 22.4px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
/*line-height: 22px;*/
}
/* Let's make sure all tables have defaults */
table td {
vertical-align: top;
}
/* -------------------------------------
BODY & CONTAINER
------------------------------------- */
body {
background-color: #f6f6f6;
}
.body-wrap {
background-color: #f6f6f6;
width: 100%;
}
.container {
display: block !important;
max-width: 600px !important;
margin: 0 auto !important;
/* makes it centered */
clear: both !important;
}
.content {
max-width: 600px;
margin: 0 auto;
display: block;
padding: 20px;
}
/* -------------------------------------
HEADER, FOOTER, MAIN
------------------------------------- */
.main {
background-color: #fff;
border: 1px solid #e9e9e9;
border-radius: 3px;
}
.content-wrap {
padding: 30px;
}
.content-block {
padding: 0 0 20px;
}
.header {
width: 100%;
margin-bottom: 20px;
}
.footer {
width: 100%;
clear: both;
color: #999;
padding: 20px;
}
.footer p, .footer a, .footer td {
color: #999;
font-size: 12px;
}
/* -------------------------------------
TYPOGRAPHY
------------------------------------- */
h1, h2, h3 {
font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
color: #000;
margin: 40px 0 0;
line-height: 1.2em;
font-weight: 400;
}
h1 {
font-size: 32px;
font-weight: 500;
/* 1.2em * 32px = 38.4px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
/*line-height: 38px;*/
}
h2 {
font-size: 24px;
/* 1.2em * 24px = 28.8px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
/*line-height: 29px;*/
}
h3 {
font-size: 18px;
/* 1.2em * 18px = 21.6px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
/*line-height: 22px;*/
}
h4 {
font-size: 14px;
font-weight: 600;
}
p, ul, ol {
margin-bottom: 10px;
font-weight: normal;
}
p li, ul li, ol li {
margin-left: 5px;
list-style-position: inside;
}
/* -------------------------------------
LINKS & BUTTONS
------------------------------------- */
a {
color: #348eda;
text-decoration: underline;
}
.btn-primary {
text-decoration: none;
color: #FFF;
background-color: #348eda;
border: solid #348eda;
border-width: 10px 20px;
line-height: 2em;
/* 2em * 14px = 28px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
/*line-height: 28px;*/
font-weight: bold;
text-align: center;
cursor: pointer;
display: inline-block;
border-radius: 5px;
text-transform: capitalize;
}
/* -------------------------------------
OTHER STYLES THAT MIGHT BE USEFUL
------------------------------------- */
.last {
margin-bottom: 0;
}
.first {
margin-top: 0;
}
.aligncenter {
text-align: center;
}
.alignright {
text-align: right;
}
.alignleft {
text-align: left;
}
.clear {
clear: both;
}
/* -------------------------------------
ALERTS
Change the class depending on warning email, good email or bad email
------------------------------------- */
.alert {
font-size: 16px;
color: #fff;
font-weight: 500;
padding: 20px;
text-align: center;
border-radius: 3px 3px 0 0;
}
.alert a {
color: #fff;
text-decoration: none;
font-weight: 500;
font-size: 16px;
}
.alert.alert-warning {
background-color: #E6522C;
}
.alert.alert-bad {
background-color: #D0021B;
}
.alert.alert-good {
background-color: #68B90F;
}
/* -------------------------------------
INVOICE
Styles for the billing table
------------------------------------- */
.invoice {
margin: 40px auto;
text-align: left;
width: 80%;
}
.invoice td {
padding: 5px 0;
}
.invoice .invoice-items {
width: 100%;
}
.invoice .invoice-items td {
border-top: #eee 1px solid;
}
.invoice .invoice-items .total td {
border-top: 2px solid #333;
border-bottom: 2px solid #333;
font-weight: 700;
}
/* -------------------------------------
RESPONSIVE AND MOBILE FRIENDLY STYLES
------------------------------------- */
@media only screen and (max-width: 640px) {
body {
padding: 0 !important;
}
h1, h2, h3, h4 {
font-weight: 800 !important;
margin: 20px 0 5px !important;
}
h1 {
font-size: 22px !important;
}
h2 {
font-size: 18px !important;
}
h3 {
font-size: 16px !important;
}
.container {
padding: 0 !important;
width: 100% !important;
}
.content {
padding: 0 !important;
}
.content-wrap {
padding: 10px !important;
}
.invoice {
width: 100% !important;
}
}
</style>
</head>
<body itemscope itemtype="http://schema.org/EmailMessage">
<table class="body-wrap">
<tr>
<td></td>
<td class="container" width="600">
<div class="content">
<table class="main" width="100%" cellpadding="0" cellspacing="0">
<tr>
{{ if gt (len .Alerts.Firing) 0 }}
<td class="alert alert-warning">
{{ else }}
<td class="alert alert-good">
{{ end }}
{{ .Alerts | len }} alert{{ if gt (len .Alerts) 1 }}s{{ end }} for {{ range .GroupLabels.SortedPairs }}
{{ .Name }}={{ .Value }}
{{ end }}
</td>
</tr>
<tr>
<td class="content-wrap">
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td class="content-block">
<a href='{{ template "__alertmanagerURL" . }}' class="btn-primary">View in {{ template "__alertmanager" . }}</a>
</td>
</tr>
{{ if gt (len .Alerts.Firing) 0 }}
<tr>
<td class="content-block">
<strong>[{{ .Alerts.Firing | len }}] Firing</strong>
</td>
</tr>
{{ end }}
{{ range .Alerts.Firing }}
<tr>
<td class="content-block">
<strong>Labels</strong><br />
{{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}
{{ if gt (len .Annotations) 0 }}<strong>Annotations</strong><br />{{ end }}
{{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}
<a href="{{ .GeneratorURL }}">Source</a><br />
</td>
</tr>
{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
{{ if gt (len .Alerts.Firing) 0 }}
<tr>
<td class="content-block">
<br />
<hr />
<br />
</td>
</tr>
{{ end }}
<tr>
<td class="content-block">
<strong>[{{ .Alerts.Resolved | len }}] Resolved</strong>
</td>
</tr>
{{ end }}
{{ range .Alerts.Resolved }}
<tr>
<td class="content-block">
<strong>Labels</strong><br />
{{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}
{{ if gt (len .Annotations) 0 }}<strong>Annotations</strong><br />{{ end }}
{{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}
<a href="{{ .GeneratorURL }}">Source</a><br />
</td>
</tr>
{{ end }}
</table>
</td>
</tr>
</table>
<div class="footer">
<table width="100%">
<tr>
<td class="aligncenter content-block"><a href='{{ .ExternalURL }}'>Sent by {{ template "__alertmanager" . }}</a></td>
</tr>
</table>
</div></div>
</td>
<td></td>
</tr>
</table>
</body>
</html>
{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
=====================
{{- end }}
===告警详情===
告警详情: {{ $alert.Annotations.message }}
故障时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
===参考信息===
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {{ $alert.Labels.instance }};{{- end -}}
{{- if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
{{- if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {{ $alert.Labels.node }};{{- end -}}
{{- if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {{ $alert.Labels.pod_name }}{{- end }}
=====================
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
=====================
{{- end }}
===告警详情===
告警详情: {{ $alert.Annotations.message }}
故障时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
恢复时间: {{ $alert.EndsAt.Format "2006-01-02 15:04:05" }}
===参考信息===
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {{ $alert.Labels.instance }};{{- end -}}
{{- if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
{{- if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {{ $alert.Labels.node }};{{- end -}}
{{- if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {{ $alert.Labels.pod_name }};{{- end }}
=====================
{{- end }}
{{- end }}
{{- end }}
1.14 常用配置说明
1.14.1 alertmanager.yml
# qq邮箱
smtp.qq.com:465
# 163邮箱
smtp.163.com:25
route:
# 报警时间相关配置
# 收到报警后会根据分组等待group_wait时间,这时间内的同组的报警将一起发出
group_wait: 20s
# 同一个分组下之前已经发送成功过,进入新的alert时等待group_interval
group_interval: 5m
# alert group报警发送成功且没有变化则等待repeat_interval后发送报警,默认1h
repeat_interval: 120s
1.14.2 prometheus.yml
global:
scrape_interval: 15s # 数据采集间隔,也就是设置多少时间间隔采集一次数据
evaluation_interval: 15s # 评估告警周期
scrape_timeout: 30s # 数据采集超时时间默认10s
rule_files: # 报警规则配置
# - "first_rules.yml"
# - "second_rules.yml"
- "rule/*.yml"
scrape_configs:
# 采集任务名称
- job_name: 'mall-tiny-grafana'
# 采集时间间隔
scrape_interval: 5s
# 采集超时时间
scrape_timeout: 10s
# 采集数据路径
metrics_path: '/actuator/prometheus'
# 采集服务的地址
# 如果Exporter应用运行在Docker容器中,需要使用
# docker inspect mall-tiny-grafana | grep IPAddress来获取容器IP地址
static_configs:
- targets: ['172.17.0.5:8088']
1.14.3 rules.yml
rule.yaml
用来配置报警规则,常用的报警规则可以参考下面。
报警规则大全:https://awesome-prometheus-alerts.grep.to/rules.html
groups:
- name: host down
rules:
- alert: node-down
expr: up{} != 1
for: 15s # 报警持续时间
Alert 的三种状态:
-
pending(报警持续时间):警报被激活,但是低于配置的持续时间。这里的持续时间即 rule 里的 for 字段设置
的时间,该状态下不发送报警。
-
firing(推送报警):警报已被激活,而且超出设置的持续时间,该状态下发送报警。
-
inactive(评估告警周期):既不是 pending 也不是 firing 的时候状态变为 inactive。
prometheus 触发一条告警的过程:prometheus—>触发阈值—>超出持续时间—>alertmanager—>分组|抑制|
静默—>媒体类型—>邮件|钉钉|微信等。
1.15 Docker安装Altermanager
搜索镜像:
$ docker search prom/alertmanager
下载镜像:
$ docker pull prom/alertmanager
启动:
$ /opt/alertmanager/alertmanager.yml
# 内容
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
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']
$ docker run -d --name alertmanager -p 9093:9093 -v /opt/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager
浏览器访问 http://192.168.54.195:9093/
: