• 使用zscore异常检测算法进行监控告警


    云原生时代的监控告警

    监控是运维工作的基础。随着云原生的快速发展,监控系统近几年也快速向prometheus这类时间序列方案发展。用时间序列数据存储监控指标,可以很方便且快速的收集指标并对数据进行处理与计算,但由于指标量变得庞大,对运维来说用这些指标数据做出合理准确的告警就成为了一个难点。

    传统的阈值告警,在云原生时代这种复杂的网络平面下,显得有些不足。而这几年很火爆的AIops使用机器学习算法训练出来的模型与参数,对于运维来说学习成本太高,使用起来也并没感觉很准。监控数据其实在大部分时候都是有变化趋势与规则的,这类数据用异常检测算法其实更合理,而且学习成本不高。

    异常检测算法

    时间向量数据,特别适合应用于一些基础的统计学算法。计算很快,而且Prometheus自带的PQL自带标准差、方差、平局值、对数等,数据聚合特别方便。

    我在实际生产中,使用z-score算法。这个算法很简单,现在使用了有半年了,目前看在业务流量、连接数、QPS、PV这类有比较明显的高低峰的指标类型上,告警上很准确且灵敏。 

    z-score公式:z = (x-u)/σ

    其中x是当前数据,u是均值,σ为标准差。

     z值符合正太分布,99.7%的数据落在[-3,3],z值离0越远则越有可能是异常点。

    使用案例

    假设指标名qps

    x=sum(qps{env="prod"})by(instance)
    u=avg_over_time(sum(qps{env="prod"})by(instance)[1d])
    σ=stddev_over_time(sum(qps{env="prod"})by(instance)[1d])

    平均值和标准差所选时间段不能太小,按参考文档所述,选取1000个左右的点比较合适,我这里选的1d,实际差不多1k-3k个点。

    告警规则
    (sum(qps{name="env"}) by (instance) - avg_over_time(sum(qps{name="env"}) by (instance)[1d])) /stddev_over_time(sum(qps{name="env"}) by (instance)[1d]) >3
    or
    (sum(qps{name="env"}) by (instance) - avg_over_time(sum(qps{name="env"}) by (instance)[1d])) /stddev_over_time(sum(qps{name="env"}) by (instance)[1d]) < -3

    数据聚合的时候,聚合维度一定要保持一致,不然无法计算。我这里全都用的by (instance)这个维度聚合数据。其实可以直接取绝对值大于3,这里用大于3或小于-3是为了体现数据偏离方向。

    具体在promethues里怎么配置,方法在网上很多,这里就不再赘述了。

      

    参考文档:

    https://www.cyningsun.com/01-22-2020/use-prometheus-for-anomaly-detection.html

    https://blog.csdn.net/qq_28256625/article/details/78240985

  • 相关阅读:
    重拾web开发JavaScript复习
    Linq GroupBy
    Gotchas 31对目标类型为指涉物为常量的指针类型的类型转换的认识误区
    感谢你遇到的问题
    IDisposable模式的一点理解
    感谢你遇到的问题(2)
    .Net通过OutLook发送邮件,附件的名称太长会显示乱码
    深度学习利器之自动微分(1)
    建议转载的发在文章(Aticles)而不是随笔(Posts)内
    Forum,ForumGroup和my forum的汉译
  • 原文地址:https://www.cnblogs.com/maxgongzuo/p/15908758.html
Copyright © 2020-2023  润新知