OTel Kafka Metrics Remapping は公開アルファ版です。コレクターのバージョン >= 0.93.0 で利用可能です。これに関連するフィードバックがある場合は、アカウントチームに連絡して意見を提供してください。

概要

OOTB Kafka ダッシュボードの OpenTelemetry Kafka メトリクス

Kafka メトリクスレシーバーJMX Receiver/ JMX Metrics Gatherer を使用すると、Kafka メトリクスを収集し、すぐに使える Kafka Dashboard “Kafka, Zookeeper and Kafka Consumer Overview” にアクセスできます。

JMX ReceiverJMX Metrics Gatherer は代用品とお考えください。これらは同じメトリクスセットを収集します (JMX ReceiverJMX Metrics Gatherer を起動します)。

Kafka メトリクスレシーバー

receivers:
  kafkametrics:
    brokers: "${env:KAFKA_BROKER_ADDRESS}"
    protocol_version: 2.0.0
    scrapers:
      - brokers
      - topics
      - consumers

Kafka メトリクスレシーバーは、単一のレプリカを持つ deployment モードのコレクターで使用する必要があります。これにより、同じメトリクスが複数回収集されることはありません。デプロイメントモードのコレクターは、Datadog Exporter を活用してメトリクスを直接 Datadog にエクスポートしたり、OTLP エクスポーターを活用してメトリクスを別のコレクターインスタンスに転送したりできます。

以下の行を values.yaml に追加します。

mode: deployment

Collector 構成に以下を追加します。

receivers:
  kafkametrics:
    brokers: ${env:KAFKA_BROKER_ADDRESS}
    protocol_version: 2.0.0
    scrapers:
      - brokers
      - topics
      - consumers

JMX Receiver

JMX Receiver には以下の要件があります。

  • コレクターを実行しているホストで JRE が使用可能であること。
  • コレクターを実行しているホストで JMX Metric Gatherer JAR が使用可能であること。JMX Metric Gatherer JAR の最新リリースは、opentelemetry-java-contrib リリースページからダウンロードできます。

Collector 構成に以下を追加します。

receivers:
  jmx:
    jar_path: /path/to/opentelemetry-jmx-metrics.jar
    endpoint: ${env:KAFKA_BROKER_JMX_ADDRESS}
    target_system: kafka,jvm
  jmx/consumer:
    jar_path: /path/to/opentelemetry-jmx-metrics.jar
    endpoint: ${env:KAFKA_CONSUMER_JMX_ADDRESS}
    target_system: kafka-consumer
  jmx/producer:
    jar_path: /path/to/opentelemetry-jmx-metrics.jar
    endpoint: ${env:KAFKA_PRODUCER_JMX_ADDRESS}
    target_system: kafka-producer

JMX Receiver は、単一のレプリカを持つ deployment モードのコレクターで使用する必要があります。これにより、同じメトリクスが複数回収集されることはありません。デプロイメントモードのコレクターは、Datadog Exporter を活用してメトリクスを直接 Datadog にエクスポートしたり、OTLP エクスポーターを活用してメトリクスを別のコレクターインスタンスに転送したりできます。

JMX Receiver には以下の要件があります。

  • コレクターを実行しているホストで JRE が使用可能であること。
  • コレクターを実行しているホストで JMX Metric Gatherer JAR が利用可能であること。JMX Metric Gatherer JAR の最新リリースは、こちらでダウンロードできます。

OTel コレクターのデフォルトイメージは上記の要件を満たさないため、カスタムイメージをビルドする必要があります。コレクターのバイナリ、JRE、JMX Metrics Gatherer JAR を含むイメージの例については、以下の Dockerfile を参照してください。

Dockerfile:

FROM alpine:latest as prep

# OpenTelemetry コレクターのバイナリ
ARG OTEL_VERSION=0.92.0
ARG TARGETARCH=linux_amd64
ADD "https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v${OTEL_VERSION}/otelcol-contrib_${OTEL_VERSION}_${TARGETARCH}.tar.gz" /otelcontribcol
RUN tar -zxvf /otelcontribcol

# JMX Metrics Gatherer Jar
ARG JMX_GATHERER_JAR_VERSION=1.27.0
ADD https://github.com/open-telemetry/opentelemetry-java-contrib/releases/download/v${JMX_GATHERER_JAR_VERSION}/opentelemetry-jmx-metrics.jar /opt/opentelemetry-jmx-metrics.jar
# 非 root ユーザーの ID (https://groups.google.com/g/distroless-users/c/-DpzCr7xRDY/m/eQqJmJroCgAJ)
ARG USER_UID=65532
RUN chown ${USER_UID} /opt/opentelemetry-jmx-metrics.jar


FROM gcr.io/distroless/java17-debian11:nonroot

COPY --from=prep /opt/opentelemetry-jmx-metrics.jar /opt/opentelemetry-jmx-metrics.jar
COPY --from=prep /otelcol-contrib /otelcol-contrib

EXPOSE 4317 55680 55679
ENTRYPOINT ["/otelcol-contrib"]
CMD ["--config", "/etc/otelcol-contrib/config.yaml"]

以下の行を values.yaml に追加します。

mode: deployment

Collector 構成に以下を追加します。

receivers:
  jmx:
    jar_path: /path/to/opentelemetry-jmx-metrics.jar
    endpoint: ${env:KAFKA_BROKER_JMX_ADDRESS}
    target_system: kafka,jvm
  jmx/consumer:
    jar_path: /path/to/opentelemetry-jmx-metrics.jar
    endpoint: ${env:KAFKA_CONSUMER_JMX_ADDRESS}
    target_system: kafka-consumer
  jmx/producer:
    jar_path: /path/to/opentelemetry-jmx-metrics.jar
    endpoint: ${env:KAFKA_PRODUCER_JMX_ADDRESS}
    target_system: kafka-producer

JMX Metrics Gatherer

JMX Metric Gatherer は、uber jar として実行し、コマンドラインからプロパティを構成することを目的としています。

コレクターを実行するホストで JRE が使用可能であることを確認してください。JRE がない場合は、必ずダウンロードしてください。例:

apt-get update && \
apt-get -y install default-jre-headless

これが完了したら、JMX Metric Gatherer JAR の最新リリースをこちらでダウンロードして、以下を実行してください。

// Kafka Broker
java -jar -Dotel.jmx.service.url=service:jmx:rmi:///jndi/rmi://{KAFKA_BROKER_JMX_ADDRESS}/jmxrmi \ -Dotel.jmx.target.system=kafka,jvm \
-Dotel.metrics.exporter=otlp \
-Dotel.exporter.otlp.endpoint=http://localhost:4317 \
-jar /path/to/opentelemetry-jmx-metrics.jar

// Kafka Producer
java -jar -Dotel.jmx.service.url=service:jmx:rmi:///jndi/rmi://{KAFKA_PRODUCER_JMX_ADDRESS}/jmxrmi \ -Dotel.jmx.target.system=kafka-producer \
-Dotel.metrics.exporter=otlp \
-Dotel.exporter.otlp.endpoint=http://localhost:4317 \
-jar /path/to/opentelemetry-jmx-metrics.jar

// Kafka Consumer
java -jar -Dotel.jmx.service.url=service:jmx:rmi:///jndi/rmi://{KAFKA_CONSUMER_JMX_ADDRESS}/jmxrmi \ -Dotel.jmx.target.system=kafka-consumer \
-Dotel.metrics.exporter=otlp \
-Dotel.exporter.otlp.endpoint=http://localhost:4317 \
-jar /path/to/opentelemetry-jmx-metrics.jar

JMX Metric Gatherer は、uber jar として実行し、コマンドラインからプロパティを構成することを目的としています。

これを Kubernetes でデプロイするには、JRE と JMX Metrics Gatherer Jar を含むイメージをビルドする必要があります。JRE と JMX Metrics Gatherer Jar を含むイメージの例については、以下の Dockerfile を参照してください。

Dockerfile:

FROM alpine:latest as prep

# JMX Metrics Gatherer Jar
ARG JMX_GATHERER_JAR_VERSION=1.27.0
ADD https://github.com/open-telemetry/opentelemetry-java-contrib/releases/download/v${JMX_GATHERER_JAR_VERSION}/opentelemetry-jmx-metrics.jar /opt/opentelemetry-jmx-metrics.jar
# 非 root ユーザー ID (https://groups.google.com/g/distroless-users/c/-DpzCr7xRDY/m/eQqJmJroCgAJ)
ARG USER_UID=65532
RUN chown ${USER_UID} /opt/opentelemetry-jmx-metrics.jar

FROM gcr.io/distroless/java17-debian11:nonroot

COPY --from=prep /opt/opentelemetry-jmx-metrics.jar /opt/opentelemetry-jmx-metrics.jar

EXPOSE 4317 55680 55679
ENTRYPOINT ["java"]
CMD ["-Dotel.jmx.service.url=service:jmx:rmi:///jndi/rmi://kafka:1099/jmxrmi", \
"-Dotel.jmx.target.system=kafka,jvm", \
"-Dotel.metrics.exporter=otlp", \
"-Dotel.exporter.otlp.endpoint=http://otelcol:4317", \
"-jar", \
"/opt/opentelemetry-jmx-metrics.jar"]

収集データ

OpenTelemetry Collector を使用してログを収集する方法については、ログ収集を参照してください。

すぐに使える Kafka ダッシュボードに表示するには、Kafka ログに source:kafka タグを付ける必要があります。これを行うには、属性プロセッサーを使用します。

processors:
  attributes:
    actions:
      - key: ddtags
        value: "source:kafka"
        action: insert

この属性のみが Kafka ログに追加されるようにするには、属性プロセッサーの包含/除外フィルターを使用します。

データ収集

収集した Kafka メトリクスについては、OpenTelemetry Metrics Mapping を参照してください。

完全な構成例

Datadog エクスポーターを使用した完全な構成例については、kafka.yaml を参照してください。

ログ出力例

Resource SchemaURL: https://opentelemetry.io/schemas/1.20.0
Resource attributes:
     -> service.name: Str(unknown_service:java)
     -> telemetry.sdk.language: Str(java)
     -> telemetry.sdk.name: Str(opentelemetry)
     -> telemetry.sdk.version: Str(1.27.0)
ScopeMetrics #0
ScopeMetrics SchemaURL: 
InstrumentationScope io.opentelemetry.contrib.jmxmetrics 1.27.0-alpha
Metric #0
Descriptor:
     -> Name: kafka.message.count
     -> Description: The number of messages received by the broker
     -> Unit: {messages}
     -> DataType: Sum
     -> IsMonotonic: true
     -> AggregationTemporality: Cumulative
NumberDataPoints #0
StartTimestamp: 2024-01-22 15:50:24.212 +0000 UTC
Timestamp: 2024-01-22 15:51:24.218 +0000 UTC
Value: 25

アプリ例

このドキュメントで説明する構成を次のアプリケーション例で示します。このサンプルアプリケーションは、プロデューサー、コンシューマー、ブローカー、および zookeeper インスタンスで構成されています。Kafka メトリクスレシーバー、JMX Receiver、JMX Metrics Gatherer の使用例を示しています。