かんがるーさんの日記

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

Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( その11 )( Docker コンテナの image をバージョンアップする )

概要

記事一覧はこちらです。

Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( その10 )( SpotBugs プラグインの findsecbugs-plugin を導入する ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Docker コンテナの image をバージョンアップします。

参照したサイト・書籍

  1. redis cluster with error "Couldn't connect to redis instance"
    https://github.com/oliver006/redis_exporter/issues/325

  2. Prometheus Configuration to Scrape Multiple Redis Hosts
    https://github.com/oliver006/redis_exporter#prometheus-configuration-to-scrape-multiple-redis-hosts

目次

  1. 現状の確認とバージョンアップの方針
  2. docker-compose.yml を変更する
  3. docker-compose.mail.yml を変更する
  4. .env を変更する
  5. docker-compose up -d コマンドを実行する
  6. Grafana の Spring Boot Statistics ダッシュボードにメトリックスが表示されない原因を解消する
  7. Grafana の Prometheus Redis ダッシュボードにメトリックスが表示されない原因を解消する

手順

現状の確認とバージョンアップの方針

現状を確認したところ、以下の状況でした。

  • Prometheus が動作していません。http://localhost:9090/ にアクセスしても何も表示されず、IntelliJ IDEA の Services Window を見ると確かに動作していません。panic: runtime error: slice bounds out of range というログが出ていました。

    f:id:ksby:20200105121116p:plain

  • Grafana は動作していますが、Prometheus が動作しておらずデータを取得できないためメトリックスが何も表示されません。

  • Redis Cluster は動作しています。
  • RabbitMQ は動作しています。
  • PostgreSQL、pgAdmin 4 は動作しています。
  • Flyway は動作しています。
  • docker-mailserver、rainloop は動作しています。

Prometheus が動作していない原因がよく分かりませんが、以下の方針でバージョンアップすることにします。

  • バージョンを明記している、あるいはバージョンを記載していない image は最新バージョンにする(明記する)。
  • latest を指定しているものは明確にバージョン番号を指定する。
  • 明確なバージョン番号がないものは lastest を指定する。

docker-compose.yml を変更する

services:
  prometheus:
    image: prom/prometheus:v2.15.1
    ..........

  grafana:
    image: grafana/grafana:6.5.2
    ..........

  redis_exporter:
    image: oliver006/redis_exporter:v1.3.5-alpine
    ..........

  haproxy:
    image: haproxy:2.1.2-alpine
    ..........

  haproxy-rsyslog:
    image: rafpe/docker-haproxy-rsyslog:latest
    ..........

  flyway:
    image: flyway/flyway:${FLYWAY_VERSION}-alpine
    ..........

  postgres_exporter:
    image: wrouesnel/postgres_exporter:v0.8.0
    ..........
  • prometheus で image: prom/prometheus:latestimage: prom/prometheus:v2.15.1 に変更します。
  • grafana で image: grafana/grafana:latestimage: grafana/grafana:6.5.2 に変更します。
  • redis_exporter で image: oliver006/redis_exporter:latestimage: oliver006/redis_exporter:v1.3.5-alpine に変更します。
  • haproxy で image: haproxy:1.8.14-alpineimage: haproxy:2.1.2-alpine に変更します。
  • haproxy-rsyslog で image: rafpe/docker-haproxy-rsyslogimage: rafpe/docker-haproxy-rsyslog:latest に変更します。
  • flyway で image: boxfuse/flyway:${FLYWAY_VERSION}-alpineimage: flyway/flyway:${FLYWAY_VERSION}-alpine に変更します。boxfuse/flyway は [DEPRECATED] になっていて、flyway/flyway が Official Flyway Docker images になっていました。
  • postgres_exporter で image: wrouesnel/postgres_exporterimage: wrouesnel/postgres_exporter:v0.8.0 に変更します。

docker-compose.mail.yml を変更する

  rainloop:
    image: hardware/rainloop:1.13.0
  • rainloop で image: hardware/rainloopimage: hardware/rainloop:1.13.0 に変更します。

.env を変更する

HOST_IP_ADDRESS=172.31.16.1
REDIS_VERSION=5.0.7
REDIS_CLUSTER_1_PORT=6379
REDIS_CLUSTER_2_PORT=6380
REDIS_CLUSTER_3_PORT=6381
REDIS_CLUSTER_4_PORT=6382
REDIS_CLUSTER_5_PORT=6383
REDIS_CLUSTER_6_PORT=6384

RABBITMQ_VERSION=3.8.2-management
RABBITMQ_ERLANG_COOKIE=Uzkm93w5e1Lz8AcP
RABBITMQ_DEFAULT_USER=rabbitmq
RABBITMQ_DEFAULT_PASS=12345678
RABBITMQ_DEFAULT_VHOST=/

POSTGRESQL_VERSION=12.1
PGADMIN4_VERSION=4.16

FLYWAY_VERSION=6.1.3
FLYWAY_URL=jdbc:postgresql://postgresql/ksbylending
FLYWAY_USER=ksbylending_user
FLYWAY_PASSWORD=xxxxxxxx

POSTGRES_EXPORTER_USER=postgres_exporter
POSTGRES_EXPORTER_PASSWORD=zzzzzzzz

MAILSERVER_VERSION=release-v6.2.1
  • REDIS_VERSION=5.0.2REDIS_VERSION=5.0.7 に変更します。
  • RABBITMQ_VERSION=3.7.8-managementRABBITMQ_VERSION=3.8.2-management に変更します。
  • POSTGRESQL_VERSION=11.1POSTGRESQL_VERSION=12.1 に変更します。
  • PGADMIN4_VERSION=3.6PGADMIN4_VERSION=4.16 に変更します。
  • FLYWAY_VERSION=5.2.4FLYWAY_VERSION=6.1.3 に変更します。
  • MAILSERVER_VERSION=release-v6.1.0MAILSERVER_VERSION=release-v6.2.1 に変更します。

docker-compose up -d コマンドを実行する

以下のコマンドを実行して docker image を更新・ダウンロードします(画面キャプチャはなし)。

  1. docker-compose build コマンドを実行し、Dockerfile で作成している image を更新します。
  2. docker-compose up -d コマンドを実行してコンテナ一式(メールサーバ・rainloop を除く)を起動します。
  3. docker-compose -f docker-compose.mail.yml up -d コマンドを実行してメールサーバ・rainloop のコンテナを起動します。
  4. docker-compose -f docker-compose.mail.yml down コマンドを実行してメールサーバ・rainloop のコンテナを停止・削除します。

正常に起動することが確認できたら、IntelliJ IDEA の Services Window から古い docker image を削除します。

Grafana の Spring Boot Statistics ダッシュボードにメトリックスが表示されない原因を解消する

http://localhost:9090/graph にアクセスすると今度は Prometheus の画面が表示されるようになりました。

f:id:ksby:20200105180910p:plain

しかし、今度は Grafana の Spring Boot Statistics ダッシュボードに何もメトリックスが表示されていないことに気づきました。以前は「Application」に Spring Boot のアプリケーションで設定している "lending" の文字が自動で選択されていたのですが、今は "None" という文字が表示されています。

f:id:ksby:20200105181127p:plain

また Prometheus Redis ダッシュボードもメトリックスが表示されていませんでした。

f:id:ksby:20200105181854p:plain

他の2つのダッシュボードは正常にメトリックスが表示されていました。

まずは Spring Boot Statistics ダッシュボードにメトリックスが表示されない原因を解消します。

ダッシュボード右上の「Dashboard settings」アイコン(歯車のアイコン)をクリックします。

f:id:ksby:20200105182422p:plain

「Settings」画面に遷移したら、画面左側の「Variables」をクリックします。

f:id:ksby:20200105182707p:plain

「Variables」の画面が表示されたら、一番上の $instance をクリックします。

f:id:ksby:20200105182844p:plain

$instance の編集画面が表示されます。「Query」を見ると label_values(jvm_classes_loaded, instance) と入力されており、Prometheus から取得するメトリックスの内 jvm_classes_loaded を見て $instance にセットする値を取得するよう設定されていますが、

f:id:ksby:20200105183009p:plain

Prometheus の画面で jvm_classes_loaded を入力すると、候補として表示されるのは jvm_classes_loaded_classesjvm_classes_loaded というメトリックスはなくなっていました。

f:id:ksby:20200105183454p:plain

jvm_classes_loaded_classes で検索するとデータが取得できて、application も instance も取得することができることが確認できます。

f:id:ksby:20200105183605p:plain

つまり取得元のメトリックス名が変更されたことが原因なので、$instance$application の編集画面でメトリックス名を jvm_classes_loadedjvm_classes_loaded_classes に変更すれば解決します。1点注意があって、下の画面キャプチャでは見えませんが、変更後に画面下の「Update」ボタンをクリックしてください(画面右側のスクロールバーで下に行けば表示されます)。

f:id:ksby:20200105184556p:plain f:id:ksby:20200105184239p:plain

「Variables」を変更したら「Save」ボタンをクリックします。

f:id:ksby:20200105184801p:plain

「Save changes」ダイアログが表示されるので、「Save current variables」をチェックして中央にコメントを入力した後「Save」ボタンをクリックします。

f:id:ksby:20200105185109p:plain

Spring Boot Statistics ダッシュボードの画面に戻るとメトリックスが表示されるようになりました。

f:id:ksby:20200105185308p:plain

Grafana の Prometheus Redis ダッシュボードにメトリックスが表示されない原因を解消する

Prometheus が Redis のメトリックスを取得するのに利用している redis_exporter のログを見ると Couldn't connect to redis instance というログが出ていました。

f:id:ksby:20200105190715p:plain

Web で検索すると redis cluster with error "Couldn't connect to redis instance" の Issue が見つかり、その中のリンク先に行くと Prometheus Configuration to Scrape Multiple Redis Hosts に複数の Redis からメトリックスを取得するための設定方法が記述されていました。

今回 redis_exporter のコンテナの image を image: oliver006/redis_exporter:latestimage: oliver006/redis_exporter:v1.3.5-alpine に変更しましたが、バージョンが 0.x から 1.x に変更されて設定方法も変わったようです。マニュアル記載の設定方法に変更します。

docker-compose.yml の redis_exporter の設定から environment の REDIS_ADDR の設定を削除します。

  redis_exporter:
    image: oliver006/redis_exporter:v1.3.5-alpine
    container_name: redis_exporter
    ports:
      - "9121:9121"

docker/prometheus/prometheus.yml に - job_name: 'redis_exporter_targets' の設定を追加します。ここにメトリックスを取得する Redis を列挙します。

scrape_configs:
..........
- job_name: 'redis_exporter_targets'
  static_configs:
    - targets:
        - redis://redis-cluster-6379:6379
        - redis://redis-cluster-6380:6379
        - redis://redis-cluster-6381:6379
        - redis://redis-cluster-6382:6379
        - redis://redis-cluster-6383:6379
        - redis://redis-cluster-6384:6379
  metrics_path: /scrape
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: redis_exporter:9121

- job_name: 'redis_exporter'
  static_configs:
  - targets: ['redis_exporter:9121']

..........

Docker コンテナを再起動して Prometheus Redis ダッシュボードを表示すると、今度はメトリックスが表示されるようになりました。左上のパネル等の表示がおかしいのは1台の Redis からメトリックスを取得していることが前提の設定になっているものだからです。ここは作り変えない限りどうしようもないので、このままにします。

f:id:ksby:20200105224212p:plain

最後に clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると "BUILD SUCCESSFUL" のメッセージが出力されました。特に問題はなさそうです。

f:id:ksby:20200105225830p:plain

履歴

2020/01/05
初版発行。
2020/01/13
* haproxy の image を image: haproxy:2.1.2image: haproxy:2.1.2-alpine に変更しました。