かんがるーさんの日記

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

Spring Boot 1.5.x の Web アプリを 2.0.x へバージョンアップする ( その25 )( Docker で PostreSQL+pgAdmin4+ Flyway の環境を構築する2 )

概要

記事一覧はこちらです。

Spring Boot 1.5.x の Web アプリを 2.0.x へバージョンアップする ( その24 )( Docker で PostreSQL+pgAdmin4+ Flyway の環境を構築する ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Spring Boot の Web アプリケーションにも Flyway を導入します。
    • PostgreSQL のメトリックスを Prometheus+Grafana で見られるようにします。

参照したサイト・書籍

  1. Spring Boot Reference Guide - 82.5.1 Execute Flyway Database Migrations on Startup
    https://docs.spring.io/spring-boot/docs/2.0.7.RELEASE/reference/htmlsingle/#howto-execute-flyway-database-migrations-on-startup

  2. PostgreSQL Statistics
    https://grafana.com/dashboards/6742

  3. wrouesnel/postgres_exporter
    https://github.com/wrouesnel/postgres_exporter

目次

  1. Spring Boot の Web アプリケーションに Flyway を導入する
  2. PostgreSQL のメトリックスを Prometheus+Grafana で見られるようにする

手順

Spring Boot の Web アプリケーションに Flyway を導入する

build.gradle の以下の点を変更します。

dependencies {
    ..........

    // dependency-management-plugin によりバージョン番号が自動で設定されないもの、あるいは最新バージョンを指定したいもの
    ..........
    implementation("com.google.guava:guava:27.0-jre")
    implementation("org.flywaydb:flyway-core:5.2.4")
    testImplementation("org.dbunit:dbunit:2.6.0")
    ..........
  • dependencies block に implementation("org.flywaydb:flyway-core:5.2.4") を追加します。

変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

動作確認します。docker-compose.yml の flyway コンテナの設定をコメントアウトしてから、

#  flyway:
#    image: boxfuse/flyway:${FLYWAY_VERSION}-alpine
#    container_name: flyway
#    volumes:
#      - ./src/main/resources/db/migration:/flyway/sql
#    command: -url=${FLYWAY_URL} -user=${FLYWAY_USER} -password=${FLYWAY_PASSWORD} -connectRetries=60 migrate
#    depends_on:
#      - postgresql

docker-compose up -d コマンドを実行した後 Tomcat を起動すると flyway_schema_history テーブルの create table 文が実行されており、

f:id:ksby:20190103120942p:plain

pgAdmin4 で接続してみるとテーブルが作成されてデータも登録されていました。

f:id:ksby:20190103121856p:plain

tomcat を停止して docker-compose down コマンドを実行した後、docker-compose.yml を元に戻します。

今度は docker で flyway コンテナを起動した後、SQL ファイルを追加して Tomcat 起動時に実行されるか確認します。

docker-compose up -d コマンドを実行します。

src/main/resources/db/migration の下に V2__create_table.sql を新規作成した後、以下の内容を記述します。

create table test_table (
    test_id                 bigserial primary key
    , test_data             text
);

tomcat を起動すると V2__create_table.sql が実行されて test_table が作成されていました。

f:id:ksby:20190103123420p:plain

問題なさそうです。

また Tomcat を起動時に Direct configuration of the Flyway object has been deprecated and will be removed in Flyway 6.0. Use Flyway.configure() instead. 等の WARN ログが出力されていました。おそらく Flyway の AutoConfiguration だと思いますが、Spring Boot の対応バージョンが 6.0 になる前に独自に Flyway のバージョンを 6.0 系に上げようとしても上がらないかもしれません。

f:id:ksby:20190103114613p:plain

PostgreSQL のメトリックスを Prometheus+Grafana で見られるようにする

PostgreSQL のメトリックスを PostgreSQL Statistics で Grafana で表示させてみます。

PostgreSQL → Prometheus への exporter は wrouesnel/postgres_exporter を Docker で起動して利用します。

https://github.com/wrouesnel/postgres_exporter#running-as-non-superuser を参考にして src/main/resources/db/init/create_database.sql に以下の SQL 文を追加して postgres_exporter 用のユーザを作成します。

-- postgres_exporter user
CREATE USER postgres_exporter PASSWORD 'zzzzzzzz';
ALTER USER postgres_exporter SET SEARCH_PATH TO postgres_exporter,pg_catalog;
-- If deploying as non-superuser (for example in AWS RDS), uncomment the GRANT
-- line below and replace <MASTER_USER> with your root user.
-- GRANT postgres_exporter TO <MASTER_USER>
CREATE SCHEMA postgres_exporter AUTHORIZATION postgres_exporter;
CREATE VIEW postgres_exporter.pg_stat_activity
AS
SELECT * from pg_catalog.pg_stat_activity;
GRANT SELECT ON postgres_exporter.pg_stat_activity TO postgres_exporter;
CREATE VIEW postgres_exporter.pg_stat_replication AS
SELECT * from pg_catalog.pg_stat_replication;
GRANT SELECT ON postgres_exporter.pg_stat_replication TO postgres_exporter;

.env を以下のように変更します。

........
FLYWAY_PASSWORD=xxxxxxxx

POSTGRES_EXPORTER_USER=postgres_exporter
POSTGRES_EXPORTER_PASSWORD=zzzzzzzz
  • 以下の2行を追加します。
    • POSTGRES_EXPORTER_USER=postgres_exporter
    • POSTGRES_EXPORTER_PASSWORD=zzzzzzzz

docker-compose.yml に postgres_exporter の設定を追加します。

  flyway:
    ..........

  postgres_exporter:
    image: wrouesnel/postgres_exporter
    container_name: postgres_exporter
    environment:
      - DATA_SOURCE_NAME=postgresql://${POSTGRES_EXPORTER_USER}:${POSTGRES_EXPORTER_PASSWORD}@postgresql:5432/ksbylending?sslmode=disable
    depends_on:
      - postgresql

docker/prometheus/prometheus.yml を以下のように変更します。

- job_name: 'postgres_exporter'
  static_configs:
    - targets: ['postgres_exporter:9187']

docker-compose up -d コマンドを実行します。

f:id:ksby:20190103161540p:plain

Grafana に PostgreSQL StatisticsDashboard を追加します。http://localhost:3000/ にアクセスした後、画面左側のメニューから「Create」-「Import」を選択します。

「Import」画面が表示されますので 6742 の ID を入力します。

f:id:ksby:20190103161838p:plain

「Prometheus」で「spring-actuator」を選択した後、「Import」ボタンをクリックします。

f:id:ksby:20190103162012p:plain

PostgreSQL StatisticsDashboard が表示されます(画面右上の表示間隔の設定を Last 30 minutes → Last 15 minutes Refresh every 5s に変更しています)。

f:id:ksby:20190103162253p:plain f:id:ksby:20190103162405p:plain f:id:ksby:20190103162457p:plain f:id:ksby:20190103162626p:plain

履歴

2019/01/03
初版発行。