简介: 在云原生和DevOps研发模式的挑战下,一个系统从开发、测试、到上线的整个过程中,会产生大量的日志、指标、事件以及告警等数据,这也给企业质量平台建设带来了很大的挑战。本议题主要通过可观测性的角度来讨论基于海量日志和时序数据的质量建设最佳实践。
作者 | 寂之
来源 | 阿里技术公众号
在云原生和DevOps研发模式的挑战下,一个系统从开发、测试、到上线的整个过程中,会产生大量的日志、指标、事件以及告警等数据,这也给企业质量平台建设带来了很大的挑战。本议题主要通过可观测性的角度来讨论基于海量日志和时序数据的质量建设最佳实践。
众所周知,在云原生开发模式下,可观测性是非常重要的一部分,它通过日志、指标、Trace等数据,让我们可以深入了解系统的运行状态和健康程度。在 CNCF Landscape大图中,可观测性也占据了相当大的一块位置。
然而在实际使用过程中,许多人对可观测性的关注,主要集中在系统上线之后。这当然是没有问题的,但实际上,从一个系统开发开始,一直到线上运行,都是可以从可观测的角度来对系统的质量进行评估和衡量,我们可以称之为对质量的观测。
下图比较概括地描述了一个系统的质量观测完整生命周期,大体上可以分为如下四个阶段,并且在每个阶段都有需要特别关注的一些数据和指标:
在整个质量观测的生命周期中,除了各种各样的数据,我们也会涉及到各种各样的系统,例如 GitLab、sonarqube、Allure、JMeter、Jenkins、Travis CI、Argo CD 等等。这些不同的系统作用于不同的阶段,会产生大量的异构数据,如何对这些数据进行合理的管理和使用,从而可以比较方便地挖掘出其中的数据价值(不局限于软件质量方面),对我们来说是一个比较大的挑战。
基于上述的讨论,我们可以大体总结出质量观测的几个痛点:
1 海量数据管理痛点
首先我们来探讨第一个痛点,也就是如何对海量的异构数据进行管理。目前可观测性相关的系统五花八门。
例如日志可能会使用 ELK 或者 Splunk,指标会使用 Prometheus,Trace 使用 Skywalking、Jaeger 或者 zipkin。但太多的选择也不见得是好事,在这种情况下,可观测性数据的管理又给我们带来了如下几个痛点:
2 数据统一接入和管理
基于上述几个痛点,我们的解决方案是将这些异构的数据进行统一的存储和管理,如下图所示:
在这里,我们将日志、指标、Trace等数据全部接入到一个统一的可观测性存储中。然后基于这个统一的存储,进行后续的查询分析、可视化、监控告警、AI 等上层能力,甚至还可以进行数据的加工和规整,一站式地完成异构数据到同构数据的转换过程。
基于统一的存储,我们可以构建统一的查询和分析语法,从而一套语法适配不同的数据,并且让不同的数据之间进行联合查询也变成了可能。如下图所示,我们以标准 SQL 为基础,进行了部分 DSL 扩展和 SQL 函数扩展,并融合了 PromQL,从而让不同类型的数据查询和分析变得统一。
例如下面的例子:
基于上述统一的数据存储和查询分析,我们可以非常轻松地实现统一的可视化和监控。如下图所示,虽然不同阶段的数据产生自不同的系统,也有着不同的格式,但是由于它们的存储和分析是一致的,因此我们可以构建出统一的报表来查看各个阶段的软件质量,以及统一进行监控的配置和告警的管理,而无需将这些分散到各个不同的系统中,脱离例如 ES + Kibana、Prometheus + Grafana 等组合。
1 传统监控的困难和挑战
接下来我们来看如何基于这些数据,让监控更加智能。传统的监控大多是基于一些固定的阈值,或者同环比。但是在很多场景下,这种模式存在着诸多问题。例如:
监控规则无法自适应:基于人为定义的阈值,很大程度上依赖于人的经验,随着系统的演化和业务的发展,这些规则往往不能很好地适应,由此不可避免地导致漏报、误报等问题。无法做到数据的自适应,因此需要人为介入,不断调整阈值。例如下图:
2 智能巡检
基于上述痛点,我们提出了智能巡检的方案。它具备以下几个优势:
在一些数据波动比较大,指标没有固定阈值的场景下(例如用户访问量、外卖订单量等),智能巡检的优势可以得到很好的体现。例如下图,指标本身呈现出周期性的波动,假如一个新版本上线了之后,由于bug导致网络流量异常抖动。如果基于固定阈值来判断,此时处于指标值的上下界范围内,就很难发现问题;但是基于智能巡检,就可以很容易地判定这是一个异常点。
3 智能巡检实现思路
智能巡检的基本思路如下:
我们采用无监督学习算法,自动识别实体的数据特征,根据数据特征选取不同的算法组合,针对数据流实时建模,完成异常任务检测。并根据用户的打标信息(对告警进行确认或者误报反馈),训练监督模型,对算法进行不断优化,从而提高监控的准确率。
目前异常检测我们使用了两种算法,它们的比较如下:
1 告警管理痛点
在质量观测的完整生命周期中,会产生大量的告警。如下图所示:
这导致的问题就是:
2 告警智能管理
我们可以通过告警智能管理来解决上述问题,如下图所示:
告警智能降噪包含以下几种机制:
动态分派包含如下功能:
另外就是值班和代班机制。值班是非常常见的一个场景,通常情况下,告警不是发送给所有的负责人,而是通过轮转的方式进行分别值班。既然有了值班,也必须要考虑特殊的场景需要代班,例如某人值班的当天,由于有事,所以让另外一个人来代替他值班。例如下面的例子:2021年8月由张三和李四值班(每班一周,仅工作日值班),首个工作日交班;8月17日张三请假,由小明代值班。
综合上面的讨论,完整的架构大图如下:
通过将日志、时序、Trace、事件等数据接入到统一的可观测存储,从而实现统一的查询分析、可视化等功能,基于此,可以实现统一的监控和告警管理,从而赋能研发、运维、安全等各个角色。除此之外,还支持通过开放告警的功能,将其它系统(例如 Prometheus、Grafana、Zabbix 等)的告警直接接入进行告警的统一管理。
关于对未来的展望:
随着以上几步的不断建设和完善,相信对于质量的观测和把控,会越来越朝着人性化、自动化、智能化的方向迈进。
链接:
1、CNCF Landscape地址:CNCF Cloud Native Interactive Landscape
2、Time-Series Event Prediction with Evolutionary State Graph:Time-Series Event Prediction with Evolutionary State Graph | Proceedings of the 14th ACM International Conference on Web Search and Data Mining
3、RobustSTL: A Robust Seasonal-Trend Decomposition Algorithm for Long Time Series:RobustSTL: A Robust Seasonal-Trend Decomposition Algorithm for Long Time Series| Proceedings of the AAAI Conference on Artificial Intelligence
原文链接
本文为阿里云原创内容,未经允许不得转载。