ハマった時は # init 0

試したことを書き綴ってます

spring boot + micrometer.io + prometheusで簡単メトリクス監視

最近、prometheusを使い始めましたので、java(spring boot)でメトリクス収集のスタンダードとなりつつあるmicrometer.ioを調べてみました。


はじめに

micrometer.ioは、javaアプリの性能監視用メトリクスを収集して任意のモニタリングサービスと連携してくれるライブラリです。

prometheusやinfluxDBと連携してとっても簡単に性能モニタリングや性能監視ができます。

連携できるサービスは Spring Boot Reference Guide に記載されています。

micrometer.ioでは、

サーブレット周りのメトリクス(リクエスト数やレスポンスタイム、ステータスコードごとのレスポンス数)、WebFlux、datasource、schedulerなどなどのメトリクスが取得可能です。

spring bootでmicrometerを使う場合は、dependencyにmicrometerを追加するだけで、AutoConfigurationによって諸々Bean生成&AOPされ、コードを一切書かずにメトリクス収集できてしまいます。

使ってみた範囲では、サーブレット周りのメトリクスは、dependency追加だけで収集してくれました。

任意のメソッドの処理速度を測りたい場合は、アノテーション(たぶん@Timed)を付与するだけで取れちゃうそうです。

また、spring boot 2からは、micrometerがbootに統合され、bootでのメトリクス収集のデファクトになっています。


試してみた

各種ソフトウェアのバージョンなど

次のソフトウェアバージョンで試してみました。

  • Java ... java1.8
  • spring boot ... 1.5.10
  • micrometer ... 1.0
  • prometheus ... 2.2.0 rc1

また、お試し用に、簡単なRestサービスを作りサーブレットのメトリクスを取ってみました。


gradleやmavendependency設定

gradleやmavendependencyに以下を追加します。

  • micrometer-spring-legacy
    • spring boot 1.5ではmicrometerを引っ張る必要があります。2.0からは不要かな?
  • micrometer-registry-prometheus
    • prometheusと連携するために追加します。これと次のactuatorを組み合わせてprometheus用のエンドポイントが自動作成されます。
  • spring-boot-starter-actuator
    • prometheus用のエンドポイントはactuatorを利用します。

gradleだと以下のような設定になります。

dependencies {
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-starter-web')

    compile('io.micrometer:micrometer-spring-legacy:latest.release')
    compile('io.micrometer:micrometer-registry-prometheus:1.0.0')

    testCompile('org.springframework.boot:spring-boot-starter-test')
}


prometheusエンドポイントの認証設定 (actuatorの認証設定)

application.propertiesやymlで、prometheusエンドポイントの認証設定を行います。

デフォルトでは認証がかかっていますが、お試しなので、認証を解除しておきます。

actuatorを利用してprometheus用のエンドポイントが作られていますので、以下で認証を解除できます。

endpoints.prometheus.sensitive=false

以上の設定だけで、メトリクスが収集され、prometheus向けのエンドポイントができあがります。

エンドポイントは/prometheusです。


メトリクスを見てみる

ローカルでアプリを動かした場合は、localhost:8080/prometheusに接続するとprometheus向けのメトリクスが参照できます。

次のようなメトリクスが取れます。

サンプルとして、/demo/sleep(ランダムスリープするAPI)と/greeting(hello worldを返却するだけ)を作成しており、何回かアクセスした後に、メトリクスを参照しています。

http_server_requests_seconds_{count,max,sum}がHTTPリクエストのメトリクスです。 その他にもCPUやメモリ、Javaヒープのメトリクスなどなどがデフォルトで取得できます。


prometheusの設定

prometheusで、監視対象として作成したエンドポイント(/prometheus)を追加します。

設定ファイル(prometheus.yml)で以下のような設定を追加すれば完了です。

scrape_configs:
  - job_name: 'spring'
    metrics_path: '/prometheus'
    scrape_interval: 30s
    static_configs:
      - targets: ['localhost:8080']

まとめ

spring boot とmicrometerを組み合わせることで、dependencyの追加と、application.properties/yml の設定だけでコードは一切書かずにメトリクスを取れてしまいます。 めちゃめちゃ簡単です。

micrometer以外では、prometheusオフィシャルのsimpleclientでもうちょっと違うメトリクスが取得できます。用途に合わせてsimpleclientと組み合わせたりして使うとよいとおもいます。 prometheusにはzipkinプラグインがありますので、これも調べたいと思います。

また、WebFluxのメトリクス取得や、scheduler, datasourceのメトリクスがどんなものが取得できるのかも試したいですね。


今回試したサンプルアプリはgithubに登録してあります。
GitHub - ikeda-mk/prometheus-micrometer-demo