共计 4998 个字符,预计需要花费 13 分钟才能阅读完成。
本文作者:观测云产品架构师 潘杨
掘金链接:https://juejin.cn/post/7204668263287521317
背景
在监控高度分布式的应用程序时,可能依赖于多个基于云的和本地环境中的数百个服务和基础设施组件,在辨认谬误、检测高提早的起因和确定问题的根因都是比拟有挑战性的。即便你曾经具备了弱小的监控和警报系统,然而你的基础设施和应用程序也可能会随着工夫的推移而发生变化,这很可能会导致难以牢靠地检测异样行为,而对于 7*24 小时不间断运行的后盾服务,监控告警是稳定性运行的基石。
很多开发者都有过这样的经验,对服务的每一个指标都做了严格的监控和告警,唯恐漏掉告警导致问题无奈发现,导致每天接管到大量的有效告警,告警的泛滥逐步麻木了警惕性,后果实在的问题初漏端倪时却被疏忽,最终导致了重大的故障。
如何晋升告警的有效性,精确辨认问题,同时又不至于吞没在大量的有效告警中,正是本文所探讨的内容。
告警是可靠性的根底
首先来看一下告警的重要性,为什么咱们须要消耗这么多精力来优化告警。尽管咱们都冀望一个服务是没有故障的,但事实确是不存在 100% 没问题的零碎,咱们只能一直晋升服务的可靠性,咱们冀望做到:
- 对服务以后状态一目了然,尽在掌控
- 可能第一工夫发现问题,并且疾速定位问题起因
要想做到以上两点,只能依赖欠缺的监控 & 告警,监控展现服务的残缺运行状态,然而不可能始终盯屏察看,并且也不可能关注到所有方面,要想被动的理解零碎状态,唯有通过告警,自动检测异常情况。所以说,告警是团队监控服务质量和可用性的一个最次要伎俩。
告警面临的事实问题
业务动态变化指标很难设定适合的动态阈值
随着业务的变动,相干的指标往往呈现出以小时、天、周为周期的季节性特色。这些指标自身就起伏不定,导致动态阈值、同比阈值都不好配。而采纳偷懒的形式抉择对所有利用 / 接口的响应工夫、错误率和调用量等等指标配置成固定阈值天然会产生大量误告警。
雷同指标不同利用中阈值不同
以利用响应工夫指标为例,有的接口失常时响应工夫可能在 200ms 左右,那么当响应工夫大于 300ms 时就能够断定为异样。然而,实在的业务场景中有些接口长期访问量大,整体指标在 500ms 左右失常稳定,所有这时候适合的告警阈值可能是 600ms 左右。而一个利用可能有几百个接口,这时要对所有接口配置适合的阈值,工夫老本就会变得十分高。
指标的阈值会随着业务变动
随着公司业务倒退、新利用上线,一些指标失常状态的阈值都会一直变动。如果没有及时更新阈值,就很容易产生大量误告警。
告警设置准则
每当告警产生时,运维同学须要暂停手头工作,查看告警。然而这种中断十分影响工作效率,减少研发老本,特地对正在开发调试的同学,影响很重大。所以,每当咱们收到告警时,咱们心愿它能实在的反映出异样,即告警尽可能不误报(对失常状态报警);每当有异样产生时,报警应该及时收回来,即告警不能漏报(错过报警)。误报和漏报总是一对矛盾的指标。以下是一些告警设置准则:
- 告警具备真实性:告警必须反馈某个实在存在的景象,展现你的服务正在呈现的问题或行将呈现的问题
- 告警表述具体:从内容上,告警要近可能具体的形容景象,比方服务器在某个工夫点具体产生了什么异样
- 告警具备可操作性:每当收到告警时,个别须要做出某些操作,对于某些毋庸做出操作的告警,最好勾销。当且仅当须要做某种操作时,才须要告诉
- 新告警应用激进阈值:在配置告警之初,应尽可能扩充监控告警覆盖面,选取激进的阈值,尽可能防止漏报。
- 告警继续优化:后续继续对告警进行统计分析,对误报的告警,通过屏蔽、简化、阈值调整、更精准的体现起因等多种形式缩小误报,这是一个绝对长期的过程。
再以申请失败举例,如仅当申请的失败量超过某一阈值时告警,可能存在多种起因,如一些歹意结构的申请,也触发失败量告警。这样的告警既不具备真实性,也不具备可操作性,因为的确无需任何解决。对于此类情况,咱们应该尽可能通过个性加以辨认,从而更加精准的辨别起因的告警。
告警工具抉择
观测云 VS Grafana VS ZABBIX VS Open-falcon VS ARM3.0
阈值告警 | 离群检测 | 区间检测 | 渐变检测 | 日志检测 | |
---|---|---|---|---|---|
观测云 | √ | √ | √ | √ | √ |
Grafana | √ | × | × | × | × |
ZABBIX | √ | × | × | × | × |
Open-falcon | √ | × | × | × | × |
Grafana 检测配置
Grafana 除了反对丰盛的数据源和图表性能之外,还反对告警性能,该性能也使得 Grafana 从一个数据可视化工具成为了一个真正的监控利器。Grafana 能够通过 Alerting 模块的配置把监控数据中的异样信息进行告警,告警的规定能够间接基于现有的数据图表进行配置,在告警的时候也会把出现异常的图表进行告诉,使得咱们的告警告诉更加敌对。
然而 Grafana 的告警的触发条件次要以指标的频率与既定的阈值比拟为主,对于离群检测、渐变检测等高级高级项绝对缺失。
Zabbix 检测配置
zabbix 的检测配置绝对较为繁琐,须要大量的自建检测脚本来反对,配置步骤为首先须要新建一个检测场景,在场景中新建监控界面并创立对应主机的触发器来新建检测。
zabbix 的告警规定以表达式为主,反对阈值检测为主,对于离群检测、渐变检测等高级高级项绝对缺失。
Open-falcon 检测配置
Open-falcon 绝对于 zabbix 来说有着弱小灵便的数据采集能力,反对主动发现,反对 falcon-agent、snmp、反对用户被动 push、用户自定义插件反对、opentsdb data model like(timestamp、endpoint、metric、key-value tags)和程度扩大能力,反对每个周期上亿次的数据采集、告警断定、历史数据存储和查问然而不反对很多根底的服务器监控插件(如 Tomcat、apache 等等)且性能绝对 zabbix 来说还是不够欠缺。
同样 Open-falcon 的告警的触发条件次要以指标的频率与既定的阈值比拟为主,对于离群检测、渐变检测等高级高级项绝对缺失。
观测云的区间检测监控
随着公司的业务倒退、新利用的上线个别的阈值检测曾经很难满足咱们的需要了。在观测云应用区间检测后每一次检测中,监视器会依据指标过来的值计算出一个失常下限和失常上限,即一个失常区间,而后用指标的以后值(一段期间的均值 / 最小值 / 最大值 / 和值)与这个下限和上限比拟。如果满足异样条件,监视器便会给出正告。在此,咱们应用部分异样因子算法(Local Outlier Factor-LOF)。这是一种联合了间隔因素和密度因素的异样检测算法。在 LOF 中定义了第 k 间隔,可达间隔,部分可达密度等概念,很好的均衡了间隔因素和密度因 素。在监控器中应用此算法,咱们须要应用指标的过来值来训练模型,而后计算出一个或是多个区间,而落入此区间的点能够被看做是失常的。
具体的做法是,应用拟合后的模型,在训练集的最大值 max 和最小值 min 之间遍历,如采样 1000 个数据点,或者采样 n 倍的训练集数据点,而后对相邻的失常数据点进行合并,以此来寻找所有潜在的失常区间。采样点数越多,则可能的区间越多。依据须要,咱们能够合并比拟小的区间。非凡状况下,如当指标的体现比拟安稳,咱们能够只算出一个失常区间。
如上图中,红线左侧代表咱们应用的过来参考值,右侧代表咱们须要进行判断的以后值,而绿色暗影局部示意咱们依据过来值计算出的一个失常区间,咱们能够依据不同的聚合函数和比拟形式来达到不同的成果。这样就能够尽量避免有效告警的产生了。
告警工具应用
利用观测云监控器进行区间检测
区间检测配置
根本信息
- 规定名称:检测规定的名称
- 关联仪表板:须要关联的仪表板或是异样事件可能影响到的仪表板
检测配置
- 检测频率:监控算法的执行周期,目前配置固定与检测区间相干为 5 分钟、5 分钟、15 分钟、30 分钟、1 小时、1 小时
- 检测区间:每次执行工作时,检测指标查问的工夫范畴(获取数据范畴)
- 检测指标:监控的指标数据,每次只容许检测一个指标(只反对指标类数据)。
- 触发条件:设置告警级别的触发条件
- 告警级别:蕴含紧急(红色)、重要(橙色)、正告(黄色)、无数据(灰色)、失常(绿色)五个等级,每个等级只能设置一个触发条件。
- 触发条件:基于周期范畴、异样次数、异样方向以及异样点数占比。若查问后果带单位,则提醒单位进位后的后果。
告警级别紧急(红色)、重要(橙色)、正告(黄色)
配置异样方向,异样占比阐明如下:
- 异样方向:以后区间检测算法含向上(数据超出区间上沿)、向下(数据超出区间下沿)、向上或向下三种检测规范。
- 异样占比:以后区间检测异样方向异样点数超出区间的占比
告警级别无数据(灰色)、失常(绿色)
配置检测周期,阐明如下:
- 检测周期=检测频率
- 自定义检测周期=检测频率 * N
- 无数据(灰色):无数据状态反对「触发无数据事件」、「触发复原事件」、「不触发事件」三种配置,须要手动配置无数据处理策略。
检测规定失效后,第一次检测无数据且继续无数据,不产生无数据告警事件;若检测有数据且在配置的自定义检测周期内,数据上报产生断档,则产生无数据告警事件。
可参考以下场景:
场景 | 最初一次无数据事件 | 最初一次事件状态 | 后果 |
---|---|---|---|
数据始终失常 | – | – | 数据无断档,失常 |
数据产生断档 | – | – | 数据存在断档,产生无数据事件 |
数据新上报 | 不存在 | – | 首次上报数据,失常 |
数据新上报 | 存在 | 失常 | 从新上报数据,且曾经发送过数据恢复上报事件,不再产生告警事件 |
数据新上报 | 存在 | 无数据 | 从新上报数据,产生数据恢复上报事件 |
始终没有数据 | – | – | 继续无数据,不产生告警事件 |
- 失常(绿色):检测规定失效后,产生紧急、重要、正告异样事件后,在配置的自定义检测周期内,数据检测后果恢复正常,则产生复原告警事件。可参考以下场景:
场景 | 最初一次事件产生工夫 | 后果 |
---|---|---|
从未产生异样 | – | 无复原事件 |
异样已复原 | 若自定义检测周期为 15 分钟,最初一次事件产生工夫不到 15 分钟时 | 无复原事件 |
异样已复原 | 若自定义检测周期为 15 分钟,最初一次事件产生工夫在 15 分钟时 | 产生复原事件 |
留神:复原告警事件不受告警缄默限度。若未设置复原告警事件检测周期,则告警事件不会复原,且始终会呈现在「事件」-「未复原事件列表」中。
事件告诉
- 事件题目:设置告警触发条件的事件名称.
- 事件内容:设置告警触发条件的事件内容,反对应用预置的模板变量,详情参考 模版变量。
- 告警策略:当监控器满足触发条件后,立刻发送告警信息给指定的告诉对象。告警策略中蕴含须要告诉的事件等级、告诉对象、以及告警缄默周期。
如何利用好区间检测
当在某些业务场景下当业务出现异常时可能会导致磁盘使用率出现异常,或者时有其余利用写入呈现谬误时时也可能导致磁盘使用率呈现变动,这里以检测磁盘使用率区间异样为例,当发现磁盘使用率疾速升高超出区间时就要及时来排查以后 host 可能影响业务的过程了。
检测配置
- 检测区间:为了更好的检测磁盘使用率的异样增长,检测区间采纳获取近 15 分钟的数据作为检测根底来剖析异样(能够依据业务重要水平来动静调整)
- 检测指标:检测指标为指标 host,device 的内存使用率指标
M::disk
:(AVG(used_percent
)) BYhost
,device
- 触发条件
- 告警级别紧急(红色):咱们认为当磁盘使用率在最近 15 分钟 (5 秒为一个聚合点) 呈现超出区间的异样数据占比超过 50% 时为紧急的异样事件,须要咱们及时的进行人为的干涉排查,防止影响到线上业务的失常运行
- 失常(绿色):当在间断 2 个检测周期 (2 次检测后果) 内无异样事件产生,咱们就认为以后磁盘使用率异样曾经排查到具体过程解决了问题
- 无数据(灰色):当检测指标间断 2 个检测周期 (2 次检测) 都呈现无数据状况时,会触发无数据告警,当呈现无数据告警时,要及时的排查采集的相干异样,保证数据采集状况失常
触发事件
创立好监控器之后在以检测频率为 5 分钟一次的工作中,发现业务稳定引起内存使用率产生陡升产生异样告警事件
查看事件详情,发现是主机 izbp152ke14timzud0du15z 的磁盘使用率异样点超出区间边界占比达到了 99.45%
也能够通过监控器关联的视图来查看是否能定位问题
也能够通过查看相干过程性能跳转到具体的过程页面进行剖析看是那个过程是比拟能够的
由剖析得出有人在该业务环境进行测试,导致了大量资源占用,通过解决相干过程来进行业务复原复原事件
当继续检测 10 个周期都没发现异常即因为曾经通过人为干涉解决了异样,事件的异样状态会主动调整为复原,及未复原 -1