🎄

Go の HTTP サーバーにヘルスエンドポイントを追加する

2023/12/18に公開

これは Go Advent Calendar 2023 の 18 日目の記事です。

HTTP サーバーが正常に動いているかを外部から確認できるようにするには、ヘルスチェック用のエンドポイントを用意するのが一般的です。書籍『入門 監視』では「healthエンドポイントパターン」として紹介されている手法です。

ヘルスエンドポイントでは状態に応じた HTTP レスポンスステータスコードを返す必要があります。正常なら 200 OK を、そうでなければ 503 Service Unavailable を返すのが適切です。これがヘルスエンドポイントの最小要件ですが、 HTTP レスポンスボディに詳細な情報を付加することでより利便性を高めることができます。

そのようなヘルスエンドポイントを Go の HTTP サーバーに追加するには health というパッケージが便利です。

https://pkg.go.dev/goa.design/clue/health

health は次のは 3 つの要素で構成されています。

  • Pinger: 依存サービスが正常に動いているか確認するインターフェース
  • Checker: 渡された Pinger で確認を行って結果を取りまとめるインターフェース
  • Handler: Checker の結果をレスポンスする http.HandlerFunc を作成する関数

次の図は DB と External API という 2 つの依存サービスを持つサーバーの例です。Checker には複数の Pinger を渡すことができます。すべての Pinger が正常だった場合 Handler は 200 OK を返します。

いずれかの依存先に異常があった場合は 503 Service Unavailable となります。

レスポンスボディには Checker が取りまとめた結果が格納されるので、サーバーの状態の把握に役立つでしょう。

{
    "status": {
        "DB": "NG",
        "External API": "OK"
    },
    "uptime": 20, // サーバーが起動してからの秒数
    "version": "91bb64a8103b494d0eac680f8e929e74882eea5f" // サーバーのバージョン
}

Discussion