ASP.NET Coreのヘルスチェックの出力をカスタマイズする方法
2020-07-13
azblob://2022/11/11/eyecatch/2020-07-13-customize-aspnetcore-healthcheck-000.jpg

こんにちは、暑くなってきて生きるのがしんどい石川です。今回はASP.NET Coreのヘルスチェック出力をカスタマイズする方法を紹介します。

デフォルトのヘルスチェック

早速ですが、デフォルトで用意されているヘルスチェックを実装し、エンドポイントを叩いてみましょう。

ヘルスチェックはStartup.csのConfigureServicesメソッドとConfigureメソッドに1行ずつ書くだけで表示できます。

public void ConfigureServices(IServiceCollection)
{
    services.AddHealthChecks();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseHealthChecks("/health")
}

さて、これで表示されるヘルスチェックは…

味気ねえ……………

ということでカスタマイズして見える情報を増やしたいと思います。

ビルド日時を表示する

.NET Coreでプログラムのビルド日時を取得する | cloud.config Tech Blogで紹介している手段でビルド日時を取得します。

UseHelthChecksメソッドにはHealthCheckOptionsを追加で受け入れるオーバーロードが用意されているのでそちらを用います。

app.UseHealthChecks("/health", new HealthCheckOptions()
{
   ResponseWriter = // ここにHttpContext.Response.WriteAsyncを返すTaskを渡す
});

ちょっとわかりにくいですが以下のようなメソッドを渡すとよさそうです。

private Task WriteResponse(HttpContext context, HealthReport result)
{
    context.Response.ContentType = "application/json; charset=utf-8"
    using(var stream = new MemoryStream())
    {
        using(var writer = new Utf8JsonWriter(stream, new JsonWriterOptions(){ Indented = true})
        {
            writer.WriteStartObject();
            writer.WriteString("Status", result.Status.ToString());
            // 前回記事で紹介したメソッドを呼び出す
            writer.WriteString("Build at", GetBuildTimeStamp().ToString());
            writer.WriteEndObject();
        }
    }

    var json = Encoding.UTF8.GetString(stream.ToArray());

    return context.Response.WriteAsync(json);
}

実際に渡してみます。

app.UseHealthChecks("/health", new HealthCheckOptions()
{
   ResponseWriter = WriteResponse
});

これを表示してみると…

いい感じ〜〜〜〜〜

といった感じでASP.NET Coreのヘルスチェックをカスタマイズする方法の紹介でした。

Utf8JsonWriterがちょっとクセがあって使いにくい感じでした…

それでは〜〜〜〜