SpringBoot Adminを利用して簡易的なアプリケーションモニタリングツールを導入する

エキサイト株式会社エンジニア佐々木です。メディア事業部ではSpringBootとAWSを使用してサービスを展開しています。簡易的な監視にSpringBootAdminを利用していますので、その紹介になります。

環境

環境は下記になります。

$ java --version 
openjdk 21.0.3 2024-04-16 LTS
OpenJDK Runtime Environment Corretto-21.0.3.9.1 (build 21.0.3+9-LTS)
OpenJDK 64-Bit Server VM Corretto-21.0.3.9.1 (build 21.0.3+9-LTS, mixed mode, sharing)

$ ./gradlew --version
------------------------------------------------------------
Gradle 8.5
------------------------------------------------------------

Build time:   2023-11-29 14:08:57 UTC
Revision:     28aca86a7180baa17117e0e5ba01d8ea9feca598

Kotlin:       1.9.20
Groovy:       3.0.17
Ant:          Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM:          21.0.3 (Amazon.com Inc. 21.0.3+9-LTS)
OS:           Mac OS X 14.4.1 aarch64

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.5)

なぜ簡易モニタリングが欲しかったのか?

メディア事業部ではSpringBootをAWS ECSに載せてサービスを提供していますが、コストの関係でエラーログはCloudWatch Logs、正常系はFireLensでS3に入れてAWS Athena、メトリクスはContainer InsightCloudWatchで見るようなこと切替が発生していました。簡易的でも統合的にモニタリングしたい欲求があるので、SpringBoot系に限定はされてしまいますがSpringBoot Adminというモニタリングツールがあるので、導入してみようと思います。

結果から書きますと、SpringBootAdminを入れることで下記のことを実現することができました。

  • ログがリアルタイムに流れてくる
  • メトリクスはほぼ設定不要で取得できる(yamlで数行)
  • アプリケーション内の設定情報を見ることが可能
  • ログレベルを再起動なしで変更可能
  • スレッドダンプ・ヒープダンプの取得が容易
  • キャッシュ削除をSpringBootAdminから実行可能
  • スケジューラーの設定確認が可能

パッと思いつくだけでもこれくらいあります。ただし、過去データを蓄積する機能はありませんので、その場合は他のモニタリングサービスを使用しないといけません。そしてサーバ費のみとなっております。

SpringBoot Adminの構成について

SpringBoot Adminは、サーバとクライアントでライブラリが分かれています。それぞれで設定が必要になります。

SpringBootAdminのServerとClientの構成

SpringBoot Admin Serverの設定

build.gradle

サーバ側の依存関係は下記を追加するだけです。

dependencies {
    ....
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation "de.codecentric:spring-boot-admin-starter-server:3.2.3"
    ...
}

application.yml

サーバー側のアプリケーション側の設定ファイルもほとんど設定がありません。

spring:
  application:
    admin:
      enabled: true
  boot:
    admin:
      monitor:
        default-retries: 1
      ui:
        # 公開用のURL
        public-url: http://localhost:8080/

以上でサーバ側の設定は完了です。

SpringBoot Admin Clientの設定

クライアント側の設定は、各API、Webフロント、管理面、バッチなどの既存のアプリケーションに下記の設定を追加します。

build.gradle

クライアントの方は下記の依存関係を追加します。

dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-actuator'   // メトリクス収集するためのエンドポイントライブラリ
        implementation "de.codecentric:spring-boot-admin-starter-client:$springBootAdminClientVersion"   // SpringBootAdmin Client
}

application.yml

クライアントのアプリケーション側の設定ファイルは、下記となります。少し多めです。

## アプリケーション名
spring:
  application:
    name: sample-application   # SpringBootAdminServerで表示する
  boot:
    admin:
      client:
        enabled: true
        url: http://localhost:8080  # SpringBootAdminServerのURLを記載します
        auto-registration: true  # SpringBootAdminServerに自身のサーバ自動登録する
        auto-deregistration: true # サーバが落ちたときに自動で削除処理を行う。この設定がfalseだと、サーバが落ちた時にSpringBootAdminServer上で異常として検知されます

## spring-boot-starter-actuator のメトリクス用のエンドポイントでどこまで公開するかを設定する
## ほぼ全公開の設定になります
management:
  info:
    env:
      enabled: true
  endpoint:
    health:
      enabled: true
      probes:
        enabled: true
      show-components: always
    logfile:
      enabled: true
  endpoints:
    web:
      exposure:
        include: '*'

## アプリケーションログの出力設定になります。
logging:
  file:
    name: application.log
  logback:
    rollingpolicy:
      max-history: 7
      max-file-size: 10MB

上記で設定が完了となります。

Server/Clientをそれぞれ起動する

それぞれを起動して、通信ができると下記のような画面が出てくると思います。

SpringBootAdminServerのUI

サーバの状態

サーバの状態は画像の通りになります。gitのコミットIDやビルドバージョン、メモリやCPUが取得できているかなど基本情報は取得できています。

サーバの状態

ログファイルの確認

サーバから出力されているログファイルも取得することができます。

ログレベルの変更

ログレベルの変更も、メソッド単位で可能です。

まとめ

SpringBootAdminは、内部でWebflux/Nettyを使用しているようで、結構な接続数を処理できるようです。SpringBootAdminServer1台で、クライアント50〜100台は処理できるようです。データ蓄積はできませんが、簡易的にみるには十分かなと思います。また、Slack通知などや認証まわりなどのカスタマイズも設定を書けば可能なようです。これから使用していこうと思います。

最後に

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com