上篇我们讲了如何使用 App Metrics 做一个简单的 APM 监控, 最后提到过健康检查这个东西.
这篇主要就是讲解健康检查的内容.
没看过上篇的, 请移步: ASP.NET Core 之跨平台的实时性能监控
首先我们来了解一下什么是健康检查 (health checks)
健康检查, 其实这个名称已经很明确了, 它是检查你的应用程序是否健康运行的一种方式。随着当前各类项目越来越多的应用程序正在转向微服务式架构,健康检查就变得尤为关键。虽然微服务体系结构具有许多好处,但其中一个缺点就是为了确保所有这些服务都正常运行的操作开销更高。你不在是监视一个庞大的整体项目的健康状况,而是需要监控许多不同服务的状态,甚至这些服务通常只负责一件事情。健康检查 (Heatlh Checks) 通常与一些服务发现工具结合使用,如 Consul ,来监控您的微服务器,来观测您的服务是否健康运行。
健康检查有很多种不同的方法,但最常见的方法是将 HTTP 端点暴露给专门用于健康检查的应用程序。一般来说, 如果一切情况都很好,你的服务将返回 200 的状态码, 然而任何非 200 的代码则意味着出现问题。例如,如果发生错误,你可能会返回 500 以及一些出错的 JSON 信息。
你的健康检查将基于你的应用程序或者你的微服务主要在做写什么事情, 就检查什么.
不过我们也可以举例一些常见的健康检查内容:
下面我们就来讲解一下, 如何使用 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 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 CheckAsync(CancellationToken token =
- default(CancellationToken)) {
- return Task.FromResult(HealthCheckResult.Unhealthy("不健康")); //重点是这里
- }
返回亚健康
- protected override Task 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 中其实也给我们内置了相关的健康检测插件.(说明健康检测真的很重要)
有兴趣的朋友可以去看看.
来源: http://www.cnblogs.com/GuZhenYin/p/7216724.html