Kafka運用でまず外せないのは、ブローカの健全性とレプリカ状況の可視化です。本稿は、Prometheus + Grafanaを前提に、JMX Exporter/Node Exporterの構成と、試験でも頻出の代表メトリクスを軸にダッシュボードとアラートを設計する要点をまとめます。
内容はApache KafkaのJMXメトリクス仕様(公式ドキュメント)に沿い、バージョンに左右されにくい指標名と監視ロジックを採用します。受験(CCAAK)と実務の両方でそのまま使える構成を目指します。
KafkaはJMXで豊富な内部メトリクスを公開します。これをPrometheusに取り込む最も一般的で安定した手段が、JMX Exporter(javaagent)です。ブローカ、Kafka Connect、Schema Registry、REST ProxyなどのJavaプロセスごとにjavaagentを付与し、HTTPでメトリクスを露出させます。OSレベルはNode Exporterで補完します。
PrometheusはPullモデルで各エンドポイントをスクレイプし、GrafanaはPromQLで可視化します。クラスタ/環境/ロールでラベル設計を統一しておくと、ダッシュボードの変数化とアラートの集計が安定します。
| エクスポータ | 導入対象 | 主な指標例(JMX名/一般名) |
|---|---|---|
| JMX Exporter(javaagent) | Kafka Broker / Connect / Schema Registry / REST Proxy | kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions / UnderReplicatedPartitions, kafka.controller:type=KafkaController,name=ActiveControllerCount / ActiveControllerCount, kafka.server:type=KafkaRequestHandlerPool,name=RequestHandlerAvgIdlePercent / RequestHandlerAvgIdlePercent |
| Node Exporter | Linuxノード(Brokerノード等) | node_cpu_seconds_total, node_filesystem_avail_bytes, node_network_receive_bytes_total |
| JMX Exporter(javaagent, Connect) | Kafka Connect Worker | kafka.connect:type=connect-worker-metrics,name=connector-count、task-count、status-metrics 等 |
Kafka監視(Prometheus Pull)の全体像
監視対象エンドポイントのインベントリ例(論理名とURL)
# 環境: production, クラスタ: cluster-a
- job: kafka-broker
targets:
- broker-1.prod.example.com:7071
- broker-2.prod.example.com:7071
- broker-3.prod.example.com:7071
- job: kafka-connect
targets:
- connect-1.prod.example.com:7072
- job: node
targets:
- broker-1.prod.example.com:9100
- broker-2.prod.example.com:9100
- broker-3.prod.example.com:9100Kafka系プロセスにjmx_prometheus_javaagent.jarを付与し、HTTPでメトリクスを露出します。Kafka Brokerであれば、KAFKA_OPTSや環境変数を用いて起動引数にjavaagentを追加します。公式のJMX名をルールで明示しておくと、PromQLが安定します。
最小構成ではUnderReplicatedPartitions、ActiveControllerCount、RequestHandlerAvgIdlePercent、Network I/O関連をまず収集します。ルールで余分な属性を落とし、高カーディナリティ(topic/partition単位)の爆発を避けます。
Kafka Brokerへのjavaagent付与とjmx_exporter設定例
# 1) Kafka起動にjavaagentを付与(systemdや環境変数で)
export KAFKA_OPTS="-javaagent:/opt/jmx/jmx_prometheus_javaagent.jar=7071:/opt/jmx/kafka-broker-jmx.yml $KAFKA_OPTS"
# 2) /opt/jmx/kafka-broker-jmx.yml(最小安定セット)
---
lowercaseOutputName: true
rules:
# UnderReplicatedPartitions
- pattern: 'kafka.server<type=ReplicaManager, name=UnderReplicatedPartitions>(Count)'
name: kafka_server_replicamanager_underreplicatedpartitions
type: GAUGE
help: Number of under-replicated partitions
# ActiveControllerCount(単一クラスタでは常に1が正)
- pattern: 'kafka.controller<type=KafkaController, name=ActiveControllerCount>(Value)'
name: kafka_controller_kafkacontroller_activecontrollercount
type: GAUGE
# RequestHandlerAvgIdlePercent(0〜1)
- pattern: 'kafka.server<type=KafkaRequestHandlerPool, name=RequestHandlerAvgIdlePercent>(Value)'
name: kafka_server_kafkarequesthandlerpool_requesthandleravgidlepercent
type: GAUGE
# Network I/O
- pattern: 'kafka.server<type=BrokerTopicMetrics, name=BytesInPerSec, topic=.*>(OneMinuteRate|Count)'
name: kafka_server_brokertopicmetrics_bytesinpersec_$1
type: GAUGE
labels:
topic: "$topic"
- pattern: 'kafka.server<type=BrokerTopicMetrics, name=BytesOutPerSec, topic=.*>(OneMinuteRate|Count)'
name: kafka_server_brokertopicmetrics_bytesoutpersec_$1
type: GAUGE
labels:
topic: "$topic"Prometheusではジョブごとにtargetsを分離し、環境・クラスタ名をexternal_labelsに持たせます。メトリクス側の高カーディナリティ抑制はmetrics_relabel_configsで行います(例: topicは上位N件のみ許容、partitionラベルは原則ドロップ)。
レイテンシやスループット評価ではレート関数を使い、1m/5m/15mで複数の窓を使い分けるとノイズ耐性が上がります。
prometheus.ymlの例(ジョブ分離と高カーディナリティ抑制)
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
env: production
cluster: cluster-a
scrape_configs:
- job_name: 'kafka-broker'
static_configs:
- targets: ['broker-1.prod.example.com:7071','broker-2.prod.example.com:7071','broker-3.prod.example.com:7071']
metrics_relabel_configs:
# partitionラベルを持つメトリクスは原則ドロップ
- action: drop
regex: .+
source_labels: [partition]
# topicは重要上位のみ残す例(^app- で始まるものだけ)
- action: keep
source_labels: [topic]
regex: app-.*
- action: labeldrop
regex: (client_id|fetcher_id)
- job_name: 'kafka-connect'
static_configs:
- targets: ['connect-1.prod.example.com:7072']
- job_name: 'node'
static_configs:
- targets: ['broker-1.prod.example.com:9100','broker-2.prod.example.com:9100','broker-3.prod.example.com:9100']CCAAK対策と実務の両面でまず用意したいのは、レプリカ健全性・コントローラ状態・ブローカ処理余力・I/Oの4系統です。以下は最小クエリ例です。変数: cluster, broker, topicなど。
単一グラフにすべてを載せず、アラート条件に直結する集約系(sum/max)と、ドリルダウン系(by broker/topic)の両方を用意すると故障切り分けが速くなります。
代表パネルのPromQL例(ダッシュボードに貼る)
# 1) レプリカ健全性
sum(kafka_server_replicamanager_underreplicatedpartitions{cluster="$cluster"})
# 2) コントローラ状態(1で正常)
max(kafka_controller_kafkacontroller_activecontrollercount{cluster="$cluster"})
# 3) ブローカ処理余力(平均)
avg by (cluster) (
kafka_server_kafkarequesthandlerpool_requesthandleravgidlepercent{cluster="$cluster"}
)
# 4) Bytes In/Out(トピック合計・5分移動平均)
rate(sum by (cluster) (kafka_server_brokertopicmetrics_bytesinpersec_oneminuterate{cluster="$cluster"}))[5m]
rate(sum by (cluster) (kafka_server_brokertopicmetrics_bytesoutpersec_oneminuterate{cluster="$cluster"}))[5m]
# 5) ブローカ別のUnderReplicatedPartitions(ドリルダウン)
max by (instance) (kafka_server_replicamanager_underreplicatedpartitions{cluster="$cluster"})過検知を避けるため、短期のスパイクは抑え、1〜5分のfor句を付与します。UnderReplicatedPartitionsは直ちに対応すべきため1m、RequestHandlerAvgIdlePercentは継続観測で5mを推奨。
通知はクラスタとブローカ単位のタグ付けでルーティングし、メッセージには調査の起点(対象ブローカ、直近の再割り当てや障害履歴)を含めます。
alerting rules(Prometheus)の例
groups:
- name: kafka.rules
rules:
- alert: KafkaUnderReplicatedPartitions
expr: sum(kafka_server_replicamanager_underreplicatedpartitions) > 0
for: 1m
labels:
severity: critical
team: kafka
annotations:
summary: "Under-replicated partitions detected"
description: "There are {{ $value }} under-replicated partitions in {{ $labels.cluster }}. Check broker health and network."
- alert: KafkaControllerNotOne
expr: max(kafka_controller_kafkacontroller_activecontrollercount) != 1
for: 3m
labels:
severity: warning
team: kafka
annotations:
summary: "ActiveControllerCount is not 1"
description: "Active controller count is {{ $value }} in {{ $labels.cluster }} (expected 1). Investigate controller elections."
- alert: KafkaRequestHandlersSaturated
expr: avg(kafka_server_kafkarequesthandlerpool_requesthandleravgidlepercent) < 0.2
for: 5m
labels:
severity: warning
team: kafka
annotations:
summary: "Low RequestHandler idle percent"
description: "Handler idle percent below 0.2 for 5m in {{ $labels.cluster }}. Consider scaling or tuning."多くのエクスポータは平文HTTPのみです。ネットワーク境界内に限定するか、必要に応じてリバースプロキシでTLS/認証を終端します。Prometheus側はbasic_auth/tls_configを設定可能です。エンドポイントはネットワークACLで限定公開にしてください。
マルチクラスタ運用では、external_labelsでclusterを固定付与し、同一Prometheusで集約しても衝突しないようにします。高カーディナリティはmetrics_relabel_configsで計画的に削減し、ダッシュボードは変数で切替可能にします。
Prometheusでプロキシ配下のエクスポータをスクレイプ(Basic認証/TLS)の例
scrape_configs:
- job_name: 'kafka-broker-proxied'
scheme: https
basic_auth:
username: prometheus
password: ${EXPORTER_BASIC_AUTH_PASSWORD}
tls_config:
insecure_skip_verify: false
static_configs:
- targets: ['broker-1.proxy.example.com:443','broker-2.proxy.example.com:443']CCAAK
問題 1
Kafkaクラスタのレプリカ健全性を最も直接的かつ早期に検知するために、Prometheusで監視すべき指標の組み合わせとして最適なのはどれか。
正解: A
UnderReplicatedPartitionsはレプリカ不健全を直接示し、ActiveControllerCountはコントローラの異常状態を示唆する。両者の組み合わせはレプリカ健全性の早期検知に有効。I/Oやノード資源は重要だが間接的な兆候に留まる。
JMXポートを開ければPrometheusは直接取れますか?JMX Exporterは必須ですか?
PrometheusはJMXに直接は接続しません。HTTPでメトリクスを露出するJMX Exporter(javaagentなど)が実質必須です。javaagentがあればJMXリモートを開ける必要はありません。
Consumer LagはJMXだけで正確に取れますか?
JMXの標準メトリクスだけでは、グループ別のLagを網羅的に可視化するのは困難です。実務ではKafkaのグループオフセット(__consumer_offsets)を読み取り可視化する専用の仕組みや製品を併用します。試験対策としては、ブローカ健全性(レプリカ、コントローラ、処理余力)のJMX監視を優先して理解してください。
高カーディナリティ対策はどこで行うべきですか?
第一にJMX Exporterのルールで不要な属性を出さない、第二にPrometheusのmetrics_relabel_configsでpartitionなどを落とす、の二段構えが現実的です。ダッシュボード側では集約(sum by, max by)を基本にし、詳細は変数で必要時のみ表示します。
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-...