使用z-score異常檢測算法進行監控告警


雲原生時代的監控告警

監控是運維工作的基礎。隨着雲原生的快速發展,監控系統近幾年也快速向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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM