• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

Promethues 告警触发流程 告警收敛: 分组 抑制 静默

什么是告警收敛?

在对节点或服务的日常监控中,收到的警报太多,如一下就几十封,或者很多不必要的邮件发来,容易导致人很麻木,这样时间久了,遇到比较严重的警报,我们也会放松警惕性。

面对这种情况,alertmanager 收敛可很好解决这个问题,就是当Prometheus成功的把一条告警发给了Alertmanager,而Alertmanager并不是简简单单的直接发送出去,而是合理做一些控制,这样就不会导致告警信息过多,重要告警被淹没。

  • 分组(group):将类似性质的警报分类为单个通知,同类告警聚合帮助运维排查问题

  • 抑制(Inhibition):当警报发出后,停止重复发送由此警报引发的其他警报

  • 静默(Silences):是一种简单的特定时间静音提醒的机制(时间段内,根据规则,不发警报)

Promethues告警触发流程.png

分组:

分组(group): 将类似性质的警报合并为单个通知

优势:

假设有一大堆关于MySQL的告警,但是希望在分析问题时能够针对不同的实例进行,所以可以针对不同实例进行分组。每一个告警都会被分往不同实例分组中去,每一个分组最后都会合成一个消息发送给接收者。

所以最后运维人员收到的是一封封邮件,而每一封邮件都是关于一个实例的告警。通过这种方式有效的减少了告警消息数量。

示例:假设MySQL A产生了一个报警,另外一台MySQL B,这台MySQL挂掉了,监控系统检测到IO线程SQL也挂了。通过ID进行分组,不同的实例分配到不同的分组,最后运维将会收到两条告警消息,一条是关于MySQL A CPU过高的告警;另外一条是关于MySQL B挂掉的告警消息。

  group_by: [‘alertname‘]      # 以标签作为分组依据
  group_wait: 10s                # 分组报警等待时间
  group_interval: 10s            # 发送组告警间隔时间
  repeat_interval: 1h            # 重复告警发送间隔时间


image.png


抑制 inhibition:

当警报发出后,停止重复发送由此警报引发的其他警报,可以消除冗余告警

优势:假设有一台主机挂掉了,上面运行着MySQL的服务,这个时候主机挂掉MySQL挂掉两条告警到达Alertmanager的顺序可能不一样,运维人员接收的告警顺序也可能不一样。如果先收到MySQL服务挂掉的告警,排查问题的思路可能就往别的方向走了,但是实际上这不是最根本的原因,所以我们可以通过抑制,将主机挂掉的告警把这主机上面MySQL服务挂掉告警抑制掉,最后只收到主机挂掉的告警。这样能够把冗余信息消除掉,最后得到故障发生最本质的原因。

示例:假设MySQL服务器A上面运行着MySQL服务,当这台服务器突然宕机时候,这两条告警都会出来,但是你配置一条抑制规则,抑制掉MySQL的告警,最后收到服务器挂掉的告警。

inhibit_rules:
  - source_match:                # 当此告警发生,其他的告警被抑制
      severity: ‘critical‘   
    target_match:                # 被抑制的对象
      severity: ‘warning‘  
    equal: [‘id‘, ‘instance‘]


image.png

配置文件:vim alertmanager.yml
 # inhibit_rules标记:降低告警收敛,减少报警,发送关键报警
 inhibit_rules:
   # source_match: 匹配当前告警发生后其他告警抑制掉
   - source_match:
       # severity: 指定告警级别
       severity: 'critical'
     # target_match:  抑制告警
     target_match:
       # severity: 指定抑制告警级别
       severity: 'warning'
     # equal: 只有包含指定标签才可成立规则
     equal: ['alertname', 'dev', 'instance']


静默 silences:

是一种简单特定时间静音的机制

优势:假设你有一堆分别关于MySQL实例1、2、3的告警,如果服务器要升级维护,不希望这个时间段收到关于实例1的告警,可以先设置这个时间段告警静默,就能不再收到关于这台实例的告警,但是你仍然可以收到其他实例的告警,通过这种方式你可以阻止系统发送一些可以预期的告警。

示例:假设要在MySQL A上面跑一个批处理任务,这个批处理任务消耗系统资源比较大,会触发这些告警。同时你的系统中还有一台MySQL B的服务器,这个是对外提供服务的,你不希望把它的报警给静默掉,所以可以配置一条静默规则,把MySQL A告警给静默掉,最后就收不到关于MySQL A的告警,同时其他服务不会被影响到

# 静默在 alertmanager 的 web界面 silence 里面配置

  • 选择 create silence 创建一个新的静默配置

  • 在 start 与 end 中填写静默的时间段

  • 在 name 中给 silence 取名

  • 在 Value 中 填写需要静默的实例(例如172.16.214.141:9100)

# 配置完成后在静默的时间端就看不到此实例的报警了

1、创建静默

image.png

2、填入开始结束时间,填写标签名称,保存

image.png

3、查看创建静默

image.png

延时 Delay

系统发生故障产生告警,每分钟发送一条告警消息,这样的告警信息十分令人崩溃。Alertmanager提供第一个参数是repeat interval可以将重复的告警以更大频率发送,但是只有这个参数会带来两个的问题。

问题一:第一个问题是告警不能及时收到。假设当前发送一条告警,下一次告警在一个小时之后,但在这一个小时之内系统产生了一条告警,这时告警无法被及时发出去。所以alertmanager提供了第二个参数group inteval,让报警能够及时的发送出去。

问题二:当故障发生时,告警条件一个个被满足,到达Alertmanager的顺序也分先后,所以在最开始的时候可能收到多个消息。Alertmanager提供了第三个参数叫做group wait,在一个分组收到第一条报警消息之后,通过等到group wait,把故障最开始发生时候产生告警收敛掉,最后作为一条消息发送出来。





0
0
下一篇:windows 下 tree 目录树

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。