BANK株式会社でソフトウェアエンジニアをやっている東口(@hgsgtk)です。BANK(エールバンク)」というプロダクトを開発・運用しています。日々、ユーザーに使っていただくサービスを運営していく中で、「サービスを安定的に提供できているか」という観点において、監視する技法について関心があります。監視――モダンなモニタリングのためのデザインパターン』という書籍が最近発売され、世間的にも監視について、関心が高まっているかと思います。エンドポイントパターン」について、実践例と書籍の内容の深掘りを含めて紹介しようと思います。Tokyoというイベントでも今回の内容を発表いたしましたので、こちらも合わせてご参照ください。エンドポイントパターンとはアプリケーションの健全性を伝えるアプリケーション内のHTTPエンドポイントを作るパターンです。endpoint)とも呼ばれ、特に名前がついていることを知らずに使っている方も多いのではないでしょうか。(筆者もその一人でした。)このエンドポイントでは、最低限「HTTPリクエストを受けてレスポンスを返せるか」という情報のみを返すこともできれば、デプロイされたバージョンや依存関係のあるDBなどのサブコンポーネントのステータスといった情報までをレスポンスに含めることもできます。使用用途としては、次のようなケースがあげられます。監視SaaSからの外形監視ALBなどロードバランサのヘルスチェックアプリケーション起動確認のデバッグ実際に、実践する場合、アプリケーションの状態を伝えるHTTPエンドポイントを作成します。/healthcheckや/pingなどと言った名前になるでしょうか。返すという実装になります。BANKでは、2つのエンドポイントを用途別に用意する方法をとっていて、それぞれ外形監視の対象としています。発表した、『BASEにおけるMackerel利用上の工夫と困りごとのご紹介』内でも事例として言及しております。Mackerel等の監視SaaSとの組み合わせという点では、合わせてこちらを一読いただけるとより良いかなと思います。Handlerになります。対してルーティング設定した場合は次のようなレスポンスとなります。15{"status":200}これは、ロードバランサからの外形監視などの際に利用しています。/health/deep次に、DBやRedisなど依存している外部サービスに接続できているかどうかを確認対象に含めるエンドポイントです。対してルーティング設定した場合次のようなレスポンスが返却されます。server"}例えば、データベースに対する接続が失敗した場合は、次のような503レスポンスが返却され、アプリケーションの健康状態について知ることができます。closed"}このパターンのエンドポイントは、Mackerelからの外形監視で主に利用しています。外形監視に利用できるAPIの通信ができるかといった外形監視は特にアプリケーションを運用していると最低限関心をもつところだと思います。このパターンでは、ステータスコードで状態を判別できるため、外形監視に使いやすいかと思います。起動したアプリケーションが正しくHTTPリクエストを処理する事ができるかを知る上で、重宝しています。依存関係のあるDBなどのサービスへのコネクションが取れるかについても最低限確認できるため、起動確認に有用です。BANKというサービスは、以前公開した『ECS(Fargate)でコンテナアプリケーションを動かすための設定情報の扱い方』という記事でも紹介した通り、コンテナ上で動作することを前提としたアプリケーションとして機能提供しています。コンテナ内で動かすアプリケーションにおいても、外形監視は重要と感じていますが、実際このパターンはコンテナベースアプリケーションにおいてはどのように考えられるでしょうか。参考になる原則を一つ見てみましょう。これは、コンテナ内部をブラックボックスのように扱う設計前提を持った上で、自身のアプリケーションの活動状況や準備状況など、様々な状態チェックについてAPIを提供するという設計について言及しています。エンドポイントパターン」も、観測度を上げる上で有用なパターンと言えそうですね。』という議論中の共通レスポンスフォーマットについて見ていきたいと思います。監視――モダンなモニタリングのためのデザインパターン』の「付録C」という章で言及されているものです。いったレスポンスを返すべきか、議論中のこのフォーマットについて少し深掘りしてみます。APIsこのフォーマットは、大きく以下の3つの特徴を持ちます。「次のどれかの値を設定する」とされています。(MUST)warningレベルのタイプが設定できるのは一つ面白いところかなと思いました。以外にも次のフィールドがオプショナルな項目として提示されています。Object下流の依存関係やRedisなどのアプリケーションから見たサブコンポーネントの状態を伝えるためのオブジェクトとして提示されています。公式の例では、以下のようにcassandraやcpu・memory状態などアプリケーションが依存するものについての健康状態を伝える例を示しています。学ぶことこれは、現時点では、ドラフト版なので正式に守るべき標準・制約というわけではありません。エンドパターン」を実践するにあたって、詳細な点について迷いが生まれた際にこのように議論している場所があると知ると、参考になるかと思います。監視――モダンなモニタリングのためのデザインパターン』は非常に勉強になります。迷われている方はぜひお手にとって見てはいかがでしょうか。BASE株式会社は、サービスの継続的な提供を守り・発展させていきたいそんな方を募集中です。ご興味があればぜひお気軽に遊びにいらしてください。)の開発チームによるブログです。Groupの大木です。Developerをしている東口です。Groupのマネージャーをしている山田です。12/1から始まっ...Archiveスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。