.Net Core实现健康检查

ASP.NET Core 提供运行状况检查中间件和库,以用于报告应用基础结构组件的运行状况。 运行状况检查由应用程序作为 HTTP 终结点公开。可以为各种实时监视方案配置运行状况检查终结点:

  • 运行状况探测可以由容器业务流程协调程和负载均衡器用于检查应用的状态。例如,容器业务流程协调程序可以通过停止滚动部署或重新启动容器来响应失败的运行状况检查。负载均衡器可以通过将流量从失败的实例路由到正常实例,来应对不正常的应用。
  • 可以监视内存、磁盘和其他物理服务器资源的使用情况来了解是否处于正常状态。
  • 运行状况检查可以测试应用的依赖项(如数据库和外部服务终结点)以确认是否可用和正常工作。

这个示例展示数据库的运行状态,他在其验证数据库连接并返回相应的结果

Copy
[Route("health")]
public ActionResult Health()
  {
     using (var connection = new SqlConnection("Server=.;Initial Catalog=master;Integrated Security=true"))
      {
        try
         {
            connection.Open();
         }
         catch (SqlException)
          {
            return new StatusCodeResult(503);
               
          }
       }

return new EmptyResult();
}

当我们请求该地址的时候时,如果连接到数据库时出现任何连接问题,它将显示一条包含200状态代码和503状态代码的空消息。

现在基于这些结果状态码,我们可以监视系统采取相关的操作。

从.NET Core2.2开始,我们不需要为运行状态在去自定义检查控制器和接口,而是框架本身已经为我们提供了运行状况的检查服务。

安装和运行

Install-Package Microsoft.Extensions.Diagnostics.HealthChecks

安装后,我们需要在Startup.cs文件的ConfigureServices()和Configure()方法中添加。

Copy
public void ConfigureServices(IServiceCollection services)
{
   services.AddHealthChecks();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
   app.UseHealthChecks("/health");
}

我们在configure()方法中配置完端点后,我们就可以通过 /health来请求查看我们的应用程序的健康程度的。

但是这样对于我们刚才的需求是满足不了的,那么我们如何自定义我们的健康度检查呢?

两种方式来处理

option 1

Copy
public void ConfigureServices(IServiceCollection services)
{
  services.AddHealthChecks()
  .AddCheck("sql", () =>
  {

      using (var connection = new SqlConnection("Server=.;Initial Catalog=master;Integrated Security=true"))
      {
          try
          {
              connection.Open();
          }
          catch (SqlException)
          {
              return HealthCheckResult.Unhealthy();
          }
      }

      return HealthCheckResult.Healthy();

  });
}

在这里我们使用匿名方法AddCheck(),来编写我们的自定义的验证逻辑,结果是HealthCheckResult对象,该对象包含3个选项

  1. Healthy 健康
  2. Unhealthy 不良
  3. Degraded 降级

option 2

实现IHealthCheck接口并实现CheckHealthAsync()方法,如下所示:

Copy
public class DatabaseHealthCheck : IHealthCheck
 {
     public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken =
        default)
    {
       using (var connection = new SqlConnection("Server=.;Initial Catalog=master;Integrated Security=true"))
         {
            try
              {
                connection.Open();
              }
             catch (SqlException)
              {
                 return  Task.FromResult(HealthCheckResult.Unhealthy());
              }
          }
       return Task.FromResult(HealthCheckResult.Healthy());}
}

创建该类之后,我们需要通过使用一些有效的唯一名称,AddCheck ()方法在ConfigureServices()方法中提及该类,如下所示。

Copy
public void ConfigureServices(IServiceCollection services)
   {
      services.AddHealthChecks()
          .AddCheck<DatabaseHealthCheck>("sql");
}

现在我们的代码就写完了,我们可以像上面那样添加任意数量的Health Task,它将按照我们在此处声明的顺序运行。

自定义状态码

在之前我们也说过200为健康,503为不健康那么Healthcheck服务甚至通过以下方式使用其options对象提供自定义状态代码,为我们提供了更改此默认的状态码。

Copy
config.MapHealthChecks("/health", new HealthCheckOptions
     {
       ResultStatusCodes = new Dictionary<HealthStatus, int> { { HealthStatus.Unhealthy, 420 }, { HealthStatus.Healthy, 200 }, { HealthStatus.Degraded, 419 } }
});

自定义输出

我们可以自定义输出,以获取有关每个运行状况检查任务的更清晰详细的信息。如果我们有多个运行状况检查任务来分析哪个任务使整个服务健康状态变为”不正常“,这将非常有用。

我们可以通过HealthCheckOptions ResponseWriter属性来实现。

Copy
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
   {
      app.UseRouting()
         .UseEndpoints(config =>
         {
            config.MapHealthChecks("/health", new HealthCheckOptions
              {
               ResponseWriter=CustomResponseWriter
                        
              });

        });
}
private static Task CustomResponseWriter(HttpContext context, HealthReport healthReport)
  {
     context.Response.ContentType = "application/json";

      var result = JsonConvert.SerializeObject(new
        {
         status = healthReport.Status.ToString(),
         errors = healthReport.Entries.Select(e => new
          {
            key = e.Key,
            value = e.Value.Status.ToString()
          })
     });
   return context.Response.WriteAsync(result);
}

现在以json显示我们的详细信息,完成了健康状态的检查.

健康检查界面

Install-Package AspNetCore.HealthChecks.UI

安装完成后,需要相应地在ConfigureServices()和Configure()方法中调用相应的服务方法。

Copy
public void ConfigureServices(IServiceCollection services)  
{
    services.AddHealthChecksUI();
}
  
public void Configure(IApplicationBuilder app, IHostingEnvironment env)  
{
    app.UseHealthChecksUI();
}

配置完成后,您可以运行应用程序并指向/ healthchecks-ui地址,该端点显示如下的UI.

但是界面上没有我们刚才自定义的,那我们在进行配置

Appsetting.json

Copy
{
  "ApplicationInsights": {
    "InstrumentationKey": "your-instrumentation-key"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "HealthChecksUI": {
    "HealthChecks": [
      {
        "Name": "Test Health",
        "Uri": "https://localhost:44342/health"
      }
    ],
    "EvaluationTimeinSeconds": 10,
    "MinimumSecondsBetweenFailureNotifications": 60
  }
}

这样就可以看到健康状态了

本文分享自微信公众号 - DotNet程序园(dotnetblog)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码客

Nginx Tomcat 负载均衡 集群

Nginx和Tomcat的负载均衡配置 只能用http 协议 但是nginx的优秀性能 值得你去尝试

8340
来自专栏方丈的寺院

http服务端架构演进

在详解http报文相关文章中我们介绍了http协议是如何工作的,那么构建一个真实的网站还需要引入组件呢?一些常见的名词到底是什么含义呢?

8410
来自专栏码客

Apache Tomcat 负载均衡 集群

Apache配置负载均衡和集群使用mod_jk的方式比较多。 但是mod_jk已经停止更新,并且配置相对复杂。 Apache2.2以后,提供了一种原生的方式配置...

7410
来自专栏芋道源码1024

Nginx 入门到实战

Nginx是一个开源且高性能、可靠的HTTP中间件、代理服务 其他的HTTP服务:

8610
来自专栏Alone88

【Nginx】nginx简单入门,nginx负载均衡

配置好了之后,执行 nginx -t 检查配置是否有错,出现下面的提示则没有错误,有错误会写出错误多少行的

6920
来自专栏方丈的寺院

http服务端架构演进

在 详解http报文相关文章中我们介绍了http协议是如何工作的,那么构建一个真实的网站还需要引入组件呢?一些常见的名词到底是什么含义呢?

7720
来自专栏Kirito的技术分享

一文搞懂蓝绿发布、灰度发布和滚动发布

应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境,同时要保证系统不间断提供服务。

10110
来自专栏Tensorbytes

IPVS: IP虚拟服务器

ipvs称之为IP虚拟服务器(IP Virtual Server,简写为IPVS),主要有Direct Routing、NAT模式、FULLNAT模式、TUN模...

11420
来自专栏Linyb极客之路

一一例举ZooKeeper 的实战应用场景

ZooKeeper 是一个高可用的分布式数据管理与系统协调框架。基于对 Paxos 算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,...

8220
来自专栏我的小碗汤

一文搞懂蓝绿发布、灰度发布和滚动发布

应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境,同时要保证系统不间断提供服务。

11340

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励