Spring Boot + Spring Integration でいろいろ試してみる ( その42 )( Docker Compose でサーバを構築する、Kafka 編9 - consumer の metrics を収集・表示する )
概要
記事一覧はこちらです。
Kafka の consumer の metrics を Prometheus、Grafana を使って収集・表示させてみます。
- サーバから見た consumer 関連の metrics は lightbend/kafka-lag-exporter を使用して収集します。
- クライアントから見た consumer の metrics は Spring Boot Actuator を使用して収集します。
参照したサイト・書籍
Monitor Kafka Consumer Group Latency with Kafka Lag Exporter
https://www.lightbend.com/blog/monitor-kafka-consumer-group-latency-with-kafka-lag-exporterlightbend/kafka-lag-exporter
https://github.com/lightbend/kafka-lag-exporterlightbend/kafka-lag-exporter
https://hub.docker.com/r/lightbend/kafka-lag-exporter
目次
- docker-compose.yml に kafka-lag-exporter コンテナの設定を追加する
- アプリケーションの consumer の metrics を確認するために Spring Boot Acturator を導入する
- Prometheus で kafka-lag-exporter と Spring Boot Actuator から出力される metrics を収集する
- Grafana に Kafka Lag Exporter の Dashboard を追加する
- Grafana に Spring Boot Actuator で収集した consumer の metrics を表示するための Dashboard を追加する
手順
docker-compose.yml に kafka-lag-exporter コンテナの設定を追加する
設定ファイルを置くために docker/kafka-lag-exporter/conf ディレクトリを新規作成します。
https://github.com/lightbend/kafka-lag-exporter/tree/master/examples/standalone から application.conf、logback.xml をダウンロードして docker/kafka-lag-exporter/conf の下に置きます。
application.conf は clusters の設定を以下の内容に書き換えます。
kafka-lag-exporter { port = 8000 clusters = [ { name = "cp-kafka-cluster" bootstrap-brokers = "cp-kafka1:19092,cp-kafka2:29092,cp-kafka3:39092" } ] }
docker-compose.yml に kafka-lag-exporter コンテナの設定を追加します。
jmx-prometheus-exporter3: .......... kafka-lag-exporter: image: lightbend/kafka-lag-exporter:0.5.1 container_name: kafka-lag-exporter ports: - "8000:8000" volumes: - ./docker/kafka-lag-exporter/conf:/opt/docker/conf command: - /bin/sh - -c - | /opt/docker/bin/kafka-lag-exporter \ -Dconfig.file=/opt/docker/conf/application.conf \ -Dlogback.configurationFile=/opt/docker/conf/logback.xml depends_on: - cp-kafka1 - cp-kafka2 - cp-kafka3 prometheus: ..........
docker-compose up -d
コマンドを実行してコンテナをダウンロードします。
docker-compose down
コマンドを実行して一旦コンテナを停止します。
アプリケーションの consumer の metrics を確認するために Spring Boot Acturator を導入する
Spring Boot のマニュアルの 57.3 Supported Metrics を見ると Kafka consumer metrics
が記述されているので、Spring Boot Actuator を導入してアプリケーション側の consumer の metrics も収集できるようにします。
build.gradle を以下のように変更します。
dependencies { def lombokVersion = "1.18.8" implementation("org.springframework.boot:spring-boot-starter-integration") // implementation("org.springframework.boot:spring-boot-starter-json") { // exclude group: "org.springframework", module: "spring-web" // } implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-actuator") implementation("io.micrometer:micrometer-registry-prometheus") implementation("org.springframework.integration:spring-integration-kafka:3.1.4.RELEASE") testImplementation("org.springframework.boot:spring-boot-starter-test") ..........
- Spring Boot Actuator を導入するために以下の3行を追加します。
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("io.micrometer:micrometer-registry-prometheus")
- spring-boot-starter-web を導入すれば spring-boot-starter-json も入るので
implementation("org.springframework.boot:spring-boot-starter-json")
をコメントアウトします。
/actuator/prometheus の Endpoint が有効になるよう application.properties に management.endpoints.web.exposure.include=health,info,prometheus
の設定を追加します。
.......... logging.level.org.apache.kafka.clients.NetworkClient=OFF management.endpoints.web.exposure.include=health,info,prometheus
Prometheus で kafka-lag-exporter と Spring Boot Actuator から出力される metrics を収集する
docker/prometheus/prometheus.yml に job_name: 'kafka-lag-exporter'
と job_name: 'spring-actuator'
の設定を追加します。
scrape_configs: .......... - job_name: 'kafka-lag-exporter' static_configs: - targets: - kafka-lag-exporter:8000 - job_name: 'spring-actuator' metrics_path: '/actuator/prometheus' scrape_interval: 15s static_configs: # Docker で起動した Prometheus からローカルPCで起動している Spring Boot のアプリケーション # にアクセスするのでローカルPC の IPアドレスを記述する。 - targets: ['172.31.16.1:8080']
Grafana に Kafka Lag Exporter の Dashboard を追加する
lightbend/kafka-lag-exporter には Grafana の Dashboard 用の JSON が記述されたファイル https://github.com/lightbend/kafka-lag-exporter/blob/master/grafana/Kafka_Lag_Exporter_Dashboard.json が用意されているので、これを Import します。
docker-compose up -d
コマンドを実行して http://localhost:3000/ からログインした後、画面左側の「+」-「Create」-「Import」メニューをクリックします。
「Or paste JSON」に https://github.com/lightbend/kafka-lag-exporter/blob/master/grafana/Kafka_Lag_Exporter_Dashboard.json のファイルに記述されている JSON をコピー&ペーストした後、「Load」ボタンをクリックします。
「Cinnamon Prometheus」で以前作成した data source の「Prometheus」を選択した後、「Import」ボタンをクリックします。
「Kafka Lag Exporter」の Dashboard が表示されます。アプリケーションを実行すれば以下の画像のように表示されます(一番下の「Kafka Lag Exporter JVM Metrics」以外は Metrics、Legend の設定はそのままです)。
「Kafka Lag Exporter JVM Metrics」は Metrics、Legend の設定を以下のように変更します。
- JVM Memory Used
sum(rate(jvm_memory_bytes_used{instance=~"kafka-lag-exporter.*"}[5m]))
{{instance}}
- JVM GC Time
sum(rate(jvm_gc_collection_seconds_sum{instance=~"kafka-lag-exporter.*"}[5m]))
{{instance}}
- JVM GC Rate
sum(rate(jvm_gc_collection_seconds_count{instance=~"kafka-lag-exporter.*"}[5m]))
{{instance}}
Grafana に Spring Boot Actuator で収集した consumer の metrics を表示するための Dashboard を追加する
Spring Boot Actuator で収集した consumer の metrics を表示するための Dashboard を https://grafana.com/grafana/dashboards で見つけることが出来なかったので作ることにします。
- Dashboard 名は「Kafka Consumer Dashboard」。
- http://localhost:8080/actuator/prometheus にアクセスして返ってきた metrics で
kafka_consumer_
から始まるものから表示させた方が良さそうなものだけ表示します。またkafka_consumergroup_
から始まる metrics も一部表示します(これは Spring Boot Actuator ではなく kafka-lag-exporter から取得できるサーバ側の metrics です)。 - Panel の設定で「Legend」の設定は全て以下の画像のようにします(赤枠の部分を変更します)。 Legend が画面右側に表示され、現在値も表示されます。
$topic
という Variable を1個設定します。Variable は「Kafka Lag Exporter」で使用されているので、それを見て設定しました。
作成した Dashboard は以下のようになります。
各 Panel の Metrics、Legend の設定は以下ようにしています。
- kafka_consumer_select_total (1m)
delta(kafka_consumer_select_total[1m])
{{client_id}}
- kafka_consumergroup_group_lag
kafka_consumergroup_group_lag{topic="$topic"}
{{group}}, partition = {{partition}}
- kafka_consumergroup_group_lag_seconds
kafka_consumergroup_group_lag_seconds{topic="$topic"}
{{group}}, partition = {{partition}}
- kafka_consumer_records_lag_records
kafka_consumer_records_lag_records{topic="$topic"}
{{client_id}}
- kafka_consumer_records_lag_avg_records
kafka_consumer_records_lag_avg_records
{{client_id}}, partition = {{partition}}
- kafka_consumer_records_lag_max_records
kafka_consumer_records_lag_max_records
{{client_id}}, partition = {{partition}}
- kafka_consumer_fetch_latency_avg_seconds
kafka_consumer_fetch_latency_avg_seconds
{{client_id}}
- kafka_consumer_fetch_latency_max_seconds
kafka_consumer_fetch_latency_max_seconds
{{client_id}}
- kafka_consumer_commit_latency_avg_seconds
kafka_consumer_commit_latency_avg_seconds
{{client_id}}
- kafka_consumer_commit_latency_max_seconds
kafka_consumer_commit_latency_max_seconds
{{client_id}}
少し長くなったので一旦ここで終わります。次回は partition や consumer の数を変更して lag がどのように変化するのか見てみます。
履歴
2019/09/16
初版発行。
2019/09/17
* kafka-lag-exporter の設定ファイルを置くディレクトリを docker/kafka-lag-exporter → docker/kafka-lag-exporter/conf に修正しました。
* docker/prometheus/prometheus.yml に job_name: 'kafka-lag-exporter'
の設定を記述し忘れていたので追加しました。