alertmanager实现告抑制(inhibit)制及静默(Silence)
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
目录
一.alertmanager实现告警抑制(inhibit)
1.告警抑制的应用场景
所谓的告警抑制指的是某些其他告警已经触发,则抑制某些告警的通知。
告警抑制多用于某些高等级的告警已出发,然后低等级的被抑制:
- 如机器宕机告警触发,则机器上的进程存活监控都被抑制;
- 如region基础网络组件告警触发,region内部的服务端口探活都被抑制;
2.默认的告警抑制解读
# 配置告警抑制规则
inhibit_rules:
# 如果"alertname","dev","instance"的值相同的前提条件下。
# 则当触发了"severity: critical"告警,就会抑制"severity: warning"的告警信息。
- source_match:
severity: critical
target_match:
severity: warning
equal:
- alertname
- dev
- instance
3.实战案例
3.1 定义Prometheus的规则文件
1.实验前提
定义region标签的值相同配置多条告警,当"severity: critical"触发时,就会抑制"severity: warning"的告警。
2.定义规则文件
[root@prometheus-server31 ~]# cat /yinzhengjie/softwares/prometheus-2.53.2.linux-amd64/yinzhengjie_rules.yml
groups:
- name: xixi
rules:
- alert: yinzhengjie_mysqld_exporter-alert
expr: node_boot_time_seconds{instance="10.0.0.42:9100", job="yinzhengjie_mysqld_exporter"} > 0
labels:
severity: critical
blog: "https://www.cnblogs.com/yinzhengjie"
region: beijing
annotations:
summary: DBA机器异常
- name: haha
rules:
- alert: yinzhengjie_bigdata_exporter-alert
expr: node_boot_time_seconds{instance="10.0.0.43:9100", job="yinzhengjie_bigdata_exporter"} > 0
labels:
severity: warning
auther: 尹正杰
region: beijing
annotations:
summary: 大数据集群机器异常
[root@prometheus-server31 ~]#
3.2 修改alertmanager规则文件
[root@prometheus-server31 ~]# cat /yinzhengjie/softwares/alertmanager-0.27.0.linux-amd64/alertmanager.yml
route:
group_by: ['alertname']
group_wait: 1s
group_interval: 3s
repeat_interval: 1m
# 默认发给"sre_system"组用户
receiver: 'sre_system'
continue: false
# 配置子路由
routes:
- receiver: 'sre_dba'
match_re:
job: yinzhengjie_mysqld_exporter
# 建议将continue的值设置为true,表示当前的条件是否匹配,都将继续向下匹配规则
# 这样做的目的是将消息发给最后的系统组(sre_system)
continue: true
- receiver: 'sre_bigdata'
match_re:
job: yinzhengjie_bigdata_exporter
continue: true
- receiver: 'sre_system'
match_re:
job: .*
continue: true
receivers:
- name: 'sre_system'
webhook_configs:
- url: 'http://10.0.0.42:6666/alert'
http_config: {}
max_alerts: 0
send_resolved: true
- name: 'sre_dba'
webhook_configs:
- url: 'http://10.0.0.42:7777/alert'
http_config: {}
max_alerts: 0
send_resolved: true
- name: 'sre_bigdata'
webhook_configs:
- url: 'http://10.0.0.42:8888/alert'
http_config: {}
max_alerts: 0
send_resolved: true
# 配置告警抑制规则
inhibit_rules:
# 如果"region"的值相同的前提条件下。
# 则当触发了"severity: critical"告警,就会抑制"severity: warning"的告警信息。
- source_match:
severity: critical
target_match:
severity: warning
equal:
- region
[root@prometheus-server31 ~]#
3.3 测试验证
如上图所示,告警本质上都是触发了,但是实际上alertmanager进队数据库组的进行报警。
如下图所示,报警的日志可以看出来,对于大数据组的消息始终没有发出来。
二.alertmanager实现告警静默(Silence)
1.告警静默的应用场景
当我们需要发布上线,或者下线节点做维护动作时,这些事情是我们提前预知的,就可以阻止警告发生,我们称之为静默。
alertmanager的静默接口:
/api/v2/silences
2.基于也没配置静默
2.1 New Silence
如上图所示,我们点击"New Silence"就可以新建一个静默规则。
2.2 编写静默模式
如上图所示,在新建规则,根据需求配置即可
2.3 查看受影响的静默规则
如上图所示,我们的静默规则生效啦。
2.4 触发报警测试
[root@prometheus-server31 ~]# systemctl restart prometheus-server.service
[root@prometheus-server31 ~]#
[root@alertmanager44 ~]# systemctl restart alertmanager.service
[root@alertmanager44 ~]#
2.5 关闭静默模式
如上图所示,如果我们想要关闭静默模式,直接在WebUI上让对应的静默规则过期即可。
2.6 验证静默模式是否关闭
如上图所示,当我们关闭静默模式后,就可以避免触发告警规则啦~
3.基于API发起静默模式
package main
import (
"bytes"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"time"
"github.com/prometheus/alertmanager/pkg/labels"
"github.com/prometheus/alertmanager/types"
)
func CreateSilence(alertmanagerAddr string) {
matachers := labels.Matchers{}
match := &labels.Matcher{
Type: labels.MatchEqual,
Name: "region",
Value: "北京市",
}
matachers = append(matachers, match)
slience := types.Silence{
ID: "",
Matchers: matachers,
StartsAt: time.Now(),
EndsAt: time.Now().Add(8 * time.Hour),
CreatedBy: "尹正杰",
Comment: "尹正杰k8s版本升级",
Status: types.SilenceStatus{},
}
jsonStr, _ := json.Marshal(slience)
req, err := http.NewRequest("POST", alertmanagerAddr, bytes.NewBuffer(jsonStr))
if err != nil {
return
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
log.Printf("http.post.request.err|url: %v|err: %v", alertmanagerAddr, err)
return
}
defer resp.Body.Close()
log.Printf("response Status: %v", resp.Status)
log.Printf("response Headers: %v", resp.Header)
body, _ := ioutil.ReadAll(resp.Body)
log.Printf("response Body: %v", string(body))
}
func main() {
alermanagerSilence := "http://10.0.0.44:9093/api/v2/silences"
CreateSilence(alermanagerSilence)
}
本文来自博客园,作者:尹正杰,转载请注明原文链接:https://www.cnblogs.com/yinzhengjie/p/18542942,个人微信: "JasonYin2020"(添加时请备注来源及意图备注,有偿付费)
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。