介于Alertmanager设计告警降噪系统 成本低可落地
转转基于Prometheus落地了一体化监控系统,并自研了告警系统,但研发同学每人每天都会接收到很多告警,导致重要的告警被淹没,部分同学会选择直接屏蔽掉所有告警,进一步加重问题。告警过多等同于没有告警。 另外,多个告警之间通常具有一定的关联性,如:SQL执行错误告警导致异常日志过多告警。而面对杂乱无章的告警,很难快速分析出告警的根本原因。 告警降噪治理十分重要,在此背景下,我们基于Alertmanager扩展研发了转转告警中心。 Alertmanager提供了告警发送的OpenAPI,其中,告警的labels用于识别同一条告警并对告警去重、降噪,相同labels的告警的annotations会被覆盖。startsAt与endsAt分别为告警发生时间与结束时间。 复制 [ { "labels": { "<labelname>": "<labelvalue>", ... }, "annotations": { "<labelname>": "<labelvalue>", }, "startsAt": "<rfc3339>", "endsAt": "<rfc3339>", "generatorURL": "<generator_url>" }, ... ] Alertmanager为基于标签的告警降噪,需提前规范告警常见标签。 ENV:环境,如:线上环境、测试环境 APP:服务名 SOURCE:告警来源,如:日志告警、JVM告警 NAME:告警名称 LEVEL:告警等级,如:P0告警、P5告警 INSTANCE:告警实例IP RECEIVER_TYPE:告警接受者类型 RECEIVER:告警接受者,与RECEIVER_TYPE配合使用,如RECEIVER_TYPE=邮件,RECEIVER即为邮箱地址。 Alertmanager标签名的正则规则为[a-zA-Z_][a-zA-Z0-9_]*,在真正发送通知时,最好将标签名做一次中文映射转换。 我们针对Alertmanager开发了发送告警的SDK,如下所示,发送告警非常简单,SDK默认会为每条告警自动增加服务名、环境、IP、告警等级,并按照接收方拆开为多条告警发送。每一项内容都是标签,其中value较为特殊,放在了annotations内,其他均放在了labels内用于唯一识别一条告警。 AlertManager alertManager = AlertManager.builder() //告警名称,必传 .name("告警Demo") //告警标签,拓展信息,非必传 .label("label1", "value1") .label("label2", "value2") //告警值,非必传 .value("123") //指定为企业微信告警,并指定发送人 .wechat("zhangsan", "lisi") .build(); //同步发送告警 alertManager.send(); //异步发送,默认线程池 alertManager.sendAsync(); //自定义线程池发送 ThreadPoolExecutor executor; executor.execute(alertManager); 分组机制可以将多条告警信息合并成一个通知。例如,当集群中有数百个正在运行的服务实例,假如此时发生了网络故障,结果就会有数百个告警被发送到Alertmanager。 而作为用户,可能只希望能够在一个通知中就能查看哪些服务实例受到影响。这时可以按照服务所在集群或者告警名称对告警进行分组,将这些告警聚合在一起成为一个通知。 (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |