想要4個9?掌握這些監控告警的關鍵技巧
告警的本質
沒有多少系統的告警是設計得當的。良好的告警設計是一項非常困難的工作。如何知道你收到的告警是糟糕的?多少次你收到了告警之後,立即就關掉了的?是不是成天被這些然而並沒有什麼卵用的東西給淹沒?最常見的告警設定: cpu使用率 超過90%,然後告警。這種設定在大部分場合下是沒有辦法提供高質量的告警的。
高質量的告警應該是這樣的:每次收到之後你可以立即評估影響的範圍,並且每一個告警需要你做出分級響應。所謂每個告警都應該是,actionable的。
告警的實質就是“把人當服務用”。在一些事情還沒有辦法做到程式化執行的時候,用告警通知人的方式去幹預系統達到修正的目的。一次告警就像一次服務呼叫一樣。如果告警了,但是收到告警的人並不需要做任何處理,那麼這就是一種DDoS攻擊,攻擊的是運維的幸福生活。
很多時候,告警通知人去幹的事情是真的可以被自動化掉的。比如伺服器掛了,換一臺上來。在小一點的系統裡,可能就是停機一會,人工來處理換一臺冷備的機器上去。大一點的系統,因為伺服器多了,天天都掛可不行,必須是熱備的,系統自動切換到備機。 再大一點的系統,因為切換實在太頻繁了,故障機的退庫,備機的保有都變成了一種管理負擔,那麼可以和其他的運維流程打通變成完全自動化的系統。只是因為業務處理不同階段,選擇不同的實現策略而已。業務量小,拿血肉當機器用,有的時候更經濟而已。當然對於那個被當成機器人來用的哥們來說,生活確實有點不公平。
告警物件
告警物件可以分為兩種:
-
業務規則監控 -
系統可靠性監控
對於這樣的系統可以採集什麼指標?
-
請求數,請求到達速率
-
正常響應數,正常響應占比
-
錯誤響應數,錯誤響應占比
-
響應延時
-
佇列長度,排隊時間
-
資源A的呼叫量(比如CPU使用率)
-
資源B的呼叫量(比如記憶體分配和釋放)
-
資源C的呼叫量(比如網路傳送包量)
-
…
這種層次結構,一般來說簡單來說可以分為四層:
-
產品策略和營銷:它們決定了根本的請求到達的速率 -
應用層(更粗俗一點可以叫web層):最上層的膠水 -
服務層:db,各種RPC服務,以及層層巢狀的服務 -
硬體層:cpu,記憶體,磁碟,網路
-
不應該用採集的難度決定你使用什麼指標去告警。很多情況下cpu使用率可能是最好採集的,但是未必是最值得告警的。 -
不要給運維他們想要的告警,而是要做“真正”想要的告警。大部分情況下,人們告訴你的是一個解決方案。運維告訴你它需要對db程序的cpu使用率超過x%的時候告警,它給你的是一個他認為最優的解決方案。但是他真正想要的是知道db服務是否有異常,cpu使用率超過x%未必是最好的告訴你服務是否出現異常的指標。
監控的指標和策略
-
is the work getting done?系統是否在持續完成其設定的工作。 -
is the user having good experience?使用者體驗是否好。 -
where is the problem/bottleneck?問題或者瓶頸在哪裡。
-
cpu 使用率 -
網路頻寬大小 -
db請求數 -
db響應數 -
db錯誤響應數 -
db請求延遲
-
db請求數的絕對量 -
db正確響應相對請求數的佔比
-
你無法知道上層服務可以把底層資源利用到什麼程度 -
底層資源的 saturation 未必可以容易度量
-
平均排隊時間,平均總響應延遲 -
99/95/90 percentile的排隊時間,99/95/90 percentile的響應延遲
-
每個層次都對自己做告警 -
頂層服務出了告警觸發自動定位程式 -
按照服務的依賴關係和大致的時間範圍,定位到告警之間的關聯,從而找到出問題或者瓶頸的地方
理論與現實
-
無法直接採集到錯誤數:需要對錯誤日誌的自動分類 -
無法直接採集到請求成功率:需要對請求數或響應數的絕對值做
異常檢測 -
只有總數,無法採集到其中的每個細分構成項的佔比:需要對參與的factor進行演算法擬合
-
處理成功的量不是度量is work getting done的指標。費事費力去搞演算法,不如直接把成功率指標給採集了。
-
處理成功的量,還取決於請求數。而請求數根本上是取決於上層服務了。你是一個dba,發現db的每秒處理的請求數陡降了。這說明是db故障了?還是app故障了?都有可能……最最上層是產品和營銷。你發現一個業務的註冊量相對前幾天變少了,這個是不是說明註冊服務出問題了?也需是產品太爛了,遊戲根本沒有人來玩。也可能是營銷手段的營銷,不送金幣了,玩家沒積極性了。
異常檢測
-
曲線平滑:故障一般是對近期趨勢的一個破壞,視覺上來說就是不平滑 -
絕對值的時間週期性:兩條曲線幾乎重合 -
波動的時間週期性:假設兩個曲線不重合,在相同時間點的波動趨勢和振幅也是類似的 -
有一個長度可觀的坑:當曲線開始回升到歷史範圍的時候,一般可以確認這個時間段是真的故障了
基於曲線的平滑性的檢測
-
依賴的資料少,只需要近期的歷史,不依賴於週期性 -
非常敏感,歷史如果波動很小,方差就很小,容忍的波動範圍也會非常小
-
過於敏感,容易誤報。因為方差會隨著異常點的引入而變大,所以很難使用連續三點才告警這樣的策略 -
業務曲線可能自身有規律性的陡增和陡降
基於絕對值的時間週期性
min(14 days history) * 0.6
優點:
-
計算簡單
-
可以確保發現大的故障,出了告警一定是大問題,可以直接打電話
-
依賴週期性的歷史資料,計算量大,而且無法對新接入的曲線告警
-
非常不敏感,小波動無法發現
基於振幅的時間週期性
-
比絕對值要敏感 -
利用了時間週期性,規避了業務曲線自身的週期性陡降
-
要求原曲線是光滑的 -
週期性陡降的時間點必須重合,否則誤警 -
按百分比計算容易在低峰時期誤警 -
陡降不一定代表故障,由上層服務波動引起的衝高再回落的情況時有發生
基於曲線回升的異常判斷
總結
-
高質量的告警是actionable的 -
不應該用採集的難度決定你使用什麼指標去告警 -
不要別人做什麼告警,你就做什麼,要做“真正”有用的告警:特別是cpu使用率告警 -
is work getting done:請求數 + 成功率 -
is the user having good experience:響應延遲 -
只要採集對了指標,大部分時候告警不需要複雜演算法 -
基於演算法的異常檢測:演算法不難,實在必要也是可以做到的
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70013542/viewspace-3012393/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 掌握業務效能監控與流量回溯分析的關鍵方法
- prometheus監控+alertmanager告警Prometheus
- C指標的這些使用技巧,掌握後立刻提升一個Level指標
- (4)分散式系統關鍵技術:全棧監控分散式全棧
- Zabbix如何監控Oracle的告警日誌Oracle
- 關於告警,要想做好,從這些方面著手
- 監控系統告警指令碼集合指令碼
- 這些appium常用元素定位技巧,你掌握了幾種?APP
- HACCP原理——關鍵控制點的監控(轉載)
- 史上最全的Word技巧大全 掌握這些你也能成為Word高手
- Java程式設計師想要跳槽,一定要注意這些技巧!Java程式設計師
- 掌握這20個JS技巧,做一個不加班的前端人JS前端
- Nagios傳送告警的幾個關鍵引數【轉】iOS
- prometheus之docker監控與告警系列(一)PrometheusDocker
- prometheus之docker監控與告警系列(二)PrometheusDocker
- prometheus之docker監控與告警系列(三)PrometheusDocker
- 歸檔告警頻繁監控指令碼指令碼
- [譯] 優秀 JavaScript 開發人員應掌握的 9 個技巧JavaScript
- 運維監控丨16條常用的Kafka看板監控配置與告警規則運維Kafka
- 想要告警的智慧化管理?看這一篇就夠了
- 百億資料量下,掌握這些Redis技巧你就能Hold全場Redis
- 想摸魚嗎?先掌握這 19 個 css 技巧!CSS
- 雲監控告警2.0:革新傳統告警機制,引領智慧化監控新時代
- 這些技巧你知道嗎?macOS的Fn鍵實用秘訣Mac
- 運維文件:系統監控及告警配置運維
- 告警系統主指令碼、告警系統配置檔案、告警系統監控專案指令碼
- 常用的4個伺服器效能監控命令伺服器
- oracle 監控 DML DDL 鎖 的4個檢視Oracle
- 掌握這些技巧,讓Excel批次資料清洗變得簡單高效!Excel
- 掌握這些技巧,角色原畫和建模再也不會打架了
- 10個必須掌握的PHP關聯陣列使用技巧PHP陣列
- KAFKA監控一條龍:史上最強Kafka看板+監控配置與告警規則Kafka
- 一個用python寫的自動監控alert日誌告警資訊的小程式Python
- 細說夜鶯監控系統告警自愈機制
- 百億資料量下,掌握這些Redis技巧你大概就穩住了全場Redis
- 同事改Bug飛快,原來掌握了這些程式碼Debug技巧
- 短視訊如何運營,教你這些技巧,讓你掌握流量密碼!密碼
- Android Studio 掌握這些除錯技巧,Debug 能力不能再高啦Android除錯