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 をバージョンアップします。
参照したサイト・書籍
redis cluster with error "Couldn't connect to redis instance"
https://github.com/oliver006/redis_exporter/issues/325Prometheus Configuration to Scrape Multiple Redis Hosts
https://github.com/oliver006/redis_exporter#prometheus-configuration-to-scrape-multiple-redis-hosts
目次
- 現状の確認とバージョンアップの方針
- docker-compose.yml を変更する
- docker-compose.mail.yml を変更する
- .env を変更する
docker-compose up -d
コマンドを実行する- Grafana の Spring Boot Statistics ダッシュボードにメトリックスが表示されない原因を解消する
- Grafana の Prometheus Redis ダッシュボードにメトリックスが表示されない原因を解消する
手順
現状の確認とバージョンアップの方針
現状を確認したところ、以下の状況でした。
Prometheus が動作していません。http://localhost:9090/ にアクセスしても何も表示されず、IntelliJ IDEA の Services Window を見ると確かに動作していません。
panic: runtime error: slice bounds out of range
というログが出ていました。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:latest
→image: prom/prometheus:v2.15.1
に変更します。 - grafana で
image: grafana/grafana:latest
→image: grafana/grafana:6.5.2
に変更します。 - redis_exporter で
image: oliver006/redis_exporter:latest
→image: oliver006/redis_exporter:v1.3.5-alpine
に変更します。 - haproxy で
image: haproxy:1.8.14-alpine
→image: haproxy:2.1.2-alpine
に変更します。 - haproxy-rsyslog で
image: rafpe/docker-haproxy-rsyslog
→image: rafpe/docker-haproxy-rsyslog:latest
に変更します。 - flyway で
image: boxfuse/flyway:${FLYWAY_VERSION}-alpine
→image: flyway/flyway:${FLYWAY_VERSION}-alpine
に変更します。boxfuse/flyway は[DEPRECATED]
になっていて、flyway/flyway が Official Flyway Docker images になっていました。 - postgres_exporter で
image: wrouesnel/postgres_exporter
→image: wrouesnel/postgres_exporter:v0.8.0
に変更します。
docker-compose.mail.yml を変更する
rainloop: image: hardware/rainloop:1.13.0
- rainloop で
image: hardware/rainloop
→image: 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.2
→REDIS_VERSION=5.0.7
に変更します。RABBITMQ_VERSION=3.7.8-management
→RABBITMQ_VERSION=3.8.2-management
に変更します。POSTGRESQL_VERSION=11.1
→POSTGRESQL_VERSION=12.1
に変更します。PGADMIN4_VERSION=3.6
→PGADMIN4_VERSION=4.16
に変更します。FLYWAY_VERSION=5.2.4
→FLYWAY_VERSION=6.1.3
に変更します。MAILSERVER_VERSION=release-v6.1.0
→MAILSERVER_VERSION=release-v6.2.1
に変更します。
docker-compose up -d
コマンドを実行する
以下のコマンドを実行して docker image を更新・ダウンロードします(画面キャプチャはなし)。
docker-compose build
コマンドを実行し、Dockerfile で作成している image を更新します。docker-compose up -d
コマンドを実行してコンテナ一式(メールサーバ・rainloop を除く)を起動します。docker-compose -f docker-compose.mail.yml up -d
コマンドを実行してメールサーバ・rainloop のコンテナを起動します。docker-compose -f docker-compose.mail.yml down
コマンドを実行してメールサーバ・rainloop のコンテナを停止・削除します。
正常に起動することが確認できたら、IntelliJ IDEA の Services Window から古い docker image を削除します。
Grafana の Spring Boot Statistics ダッシュボードにメトリックスが表示されない原因を解消する
http://localhost:9090/graph にアクセスすると今度は Prometheus の画面が表示されるようになりました。
しかし、今度は Grafana の Spring Boot Statistics ダッシュボードに何もメトリックスが表示されていないことに気づきました。以前は「Application」に Spring Boot のアプリケーションで設定している "lending" の文字が自動で選択されていたのですが、今は "None" という文字が表示されています。
また Prometheus Redis ダッシュボードもメトリックスが表示されていませんでした。
他の2つのダッシュボードは正常にメトリックスが表示されていました。
PostgreSQL Statistics
RabbitMQ Monitoring
まずは Spring Boot Statistics ダッシュボードにメトリックスが表示されない原因を解消します。
ダッシュボード右上の「Dashboard settings」アイコン(歯車のアイコン)をクリックします。
「Settings」画面に遷移したら、画面左側の「Variables」をクリックします。
「Variables」の画面が表示されたら、一番上の $instance
をクリックします。
$instance
の編集画面が表示されます。「Query」を見ると label_values(jvm_classes_loaded, instance)
と入力されており、Prometheus から取得するメトリックスの内 jvm_classes_loaded
を見て $instance
にセットする値を取得するよう設定されていますが、
Prometheus の画面で jvm_classes_loaded
を入力すると、候補として表示されるのは jvm_classes_loaded_classes
で jvm_classes_loaded
というメトリックスはなくなっていました。
jvm_classes_loaded_classes
で検索するとデータが取得できて、application も instance も取得することができることが確認できます。
つまり取得元のメトリックス名が変更されたことが原因なので、$instance
と $application
の編集画面でメトリックス名を jvm_classes_loaded
→ jvm_classes_loaded_classes
に変更すれば解決します。1点注意があって、下の画面キャプチャでは見えませんが、変更後に画面下の「Update」ボタンをクリックしてください(画面右側のスクロールバーで下に行けば表示されます)。
「Variables」を変更したら「Save」ボタンをクリックします。
「Save changes」ダイアログが表示されるので、「Save current variables」をチェックして中央にコメントを入力した後「Save」ボタンをクリックします。
Spring Boot Statistics ダッシュボードの画面に戻るとメトリックスが表示されるようになりました。
Grafana の Prometheus Redis ダッシュボードにメトリックスが表示されない原因を解消する
Prometheus が Redis のメトリックスを取得するのに利用している redis_exporter のログを見ると Couldn't connect to redis instance
というログが出ていました。
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:latest
→ image: 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 からメトリックスを取得していることが前提の設定になっているものだからです。ここは作り変えない限りどうしようもないので、このままにします。
最後に clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると "BUILD SUCCESSFUL" のメッセージが出力されました。特に問題はなさそうです。
履歴
2020/01/05
初版発行。
2020/01/13
* haproxy の image を image: haproxy:2.1.2
→ image: haproxy:2.1.2-alpine
に変更しました。