如何使用 Prometheus 監(jiān)控 Kafka

最近把 Kafka 的監(jiān)控遷移到了 Prometheus, 順便思考了一下監(jiān)控系統(tǒng) Dashboard 的構(gòu)建原則. 記錄一下.

0x00 Kafka metrics 初探

Kafka 使用的是"民間標(biāo)準(zhǔn)"的 metrics library, 通過(guò)定制化的 reporter 在 server.properties 中配置 參見(jiàn) Kafka 關(guān)于 metrics 源碼. 默認(rèn)情況下, Kafka metrics 所有的 metric 都可以通過(guò) JMX 獲取.

如果想把 Kafka 中的 metrics 數(shù)據(jù)暴露出來(lái), 就有如下幾個(gè)選擇:

  • 直接實(shí)現(xiàn) kafka.metrics.KafkaMetricsReporter 這個(gè) trait, 通過(guò)解析 Metrics.defaultRegistry() 里面所有的 metrics 暴露出來(lái).
  • 通過(guò) JMX, 獲取 metrics-core library 通過(guò) JMX 暴露的數(shù)據(jù)來(lái)讀取數(shù)據(jù). 讀取 JMX 又有兩種方式:
    • 在 Kafka Broker 進(jìn)程內(nèi)部讀取 JMX 數(shù)據(jù), 這樣解析數(shù)據(jù)的邏輯就在 Kafka Broker 進(jìn)程內(nèi)部, 如果有任何調(diào)整, 需要重啟 Broker
    • 在 Kafka Broker 外部, 作為一個(gè)獨(dú)立進(jìn)程, 通過(guò) JMX 的 RMI 接口讀取數(shù)據(jù). 這種方式的好處是有任何調(diào)整不需要重啟 Kafka Broker 進(jìn)程, 缺點(diǎn)是多維護(hù)了一個(gè)獨(dú)立的進(jìn)程
讀取 Kafka Broker Metrics 數(shù)據(jù)的幾種方式

0x01 Prometheus + Kafka

回到 Prometheus, 我們來(lái)挨個(gè)評(píng)估一下上述的幾個(gè)方案:

  1. 實(shí)現(xiàn)一個(gè) reporter, 將數(shù)據(jù)推送給 Prometheus Pushgateway. 但實(shí)現(xiàn)太繁瑣, 而且要顧及到 Kafka 后續(xù) API 的升級(jí).

  2. 讀取 JMX 的數(shù)據(jù). Prometheus 官方的組件 jmx_exporter 把兩種實(shí)現(xiàn)都提供了:

    • jmx_prometheus_httpserver 通過(guò)獨(dú)立進(jìn)程讀取 JMX 的數(shù)據(jù)
    • jmx_prometheus_javaagent 使用 Java Agent 方式, 盡量無(wú)侵入(僅需在 java 命令行中使用 -javaagent 參數(shù))的啟動(dòng) in-process library, 讀取 JMX 數(shù)據(jù).

不同于 metrics-core 設(shè)計(jì)的是, Prometheus 采用了 PULL 方式, 也就是說(shuō) Prometheus 主動(dòng)抓取 metrics 數(shù)據(jù), 而不是靠客戶(hù)端主動(dòng) PUSH 數(shù)據(jù), 因此 jmx_prometheus 都是通過(guò)暴露 HTTP 端口的方式暴露 metrics 數(shù)據(jù), 方便 Prometheus 抓取數(shù)據(jù).

考慮到 Kafka Broker 的 metrics 足夠穩(wěn)定(排除升級(jí)考慮), 并且對(duì) Prometheus 官方的 library 足夠有信心, 因此選擇了 jmx_prometheus_javaagent 方式, 重啟了一輪 Kafka Broker, 通過(guò) Prometheus 的 scraper 抓取了所有 Kafka Broker 的 metrics 數(shù)據(jù).

0x02 Monitoring Dashboard 構(gòu)建原則

有了 metrics 數(shù)據(jù), 就到了構(gòu)建 Dashboard 的階段了. 如何構(gòu)建一個(gè)"好用"監(jiān)控的 Dashboard? 簡(jiǎn)單的找?guī)讉€(gè) metrics 堆砌一下就完事兒了? NO, NO, NO, not that simple

總結(jié)了4個(gè)原則, 歡迎拍磚:

  1. 異角(jué)異面 (different dashboards for different roles)
  2. 唯一面板 (one and only one dashboard for a specific role)
  3. 依賴(lài)可達(dá) (all dependent systems' dashboard links are provided in the dashboards)
  4. 依圖告警 (all alert rules should have corresponding chart in the dashboard)

1. 異角異面

一個(gè)系統(tǒng)包含多種角色, 就 Kafka 集群來(lái)說(shuō),

  • Kafka 的用戶(hù), 僅僅通過(guò) Kafka API 收發(fā)消息;
  • Kafka Admin, 專(zhuān)注于 Kafka 集群的可用性;
  • 系統(tǒng)運(yùn)維人員, 關(guān)注 IDC/硬件/網(wǎng)絡(luò)等更基礎(chǔ)的資源.

不同的角色, 關(guān)注的資源不同, 如下圖:

不同角色關(guān)注點(diǎn)不同
  • Kafka 用戶(hù)僅僅關(guān)注自己的 Topic 是否可讀可寫(xiě), Consumer 是否有 Lag
  • Kafka Admin 更關(guān)注 Kafka Broker 內(nèi)部的核心 metrics, 看集群資源利用情況(CPU/Memory/IO)和可用性等指標(biāo), 至于 Topic 級(jí)別的 metrics, 最多關(guān)注數(shù)據(jù)量比較大的 topic
  • OPS 人員更關(guān)注 IDC 級(jí)別的網(wǎng)絡(luò)/硬件, 或者云服務(wù)提供商的可用性指標(biāo)

監(jiān)控系統(tǒng)應(yīng)該給不同角色提供不同的 Dashboard, 不能簡(jiǎn)單提供一個(gè)大到打不開(kāi)的 Dashboard 讓大家自己去找關(guān)注的指標(biāo)

2. 唯一面板

雖然不同角色關(guān)注點(diǎn)不同, 但關(guān)注的 metrics 確是有不少. 這里的核心原則就是為每個(gè)角色提供一個(gè)并且僅有一個(gè) Dashboad 作為入口, 不能說(shuō)為了看一些指標(biāo), 到處找 metric 在哪個(gè) Dashboard, 降低效率.

通過(guò)提煉核心的 metrics, 將這些 metrics 展現(xiàn)在一個(gè) Dashboard, 提高效率. 至于次要的 metrics 放在哪里, 參考下一條

3. 依賴(lài)可達(dá)

核心 metrics 放到一個(gè) Dashboard 中后, 有些看上去不是那么一針見(jiàn)血的 metrics 放在哪里?

External Link! 核心 Dashboard 中必須提供其他依賴(lài)的系統(tǒng)或者更多非核心的 Dashboard 的鏈接, 供用戶(hù)一鍵點(diǎn)擊打開(kāi), 注意, 是必須一個(gè)跳轉(zhuǎn)就可達(dá), 最大程度提高效率.

回到 Kafka Broker 的例子, Kafka Admin 除了看 Kafka Broker 的核心 metrics 外, 可以一鍵打開(kāi) Kafka Broker 使用的 Zookeeper 集群的 Dashboard, 或者 Kafka 節(jié)點(diǎn)的細(xì)節(jié)監(jiān)控信息的 Dashboard

4. 依圖告警

系統(tǒng)都會(huì)有一些監(jiān)控規(guī)則, 提供異常的告警功能. 但一個(gè)容易忽略的問(wèn)題是, 告警規(guī)則中使用的 metrics 是否在 Dashboard 中有對(duì)應(yīng)的圖表, 方便 on-call 人員收到告警信息后, 以最高效率的方式打開(kāi)對(duì)應(yīng)的異常 metrics 進(jìn)行問(wèn)題診斷. 更貼心的告警系統(tǒng), 應(yīng)該在告警信息中提供對(duì)應(yīng)的 Dashboard 的鏈接, 或者干脆直接把異常值時(shí)間附近的圖表信息發(fā)送到告警信息中(比如截個(gè)圖).

0x03 Kafka Broker Grafana Dashboard 構(gòu)建

貫徹上述的四點(diǎn)原則, 構(gòu)建一個(gè) Kafka Broker 的 Dashboard, 供 Kafka Admin 查看集群信息.

第一步, 提煉核心 metrics

  • Kafka Broker 層面, 主要關(guān)注如下幾個(gè) metrics:
metric name description
ActiveControllerCount 標(biāo)記哪個(gè) broker 節(jié)點(diǎn)是 controller
UncleanLeaderElectionPerSec 爭(zhēng)議的 leader 選舉次數(shù)
PartitionCount 每個(gè) broker 節(jié)點(diǎn)的 topic partition 的數(shù)量, 用于決定是否需要 rebalance
OfflinePartitionsCount 下線的 partition 的數(shù)量, 一般 >0 就說(shuō)明集群有問(wèn)題
UnderReplicatedPartitions 復(fù)制中的 Partition 數(shù)量
Bytes In bytes Per Topic Top 10 按照數(shù)據(jù)量計(jì)算前十個(gè)寫(xiě)入的 Topic
Bytes Out bytes Per Topic Top 10 按照數(shù)據(jù)量計(jì)算前十個(gè)讀取的 Topic
Message In Per Topic Top 10 按照消息量計(jì)算前十個(gè)讀取的 Topic
  • JVM 層面, 僅僅關(guān)注兩個(gè)指標(biāo), 細(xì)節(jié)通過(guò)鏈接到 JVM 詳細(xì) Dashboard.
metric name description
JVM Memory Usage JVM Heap 占用的內(nèi)存
Time Spend in GC JVM GC 所占的時(shí)間比例, 定位是否有 GC 問(wèn)題
  • 系統(tǒng)層面, 僅僅關(guān)注 CPU/IO/Network/Memory
metric name description
CPU Usage 系統(tǒng) CPU 使用率
Memory Usage 系統(tǒng) Memory 使用率
Disk Usage 磁盤(pán)占用
IO Utilization IO 使用率, 看是否有磁盤(pán) IO 瓶頸
Network In/Out 網(wǎng)絡(luò)吞吐

第二步, 構(gòu)建 Dashboad

使用 Grafana 構(gòu)建 Dashboard. 建議構(gòu)建完成后, 通過(guò) JSON 文件導(dǎo)出備份.

第三步, 添加系統(tǒng)依賴(lài) Dashboard 鏈接

核心 Metrics 構(gòu)建完成后, 需要整理依賴(lài)系統(tǒng)的 Dashboard 鏈接并添加到 Dashboard 中. 建議如下幾個(gè):

  • Kafka Broker Instance Dashboard: Kafka Broker 所在節(jié)點(diǎn)的詳細(xì)監(jiān)控信息
  • Kafka Broker JVM Dashboard: JVM 其實(shí)有更多更細(xì)化的 metrics, 可以讓公司的 JVM 達(dá)人充分發(fā)揮專(zhuān)業(yè)特長(zhǎng), 構(gòu)建更細(xì)化的 JVM 監(jiān)控 Dashboard, 比如各種不同 Heap 的占用, 線程信息等.
  • Zookeeper Dashboard: Kafka Broker 依賴(lài)的 Zookeeper 集群的 Dashboard
  • Kafka Manager: 方便對(duì) Kafka 集群進(jìn)行調(diào)整

0x04 總結(jié)

通過(guò) Kafka Broker 的監(jiān)控這個(gè)事兒, 總結(jié)了幾個(gè)原則, 先在 Kafka Broker 上實(shí)踐了一下, 看后續(xù)是否需要進(jìn)一步修正, 爭(zhēng)取貫徹到各個(gè)系統(tǒng)的監(jiān)控 Dashboard 的構(gòu)建中.

-- EOF --

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掏膏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖脑溢,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)歌径,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)亲茅,“玉大人,你說(shuō)我怎么就攤上這事狗准】寺啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵腔长,是天一觀的道長(zhǎng)袭祟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)捞附,這世上最難降的妖魔是什么巾乳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮鸟召,結(jié)果婚禮上胆绊,老公的妹妹穿的比我還像新娘。我一直安慰自己欧募,他們只是感情好压状,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著跟继,像睡著了一般种冬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舔糖,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天娱两,我揣著相機(jī)與錄音,去河邊找鬼金吗。 笑死十兢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辽聊。 我是一名探鬼主播纪挎,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼跟匆!你這毒婦竟也來(lái)了异袄?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤玛臂,失蹤者是張志新(化名)和其女友劉穎烤蜕,沒(méi)想到半個(gè)月后封孙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讽营,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年虎忌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橱鹏。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膜蠢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莉兰,到底是詐尸還是另有隱情挑围,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布糖荒,位于F島的核電站杉辙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捶朵。R本人自食惡果不足惜蜘矢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望综看。 院中可真熱鬧品腹,春花似錦、人聲如沸寓搬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)句喷。三九已至镣典,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唾琼,已是汗流浹背兄春。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锡溯,地道東北人赶舆。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像祭饭,于是被迫代替她去往敵國(guó)和親芜茵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容