かんがるーさんの日記

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

Spring Boot 1.5.x の Web アプリを 2.0.x へバージョンアップする ( その15 )( Prometheus+Grafana メモ書き )

概要

記事一覧はこちらです。

Spring Boot 1.5.x の Web アプリを 2.0.x へバージョンアップする ( その14 )( Docker で Prometheus+Grafana の環境を構築して Spring Actuator で収集したメトリックスを表示する ) の続きです。

参照したサイト・書籍

目次

  1. JVM (Micrometer) で JVM のメトリックスを表示させる
  2. HikariCP (Micrometer.io) で HikariCP のメトリックを表示させる
  3. Spring Boot Statistics でメトリックを表示させる
  4. Grafana に設定する query はどこを見ればよいのか?
  5. Prometheus で収集したデータや Grafana で使用する Data Source や Dashboard の内容を永続的に保存しておくには?
  6. 最後に

手順

JVM (Micrometer) で JVM のメトリックスを表示させる

JVM のメトリックスは何をどのように表示させればよいのか参考になるものがないか調べてみたところ、JVM (Micrometer) という Grafana の Dashboard を見つけました。これを使って表示させてみます。

まず application という label を定義します。JVM (Micrometer) ではメトリックスを取得するのに以下のように設定されていますが、

f:id:ksby:20181111002454p:plain

この中で 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 downdocker-compose up -d コマンドを実行して Prometheus+Grafana を再起動します。

JVM (Micrometer) のページで「Copy ID to Clipboard」ボタンをクリックします。

f:id:ksby:20181111004754p:plain

Grafana に admin でログインして Data Source の定義を再度追加した後、画面左側のメニューから「+」-「Import」をクリックします。

f:id:ksby:20181111004309p:plain

「Import」画面が表示されます。「Grafana.com Dashboard」に先程コピーした ID 4701 をペーストします。

f:id:ksby:20181111005859p:plain

JVM (Micrometer) の設定画面が表示されます。「Options」-「Prometheus」の項目で Data Source を選択した後、「Import」ボタンをクリックします。

f:id:ksby:20181111012951p:plain

JVM (Micrometer)Dashboard が表示されます。今は Web アプリケーションが起動していないので何も表示されていません。

f:id:ksby:20181111013615p:plain

Tomcat を起動してしばらくすると以下のように表示されます(画面右上の設定から表示期間を Last 15 minutes に変更しています)。

f:id:ksby:20181111015807p:plain f:id:ksby:20181111020041p:plain f:id:ksby:20181111020143p:plain f:id:ksby:20181111020237p:plain f:id:ksby:20181111020333p:plain

メトリックスが表示されない場合には、画面左側のメニューから「Dashboards」-「Home」を選択した後、

f:id:ksby:20181111020714p:plain

「Recently viewed dashboards」から「JVM (Micrometer)」を選択します。何度か繰り返すと表示されるようになります。(この辺、実はよく分かっていなくて、もっと良い方法があるのかな。。。)

f:id:ksby:20181111020833p:plain

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 を入力した後、

f:id:ksby:20181113001500p:plain

「Options」-「Prometheus」の項目で Data Source を選択した後、「Import」ボタンをクリックします。

f:id:ksby:20181113010230p:plain

HikariCP (Micrometer.io)Dashboard が表示されます。

f:id:ksby:20181113011124p:plain f:id:ksby:20181113011206p:plain f:id:ksby:20181113011256p:plain

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 を入力した後、

f:id:ksby:20181117090320p:plain

「Options」-「Prometheus」の項目で Data Source を選択した後、「Import」ボタンをクリックします。

f:id:ksby:20181117090450p:plain

Spring Boot StatisticsDashboard が表示されます。

f:id:ksby:20181117090738p:plain f:id:ksby:20181117090834p:plain f:id:ksby:20181117090945p:plain f:id:ksby:20181117091030p:plain f:id:ksby:20181117091123p:plain f:id:ksby:20181117091211p:plain f:id:ksby:20181117091257p:plain f:id:ksby:20181117091342p:plain f:id:ksby:20181117091428p:plain

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/storagedocker/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 downdocker-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
初版発行。