エキサイト株式会社エンジニア佐々木です。メディア事業部ではSpringBootとAWSを使用してサービスを展開しています。簡易的な監視にSpringBootAdminを利用していますので、その紹介になります。
- 環境
- なぜ簡易モニタリングが欲しかったのか?
- SpringBoot Adminの構成について
- SpringBoot Admin Serverの設定
- SpringBoot Admin Clientの設定
- Server/Clientをそれぞれ起動する
- まとめ
- 最後に
環境
環境は下記になります。
$ 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 Insight
をCloudWatch
で見るようなこと切替が発生していました。簡易的でも統合的にモニタリングしたい欲求があるので、SpringBoot系に限定はされてしまいますがSpringBoot Adminというモニタリングツールがあるので、導入してみようと思います。
結果から書きますと、SpringBootAdminを入れることで下記のことを実現することができました。
- ログがリアルタイムに流れてくる
- メトリクスはほぼ設定不要で取得できる(yamlで数行)
- アプリケーション内の設定情報を見ることが可能
- ログレベルを再起動なしで変更可能
- スレッドダンプ・ヒープダンプの取得が容易
- キャッシュ削除をSpringBootAdminから実行可能
- スケジューラーの設定確認が可能
パッと思いつくだけでもこれくらいあります。ただし、過去データを蓄積する機能はありませんので、その場合は他のモニタリングサービスを使用しないといけません。そしてサーバ費のみとなっております。
SpringBoot Adminの構成について
SpringBoot Adminは、サーバとクライアントでライブラリが分かれています。それぞれで設定が必要になります。
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をそれぞれ起動する
それぞれを起動して、通信ができると下記のような画面が出てくると思います。
サーバの状態
サーバの状態は画像の通りになります。gitのコミットIDやビルドバージョン、メモリやCPUが取得できているかなど基本情報は取得できています。
ログファイルの確認
サーバから出力されているログファイルも取得することができます。
ログレベルの変更
ログレベルの変更も、メソッド単位で可能です。
まとめ
SpringBootAdminは、内部でWebflux/Nettyを使用しているようで、結構な接続数を処理できるようです。SpringBootAdminServer1台で、クライアント50〜100台は処理できるようです。データ蓄積はできませんが、簡易的にみるには十分かなと思います。また、Slack通知などや認証まわりなどのカスタマイズも設定を書けば可能なようです。これから使用していこうと思います。
最後に
エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。
募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com