概要
Kafka メトリクスレシーバー、JMX Receiver/ JMX Metrics Gatherer を使用すると、Kafka メトリクスを収集し、すぐに使える Kafka Dashboard]7、“Kafka, Zookeeper and Kafka Consumer Overview” にアクセスできます。
注: JMX Receiver および JMX Metrics Gatherer が代替として検討されます。これらは同じメトリクスのセットを収集します (JMX Receiver は JMX Metrics Gatherer を起動します)。
Kafka メトリクスレシーバー
receivers:
kafkametrics:
brokers: "${env:KAFKA_BROKER_ADDRESS}"
protocol_version: 2.0.0
scrapers:
- brokers
- topics
- consumers
Kafka メトリクスレシーバーを、deployment モードで単一レプリカとして実行されているコレクターで使用します。これにより、同じメトリクスが複数回収集されるのを防ぎます。コレクターは、OTLP HTTP を介してメトリクスを Datadog に直接エクスポートするか、別のコレクターインスタンスに転送できます。
values.yaml に以下の行を追加します。
Collector 構成に以下を追加します。
receivers:
kafkametrics:
brokers: ${env:KAFKA_BROKER_ADDRESS}
protocol_version: 2.0.0
scrapers:
- brokers
- topics
- consumers
JMX レシーバー
JMX Receiver には以下の要件があります。
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 モードで単一レプリカとして実行されているコレクターで使用します。これにより、同じメトリクスが複数回収集されるのを防ぎます。コレクターは、OTLP HTTP を介してメトリクスを Datadog に直接エクスポートするか、別のコレクターインスタンスに転送できます。
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 Collector Binary
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
# nonroot user 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 に以下の行を追加します。
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 が使用可能であることを確認してください。そうでない場合は、必ずダウンロードしてください。例:
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
# nonroot user 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 メトリクスレシーバー
| OTEL | DESCRIPTION |
|---|
| kafka.consumer_group.lag | Current approximate lag of consumer group at partition of topic |
| kafka.consumer_group.offset | Current offset of the consumer group at partition of topic |
| kafka.partition.current_offset | Current offset of partition of topic. |
JMX レシーバー / JMX Metrics Gatherer
Kafka ブローカー
| OTEL | DESCRIPTION | FILTER |
|---|
| kafka.controller.active.count | Controller is active on broker | |
| kafka.isr.operation.count | The number of in-sync replica shrink and expand operations | operation: shrink |
| kafka.isr.operation.count | The number of in-sync replica shrink and expand operations | operation: expand |
| kafka.leader.election.rate | Leader election rate - increasing indicates broker failures | |
| kafka.logs.flush.time.count | Log flush count | |
| kafka.max.lag | Max lag in messages between follower and leader replicas | |
| kafka.message.count | The number of messages received by the broker | |
| kafka.network.io | The bytes received or sent by the broker | state: in |
| kafka.network.io | The bytes received or sent by the broker | state: out |
| kafka.partition.count | The number of partitions on the broker | |
| kafka.partition.offline | The number of partitions offline | |
| kafka.partition.under_replicated | The number of under replicated partitions | |
| kafka.purgatory.size | The number of requests waiting in purgatory | type: fetch |
| kafka.purgatory.size | The number of requests waiting in purgatory | type: produce |
| kafka.request.failed | The number of requests to the broker resulting in a failure | type: produce |
| kafka.request.failed | The number of requests to the broker resulting in a failure | type: fetch |
| kafka.request.queue | Size of the request queue | |
| kafka.request.time.99p | The 99th percentile time the broker has taken to service requests | type: produce |
| kafka.request.time.99p | The 99th percentile time the broker has taken to service requests | type: fetchfollower |
| kafka.request.time.99p | The 99th percentile time the broker has taken to service requests | type: fetchconsumer |
| kafka.request.time.avg | The average time the broker has taken to service requests | type: produce |
| kafka.request.time.avg | The average time the broker has taken to service requests | type: fetchconsumer |
| kafka.request.time.avg | The average time the broker has taken to service requests | type: fetchfollower |
| kafka.unclean.election.rate | Unclean leader election rate - increasing indicates broker failures | |
Kafka プロデューサー
| OTEL | DESCRIPTION |
|---|
| kafka.producer.byte-rate | The average number of bytes sent per second for a topic. |
| kafka.producer.compression-rate | The average compression rate of record batches for a topic. |
| kafka.producer.io-wait-time-ns-avg | The average length of time the I/O thread spent waiting for a socket ready for reads or writes. |
| kafka.producer.outgoing-byte-rate | The average number of outgoing bytes sent per second to all servers. |
| kafka.producer.record-error-rate | The average per-second number of record sends that resulted in errors for a topic. |
| kafka.producer.record-retry-rate | The average per-second number of retried record sends for a topic. |
| kafka.producer.record-send-rate | The average number of records sent per second for a topic. |
| kafka.producer.request-latency-avg | The average request latency. |
| kafka.producer.request-rate | The average number of requests sent per second. |
| kafka.producer.response-rate | Responses received per second. |
Kafka コンシューマー
| OTEL | DESCRIPTION |
|---|
| kafka.consumer.bytes-consumed-rate | The average number of bytes consumed per second |
| kafka.consumer.fetch-size-avg | The average number of bytes fetched per request |
| kafka.consumer.records-consumed-rate | The average number of records consumed per second |
| kafka.consumer.total.bytes-consumed-rate | The average number of bytes consumed for all topics per second. |
| kafka.consumer.total.records-consumed-rate | The average number of records consumed for all topics per second. |
注: Datadog では、- は _ に変換されます。たとえば、kafka.producer.request-rate は kafka.producer.request_rate になります。
OpenTelemetry と Datadog のメトリクス名の完全なマッピングについては、OpenTelemetry メトリクスマッピング を参照してください。
ログ出力例
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 の使用を示します。