asp.net core 健康检查

  • ASP.NET Core 2.2 开始,提供了健康检查中间件和库,用来报告应用基础结构组件的运行状况。官方文档在此

    运行状况检查由应用程序作为 HTTP 终结点公开。 可以为各种实时监视方案配置运行状况检查终结点:

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

安装和运行

  • 引用 Microsoft.AspNetCore.App 元包或Microsoft.AspNetCore.Diagnostics.HealthChecks 包。
  • 配置
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddHealthChecks();
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHealthChecks("/health");
}
}
  • 运行后访问/health,将返回纯文本Healthy,状态枚举HealthStatus共三个:HealthStatus.HealthyHealthStatus.DegradedHealthStatus.Unhealthy 状态
  • 此基本配置注册运行健康检查服务,并对请求进行响应,默认不注册任何其他检查,所以只是简单的响应请求,代表应用正常

自定义检查项

  • 通过实现 IHealthCheck接口创建检查项
public class ExampleHealthCheck : IHealthCheck
{
public ExampleHealthCheck()
{
// 这里可以通过构造函数注入实现获取其他服务
} public Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context,
CancellationToken cancellationToken = default(CancellationToken))
{
// 执行健康检查,代码逻辑写在这里
// 这里定义检查结果为true
var healthCheckResultHealthy = true; if (healthCheckResultHealthy)
{
return Task.FromResult(
HealthCheckResult.Healthy("检查表明健康"));
} return Task.FromResult(
HealthCheckResult.Unhealthy("检查表明不健康"));
}
}
  • 注册
public void ConfigureServices(IServiceCollection services)
{
services.AddHealthChecks()
.AddCheck<ExampleHealthCheck>(
name: "example_health_check1",
failureStatus:HealthSus.Unhealthy,
tags: new[] { "example" }); // 或者这样
services.AddHealthChecks()
.AddCheck(
name: "example_health_check2",
check: ()=>HealthCheckResu.Healthy("ok123"),
tags: new[] { "example" });
}
  • 注册参数解释,name 就是检查项名称
  • failureStatus 指定检查结果是失败时响应的状态
  • tags 标签可用于后续筛选。目的是将此标签视为健康检查的消费者,用作健康检查的便捷分组和过滤机制
  • 如果指定了 check 参数则不必实现IHealthCheck接口,检查时调用改 check,因此 failureStatus 也不必指定

运行检查

  • 注册检查中间件,指定访问链接和检查配置

筛选检查

  • Predicate 委托会在遍历所有检查的时候被调用
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHealthChecks("/health", new HealthCheckOptions()
{
// 过滤掉其他检查,只执行 Foo and Baz 检查
Predicate = (check) => check.Tags.Contains("foo_tag") ||
check.Tags.Contains("baz_tag")
}

自定义 HTTP 状态码

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHealthChecks("/health", new HealthCheckOptions()
{
// 下面的状态信息是默认分配为HealthStatus属性,可以自定义不同的健康状态返回不同状态码
ResultStatusCodes =
{
[HealthStatus.Healthy] = StatusCodes.Status200OK,
[HealthStatus.Degraded] = StatusCodes.Status200OK,
[HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable
}
});
}

取消缓存头

  • 为了防止健康检查请求响应缓存,健康检查中间件将修改缓存标头,默认AllowCachingResponses为 false,不响应缓存
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHealthChecks("/health", new HealthCheckOptions()
{
// 默认为false
AllowCachingResponses = false
});
}

自定义输出

  • 默认响应是将检查结果状态HealthStatus直接输出成纯文本。这里可以自定义输出,封装统一的响应结果,并输出更多信息
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
ResponseWriter = WriteResponse
} private static Task WriteResponse(HttpContext httpContext,
HealthReport result)
{
httpContext.Response.ContentType = "application/json"; var json = new JObject(
new JProperty("status", result.Status.ToString()),
new JProperty("results", new JObject(result.Entries.Select(pair =>
new JProperty(pair.Key, new JObject(
new JProperty("status", pair.Value.Status.ToString()),
new JProperty("description", pair.Value.Description),
new JProperty("data", new JObject(pair.Value.Data.Select(
p => new JProperty(p.Key, p.Value))))))))));
return httpContext.Response.WriteAsync(
json.ToString(Formatting.Indented));
}

应用

  • 数据库探测,例子可以是执行select 1 from tableName根据数据库响应来判断是否健康
  • 单独的就绪情况和运行情况探测,在某些托管方案中,可能初始化是一个比较耗时的操作,应用正常运行,但是可能还不能正常处理请求并响应
  • 具有自定义响应编写器的基于指标的探测,比如检查内存占用是否超标,cpu 是否占用过高,连接数是否达到上限
  • 按端口筛选,指定端口,一般用于容器环境,根据容器启动时配置的端口号进行响应
  • 分发运行状况检查库,将检查接口实现独立一个类,并通过依赖注入获取参数,检查时根据参数编写逻辑
  • 检查发布服务器,如果向 DI 添加 IHealthCheckPublisher,则运行状态检查系统将定期执行状态检查,并使用结果调用 PublishAsync。适用于需要推送的健康系统,而不是健康系统主动发出健康检查的请求

相关阅读

总结

  • 虽然大部分内容都是官方文档内容,但是写完之后相当于整理了一遍。不仅理解了看文档时不理解的地方,也更进一步了解了它的使用场景。本来以为简单的用法,过了一遍就认为自己懂了会用了,但实际上只是浮于表面,很多地方不懂得为什么这么设计,每个参数都有什么用
  • 一个新的学习思路:先了解它的应用场景,解决了什么问题,再回过头来看,针对各种场景,功能都是怎么设计和实现的,最后看不同的需求都是怎么通过不同使用方式来满足的。

asp.net core 健康检查的更多相关文章

  1. EntityFramework Core健康检查

    前言 .NET Core提供对应方法可进行健康检查,那么在EF Core中是否也提供了相应的方式呢?EF Core 2.2+(包含2.2)版本提供了针对上下文的健康检查,接下来我们直接利用.NET 5 ...

  2. [翻译] ASP.NET Core 2.2 正式版发布

    本文为翻译,原文地址:https://blogs.msdn.microsoft.com/webdev/2018/12/04/asp-net-core-2-2-available-today/ 我(文章 ...

  3. 在.NET Core 中实现健康检查

    .NET Core中提供了开箱即用的运行状况检查,首先,我将在.NET Core API应用程序中执行运行状况检查,接下来,我们将使用DbContext集成SQL Server或数据库的运行状况检查, ...

  4. 重磅!!!微软发布ASP.NET Core 2.2,先睹为快。

    我很高兴地宣布ASP.NET Core 2.2现在作为.NET Core 2.2的一部分提供! 如何获取? 您可以从.NET Core 2.2下载页面下载适用于您的开发机器和构建服务器的新.NET C ...

  5. ASP.NET Core + SaasKit + PostgreSQL + Citus 的多租户应用程序架构示例

    在 确定分布策略 中, 我们讨论了在多租户用例中使用 Citus 所需的与框架无关的数据库更改. 当前部分研究如何构建与 Citus 存储后端一起使用的多租户 ASP.NET 应用程序. http:/ ...

  6. ASP.NET Core之跨平台的实时性能监控(2.健康检查)

    前言 上篇我们讲了如何使用App Metrics 做一个简单的APM监控,最后提到过健康检查这个东西. 这篇主要就是讲解健康检查的内容. 没看过上篇的,请移步:ASP.NET Core之跨平台的实时性 ...

  7. 微服务中的健康监测以及其在ASP.NET Core服务中实现运行状况检查

    1 .什么是健康检查? 健康检查几乎就是名称暗示的.它是一种检查您的应用程序是否健康的方法.随着越来越多的应用程序转向微服务式架构,健康检查变得尤其重要(Health Check).虽然微服务架构有很 ...

  8. 给 asp.net core 写一个简单的健康检查

    给 asp.net core 写一个简单的健康检查 Intro 健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供 ...

  9. ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇

    题外话 笔者有个习惯,就是在接触新的东西时,一定要先搞清楚新事物的基本概念和背景,对之有个相对全面的了解之后再开始进入实际的编码,这样做最主要的原因是尽量避免由于对新事物的认知误区导致更大的缺陷,Bu ...

随机推荐

  1. Scrum 敏捷开发

    使用敏捷开发一个月的事件,基本的开发模式跟我遇到的这个文章介绍的基本类似,暂时简单Copy到了这里...... http://www.scrumcn.com/agile/scrum-knowledge ...

  2. 【转】你知道C#中的Lambda表达式的演化过程吗?

    [转]你知道C#中的Lambda表达式的演化过程吗? 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传 ...

  3. 使用 jfreechart 生成 曲线、柱状图、饼状图、分布图 展示到JSP

    虽然现在JS做报表和图形展示已经非常普遍和漂亮了,但是不能忽略有jfreechart 这样一种东西! 这些翻阅资料,在看以前写的示例时发现了关于jfreechart 的简单示例,不管怎样发上来分享一下 ...

  4. 26、xcode8.0 解决没有iPhone4模拟器问题

    第一步:随便打开Xcode项目 ,点击电脑屏幕右上角 Xcode->Preference 第二步: 点击下载ios 8.1 Simulator 等到下载完成即可在xcode中添加iphone4s ...

  5. 2018.11.05 NOIP模拟 列队(差分约束)

    传送门 直接建边跑差分约束就可以了. 代码

  6. Apache和nginx 域名配置

    apache配置 一.hosts配置: 1.用编辑器打开hosts文件,位置:C:\Windows\System32\drivers\etc目录下 2.在hosts文件里添加自己的域名配置,配置规则如 ...

  7. main.cpp

    /*main.cpp * *The starting point of the network simulator *-Include all network header files *-initi ...

  8. c# 文件笔记

    1.文件属性操作 File类与FileInfo都能实现.静态方法与实例化方法的区别! //use File class Console.WriteLine(File.GetAttributes(fil ...

  9. BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2321  Solved: 1187[Submit][Status ...

  10. Windows下用curl命令

    一开始自己是下载curl的可执行文件来弄的,发现中文会乱码: 按照网上的用chcp 65001后中文还是乱码,蒙逼中. 后来直接用git bash执行curl,发现git bash自带了这个命令:(可 ...