OpenTelemetry Java エージェントで JMX メトリクスのインサイトを得る

Blog posts are not updated after publication. This post is more than a year old, so its content may be outdated, and some links may be invalid. Cross-verify any information before relying on it.

JMX(Java Management Extensions)は、Java ベースのアプリケーションを管理・監視する方法を提供する技術です。 JMX メトリクスからは、アプリケーションのパフォーマンスやリソース使用状況に関する詳細な情報を得ることができます。 このデータを活用して、アプリケーションの傾向や潜在的な問題を特定し、深刻な問題になる前に対処することができます。 問題が発生した場合でも、収集したメトリクスを使って診断し、最適なパフォーマンスを得るためにシステムを調整できます。

JMX Metric Insight モジュールが OpenTelemetry Java エージェントに追加されたことで、アプリケーションの監視のために JMX メトリクスを収集する専用のサービスを別途デプロイする必要がなくなりました。 エージェントは、計装対象のアプリケーション内で利用可能なローカルの MBean を通じて、アプリケーションサーバーが公開するメトリクスをネイティブに収集・エクスポートできるようになりました。 必要な MBean と対応するメトリクスは、YAML 設定ファイルを使って記述できます。 個別のメトリクス設定により、正確なメトリクスの選択と識別が可能です。 JMX Metric Insight には、以下のような一般的なアプリケーションサーバーやフレームワーク向けに厳選された JMX メトリクスセットを含む、いくつかの事前定義済み設定が付属しています。

独自のメトリクス定義を1つ以上の YAML ファイルで提供することもできます。 詳細については、YAML ファイルの構文ドキュメントを参照してください。

Kafka Broker メトリクスを監視する

JMX Metric Insight モジュールを使用して事前定義済みのメトリクスセットをエクスポートし、Prometheus にエクスポートすることで、Kafka Broker の状態を監視してみましょう。

Kafka は macOS 上で Homebrew を使って以下の手順でインストールできます。

brew install kafka

Zookeeper を起動するには以下を実行します。

zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties

OpenTelemetry Java 計装エージェントのアタッチ

Kafka Broker を起動する前に、KAFKA_OPTS 環境変数にオプションを指定して、OpenTelemetry Java 計装エージェントを Kafka Broker にアタッチします。 エージェントの最新リリースをダウンロードできます。

export KAFKA_OPTS="-Dapplication.name=my-kafka-app
-Dotel.metrics.exporter=prometheus
-Dotel.exporter.prometheus.port=9464
-Dotel.service.name=my-kafka-broker
-Dotel.jmx.target.system=kafka-broker
-javaagent:/path/to/opentelemetry-javaagent.jar"

これで Kafka Broker を起動できます。

kafka-server-start /usr/local/etc/kafka/server.properties

Kafka Broker が起動して稼働しているはずです。 インストールをテストするために、トピックを作成し、Kafka コンソールプロデューサーとコンソールコンシューマーを使用できます。 Kafka トピックを作成します。

kafka-topics --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic my-test-topic

作成したトピックにメッセージを送信するために、Kafka コンソールプロデューサーを起動します。

$ kafka-console-producer --broker-list localhost:9092 --topic test
>First message
>Second message

次に、トピックからメッセージを最初から消費する Kafka コンソールコンシューマーを起動します。

$ kafka-console-consumer --bootstrap-server localhost:9092 --topic test --from-beginning
First message
Second message

コンシューマーが2つのメッセージを受信していることが確認できれば、Kafka のインストールが期待どおりに動作していることが検証できます。

メトリクスを Prometheus にエクスポートする

メトリクスは、サポートされているメトリクスエクスポーターのいずれかを使用して、任意のバックエンドにエクスポートできます。 エクスポーターとその設定オプションの完全なリストについては、Properties: exporters を参照してください。

たとえば、OTLP エクスポーターを使用してメトリクスを OTel Collector にエクスポートし、いくつかの処理を行ってから、任意のバックエンドでメトリクスを利用できます。 この例では、簡単にするために、メトリクスを直接 Prometheus にエクスポートしています。

Prometheus をデータソースとして使用し、Grafana ダッシュボードでメトリクスを可視化します。 このデモでは、Prometheus を Docker 上にデプロイします。 以下の最小限の設定を含む prometheus.yml ファイルを作成します。

global:
  scrape_interval: 10s
  evaluation_interval: 10s

scrape_configs:
  - job_name: my-kafka-broker
    scrape_interval: 5s
    static_configs:
      - targets: [host.docker.internal:9464]

以下のコマンドを実行して、Docker 上に Prometheus をデプロイします。

docker run -d \
    -p 9090:9090 \
    -v path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
    prom/prometheus

Prometheus コンテナが稼働しているはずです。 http://localhost:9090 にアクセスして、Prometheus ダッシュボードを確認できます。 ここでは、Prometheus 上でメトリクス kafka_request_count_total を表示しています。

Prometheus 上に表示された Kafka Broker メトリクスのサンプル

Prometheus のインストールオプションを参照してください。

Grafana ダッシュボードでメトリクスを表示する

次に、Prometheus メトリクスを Grafana ダッシュボードで可視化します。 まず、以下のコマンドで Grafana の Docker イメージを取得します。

docker run -d -p 3000:3000 grafana/grafana

http://localhost:3000 にアクセスして、Grafana のホームページを確認できます。 Add Data Source をクリックして Prometheus を選択します。 HTTP URL を追加します。デフォルトは http://localhost:9090 です。 その後、新しいダッシュボードを作成できます。可視化のオプションは Graph、Singlestat、Gauge、Table、Text など複数から選択できます。 新しいパネルを作成して、監視したいメトリクスを追加できます。 以下は6つのパネルで構成されたダッシュボードの例で、各パネルで1つのメトリクスを監視しています。 このダッシュボードで Kafka Broker の状態をリアルタイムに監視できます。

6つの Kafka Broker メトリクスを表示する Grafana ダッシュボード

OTel デモアプリケーションにおける JMX Metric Insight

公式の OpenTelemetry Astronomy shop デモアプリケーションも試すことができます。 チェックアウトサービスとアカウンティングサービスおよび不正検出サービスを接続するメッセージキューサービスは、Kafka をベースにしており、JMX Metric Insight モジュールを利用して Kafka Broker メトリクスをすぐにエクスポートできます。 ドキュメントを参照してください。

Prometheus ダッシュボードに表示された kafka_request_count メトリクスメトリクスエクスプローラーで表示された Kafka メトリクスのリスト

モジュールのさらなる機能

この例では、Kafka Broker 用の事前定義済みセットから一部のメトリクスのみを監視しました。 Kafka が公開するすべてのメトリクスがこのセットに含まれているわけではないため、事前定義済みセットに含まれていないメトリクスが必要でも心配ありません! このモジュールでは、カスタムメトリクス定義の YAML ファイルを作成するオプションが提供されているため、MBean 属性として公開されている任意のメトリクスを監視できます。 YAML ファイルの構造を確認するために、kafka-broker.yaml の一部を見てみましょう。

---
rules:
  - bean: kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec
    mapping:
      Count:
        metric: kafka.message.count
        type: counter
        desc: The number of messages received by the broker
        unit: '{messages}'

各ファイルは複数のルールで構成できます。 各ルールは、オブジェクト名によって1つ以上の MBean のセットを識別できます。 この例では kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec が一意の MBean を識別しています。 この MBean の属性 Count に注目しており、mapping の下で指定されています。 報告されるメトリクスの名前は kafka.message.count で、計装タイプは counter で、メトリクスが単調増加する合計であることを示しています。 単位は {messages} です。 メトリクスの説明も提供しています。 この YAML セグメントはシンプルですが、より多くの設定オプションを試すには、ドキュメントを参照して、モジュールのすべての機能を理解し試してみてください。

最後に、事前定義済みメトリクスセットに含めるべき重要なメトリクスがあると感じたり、モジュールの改善に関するアイデアがある場合は、リポジトリに自由にコントリビューションしてください。