被报警大量骚扰?来看看治理方法论

简介: 本文记录了作者组内监控治理过程和治理心得。

image.png

来源|阿里云开发者公众号

作者|遥凊

一、监控降噪背景

五月六月以来,蚂蚁开启监控治理主题,推进监控进一步完善,做到既能即时响应告警——五分钟响应三十分钟处理完毕,又能过滤降噪,避免处理疲劳。除了响应公司治理主题之外,小组内部告警的噪音也是一直积累的问题,这是由于随着项目和小组的发展,不可避免的使得配置的监控越来越多,累积的不健康监控增加,导致人均处理告警持续增加。因此,于六月份启动组内监控治理,同时记录治理心得。

二、为什么降噪治理很有必要?

1.避免告警疲劳,提高效率:监控报警在一个小组或项目成立的初期,往往会使人十分紧张,随着其中夹杂噪音增多,处理人员便会逐渐告警疲劳,对监控告警越来越不重视,从而导致对线上告警敬畏减少,真正有效的告警被淹没在了噪声中。同时增加了大量不必要的工作量,疲于应付报警,降低效率。·2.节省资源,同时保持系统稳定:线上监控系统通常会持续地对系统进行监控,如果监控报警太频繁,会占用大量的系统资源,导致系统性能下降,也会影响系统的稳定性。因此,降噪可以节省系统资源,提高系统的性能。

三、告警治理


3.1 如何查看噪音?

利用集团的极光报警数据看板可以非常简单的看到噪音数和故障数等数据,以及五分钟发现率和三十分钟完结率(衡量应急效率的重要指标),从而获取针对性的改进信息。同时可以对打标类型选择噪音进行筛选,并定位到对应事件,以及其对应事件id匹配的监控进行针对行监控降噪治理。

图 1. 噪音数和故障数等趋势

利用应急事件详情可快速定位对应监控,其中红框是监控id,对应于antmonter(集团监控系统)所配置报警监控。



图 2. 噪音及对应事件和监控


3.2 降噪方法论

1. 如何衡量监控效果

对于监控报警而言,衡量效果最有效的指标为召回率——即衡量能够正确识别出正样本的百分比。召回率的计算公式为:召回率 = 正确识别的正样本数 / 所有正样本数。对于监控能够保证召回率接近 100%,同时尽量提升准确率。在保证召回率,识别线上问题的同时,提升准确率降低噪音,便是监控治理要做的事。

2. 监控规则

有了衡量效果的指标,我们就需要对监控进行降噪。目前监控主要使用的是规则降噪,分为普通规则和智能规则。普通规则更加个性化、更加方便实用,也有主要缺点:需要开发者同时对监控系统和组内业务非常了解,能够预估报错量,随着业务的发展要经常更正,同时容易由于数据波动出现告警遗漏、告警频繁。那么针对普通规则,如何进行降噪?

(a). 避免维度单一

单一维度的监控配置,往往难以到达较好的监控效果,同时极易产生噪音。例如,单一设置业务成功量或失败量,当n个单位采集时间低于或高于某阈值时报警。这种方法往往会在某些时刻频繁报警,例如半夜,早晚高峰等等。必须根据业务场景增加多维度触发条件,解决该问题方案如下:

1. 成功量级 + 成功率 / 失败量级 + 成功率 适用降噪场景:成功量上升,是因为总量上升导致;失败量下降,是因为总量下降导致。

2. 成功量级 + 成功率 + 总量 适用降噪场景:避免极少业务量场景下极端失败情况,例如两笔业务量,一笔失败或两笔都失败 导致的报警。

3. 成功率 + 失败数量 适用降噪场景:同样适用极少业务量场景下极端失败情况。

4. 设置采集周期 适用降噪场景:避免冲高回落导致的针状突出噪音,如网络抖动导致问题。其中周期的范围则需要开发运维人员更具业务量级和组内业务自行确定,通过召回率和准确率进行确定。

(b). 利用黑白名单

对于一部分监控,总会存在部分业务或接口极易超出设置报警阈值的情况,此时利用黑白名单进行单独配置即可。

1.应用调用下游接口成功率监控,如果存在部分接口因业务问题造成失败,或部分外部调用接口经常失败且无影响,我们就需要将其进行单独配置监控。首先通过噪音打标场景查出经常报警且标记为噪音的接口,在监控处通过黑白名单,黑名单过滤掉噪音接口,并对其配置一项敏感度较高的阈值,再配置一个监控,将这些接口加白,白名单部分减少监控敏感度。



图5 敏感度配置

2. 业务错误码报警。监控平台能够自定义配置所需监控错误码,其来源于日志当中有一些信息,可以用来帮助我们判断是否需要关心这种日志。在进行数据采集时,可以自定义所需要关注的日志数据,并配置白名单值,如图6所示,之后可以选中其在产出日志所在位置,利用监控自动进行数据获取,如图7所示。

image.png

图6. 自定义日志数据采集白名单

图7. 日志数据采集范围

(c). 利用环比和同比

业务的总量,成功量,接口的调用成功率,单机应用error总数等等,总会存在一个数据惯性,如果最近一小时总量总是维持在每分钟100,几乎不可能会突变至每分钟总量1000且持续存在。这样我们就认为惯性失效,可能存在异常从而告警。这就衍生出环比和同比的作用。环比和同比是什么?

环比,是指相邻两个时间段之间值的比较,即纵向的对比。以时刻为例,环比就是指此刻一小时与上一小时同一指标的变化率,计算公式为:(当前一小时指标-上一小时指标)/上一小时指标。

同比,是指同一时间段相邻值之间的比较,即横向的对比。以天为例,同比就是指今日此刻与昨日此刻同一指标的变化率,计算公式为:(今日此刻数值-昨日此刻数值)/昨日此刻数值。

由此可见,利用环比可监控惯性的变化,而利用同比可排除惯性的错误情况。对于监控而言,我们通常可以选择 采集周期为当前五分钟与上一个五分钟作为环比,监控其下降或者上升的程度,从而监控惯性的变化。选择同一时期与昨日或者上周作为同比,监控其下降或者上升的程度,从而判断惯性变化是否所为异常。



图8. 同比与环比监控


3. 利用智能降噪

智能降噪作为antmonter给出的智能工具,可以有效进行降噪。

a.告警抑制:告警抑制可以帮助在大量报警风暴的情况下进行降噪,设置抑制采集周期数(如周期为一分钟,则设置周期数为5则抑制五分钟报警)。

b.短周期抖动:短周期抖动是一种网络抖动等原因导致瞬间凸状报错周期,会导致采集周期内整体数据求和、求平均值等偏高超过阈值而产生告警。输入短周期比例,则可以在产生该比率的报警周期时抑制,例如,采集周期为N,短周期比率A,则产生的报警在N * A内,则会被抑制。

c.冲高回落:冲高回落通常是指指标在一段时间内呈现出明显的上升趋势,突破了某个阈值或警戒线,但随后迅速回落到原来的水平,相当于是一次短暂的异常波动。冲高回落是指监控指标在一段时间内上涨后又下跌。当勾选该模式后,若出现监控指标在设置时间段内的持续冲高后又下跌回平稳状态,将不会触发告警通知。




4. CDO报警降噪

CDO(Complex Event Detection and Optimization)报警是一种复杂事件的监测,用于对系统的异常事件和性能问题进行监测和排查。对于CDO报警的降噪,除了打印error,warn日志规范外,还有对异常抛出的规范。对于一个应用来说,通常需要定义一个专有业务异常来服务于业务系统,并在出现可控业务问题时进行抛出,而出现未在可控范围内异常时再使用通用异常。下面举个例子来进行异常与日志的搭配代码

首先定义业务异常 BizException


public class BizException extends RuntimeException {    /** serialVersionUID */    private static final long serialVersionUID = 5840651686530819567L;
    /** 异常错误代码 */    private ResultCodeEnum    code             = ResultCodeEnum.UN_KNOWN_EXCEPTION;
    /**     * 创建一个<code>BizException</code>     *      * @param code 错误码     */    public BizException(ResultCodeEnum code) {        super(code.getMsg());        this.code = code;    }
   /**     * 创建一个<code>BizException</code>     *      * @param code 错误码     * @param message 自定义错误信息     */    public BizException(ResultCodeEnum code, String message) {        super(message);        this.code = code;    }}


其次,定义业务处理模板,当抛出业务异常时,在生产环境会进行warn日志打印,而对于其余不在可控之中的异常,则使用error日志打印。在抛出可控,不会导致系统崩溃或无法使用异常时,应抛出业务异常,如此进行规范化。

public class HandleTemplate {
       public void execute(final Response response, final HandleCallback action) {        Profiler.enter("开始进入操作模板");        try {
            action.doPreAction();
            action.doAction();
            action.doPostAction();
        } catch (BizException be) {            if (EnvEnum.DEV.getType().equals(EnvUtil.getExactEnv())) {                LogUtil.error(LOGGER, be, "业务异常:");            } else {                LogUtil.warn(LOGGER, be, "业务异常:");            }            ResultUtil.generateResult(response, be);        } catch (IntegrationException ie) {            LogUtil.error(LOGGER, ie, "查询业务异常:" + ie.getMessage());            ResultUtil.generateResult(response, ie);        } catch (Throwable e) {            LogUtil.error(LOGGER, e, "操作系统异常:" + e.getMessage());            ResultUtil.generateResult(response, ResultCodeEnum.SYSTEM_ERROR, e.getMessage());        } finally {
        }    }
}


此外,对于warn日志和error日志的使用也需要进行规范化,WARN日志应该用于记录系统发生了一些异常事件,但

这些事件不会导致系统崩溃或无法使用。例如输入参数异常或不规范,输入的参数为空、非法、越界等。ERROR日志通常用于输出一些严重错误信息,表示系统发生了一些致命的错误,例如空指针异常导致系统崩溃、无法使用,未授权访问、入侵等。如此进行规范化,则可以正确治理CDO报警。


5. 其余方式

此外,还有一些比较有必要的降噪方法,以适合不同场景下的降噪情况。

1.去除预发环境。去除预发环境的监控报警,只订阅生产环境,避免无谓的资源消耗和时间消耗。

2.设置生效时间段。根据业务时间调整生效时间段,对于有高低峰期业务特性,配置生效时间段,从而减少低峰期报警噪音。同时设置生效时间段 + 连续N分钟内只报警一次,可以避免大量报警风暴。

3.报警抑制,避免报警风暴。

4.去除不必要和重复报警,正确订阅报警,如一些自动配置化的报警,以及做好报警监控日志分析,避免大量重复覆盖流量的监控报警。

5.发送渠道优化。根据业务重要程度设置不同报警渠道,避免大量短信邮件轰炸。


3.3. 治理结果

自六月治理报警以来,噪音数已经大大减少,从占整体事件的61.70%下降到12.80%,同时打标为故障数的报警数量维持变化不大,可以说明监控保持召回率不变的同时,准确率大大提升。

五月噪音率:

六月噪音率:

最后一定要注意,降噪的治理一定要结合业务实际,并在降噪后的一定时间内以指标进行衡量,如召回率,准确率等,否则以个人感觉进行调整,就会有可能出现线上问题被屏蔽的情况!降噪的目的,是保证召回率的同时,尽量提高准确率。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
存储 消息中间件 安全
计算与存储分离实践—swift消息系统
swift是搜索事业部自主研发分布式消息系统,它的主要存储基于分布式文件系统,资源需求基于分布式调度系统。swift能支持每秒数亿的消息传递,支持PB级消息的存储。
7361 0
|
人工智能 监控 Cloud Native
深度剖析电商API监控与报警:守护电商系统稳定的核心策略
电商API监控与报警是保障电商业务稳定运行的关键工具。文章从重要性、关键指标(如响应时间、成功率、错误率等)、技术工具(如日志监控、性能监控、异常检测)及实施步骤等方面详细阐述了如何构建高效的监控体系。通过案例分析,如京东的商品API实战,展示了全链路追踪与智能告警的应用价值。未来,随着AI、自动化和云原生技术的发展,电商API监控将更加智能高效,助力提升用户体验与业务效率。
|
机器学习/深度学习 安全 数据挖掘
安全地运行 Jupyter 服务
【8月更文第29天】Jupyter Notebook 是一种流行的交互式计算环境,广泛应用于数据分析、机器学习等领域。然而,随着 Jupyter 服务越来越多地被部署在网络环境中,安全问题变得日益重要。本文将介绍一些最佳实践,帮助您保护 Jupyter 服务器免受攻击和数据泄露的风险。
1119 0
|
存储 算法
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
|
人工智能 文件存储 对象存储
Stable Diffusion 模型库,AIGC 画风任你选
Stable Diffusion(简称 SD)模型库包含写实、国漫、科技等几十种风格。可以让用户一键转存到自己的存储空间,而后直接挂载到 PAl 或 FC 下进行推理和训练。无需复杂漫长的下载和上传步骤,即可获得多种模型的使用体验,实现云上 AIGC 的快速搭建。
52980 22
Stable Diffusion 模型库,AIGC 画风任你选
|
消息中间件 人工智能 Kafka
Apache Kafka + 向量数据库 + LLM = 实时 GenAI
生成式AI(GenAI)革新了企业架构,催生新数据集成模式与最佳实践。借助Apache Kafka与Apache Flink,企业能高效处理大规模实时数据,连接各类数据库与分析平台。Kafka作为核心组件,支持GenAI应用如服务台自动化、聊天机器人及内容审核。结合大型语言模型(LLM)、检索增强生成(RAG)与向量数据库,Kafka与Flink共同打造强大数据流处理能力,克服GenAI挑战,如昂贵训练成本、数据时效性与准确性。通过语义搜索与RAG设计模式,确保LLM生成内容可靠无误。
846 0
|
SQL 人工智能 自然语言处理
如何诱导AI犯罪-提示词注入
我们用到的大模型基本把政治类信息、犯罪相关信息都已屏蔽。但是,黑客依旧可以使用提示词诱导和提示词注入的方式对大模型进行攻击。
如何诱导AI犯罪-提示词注入
|
分布式计算 Java 大数据
Scala01 —— Scala基础
Scala 是一种基于 JVM 的多范式编程语言,它融合了面向对象和函数式编程的特点。本文档介绍了Scala的基础知识,包括如何搭建开发环境、语言特性、变量和数据类型、程序逻辑、运算符、控制流、集合以及方法和函数的使用。特别强调了Scala集合的重要性,它们作为数据结构支持多种操作,并且有许多内置的算子和库来解决问题。文档还涵盖了如何在IDEA中配置Scala SDK,以及如何使用元组、映射、数组和模式匹配等核心概念。此外,文档还讨论了Scala与Java变量的区别,以及如何通过隐式类和字符串插值等扩展语言功能。
422 6
Scala01 —— Scala基础
|
人工智能 数据安全/隐私保护
如何实现AI检测与反检测原理
AI检测器用于识别AI生成的文本,如ChatGPT,通过困惑度和爆发性指标评估文本。低困惑度和低爆发性可能指示AI创作。OpenAI正研发AI文本水印系统,但尚处早期阶段。现有检测器对长文本较准确,但非100%可靠,最高准确率约84%。工具如AIUNDETECT和AI Humanizer提供AI检测解决方案,适用于学生、研究人员和内容创作者。
|
分布式计算 资源调度 Hadoop
MapReduce分布式编程
MapReduce分布式编程

热门文章

最新文章