时间:2021-05-28
ASP.NET Core 提供运行状况检查中间件和库,以用于报告应用基础结构组件的运行状况。
运行状况检查由应用程序作为 HTTP 终结点公开。 可以为各种实时监视方案配置运行状况检查终结点:
这个示例展示数据库的运行状态,他在其验证数据库连接并返回相应的结果
[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()方法中添加。
public void ConfigureServices(IServiceCollection services) { services.AddHealthChecks(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app .UseHealthChecks("/health"); }我们在configure()方法中配置完端点后,我们就可以通过/health来请求查看我们的应用程序的健康程度的。
但是这样对于我们刚才的需求是满足不了的,那么我们如何自定义我们的健康度检查呢?
两种方式来处理
option 1
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个选项
option 2
实现IHealthCheck接口并实现CheckHealthAsync()方法,如下所示:
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()方法中提及该类,如下所示。
public void ConfigureServices(IServiceCollection services) { services.AddHealthChecks() .AddCheck<DatabaseHealthCheck>("sql"); }现在我们的代码就写完了,我们可以像上面那样添加任意数量的Health Task,它将按照我们在此处声明的顺序运行。
自定义状态码
在之前我们也说过200为健康,503为不健康那么Healthcheck服务甚至通过以下方式使用其options对象提供自定义状态代码,为我们提供了更改此默认的状态码。
config.MapHealthChecks("/health", new HealthCheckOptions { ResultStatusCodes = new Dictionary<HealthStatus, int> { { HealthStatus.Unhealthy, 420 }, { HealthStatus.Healthy, 200 }, { HealthStatus.Degraded, 419 } } });自定义输出
我们可以自定义输出,以获取有关每个运行状况检查任务的更清晰详细的信息。如果我们有多个运行状况检查任务来分析哪个任务使整个服务健康状态变为”不正常“,这将非常有用。
我们可以通过HealthCheckOptions ResponseWriter属性来实现。
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()方法中调用相应的服务方法。
public void ConfigureServices(IServiceCollection services) { services.AddHealthChecksUI(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseHealthChecksUI(); }配置完成后,您可以运行应用程序并指向/ healthchecks-ui地址,该端点显示如下的UI.
但是界面上没有我们刚才自定义的,那我们在进行配置
Appsetting.json
{ "ApplicationInsights": { "InstrumentationKey": "your-instrumentation-key" }, "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": "*", "HealthChecksUI": { "HealthChecks": [ { "Name": "Test Health", "Uri": "https://localhost:44342/health" } ], "EvaluationTimeinSeconds": 10, "MinimumSecondsBetweenFailureNotifications": 60 }}这样就可以看到健康状态了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
健康检查常用于判断一个应用程序能否对request请求进行响应,ASP.NetCore2.2中引入了健康检查中间件用于报告应用程序的健康状态。ASP.NetCo
Intro健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是docker还是k8s还是现在大多数的服务注册发现大多都提供了健康检查机制来检测应
对web服务器做健康检查,一般我们都是用curl库(不管是php,perl的还是shell的),大致的方法一致:复制代码代码如下:curl-I-s|head-1
概述在使用SpringBoot的时候我们经常使用actuator,健康检查,bus中使用/refresh等。这里记录如何使用注解的方式自定义Endpoint。可
严格来说,nginx自带是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带的ngx_http_proxy_module模块和ngx_http_upst