Kafka ブローカーは JMX を通じて多数のメトリクスを公開します。試験でも現場でも、名前空間と属性の粒度を正しく押さえることが重要です。
本稿では、安定して試験・運用に使える MBean と、誤検知を避ける閾値の設計指針をまとめます。ZooKeeper モードと KRaft で細部は変化し得ますが、基本の JMX 名称と Yammer メトリクス属性は一貫しています。
Kafka の JMX は Yammer Metrics ベースです。Gauge は Value、Meter は Count/MeanRate/OneMinuteRate、Timer は 50thPercentile/95thPercentile/99thPercentile などの属性を持ちます。試験では属性名の綴り(99thPercentile など)が問われることがあります。
運用と CCAAK で特に重要なのは次のカテゴリです。可用性(ActiveControllerCount、OfflinePartitionsCount)、複製健全性(UnderReplicatedPartitions、IsrShrinksPerSec)、スループット(BytesIn/OutPerSec、MessagesInPerSec)、レイテンシ(RequestMetrics TotalTimeMs)、スレッド余力(RequestHandlerAvgIdlePercent)、JVM(java.lang:type=Memory, GarbageCollector)。
JmxTool で基本メトリクスをダンプ(安定的な属性名を指定)
kafka-run-class kafka.tools.JmxTool \
--jmx-url service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi \
--object-name 'kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec' \
--attributes Count,OneMinuteRate,FiveMinuteRate,MeanRate \
--reporting-interval 3000 --duration 15000UnderReplicatedPartitions は最重要の健全性シグナルです。Value > 0 が継続する場合は、ネットワーク遅延、ブローカー停止、ディスク I/O 劣化などを疑います。OfflinePartitionsCount はさらに重篤で、即時復旧が必要です。
IsrShrinksPerSec / IsrExpandsPerSec は ISR 変動の頻度を示し、スパイクは遅延・GC 停止やディスク輻輳の兆候になり得ます。レプリカラグは ReplicaFetcherManager の MaxLag 系 MBean で把握します(バージョンにより正確なオブジェクト名は変わるため、実機で列挙して確認する習慣を持ちましょう)。
jmxterm で URP を即時確認(Gauge: Value)
# jmxterm の例
open localhost:9999
get -b kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions Value
# 応答例: mbean = kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions:
# Value = 0ActiveControllerCount はクラスター全体でちょうど 1 である必要があります。ZooKeeper モードでも KRaft でも、能動コントローラは常に 1 つです(公開ネームスペースは実装により変化し得るため、実機で列挙して確認)。
PreferredReplicaImbalanceCount はリーダーが優先レプリカから外れている分割の数で、継続的な増加はバランス不良の兆候です。PartitionCount と LeaderCount の比率や急変も健全性確認に使えます。
Jolokia 経由で ActiveControllerCount を取得
curl -s http://broker1:8778/jolokia/read/kafka.controller:type=KafkaController,name=ActiveControllerCount | jq .value.ValueBytesInPerSec/BytesOutPerSec と MessagesInPerSec は容量計画と急変検知の基礎です。MeanRate より OneMinuteRate を主監視にすると変化に追従しやすくなります。
RequestHandlerAvgIdlePercent はリクエスト処理スレッドの余力です。低下が継続(例: < 0.2)すると待ち行列増加やレイテンシ悪化に繋がります。RequestMetrics TotalTimeMs の 95thPercentile/99thPercentile でレイテンシ SLO を直接監視します。
クライアント要求からログ書き込み・複製までの経路と主な MBean
Clients --> [NetworkProcessor] --> [RequestQueue] --> [RequestHandler]
| |
v v
RequestMetrics BrokerTopicMetrics
|
v
[Log Append]
|
v
ReplicaFetcherManager --> Followers
監視ポイント:
- RequestHandlerAvgIdlePercent (kafka.server:KafkaRequestHandlerPool)
- TotalTimeMs (kafka.network:RequestMetrics)
- BytesIn/OutPerSec・MessagesInPerSec (kafka.server:BrokerTopicMetrics)
- MaxLag (kafka.server:ReplicaFetcherManager)jmxterm でレイテンシと余力を確認
open localhost:9999
# 99 パーセンタイルのプロデュースレイテンシ
get -b kafka.network:type=RequestMetrics,name=TotalTimeMs,request=Produce 99thPercentile
# ハンドラ余力(0.0〜1.0)
get -b kafka.server:type=KafkaRequestHandlerPool,name=RequestHandlerAvgIdlePercent ValueJVM ヒープの健全性は java.lang:type=Memory の HeapMemoryUsage で追跡します。used/committed が 0.8 を越え継続する場合は、GC 圧や OOM リスクを疑います。GarbageCollector の CollectionTime/CollectionCount で GC 負荷も補助的に監視します。
ログ書き出しとフラッシュの遅延は kafka.log:type=LogFlushStats,name=LogFlushRateAndTimeMs のパーセンタイルで把握できます。OS レベルのディスク使用率と併せて相関を見ると原因切り分けが容易です。
JVM ヒープ状況を JMX で取得
open localhost:9999
get -b java.lang:type=Memory HeapMemoryUsage
# 返値の used, committed を使用率計算に利用可用性直結のメトリクス(OfflinePartitionsCount、ActiveControllerCount)は静的かつ即時のしきい値が妥当です。一方でトラフィックやレイテンシは業務ごとのリズムがあるため、ベースライン(移動平均・分位)と組み合わせると誤検知を減らせます。
JMX Exporter(Prometheus)を使う場合、Yammer の属性名をそのまま時系列にマッピングします。Timer の 99thPercentile を SLA に対応させ、継続時間条件でページングの騒音を抑制します。
| 手法 | 初期設定難易度 | 長所 | 典型メトリクス |
|---|---|---|---|
| 静的しきい値 | 低 | 単純・即時性 | ActiveControllerCount, OfflinePartitionsCount, URP |
| ベースライン逸脱 | 中 | 誤検知低減・季節性対応 | BytesIn/OutPerSec, MessagesInPerSec, p99 レイテンシ |
| SLO/エラーバジェット連動 | 中〜高 | ビジネス影響と直結 | RequestMetrics TotalTimeMs p99, エラー率(タイムアウトなど) |
Prometheus ルールと JMX Exporter の最小設定例
# jmx_exporter (jmx_prometheus_javaagent) の rules 抜粋
rules:
- pattern: 'kafka.server<type=ReplicaManager, name=UnderReplicatedPartitions><>Value'
name: kafka_under_replicated_partitions
type: GAUGE
- pattern: 'kafka.controller<type=KafkaController, name=ActiveControllerCount><>Value'
name: kafka_active_controller_count
type: GAUGE
- pattern: 'kafka.network<type=RequestMetrics, name=TotalTimeMs, request=(.+)><>(99thPercentile)'
name: kafka_request_latency_p99
labels:
request: "$1"
type: GAUGE
# alerting rules (Prometheus)
- alert: KafkaURPCritical
expr: kafka_under_replicated_partitions > 0
for: 5m
labels: {severity: critical}
annotations:
summary: "URP が 5 分以上継続"
- alert: KafkaActiveControllerAnomaly
expr: kafka_active_controller_count != 1
for: 1m
labels: {severity: critical}
annotations:
summary: "ActiveControllerCount が 1 ではない"
- alert: KafkaProduceLatencyHigh
expr: kafka_request_latency_p99{request="Produce"} > 200
for: 10m
labels: {severity: warning}
annotations:
summary: "プロデュース p99 レイテンシが 200ms を 10 分超過"CCAAK
問題 1
Kafka クラスターの可用性劣化を最短で検知したい。次のうち、最も直接的かつ優先度高く監視すべき MBean/属性の組み合わせはどれか。
正解: A
可用性(リーダー選出とパーティションの稼働)に直結するのは ActiveControllerCount と OfflinePartitionsCount。スループットやレイテンシ、JVM は重要だが、可用性の一次指標としては劣後する。
ZooKeeper モードと KRaft で MBean 名称は変わる?
多くのサーバー系 MBean(BrokerTopicMetrics、ReplicaManager など)は共通です。コントローラ関連は実装によりオブジェクト名の差異があり得るため、実機で JMX を列挙して確認してください。試験では ActiveControllerCount の意味(常に 1 であるべき)を押さえることが重要です。
Timer のパーセンタイル属性名は p99 ではなく 99thPercentile?
はい。Kafka の Yammer Metrics では 99thPercentile, 95thPercentile, 50thPercentile という属性名です。MeanRate/OneMinuteRate と同様、綴りを覚えておくと試験での取り違えを防げます。
URP が短時間だけ 1 になる。アラートは出すべき?
短時間のリーダー移譲や一時的なネットワーク抑止で瞬間的に増減することがあります。実運用では継続時間(例: >1〜2 分で warn、>5 分で critical)を条件に加え、誤検知を抑える設計が推奨です。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Kafka Topic と Partition の基礎: 分散とスケーラビリティの要
CCDAK 対策と実務の両立を意識し、Topic/Partition/Replica/Consumer Group の役...
CCDAK 試験ガイド:出題範囲・配点・申込み・対策
Confluent Certified Developer for Apache Kafka (CCDAK) の出題範囲...
Confluent Certified Administrator (CCAAK) 対策: 出題範囲・配点の考え方・運用観点の要点
CCAAKに向けて、試験領域の押さえどころを運用目線で整理。プロダクションで通用する設定・監視・セキュリティの実践知を、...
Kafka の Replica と In-Sync Replicas を正しく設計する: 耐障害性と一貫性
レプリカとISRの仕組みを起点に、acks と min.insync.replicas、クリーン/アンクリーンリーダー選...
Kafka の Offset とコミット: ポジション管理と at-least-once の基礎
CCDAK 対策と実務の両立を意識して、Kafka コンシューマのオフセット管理とコミット戦略を整理。at-least-...