本文說明如何監控 Managed Service for Apache Kafka 叢集中產生或取用資料的用戶端健康狀態。
請務必監控用戶端應用程式,這是整體可靠性策略的一環。您可以透過輸送量、錯誤率和消費者延遲等指標,判斷用戶端應用程式是否發生可靠性問題。問題可能源自於用戶端設定、分區間的鍵分配不均,或是只影響特定分區的叢集問題。
伺服器端指標
直接監控用戶端行為很有用,但伺服器端指標不需要任何額外的檢測,而且有助於偵測影響可靠性的用戶端問題。
伺服器端指標特別有助於偵測代理程式之間的負載不平衡 (熱代理程式),以及正常作業的偏差,例如延遲時間暴增。
處理量
監控下列處理量指標,並與預期處理量比較:
- 訊息速率 (以每個代理人和每個主題為單位)。
- 位元組速率:每個代理程式和主題的位元組速率。
- 要求率。設定錯誤的用戶端可能會以高頻率的小型要求 (每個要求 0 到 1000 個位元組) 淹沒代理程式,導致總處理量降低。
- 要求延遲時間。如果製作人要求延遲時間突然增加,可能表示負載不平衡,或是用戶端設定有問題。
Kafka 提供每個主題和叢集的處理量指標。匯總所有主題的資料時,這些指標的值不一定相同。使用匯總指標進行高層級監控和快訊,並在排解輸送量問題時查看每個主題的指標。找出特定經紀人遇到的問題。
要求錯誤率
topic_error_count 指標會追蹤伺服器端擷取和產生要求失敗的次數。不過,這項指標不會反映某些類型的錯誤。例如:
授權設定錯誤可能會導致用戶端無法產生主題,但這項指標不會顯示錯誤。
叢集故障可能會導致代理程式完全無法回應要求。
因此,您也應監控用戶端錯誤,包括要求逾時錯誤。
消費者延遲
消費者延遲是指消費者用戶端與特定位移之間的差距。依主題、分割區和代理程式彙整這項指標,有助於判斷延遲是否是由特定代理程式或分割區所造成。
建議您根據對工作負載至關重要的主題子集,建立延遲時間上限的快訊。
自訂資訊主頁查詢
建議您建立自訂資訊主頁和快訊,監控這些信號。下表列出可用於監控用戶端健康狀態的 Prometheus 查詢語言 (PromQL) 查詢。
| 信號 | PromQL 查詢 |
|---|---|
| 處理量:每個代理程式的訊息速率 | sum by (resource_container, location, cluster_id, broker_index) ( rate( { "managedkafka.googleapis.com/message_in_count", monitored_resource="managedkafka.googleapis.com/Topic" }[${__interval}] ) ) |
| 總處理量:每個主題的每個代理程式訊息速率,適用於前 5 大主題 | topk(5, sum by (resource_container, location, cluster_id, broker_index, topic_id) ( rate( { "managedkafka.googleapis.com/message_in_count", monitored_resource="managedkafka.googleapis.com/Topic" }[${__interval}] ) ) ) |
| 處理量:每個主題和代理程式的頻寬 | sum by (resource_container, location, cluster_id, broker_index, topic_id) ( rate( { "managedkafka.googleapis.com/byte_in_count", monitored_resource="managedkafka.googleapis.com/Topic" }[${__interval}] ) ) |
| 要求比率 | sum by (resource_container, location, cluster_id, request) ( rate( { "managedkafka.googleapis.com/request_count", monitored_resource="managedkafka.googleapis.com/Cluster", "request"="Produce" }[${__interval}] ) ) |
| 要求比率、叢集總數 | sum by (resource_container, location, cluster_id, request) ( rate( { "managedkafka.googleapis.com/topic_request_count", monitored_resource="managedkafka.googleapis.com/Topic", "request"="Produce" }[${__interval}] ) ) |
| 要求延遲時間 | sum by (resource_container, location, cluster_id, broker_index, request) ( avg_over_time( { "managedkafka.googleapis.com/request_latencies", monitored_resource="managedkafka.googleapis.com/Cluster", "percentile"="95", "request"="Produce" }[${__interval}] ) ) |
| 要求錯誤次數 | sum by (resource_container, location, cluster_id, broker_index, request) ( rate( { "managedkafka.googleapis.com/topic_error_count", monitored_resource="managedkafka.googleapis.com/Topic" }[${__interval}] ) ) |
| 消費者延遲:消費者延遲程度最高的前 5 個分區 | topk(5, max by (resource_container, location, cluster_id, broker_index, topic_id) ( max_over_time( { "managedkafka.googleapis.com/consumer_lag", monitored_resource="managedkafka.googleapis.com/TopicPartition" }[${__interval}] ) ) ) |
用戶端指標
有時,用戶端問題不會顯示在伺服器指標中。例如:
如果驗證或網路設定有誤,郵件可能會累積在用戶端的內部佇列中。要求逾時時,系統會重新將訊息加入佇列並重試。
如果流量控制設定有誤,用戶端產生的訊息可能會超過分配的執行緒數量。雖然處理量可能維持不變,但要求積壓的數量會不斷增加,導致要求在傳送前過期。
如果用戶端在 Compute Engine、Google Kubernetes Engine 或 Cloud Run 上執行,您可以使用 Cloud Monitoring 中的記錄檔式指標,偵測記錄檔中的高錯誤率。不過,除非您設定較高的記錄層級,否則部分 Kafka 用戶端會隱藏導致重試時間延長的例外狀況。因此,您也應監控要求延遲時間是否增加。
Java 用戶端會透過 Java 管理擴充功能 (JMX) 公開許多指標。詳情請參閱 Apache Kafka 說明文件中的「監控」。如有可能,請優先為客戶設定工具,以便回報下列指標:
- 要求錯誤率
(
kafka.producer:type=producer-metrics,client-id="{client-id}") - 要求平均延遲時間
(
kafka.producer:type=producer-metrics,client-id="{client-id}")
盡可能將這些指標傳送至監控解決方案。如果可以連線至執行用戶端執行個體的電腦上的 JMX 通訊埠,您也可以以互動方式讀取這些指標。
因應措施
如果用戶端應用程式發生問題,請考慮採取下列緩解措施:
查看各代理人之間的負載是否不平衡 (熱門代理人)。確認叢集已啟用自動重新平衡。
如果要求比率異常偏高,請檢查用戶端是否傳送大量小型要求。檢查製作人端的
max.request.size和batch.size設定。檢查用戶端設定,確認驗證、網路和流量控制是否正常運作。
如果叢集中的所有主題或分割區都出現過度延遲,可能表示叢集負載過重,應擴大規模。
如果代理程式中所有主題或分割區的延遲時間過長,可能表示代理程式負載過重。請嘗試改善金鑰分配或將分割區重新指派給其他代理程式。