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)
}

posted @ 2024-11-13 01:27  尹正杰  阅读(92)  评论(0编辑  收藏  举报