Custom ASP.NET Core Health Check Response

In my previous post http://codechavez.com/easy-asp-net-core-health-check/ I went over how to implement the out of the box Health check capabilities, we find in dotnet core. Now, I would like to show you how to customize a health check response in ASP.NET Core.

Let’s jump right into it.

public class HealthCheckResponseExample
{
    public static Task HealthCheckResponseWriter(HttpContext context, HealthReport healthReport)
    {
            context.Response.ContentType = "application/json";
            var result = JsonConvert.SerializeObject(new
            {
                overall = healthReport.Status.ToString(),
                checks = healthReport.Entries.Select(e => new
                {
                    name = e.Key,
                    status = e.Value.Status.ToString(),
                    message = e.Value.Description,
                    exception = e.Value.Exception?.Message,
                    duration = e.Value.Duration.ToString("c")
                })
            });
            return context.Response.WriteAsync(result);
     }
 }

The code above takes a HttpContext and a HealthReport object, the HealthReport object is the one we want because it contains the outcomes of the check dependencies.

This is how we consume in startup.cs

public void ConfigureServices(IServiceCollection services)
{
            services.AddHealthChecks()
                    .AddSqlServer("db connection"), name: "SQL DB Check");
}

// some more code

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
            app.UseHttpsRedirection();
            app.UseRouting();
            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapHealthChecks("/health", new HealthCheckOptions()
                {
                    ResponseWriter = HealthCheckResponseExample.HealthCheckResponseWriter
                });
            });
}

As you see above calling the method is very straight forward. As a result we get a 200 – OK with JSON

{
    "overall": "Healthy",
    "checks": [
        {
            "name": "SQL DB Check",
            "status": "Healthy",
            "message": null,
            "exception": null,
            "duration": "00:00:01.3147942"
        }
    ]
}

Some extra NuGets are necessary if you are checking on DBs, but if you only are checking for MSQL Server you can add the NuGet package AspNetCore.HealthChecks.SqlServer , if you are using a different database you may want to search for the package for that database.

In conclusion, adding a custom response is very easy and you may want to add some other pieces of information based on your needs.

References:
https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks?view=aspnetcore-3.1


Spread the word
  • Yum