参考资料:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
global:
smtp_smarthost: 'smtp.mxhichina.com:465'
smtp_from: 'monitor@xxx.com'
smtp_auth_username: 'monitor@xxx.com'
smtp_auth_password: 'xxx'
smtp_require_tls: false
resolve_timeout: 5m
route:
group_by: ['alertname'] # 在等待时间内当前group接收到了新的告警,这些告警将会合并为一个通知向receiver发送。
group_wait: 10s # 一组告警第一次发送之前等待的时间。用于等待抑制告警,或等待同一组告警采集更多初始告警后一起发送。(一般设置为0秒 ~ 几分钟)
group_interval: 1m # 相同的group之间发送告警通知的时间间隔
repeat_interval: 9m # 一条成功发送的告警,在再次发送通知之前等待的时间
receiver: 'webhook'
receivers:
- name: 'webhook'
webhook_configs:
- url: 'http://holli-gpaas-monitor-svc.monitoring.svc.cluster.local:8080/monitor/v1/rule/alertmanager'
send_resolved: false
# url: 'http://prometheus-service.monitoring.svc.cluster.local:5001/api/v1/alertmanager'
- name: 'email'
email_configs:
- to: '517554016@qq.com'
send_resolved: false
inhibit_rules:
- source_match:
severity: 'warning'
target_match:
severity: 'info'
equal: ['alertname', 'InternalIP']

1、alertmanager webhook

当用户定义webhook用于接收告警信息后,当告警被触发时,Alertmanager会按照以下格式向这些url地址发送HTTP Post请求,请求内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"version": "4",
"groupKey": <string>, // key identifying the group of alerts (e.g. to deduplicate)
"status": "<resolved|firing>",
"receiver": <string>,
"groupLabels": <object>,
"commonLabels": <object>,
"commonAnnotations": <object>,
"externalURL": <string>, // backlink to the Alertmanager.
"alerts": [
{
"labels": <object>,
"annotations": <object>,
"startsAt": "<rfc3339>",
"endsAt": "<rfc3339>"
}
]
}

有部分数据可参考:http://\prometheus:port/api/v1/alerts 接口返回的数据。

2、告警流程梳理

PrometheusRule里面的for: 4m表示:评估等待时间(Pending Duration),用于表示只有当触发条件持续4分钟后才发送告警,在等待期间新产生的告警状态为pending。如果告警持续超过4分钟,告警状态则由Pending变为Firing。Active Since为第一次满足触发条件的时间点。

这个参数主要用于降噪,很多类似响应时间这样的指标都是有抖动的,通过指定 Pending Duration,我们可以过滤掉这些瞬时抖动,可以让我们能够把注意力放在真正有持续影响的问题上。

告警状态变为Firing后,就可以在Alertmanager UI界面中查到告警了,告警时间为Active Since时间。

1
2
3
group_wait: 10s
group_interval: 1m
repeat_interval: 9m

告警过程:

1、alertmanager收到告警后,等待group_wait(10s),发送第一次通知

2、未达到group_interval(1m 10s),休眠

3、达到group_interval(1m 10s)时,小于repeat_interval(9m 10s),休眠

4、到第10个group_interval(10m 10s),大于repeat_interval(9m 10s),发送第二次通知

Firing(0s) - 第一次通知(10s) - 第二次通知(10m 10s)

结论

当repeat_interval小于group_interval时,repeat_interval不影响告警

当repeat_interval大于group_interval,且不为group_interval倍数,影响告警

当repeat_interval大于group_interval,且为group_interval倍数,可能影响告警(*注)

注:

当repeat_interval大于group_interval,且为group_interval倍数时,可能发生两种情况:

  • 在repeat_interval时发出告警
  • 在repeat_interval + group_interval时发出告警(原因是如果repeat_interval是group_interval的倍数,则在需要发出通知时会同时判断两个值,程序耗时 + 网络耗时会导致对比结果不准确)