たまにアプリが落ちてしまうことがあったのでSpring Boot Actuatorを使って死活監視をかなり雑にしてみました。
本来ならprometheusと連携した方がいい?ような気がしますがそれは別途試すとして、今回はGrafanaから直接Spring Boot Actuatorのエンドポイントにアクセスさせます。
Spring Boot Actuatorの設定
Spring Bootで作成したPJにヘルスチェック用のエンドポイントを追加していきます。
Maven pom.xmlにライブラリ追加
pom.xmlに以下を追加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.propertiesに設定追加
application.propertiesに以下を追加
デフォルト設定ではエンドポイントが/actuatorになりますが、”management.endpoints.web.base-path”で/statusに変更しています。特に変更した必要はないのですが。
ここをみるとWeb(HTTP)の場合、デフォルトでhealthが有効になっているので設定する必要はありませんが意図的に公開していますという意味で設定しました。
また、jmx経由だと全開なのでこちらは全て除外しています。GrafanaからはHTTPでアクセスさせるためです。
management.endpoints.web.base-path=/status
management.endpoints.web.exposure.include=health
management.endpoints.jmx.exposure.exclude=*
Spring Securityを使用しているので認証不要に設定
ヘルスチェックは別に認証いらないかなと思ったので認証不要に設定します。
省略した形でソースを載せておきます。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/status/**").permitAll() // 認証不要なパスを指定
.anyRequest().authenticated()
.and()
.cors().and().csrf().disable()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
// 省略
}
動作確認
以上の設定が完了したら設定が有効になっているか確認しましょう。
ローカルで動かす場合は http://localhost:8080/status/health にアクセスすると {“status”:”UP”} というJSONが返却されます。
次はここに対してGrafanaからアクセスさせていきます。
Grafanaの設定
Grafanaのpluginをインストール
以下の2つのプラグインを使用します。
JSON API(Data source)でエンドポイントにアクセスし、Dynamic text(panel)で表示していきます。
- Dynamic text
- JSON API
Grafanaのプラグイン画面でDynamic text、JSON APIとそれぞれ検索してインストールしてください。
Data sourcesの設定
Add data sourceでインストールしたJSON APIを選択し、設定していきます。
今回は認証など煩わしい設定をする必要がないのでURLとtimeout(秒)のみ設定しました。
URLはhttps://xxxxx/status としました。/healthは次で設定可能ですのでここでは指定しません。
特にヘルスチェック以外のエンドポイントを使用する場合は/statusで止めておくべきです。
設定後、Save & testでSuccessとなることを確認してください。
ダッシュボードの設定
ダッシュボード→ Add an empty panelでパネルを追加し、Data sourceで先ほど設定したJSON APIを選択します。
最初にPath(/health)を設定していきます。
次にFieldを設定します。先にPathを設定しているため、”$.”と入力するとstatusという文字列が候補として出てくるはずです。
そのまま選択して$.statusとしてください。
最後にAliasを設定します。ここでは status とします。
あとはパネルの設定となります。パネルをDynamic textに変更してください。
右側にある設定のDynamic text – Contentに以下のように記述します。
この領域はマークダウンで記述できるのでお好きなように設定してください。
{{XXX}}で先ほどJSON APIで設定したaliasを指定することで {“status”:”UP”} の UP の部分を取得することができます。
Spring Boot Actuator health check
# {{status}}
ダッシュボードに戻って表示を確認
JSON APIとDynamic textの設定が完了したら Apply でダッシュボードに戻って表示を確認しましょう。
ちなみにアプリが落ちる(主にOutOfMemoryで)と画像のように赤いビックリマークがでるのでそこで判断します。(雑)
Prometheusと連携はやる気がでたらやってみよう。
以上です。
コメント