Spring Boot Actuator+ZabbixによるシンプルなWEBアプリケーション監視

はじめに

Boot And Zabbix

皆様こんにちは。Spring Boot遊びがタノシイな文字コードおじさんです。

今回はSpring Bootで作成したWEBアプリをSpring Boot Actuator+Zabbixで簡単に監視する方法をご紹介します。

んん?Spring Bootをやったことが無い??そんな方は下記のチュートリアルで体験する以外、ありえませんぞww

GradleまたはMavenがあればホントに15分でできるので、ぜひお試しを!

Building an Application with Spring Boot

Spring Boot Actuatorの概要と導入

Spring Boot Actuatorの導入

Spring Boot Actuatorは監視・管理用の機能を追加してくれるものです。導入は至って簡単で、依存関係に追加するだけでOKです。

Gradleならdependenciesに1行追加で済みます(イケメェン

Mavenなら以下の通りです。

依存関係に追加すると監視用のエンドポイントが利用可能になります。HTTPでアクセスした場合JSONとして内容が表示されます。

追加されたエンドポイントのうち代表的なものを見てみましょう。なお、詳細な一覧は公式ドキュメント(40. Endpoints)を参照してください。

autoconfig

auto-configurationの候補とそれが自動設定されたかどうか、およびその理由が表示されます。

ブラウザ(HTTP)で開くとJSONで表示されますが、視神経と毛根に多大なダメージを与える物量です。構造的にはルートから

  • positiveMatchesの配列
  • negativeMatchesの配列

となっており、各配列内に自動設定の候補とその内容が記載されています。一部を下記に記してみます。

どちらかというと開発時に用いるエンドポイントだと思われます。

beans

Springのコンテナに登録されたbeanの一覧が表示されます。これもやはり開発時の確認用でしょう。

dump

スレッドダンプを表示します。

env

ConfigurableEnvironmentから得られるプロパティ一覧です。具体的にはJVMの情報だとか、システム情報だとか、ちょっと外部には見せたくない情報が盛り沢山です。

health

アプリケーションのヘルスチェック用のエンドポイントです。デフォルトではシンプルに

とだけ返します。まさに監視向けの機能ですね。

なお、ヘルスチェックはカスタマイズすることが可能です(後述

metrics

メトリクス情報を表示します。アクセス回数やメモリの情報、GCの情報など、監視上有用な情報を得られます。

mappings

@RequestMappingで登録されたマッピング情報の一覧を表示します。

shutdown

アプリケーションをシャットダウンするためのエンドポイントです。デフォルトでは無効化されているため、利用するためにはapplication.properties or ymlで有効に設定しなければなりません。

また、GETリクエストは受け付けず、POSTでリクエストしなければなりません。

通常は無効化したままで良いと思われます。

trace

トレース情報を表示します。デフォルトだと直近のHTTPリクエスト・レスポンス内容を表示してくれます。開発時にはなかなか便利な機能ですね。

アプリケーション監視のための準備

長々とエンドポイントを紹介しましたが、今回はシンプルな死活監視をするため、用いるエンドポイントはhealthのみです。その他のエンドポイントは必要が無いので無効化しておきましょう(特にenvなどは外部からは見られたくない情報が満載ですので、、、)

application.propertiesに下記のように記載することで、エンドポイントの無効化が可能です。

また、エンドポイントの名称を変更することもできます。

この場合、healthエンドポイントは/checkでアクセスする必要があります。

Zabbixからの監視

WEB監視+ヘルスチェック

Spring Boot側は準備ができたので、今度はZabbix側のお話です。healthに対してWEB監視を設定します。Spring Boot Actuator自体はSSHやJMXによるアクセス方法も提供しますが、シンプルな死活監視をするだけならHTTP経由のWEB監視で十分です。

以下、Zabbix 2.2を前提に話をすすめます。

WEB監視の設定

Spring Bootだからと言って特別なことを考える必要はありません。しめやかに任意のホストからWEB⇒シナリオの作成を選択しましょう。

WEB監視-シナリオ

シナリオ名と更新間隔などを策定したら、ステップを追加しましょう。

WEB監視-ステップ

監視対象URLをlocalhostにしていますが、実際は対象のURLを適切にセットしてくださいね。監視文字列はhealthエンドポイントが正常時に返す値を設定、ステータスコードは200としましょう。

ステップを追加したら、対応するトリガーを作成します。

WEB監視-トリガー

トリガーはweb.test.fail関数を使っています。上記例だと「直近のWEB監視の結果が2回連続で失敗したら致命的な障害として扱う」ように設定しています。

致命的な障害にした理由としては、ヘルスチェックがWEB監視で通らない=エンドユーザーから見られない状態なので、発生原因はともかく状況としてはかなり深刻だからです。あとは致命的な障害に応じたアクション(メールアラートなど)を紐づけてあげればOKですね。

少々端折り気味ですが、通常のWEB監視の設定で簡単に死活監視ができることがお分かりいただけたかと思います。

ヘルスチェックのカスタマイズ

デフォルトの機能でも死活監視ができてしまったわけですが、healthエンドポイントはデフォルトでは常にUPを返すだけなので、条件に応じて返されるステータスを変更したい場面もあると思います。そこで、今度はヘルスチェックのカスタマイズ方法を紹介します。

カスタマイズにはHealthIndicatorインターフェースを実装したクラスを用意します。実際のコードを見たほうが早いと思うので、載せてみます。

やっていることはHealthIndicator#healthメソッド内で必要な検証を行い、結果に応じてステータスを返してあげているだけです。簡単ですね。

クラスに@Componentアノテーションをつけるのをお忘れなく。

まとめ

  • Spring Boot Actuatorを導入すれば監視・管理用の機能を依存関係に追加するだけで簡単に得られる
  • 運用上は外部に見せたくない情報を表示するエンドポイントは無効化しよう
  • healthエンドポイントにZabbixのWEB監視を組み合わせればあっという間にエンドユーザーレベルでの死活監視が実現できちゃう
  • ヘルスチェックはカスタマイズが可能

こんなところでしょうか。最後にヘルスチェックのカスタマイズについて紹介したものの、個人的にはヘルスチェックはシンプルなもので十分かなぁと思っています。というのも、サーバーのリソース状態などはZabbix Agentをアプリケーションが稼働しているホストに導入すれば実現できてしまいますからね。また、カスタマイズしてあまりにも複雑なことをやってしまうと、監視の負荷が大きくなるので、この点もよく考慮しないといけませんね。

ではでは。