監控 Kafka 用戶端應用程式

本文說明如何監控 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.sizebatch.size 設定。

  • 檢查用戶端設定,確認驗證、網路和流量控制是否正常運作。

  • 如果叢集中的所有主題或分割區都出現過度延遲,可能表示叢集負載過重,應擴大規模。

  • 如果代理程式中所有主題或分割區的延遲時間過長,可能表示代理程式負載過重。請嘗試改善金鑰分配或將分割區重新指派給其他代理程式。

後續步驟