上篇咱们讲了如何使用App Metrics 作一个简单的APM监控,最后提到过健康检查这个东西.html
这篇主要就是讲解健康检查的内容.git
没看过上篇的,请移步:ASP.NET Core之跨平台的实时性能监控github
首先咱们来了解一下什么是健康检查(health checks)?数据库
健康检查,其实这个名称已经很明确了,它是检查你的应用程序是否健康运行的一种方式。随着当前各种项目愈来愈多的应用程序正在转向微服务式架构,健康检查就变得尤其关键。虽然微服务体系结构具备许多好处,但其中一个缺点就是为了确保全部这些服务都正常运行的操做开销更高。你不在是监视一个庞大的总体项目的健康情况,而是须要监控许多不一样服务的状态,甚至这些服务一般只负责一件事情。健康检查(Heatlh Checks)一般与一些服务发现工具结合使用,如Consul ,来监控您的微服务器,来观测您的服务是否健康运行。服务器
健康检查有不少种不一样的方法,但最多见的方法是将HTTP端点暴露给专门用于健康检查的应用程序。通常来讲,若是一切状况都很好,你的服务将返回200的状态码,然而任何非200的代码则意味着出现问题。例如,若是发生错误,你可能会返回500以及一些出错的JSON信息。架构
你的健康检查将基于你的应用程序或者你的微服务主要在作写什么事情,就检查什么.app
不过咱们也能够举例一些常见的健康检查内容:ide
下面咱们就来说解一下,如何使用App Metrics来实现咱们的健康检查.微服务
效果如图:工具
这里就不建立新的项目了,直接拿上个项目的例子来写.
App Metrics中的健康检查分为3种状态:
1.健康(绿),2.亚健康(黄),3.不健康(红). 颜色如上图所示
也含有一些内置的健康检查(后面讲解),咱们先来说一下如何自行建立健康检查
首先咱们在Demo中建立一个健康检查的文件夹(固然,也能够是类库)
建立类,取名为 OKHealthCheck,继承HealthCheck(引用:using App.Metrics.Health),代码以下:
public class OKHealthCheck: HealthCheck { public OKHealthCheck() : base("正常的检查(OKHealthCheck)") { } protected override Task<HealthCheckResult> CheckAsync(CancellationToken token = default(CancellationToken)) { //返回正常的信息 return Task.FromResult(HealthCheckResult.Healthy("OK")); } }
而后在Startup注入中,加入健康检查的注入
services.AddMetrics(options => { options.GlobalTags.Add("app", "sample app"); options.GlobalTags.Add("env", "stage"); }) .AddHealthChecks()//这里是健康检查的注入 .AddJsonSerialization() .AddReporting( factory => { factory.AddInfluxDb( new InfluxDBReporterSettings { InfluxDbSettings = new InfluxDBSettings(database, uri), ReportInterval = TimeSpan.FromSeconds(5) }); }) .AddMetricsMiddleware(options => options.IgnoredHttpStatusCodes = new[] { 404 });
值得注意的是,这里的健康检查注入,是经过反射实现的,他会自动检测你项目引用的dll,找到继承过HealthCheck的类,自动所有注入.
而后咱们运行,会发现咱们的Grafana的健康检查仪表盘,多了条数据,如图:
(注:这里说明一下这个Apdex Score(用户满意度得分),是默认自动开启的.能够经过配置关闭)
上面咱们演示了如何建立一个本身的健康检查,可是只返回了健康的信息,咱们还有亚健康,不健康,这些固然也是会出现的.因此,代码以下:
返回不健康的信息:
protected override Task<HealthCheckResult> CheckAsync(CancellationToken token = default(CancellationToken)) { return Task.FromResult(HealthCheckResult.Unhealthy("不健康")); //重点是这里 }
返回亚健康
protected override Task<HealthCheckResult> CheckAsync(CancellationToken token = default(CancellationToken)) { return Task.FromResult(HealthCheckResult.Degraded("Degraded")); }
在这个方法中,加上大家本身的检查业务逻辑,返回相应的HealthCheckResult便可.
前面咱们说过,App Metrics给咱们提供了一些内置的健康检查,咱们下面就来一一讲解
咱们直接在AddHealthChecks中注入,使用方法以下,:
.AddHealthChecks(factory=> { //经过HTTP访问GitHub,看是否正常,间隔10秒 factory.RegisterHttpGetHealthCheck("github是否访问正常", new Uri("https://github.com/"), TimeSpan.FromSeconds(10)); })//这里是健康检查的注入
代码以下:
.AddHealthChecks(factory=> { //经过HTTP访问GitHub,看是否正常,间隔10秒 factory.RegisterHttpGetHealthCheck("github是否访问正常", new Uri("https://github.com/"), TimeSpan.FromSeconds(10)); //检测是否能Ping通百度 factory.RegisterPingHealthCheck("百度 ping", "baidu.com", TimeSpan.FromSeconds(10)); })//这里是健康检查的注入
说明一下,这个是检测当前程序占用的物理内存是否超过你设置阀值(字节为单位),并非检测你还剩下多少物理内存
.AddHealthChecks(factory=> { //经过HTTP访问GitHub,看是否正常,间隔10秒 factory.RegisterHttpGetHealthCheck("github是否访问正常", new Uri("https://github.com/"), TimeSpan.FromSeconds(10)); //检测是否能Ping通百度 factory.RegisterPingHealthCheck("百度 ping", "baidu.com", TimeSpan.FromSeconds(10)); //检测占用内存是否超过2G factory.RegisterProcessPhysicalMemoryHealthCheck("占用内存是否超过阀值(2G)", (2048L * 1024L) * 1024L); })//这里是健康检查的注入
说明一下,这个方法,经过源码能够看到,获取的是PrivateMemorySize64,也是就是获取为关联的进程分配的专用内存量。
.AddHealthChecks(factory=> { //经过HTTP访问GitHub,看是否正常,间隔10秒 factory.RegisterHttpGetHealthCheck("github是否访问正常", new Uri("https://github.com/"), TimeSpan.FromSeconds(10)); //检测是否能Ping通百度 factory.RegisterPingHealthCheck("百度 ping", "baidu.com", TimeSpan.FromSeconds(10)); //检测占用内存是否超过2G factory.RegisterProcessPhysicalMemoryHealthCheck("占用内存是否超过阀值(2G)", (2048L * 1024L) * 1024L); //检测专用内存占用量是否超过阀值(2G) factory.RegisterProcessPrivateMemorySizeHealthCheck("专用内存占用量是否超过阀值(2G)", (2048L * 1024L) * 1024L); })//这里是健康检查的注入
没啥好说的,直接上代码:
.AddHealthChecks(factory=> { //经过HTTP访问GitHub,看是否正常,间隔10秒 factory.RegisterHttpGetHealthCheck("github是否访问正常", new Uri("https://github.com/"), TimeSpan.FromSeconds(10)); //检测是否能Ping通百度 factory.RegisterPingHealthCheck("百度 ping", "baidu.com", TimeSpan.FromSeconds(10)); //检测占用内存是否超过2G factory.RegisterProcessPhysicalMemoryHealthCheck("占用内存是否超过阀值(2G)", (2048L * 1024L) * 1024L); //检测专用内存占用量是否超过阀值(2G) factory.RegisterProcessPrivateMemorySizeHealthCheck("专用内存占用量是否超过阀值(2G)", (2048L * 1024L) * 1024L); //检测虚拟内存占用是否超过阀值(2G) factory.RegisterProcessVirtualMemorySizeHealthCheck("虚拟内存占用量是否超过阀值(2G)", (2048L * 1024L) * 1024L); })//这里是健康检查的注入
最后,咱们把代码跑起来.~,效果如图
至此,今天的内容就结束了.
有趣的是,其实微软在ASP.NET Core 2.0中其实也给咱们内置了相关的健康检测插件.(说明健康检测真的很重要)
有兴趣的朋友能够去看看.