Help us understand the problem. What is going on with this article?

Spring Boot Adminの構築と所感 〜Gitコミット情報を表示するTipsも〜

More than 1 year has passed since last update.

Spring InitializrにSpring Boot Admin(Server),Spring Boot Admin(Client)が追加されていたので、触ってみることにした。
Spring Boot AdminはSpring Bootアプリケーションのモニタリングができるライブラリ。

構築

環境

OS: macOS Sierra 10.12.6
Java: 1.8.0_102
Spring Boot: 1.5.10.RELEASE
Spring Boot Admin: 1.5.7

構築手順

Spring Boot AdminはServer-Clientの構成になっている。
Serverがモニタリング画面を提供し、Clientがモニタリング対象のアプリケーションとなる。

Spring Boot Admin Server

Spring InitializrからSpring Boot Admin (Server)を選択してアプリケーションを作成する。

depenedencyspring-boot-admin-starter-serverが追加されていればOK。
(上記のようにSpring Initializrから作れば自然と追加されているのでpom.xmlの編集はいらないはず)

pom.xml
    <dependencies>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

あとはApplicationクラスの@SpringBootApplicationアノテーションを削除して、以下のようにアノテーションを追加する必要がある。

SpringBootAdminServerApplication.java
@Configuration
@EnableAutoConfiguration
@EnableAdminServer
public class SpringBootAdminServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootAdminServerApplication.class, args);
    }
}

これでアプリケーションとして起動すればServer側はOK。
http://localhost:8080にアクセスすればモニタリングのWebページが表示される。

Spring Boot Admin Client

Spring InitializrからSpring Boot Admin (Client)を選択してアプリケーションを作成する。
Client自体がアプリケーションとして起動すべきなので、ここでWEBアプリケーションを想定して、Webも追加しておく。

上記のようにして作成すれば、dependencyspring-boot-admin-starter-client(とspring-boot-starter-web)が追加されているはず。

pom.xml
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

Serverへの接続情報をapplication.yml(propertiesよりymlのほうが個人的には好きなので変更した)に記載すれば一旦はOK。

application.yml
server:
  port: 3000 # ①
spring:
  boot:
    admin:
      url: http://localhost:8080 # ②
management:
  security:
    enabled: false # ③

各プロパティについて解説しておく。
①: Spring Boot Admin Serverが(とくに設定していないので)デフォルトの8080ポートで起動するため、起動ポートが被らないようにする。
②: Spring Boot Amdin Serverへの接続情報。
③: Spring Boot 1.5.x から全てのエンドポイントがセキュアになっているため。確認のために無効化しているので、本番ではsecurity sectionに記載されている対応が必要。

あとは、ビルド時の情報(バージョンやartifactなど)が表示されるように、pom.xmlにbuild-infoを追加しておいたほうがよい。

pom.xml
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>build-info</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

あとは起動すればOK。

所感

画面はこんな感じ。

スクリーンショット 2018-02-15 17.26.52.png

デメリット

すぐに違和感を持ったのは、表示が時間経過ではないことだ。
つまり、いまのスナップショットの状態しか表示されていないのだ。
そのため、その状態が通常より負荷がかかっている状態なのかどうかが分からない。
これは最大のデメリットだと思う。正直見づらいし、感覚的に正常かどうかつかめないから使いにくい。

メリット

  • すぐに構築することができること
  • 綺麗なUIで表示されること
  • (ここでは話していないが)Eurekaなどにも対応していること

ちょっと追求してみた

内部の作り(Spring Boot Admin Client)

de.codecentric.boot.admin.client.registrationパッケージにメインの処理が記述されている。
Client側はスケジューリングして、Server側へ登録処理をしているだけ。

クラス 処理概要
RegistrationApplicationListener スケジューリングの登録、解除を行う。ApplicationRegistratorクラスのメソッドを起動時 or 定期的に呼び出すようにしている。
ApplicationRegistrator Spring Boot Server AdminにHTTP通信を行い、Server側に登録依頼する処理をしている。

内部の作り(Spring Boot Admin Server)

ざっくりはHTTPを受けて登録する処理と定期的にステータスを更新する処理がある。
HTTPを受けて登録する処理に主に関係するクラスはこちら。

パッケージ クラス 処理概要
de.codecentric.boot.admin.registry.web RegistryController Client側からのAPIを受けるController。
de.codecentric.boot.admin.registry ApplicationRegistry Client側から受けた情報を元に、Clientの情報を登録しておく。

定期的にステータスを更新する処理はこちら。

パッケージ クラス 処理概要
de.codecentric.boot.admin.registry StatusUpdateApplicationListener スケジューリングの登録、解除を行う。
de.codecentric.boot.admin.registry StatusUpdater Client側のActuator APIへアクセスし、ステータスを更新する。

Tips:Gitコミット情報の表示

デフォルトで作成すると、Gitのコミット情報(コミットIDやブランチなど)が表示されなかったので、設定を調べてみた。

Spring Boot AdminはSpring Boot Actuatorの/infoの情報を表示しているので、/infoにGitの情報を追加すればよい。やり方は以下の通りだ。

pom.xmlにgit-commit-id-pluginを追加する。

pom.xml
<build>
    <plugins>
        <plugin>
            <groupId>pl.project13.maven</groupId>
            <artifactId>git-commit-id-plugin</artifactId>
        </plugin>
    </plugins>
</build>

これだけでOK!
git-commit-id-plugingit.propertiesファイルを作成するだけだが、Spring Boot ActuatorのGitInfoContributorクラスが自動でファイルを見つけ、/infoに追加してくれる。

まとめ

やっぱり時間経過がないのがイタいですね。
自分だったらプロジェクトにわざわざ採用しないかなぁ、と思いました。
これからもっと使い勝手がよくなるように改善されていくことを期待しています。

あとライブラリの中身まで見ると、勉強になりますね。
ときどきはこうやってライブラリを確認する時間を取りたいですね。

GitHub

自身のGitHubにアップしたので参考にどうぞ。
spring-boot-admin-sample

参考

Spring Boot Admin

Gitコミット情報の表示

mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away