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