詳解 Flink 指標(biāo)、監(jiān)控與告警
摘要:本文由美團(tuán)點(diǎn)評研發(fā)工程師孫夢瑤分享,主要介紹 Flink 的指標(biāo)監(jiān)控和報警的內(nèi)容,分為以下四部分:
監(jiān)控告警鏈路:基于美團(tuán)點(diǎn)評實時計算平臺的實踐
常用的監(jiān)控項:哪些指標(biāo)可以高效地衡量作業(yè)
指標(biāo)的聚合方式:橫看成嶺側(cè)成峰
指標(biāo)監(jiān)控的應(yīng)用:有哪些常見的表達(dá)方式供參考
?
為什么我們關(guān)注指標(biāo)監(jiān)控
指標(biāo):衡量和描述對象的方式
可量化:比如最近天氣很熱。今天比昨天熱嗎?北京的溫度比上海更熱嗎?大家就沒有辦法評判,所以溫度就是這樣一個指標(biāo),來量化我們天熱的程度。 標(biāo)準(zhǔn)化:我們習(xí)慣說的溫度是攝氏溫度,如果有人跟你講華氏溫度,說今天77度,你就會覺得很奇怪,氣溫怎么會有這么高的數(shù)值,因此,我們的指標(biāo)還需要是標(biāo)準(zhǔn)化的,需要有一個統(tǒng)一的標(biāo)準(zhǔn)。 多維度:南方的同學(xué)覺得35度悶得喘不過氣來;北方的同學(xué)覺得35度好像也就那樣。因為我們除了氣溫這個指標(biāo)會影響人體的舒適度之外,還有一個指標(biāo)叫空氣濕度。所以衡量天氣需要結(jié)合多個維度的指標(biāo)。
監(jiān)控:對指標(biāo)進(jìn)行監(jiān)測和控制
實時:比如天氣預(yù)報,實時的預(yù)報才是我們需要的監(jiān)控內(nèi)容。 易用:相比于電視機(jī)里固定時間播報的天氣信息,手機(jī) App 就是易用的天氣監(jiān)控軟件。 可查詢歷史:比如前幾天某地一直在下雨,河流湍急,可能影響我出行的選擇。
監(jiān)控報警的鏈路——基于美團(tuán)點(diǎn)評實時計算平臺的實踐 常用的監(jiān)控報警項——哪些指標(biāo)可以高效地衡量我的作業(yè) 指標(biāo)的聚合方式——橫看成嶺側(cè)成峰 指標(biāo)監(jiān)控的應(yīng)用——有哪些常見的表達(dá)方式供參考
1.?監(jiān)控報警的鏈路
1.1 監(jiān)控報警鏈路
日志收集部分,我們首先是要把這些日志和指標(biāo)進(jìn)行統(tǒng)一化、集中化的收集。對于這一環(huán),之前兩個講師也講過, Flink 現(xiàn)在提供的方式有三種:一個是在 Flink UI 上可以直接看到這個作業(yè)的一些指標(biāo);第二種 REST API 從作業(yè)上獲取指標(biāo);第三種就是配各種第三方的 Reporter 。美團(tuán)這邊是在 slf4j 的基礎(chǔ)上增加自己的維度信息格式化后往下發(fā)。 解析展示部分,使用一些 Flink 作業(yè)去解析聚合平臺所有作業(yè)的指標(biāo)數(shù)據(jù),展示給用戶,也提供給下游使用。 監(jiān)控和報警部分,對于聚合完成了的指標(biāo),做一些個性化的可配置的規(guī)則報警。

1.2 指標(biāo)展示:Grafana


2. 常用的監(jiān)控項
2.1 常用的指標(biāo)
對于系統(tǒng)指標(biāo)最常關(guān)注的是作業(yè)的可用性,如 uptime (作業(yè)持續(xù)運(yùn)行的時間)、fullRestarts (作業(yè)重啟的次數(shù))。
第二個關(guān)注的是作業(yè)的流量,可以通過 numRecordsIn、numBytesInLocal 等相關(guān)指標(biāo)來關(guān)注作業(yè)每天處理的消息數(shù)目及高峰時間段的流量,通過關(guān)注這些指標(biāo)可以觀察作業(yè)的流量表現(xiàn)是否正常。
然后是 CPU(如:CPU.Load)、內(nèi)存(如:Heap.Used )、GC ( 如:GarbageCollector.Count、GarbageCollector.Time )及網(wǎng)絡(luò) ( inputQueueLength、outputQueueLength) 相關(guān)指標(biāo),這些指標(biāo)一般是用來排查作業(yè)的故障信息。
另外是 checkpoint 相關(guān)信息,例如最近完成的 checkpoint 的時長( lastCheckpointDuration )、最近完成的 checkpoint 的大小( lastCheckpointSize )、作業(yè)失敗后恢復(fù)的能力( lastCheckpointRestoreTimestamp )、成功和失敗的 checkpoint 數(shù)目( numberOfCompletedCheckpoints、numberOfFailedCheckpoints )以及在 Exactly once 模式下 barrier 對齊時間( checkpointAlignmentTime )。
還有就是 connector 的指標(biāo),例如常用的 Kafka connector ,Kafka 自身提供了一些指標(biāo),可以幫助我們了解到作業(yè)最新消費(fèi)的消息的狀況、作業(yè)是否有延遲等。
比如處理邏輯耗時打點(diǎn),例如包含復(fù)雜邏輯的業(yè)務(wù)系統(tǒng),可以通過在邏輯前后進(jìn)行打點(diǎn),這樣可以查看每條消息處理完這個邏輯的耗時。
另一塊是外部服務(wù)調(diào)用的性能, 在 Flink 作業(yè)中可能需要訪問外部存儲(如 Redis ), 可以通過打點(diǎn)來查看請求的耗時、請求的成功率等。
還有是緩存命中率,有時候由于數(shù)據(jù)集過大,我們只訪問熱數(shù)據(jù),此時會在內(nèi)存中緩存一部分信息,我們可以監(jiān)控緩存命中率,如果緩存命中率非常高說明緩存有效,如果緩存命中率非常低,一直在訪問外部存儲,就需要考慮緩存設(shè)計的是否合理。
2.2 如何確定哪些指標(biāo)需要關(guān)注?
第一點(diǎn)是作業(yè)狀態(tài)相關(guān)的, 如作業(yè)是否出故障、作業(yè)是否存活、作業(yè)是否穩(wěn)定運(yùn)行、影響作業(yè)可用性的風(fēng)險因素(如上次 checkpoint 是否成功、最近成功的 checkpoint 的時間)。
第二點(diǎn)是作業(yè)性能相關(guān)的,如作業(yè)的處理延遲、數(shù)據(jù)傾斜、性能瓶頸(如外部訪問)等。
第三點(diǎn)是業(yè)務(wù)邏輯相關(guān),如上游數(shù)據(jù)質(zhì)量、新上的邏輯是否存在問題、數(shù)據(jù)是否存在丟失( Exactly once 語義中數(shù)據(jù)是否允許丟失)。

3. 指標(biāo)的聚合方式



4. 指標(biāo)監(jiān)控的應(yīng)用
4.1 作業(yè)異常報警
作業(yè)狀態(tài)異常:包括作業(yè)任務(wù)的異常狀態(tài)如 failing,也包括 uptime 等指標(biāo)的異常。 作業(yè)無指標(biāo)上報:作業(yè)無指標(biāo)上報會給作業(yè)的負(fù)責(zé)人發(fā)報警;當(dāng)上報的作業(yè)多到一定程度了,達(dá)到預(yù)值的時候會直接給平臺的管理員發(fā)報警。 指標(biāo)達(dá)到閾值:是大家最常用的報警項。比如: 處理量跌0 消費(fèi)延遲(落后一定數(shù)量、持續(xù)一定時間) 失敗率、丟失率等 個性化:實時計算平臺中有很多類任務(wù),不同的任務(wù)它會有不同的特性。比如: 報警時段:不同的時間段報警,可能需要有不同的域值,或者不同的報警方式(公司通訊軟件報警、電話報警等)
聚合方式:不同的業(yè)務(wù)可能會有不同的報警的聚合的方式,這個也是需要盡量的兼容的。 錯誤日志、關(guān)鍵詞日志:當(dāng)錯誤日志到達(dá)一定量或者日志出現(xiàn)某關(guān)鍵詞時,觸發(fā)報警。
4.2 指標(biāo)大盤
反映平臺整體的現(xiàn)狀: 異常值高亮 多維度聚合 時間線對比等 及時發(fā)現(xiàn)并快速定位到故障 給出平臺可優(yōu)化的方向 便于統(tǒng)籌資源分配
4.3 自動化運(yùn)維
無法運(yùn)維:沒有指標(biāo),作業(yè)狀態(tài)是個黑盒,出了問題一群人查代碼。 手動運(yùn)維:重啟,擴(kuò)容,回滾、遷移,降級,糾正錯誤代碼,優(yōu)化處理邏輯。手動運(yùn)維表示無論在干什么,當(dāng)報警電話一來,你需要掏出電腦、手機(jī)去排查問題。 輔助運(yùn)維:當(dāng)手動運(yùn)維做多了,把大家的業(yè)務(wù)作業(yè)的各項指標(biāo)都進(jìn)行標(biāo)準(zhǔn)化,我們就可以得到一些參考值。把這些經(jīng)驗匯總,作為其他同學(xué)的運(yùn)維的時候參考的建議,這樣即使是新人也可以快速借助這些輔助工具進(jìn)行處理,降低學(xué)習(xí)成本。 智能運(yùn)維:智能運(yùn)維是不需要人處理,當(dāng)發(fā)生故障的時候,自動操作的運(yùn)維方式。執(zhí)行作業(yè)的機(jī)器掛了,自動拉起,自動把作業(yè)啟動起來。資源不足了,自動去擴(kuò)容。線上的作業(yè)有問題,自動切換到備用的作業(yè)……當(dāng)然目前能做到的這些只能解決一部分問題,一些代碼問題帶來的故障還是需要人為介入修復(fù) bug。

Q&A
在設(shè)計整套系統(tǒng)的架構(gòu)時,需要有一定的兼容性,不能只關(guān)注一類指標(biāo)。
設(shè)計初期需要考慮有哪些類型的指標(biāo),每個類型的指標(biāo)有什么樣的特征,可能有哪些聚合的維度,用什么樣的方式去聚合。
搭建模型。
設(shè)計,先把指標(biāo)的特征提取出來,然后對這些特征去進(jìn)行設(shè)計,最后做一個能兼容的系統(tǒng),這樣對于已知類型的指標(biāo),就只需修改配置就可以擴(kuò)展了。
--end--
