如何将健康检查添加到 Swagger

How to add Health Checks to Swagger

看了很多文章都没有找到明确的答案,我想再次开始一个关于在 ASP .Net Core 中为 swagger 添加健康检查的话题。

首先,我想问你这样做是否是个好主意,以及如何以最简单的方式做到这一点。

提前感谢所有的回答。

第一个问题,为什么我们需要Health Check

当我们创建健康检查时,我们可以为某些服务创建非常精细的、特定的检查,这在诊断我们的应用程序基础设施问题时有很大帮助,因为我们可以很容易地看到哪些 service/dependency 表现不佳。我们的应用程序可能仍在运行 运行,但处于降级状态,我们无法通过简单地使用该应用程序轻易地看到它,因此进行健康检查可以让我们更好地了解我们的应用程序的健康状态看起来像。

我们可以持续监控应用程序的运行状况,主动了解应用程序运行不正常的地方并根据需要进行调整,而不是依赖用户报告应用程序问题。

这里是关于数据库健康检查的简单演示

首先写一个controller,在里面注入HealthCheckService

[Route("[controller]")]
    [ApiController]
    [AllowAnonymous]
    public class HealthController : ControllerBase
    {
        private readonly HealthCheckService healthCheckService;

        public HealthController(HealthCheckService healthCheckService)
        {
            this.healthCheckService = healthCheckService;
        }

        [HttpGet]
        public async Task<ActionResult> Get()
        {
            HealthReport report = await this.healthCheckService.CheckHealthAsync();
            var result = new
            {
                status = report.Status.ToString(),
                errors = report.Entries.Select(e => new { name = e.Key, status = e.Value.Status.ToString(), description = e.Value.Description.ToString() })
            };
            return report.Status == HealthStatus.Healthy ? this.Ok(result) : this.StatusCode((int)HttpStatusCode.ServiceUnavailable, result);
        }
    }

然后在Program.cs(.Net 6)中配置health check测试数据库的查询功能是否正常

    //.....
    string connectionString = builder.Configuration.GetConnectionString("default");
    
    builder.Services.AddHealthChecks().AddCheck("sql", () =>
    {
        string sqlHealthCheckDescription = "Tests that we can connect and select from the database.";

        string sqlHealthCheckUnHealthDescription = "There is something wrong in database.";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            try
            {
                connection.Open();
    
                //You can specify the table to test or test other function in database

                SqlCommand command = new SqlCommand("SELECT TOP(1) id from dbo.students", connection);
                command.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                //Log.Error(ex, "Exception in sql health check");
                return HealthCheckResult.Unhealthy(sqlHealthCheckUnHealthDescription );
            }
        }
    
        return HealthCheckResult.Healthy(sqlHealthCheckDescription);
    });

    //......

结果:

Swagger 将公开此 health check 端点

当查询函数在数据库中正常工作时,它将return 200

当数据库出现问题时,会return503