かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

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 を使用して収集します。

参照したサイト・書籍

  1. Monitor Kafka Consumer Group Latency with Kafka Lag Exporter
    https://www.lightbend.com/blog/monitor-kafka-consumer-group-latency-with-kafka-lag-exporter

  2. lightbend/kafka-lag-exporter
    https://github.com/lightbend/kafka-lag-exporter

  3. lightbend/kafka-lag-exporter
    https://hub.docker.com/r/lightbend/kafka-lag-exporter

目次

  1. docker-compose.yml に kafka-lag-exporter コンテナの設定を追加する
  2. アプリケーションの consumer の metrics を確認するために Spring Boot Acturator を導入する
  3. Prometheus で kafka-lag-exporter と Spring Boot Actuator から出力される metrics を収集する
  4. Grafana に Kafka Lag Exporter の Dashboard を追加する
  5. 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 コマンドを実行してコンテナをダウンロードします。

f:id:ksby:20190915090026p:plain

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」メニューをクリックします。

f:id:ksby:20190915192045p:plain

「Or paste JSON」に https://github.com/lightbend/kafka-lag-exporter/blob/master/grafana/Kafka_Lag_Exporter_Dashboard.json のファイルに記述されている JSON をコピー&ペーストした後、「Load」ボタンをクリックします。

f:id:ksby:20190915192432p:plain

「Cinnamon Prometheus」で以前作成した data source の「Prometheus」を選択した後、「Import」ボタンをクリックします。

f:id:ksby:20190915192645p:plain

「Kafka Lag Exporter」の Dashboard が表示されます。アプリケーションを実行すれば以下の画像のように表示されます(一番下の「Kafka Lag Exporter JVM Metrics」以外は Metrics、Legend の設定はそのままです)。

f:id:ksby:20190915195004p:plain f:id:ksby:20190915195130p:plain f:id:ksby:20190915195219p:plain

「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 を表示するための Dashboardhttps://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」の設定は全て以下の画像のようにします(赤枠の部分を変更します)。 f:id:ksby:20190916102623p:plain Legend が画面右側に表示され、現在値も表示されます。 f:id:ksby:20190916102911p:plain
  • $topic という Variable を1個設定します。Variable は「Kafka Lag Exporter」で使用されているので、それを見て設定しました。 f:id:ksby:20190916103229p:plain f:id:ksby:20190916103516p:plain

作成した Dashboard は以下のようになります。

f:id:ksby:20190916105338p:plain f:id:ksby:20190916105446p:plain f:id:ksby:20190916105537p:plain f:id:ksby:20190916105628p:plain

各 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' の設定を記述し忘れていたので追加しました。