Spring Boot 1.5.x の Web アプリを 2.0.x へバージョンアップする ( その15 )( Prometheus+Grafana メモ書き )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
- Dashboards Official & community built dashboards にある Dashboard をいくつか利用してメトリックスを表示してみます。
- また疑問に思った点を調べてメモ書きしています。
参照したサイト・書籍
JVM (Micrometer)
https://grafana.com/dashboards/4701Grafana - Variables
http://docs.grafana.org/reference/templating/Allow adding Micrometer Common Tags declaratively using the application properties
https://github.com/spring-projects/spring-boot/issues/12933Is it possible to define additional tags for default Spring Boot 2 metrics?
https://stackoverflow.com/questions/51552889/is-it-possible-to-define-additional-tags-for-default-spring-boot-2-metricsHikariCP (Micrometer.io)
https://grafana.com/dashboards/6083Spring Boot Statistics
https://grafana.com/dashboards/6756Spring Boot Actuator 2.0 & Micrometer
https://www.slideshare.net/makingx/spring-boot-actuator-20-micrometer-jjugccc-ccca1Prometheus入門から運用まで徹底解説
https://www.slideshare.net/ssuser88ff5b/prometheus-79183671次世代監視の大本命! Prometheus を実運用してみた
https://qiita.com/sugitak/items/ff8f5ad845283c5915d2Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
https://www.slideshare.net/techblogyahoo/micrometerprometheus-jsug-sf26
目次
- JVM (Micrometer) で JVM のメトリックスを表示させる
- HikariCP (Micrometer.io) で HikariCP のメトリックを表示させる
- Spring Boot Statistics でメトリックを表示させる
- Grafana に設定する query はどこを見ればよいのか?
- Prometheus で収集したデータや Grafana で使用する Data Source や Dashboard の内容を永続的に保存しておくには?
- 最後に
手順
JVM (Micrometer) で JVM のメトリックスを表示させる
JVM のメトリックスは何をどのように表示させればよいのか参考になるものがないか調べてみたところ、JVM (Micrometer) という Grafana の Dashboard を見つけました。これを使って表示させてみます。
まず application
という label を定義します。JVM (Micrometer) ではメトリックスを取得するのに以下のように設定されていますが、
この中で application="$application"
と記述されていますので application
という label が必要になります。instance="$instance"
の方は何も定義しなくても問題ありません。
docker/prometheus/prometheus.yml を以下のように変更します。
global: scrape_interval: 15s # By default, scrape targets every 15 seconds. evaluation_interval: 15s # Evaluate rules every 15 seconds. # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' scrape_interval: 15s static_configs: - targets: ['localhost:9090'] - job_name: 'spring-actuator' metrics_path: '/actuator/prometheus' scrape_interval: 15s basic_auth: username: actuator password: xxxxxxxx static_configs: # Docker で起動した Prometheus からローカルPCで起動している Spring Boot のアプリケーション # にアクセスするので、localhost ではなくローカルPCに割り当てられているIPアドレスを設定する - targets: ['172.23.136.33:8080'] labels: application: 'lending'
labels: application: 'lending'
を追加します。
Spring Boot 2.1 になると application.properties に以下のように定義できるようになるらしいです。
management.metrics.tags.application=lending
docker-compose down
、docker-compose up -d
コマンドを実行して Prometheus+Grafana を再起動します。
JVM (Micrometer) のページで「Copy ID to Clipboard」ボタンをクリックします。
Grafana に admin でログインして Data Source の定義を再度追加した後、画面左側のメニューから「+」-「Import」をクリックします。
「Import」画面が表示されます。「Grafana.com Dashboard」に先程コピーした ID 4701
をペーストします。
JVM (Micrometer) の設定画面が表示されます。「Options」-「Prometheus」の項目で Data Source を選択した後、「Import」ボタンをクリックします。
JVM (Micrometer) の Dashboard が表示されます。今は Web アプリケーションが起動していないので何も表示されていません。
Tomcat を起動してしばらくすると以下のように表示されます(画面右上の設定から表示期間を Last 15 minutes に変更しています)。
メトリックスが表示されない場合には、画面左側のメニューから「Dashboards」-「Home」を選択した後、
「Recently viewed dashboards」から「JVM (Micrometer)」を選択します。何度か繰り返すと表示されるようになります。(この辺、実はよく分かっていなくて、もっと良い方法があるのかな。。。)
HikariCP (Micrometer.io) で HikariCP のメトリックを表示させる
HikariCP (Micrometer.io) という Grafana の Dashboard で HikariCP のメトリックスを表示させてみます。
log4jdbc が有効になっていると HikariCP のメトリックスが取得できないので、application.properties に一時的に spring.autoconfigure.exclude=com.integralblue.log4jdbc.spring.Log4jdbcAutoConfiguration
を追加します。
spring.autoconfigure.exclude=com.integralblue.log4jdbc.spring.Log4jdbcAutoConfiguration spring.datasource.hikari.jdbc-url=jdbc:postgresql://localhost/ksbylending ..........
「Import」画面の「Grafana.com Dashboard」に HikariCP (Micrometer.io) に表示されている ID 6083
を入力した後、
「Options」-「Prometheus」の項目で Data Source を選択した後、「Import」ボタンをクリックします。
HikariCP (Micrometer.io) の Dashboard が表示されます。
Spring Boot Statistics でメトリックを表示させる
Spring Boot Statistics という Grafana の Dashboard を見つけました。この Dashboard だと JVM、HikariCP のメトリックス以外に URI 毎の Request Count や Response Time 等も表示されます。Spring Boot + Spring Actuator でメトリックスを表示させたいなら、これが一番便利そうな気がします。
「Import」画面の「Grafana.com Dashboard」に Spring Boot Statistics に表示されている ID 6756
を入力した後、
「Options」-「Prometheus」の項目で Data Source を選択した後、「Import」ボタンをクリックします。
Spring Boot Statistics の Dashboard が表示されます。
Grafana に設定する query はどこを見れたよいのか?
JVM (Micrometer) が表示に使用している query を見ると sum(rate(http_server_requests_seconds_count{application="$application", instance="$instance"}[1m]))
のように記述されていますが、この辺の書き方は Prometheus の Document の以下のページに記載されています。PromQL(Prometheus Query Language)という名称らしいです。
https://prometheus.io/docs/prometheus/latest/querying/basics/ https://prometheus.io/docs/prometheus/latest/querying/operators/ https://prometheus.io/docs/prometheus/latest/querying/functions/ https://prometheus.io/docs/prometheus/latest/querying/examples/
Prometheus で収集したデータや Grafana で使用する Data Source や Dashboard の内容を永続的に保存しておくには?
Dashboard を試すのに何度も docker-compose で Promethes + Grafana の環境を down, up させていたのですが、起動し直す度に収集していたメトリックスのデータが消えるのと Grafana を再設定しないといけなくて面倒だったので、コンテナではなくホストのディレクリにデータが保存されるようにします。
Prometheus は prometheus/Dockerfile を見ると "--storage.tsdb.path=/prometheus"
という記述があるので /prometheus
にホストのディレクトリをマウントすればよいはずです。
Grafana は grafana/Dockerfile を見ると GF_PATHS_DATA="/var/lib/grafana"
という記述があり、Grafana container with persistent storage (recommended) に -v grafana-storage:/var/lib/grafana
という記述があるので /var/lib/grafana
にホストのディレクトリをマウントすればよいはずです。
まずはプロジェクト内に docker/prometheus/storage
、docker/grafana/storage
の2つのディレクトリを作成します。
次に docker-compose.yml を以下のように変更します。
version: '3' services: prometheus: image: prom/prometheus:latest container_name: prometheus ports: - "9090:9090" volumes: - ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - ./docker/prometheus/storage:/prometheus grafana: image: grafana/grafana:latest container_name: grafana ports: - "3000:3000" volumes: - ./docker/grafana/storage:/var/lib/grafana
- 以下の行を追加します。
- ./docker/prometheus/storage:/prometheus
- ./docker/grafana/storage:/var/lib/grafana
これで docker-compose down
、docker-compose up -d
コマンドで再起動しても Prometheus が収集していたデータは消えず、Grafana も設定し直す必要がなくなりました。
最後に
- 最初は Dashboards Official & community built dashboards にある Dashboard を利用するのが分かりやすそうです。Spring Boot を使っているならば Spring Boot Statistics が良い気がします。
- PromQL は公式ドキュメント、Dashboards Official & community built dashboards のサンプルや Web の記事を見ればよさそうです。
- Prometheus + Grafana 関連は以前はドキュメントがなかったそうですが、今回調べてみた感じだと結構いろいろ出てきているように思えます。
- Docker が使えると Spring Boot + Spring Acutoator + Prometheus + Grafana の環境を構築してメトリックスを表示するのは本当に楽ですね。
他にもカスタムメトリックスを表示させたりもしてみたかったのですが、本編が全然進まないので Prometheus + Grafana をいじるのはこれで一旦止めます。でも Spring Actuator を入れて Prometheus + Grafana でメトリックスを表示するのは Spring Boot 2.0 にバージョンアップして一番面白いなと思いました。
履歴
2018/11/18
初版発行。