なぜ
Kafka 可観測性の通常の道筋は JMX エクスポーターのサイドカーです——broker ごとの 追加プロセスで、独自のスクレイプウィンドウ、独自の障害モード、そしてスタックの 他の部分が話す言葉とは少しずれたメトリクスモデルを持ちます。
monedula-metrics-reporter はそのサイドカーを取り除きます。Kafka 自身の
MetricsReporter インターフェースに差し込み、メトリクスを OpenTelemetry
collector へ OTLP 経由で直接プッシュします——gRPC か HTTP か、あなた次第です。
broker のコンテキスト(クラスター ID、ノード ID)はリソース属性として
アタッチされるため、同じメトリクスストリームがホストごとの配線なしに
broker をまたいで機能します。
すべてのエクスポート I/O はデーモンスレッド上で発生します。collector が遅い、 あるいはダウンしていても、Kafka がトラフィックを処理するために使うスレッドには 何も届きません。
完全な背景——Kafka 内部に隠れた二つのメトリクスシステム、なぜインポートした Grafana ダッシュボードがこれほど頻繁に No Data を表示するのか、そして ネイティブな OTLP がそれをどう解きほぐすのか——については、Kafka のメトリクスはこんなに難しくなければならないのか?をお読みください。
設定
shadow jar を $KAFKA_HOME/libs/ に置き、server.properties に次のように記述します。
metric.reporters=dev.monedula.metricsreporter.OtlpMetricReporter
otlp.metric.reporter.endpoint=http://otel-collector:4317
otlp.metric.reporter.transport=grpc
同じプラグインが Kafka クライアントでも動作します——producer または consumer の
設定で metric.reporters を通じて登録すれば、対応するクライアント側のストリームが
同じ collector に流れ込みます。
完全なデモスタック(broker + collector + Prometheus + Grafana)はリポジトリの
quickstart/ の下にあります。
互換性
Kafka 3.x および 4.x。Java 17 以上。最新の MetricsReporter SPI とレガシーの
Yammer レジストリの両方が配線されているため、Yammer 側を取りこぼすことなく、
Kafka が今日出力するメトリクスをカバーできます。