前言

上篇我们讲了如何使用App Metrics 做一个简单的APM监控,最后提到过健康检查这个东西.

这篇主要就是讲解健康检查的内容.

没看过上篇的,请移步:ASP.NET Core之跨平台的实时性能监控

首先我们来了解一下什么是健康检查(health checks)?

1.什么是健康检查?

健康检查,其实这个名称已经很明确了,它是检查你的应用程序是否健康运行的一种方式。随着当前各类项目越来越多的应用程序正在转向微服务式架构,健康检查就变得尤为关键。虽然微服务体系结构具有许多好处,但其中一个缺点就是为了确保所有这些服务都正常运行的操作开销更高。你不在是监视一个庞大的整体项目的健康状况,而是需要监控许多不同服务的状态,甚至这些服务通常只负责一件事情。健康检查(Heatlh Checks)通常与一些服务发现工具结合使用,如Consul  ,来监控您的微服务器,来观测您的服务是否健康运行。

2.如何实施健康检查?

健康检查有很多种不同的方法,但最常见的方法是将HTTP端点暴露给专门用于健康检查的应用程序。一般来说,如果一切情况都很好,你的服务将返回200的状态码,然而任何非200的代码则意味着出现问题。例如,如果发生错误,你可能会返回500以及一些出错的JSON信息。

3.健康检查的常见情况

你的健康检查将基于你的应用程序或者你的微服务主要在做写什么事情,就检查什么.

不过我们也可以举例一些常见的健康检查内容:

  • 检查我的服务可以连接到数据库吗?
  • 检查我的服务可以查询第三方API吗?
    • 可能做一些只读操作
  • 我的服务可以访问文件系统吗(IO是否正常)?
  • 检查我的服务占用的内存或CPU是否高于某个阈值?

下面我们就来讲解一下,如何使用App Metrics来实现我们的健康检查.

效果如图:

正文

这里就不创建新的项目了,直接拿上个项目的例子来写.

App Metrics中的健康检查分为3种状态:

1.健康(绿),2.亚健康(黄),3.不健康(红).  颜色如上图所示

也含有一些内置的健康检查(后面讲解),我们先来讲一下如何自行创建健康检查

1.创建自己的健康检查

首先我们在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()
});
})
.AddMetricsMiddleware(options => options.IgnoredHttpStatusCodes = new[] { });

值得注意的是,这里的健康检查注入,是通过反射实现的,他会自动检测你项目引用的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即可.

2.使用内置的健康检查

前面我们说过,App Metrics给我们提供了一些内置的健康检查,我们下面就来一一讲解

2.1内置的HTTP检测

我们直接在AddHealthChecks中注入,使用方法如下,:

.AddHealthChecks(factory=> {
//通过HTTP访问GitHub,看是否正常,间隔10秒
factory.RegisterHttpGetHealthCheck("github是否访问正常", new Uri("https://github.com/"), TimeSpan.FromSeconds());
})//这里是健康检查的注入

2.2内置的Ping检测

代码如下:

               .AddHealthChecks(factory=> {

                   //通过HTTP访问GitHub,看是否正常,间隔10秒
factory.RegisterHttpGetHealthCheck("github是否访问正常", new Uri("https://github.com/"), TimeSpan.FromSeconds());
//检测是否能Ping通百度
factory.RegisterPingHealthCheck("百度 ping", "baidu.com", TimeSpan.FromSeconds()); })//这里是健康检查的注入

2.3内置物理内存占用检测

说明一下,这个是检测当前程序占用的物理内存是否超过你设置阀值(字节为单位),并不是检测你还剩下多少物理内存

               .AddHealthChecks(factory=> {

                   //通过HTTP访问GitHub,看是否正常,间隔10秒
factory.RegisterHttpGetHealthCheck("github是否访问正常", new Uri("https://github.com/"), TimeSpan.FromSeconds());
//检测是否能Ping通百度
factory.RegisterPingHealthCheck("百度 ping", "baidu.com", TimeSpan.FromSeconds());
//检测占用内存是否超过2G
factory.RegisterProcessPhysicalMemoryHealthCheck("占用内存是否超过阀值(2G)", (2048L * 1024L) * 1024L); })//这里是健康检查的注入

2.4内置专用内存占用检测

说明一下,这个方法,通过源码可以看到,获取的是PrivateMemorySize64,也是就是获取为关联的进程分配的专用内存量。

               .AddHealthChecks(factory=> {

                   //通过HTTP访问GitHub,看是否正常,间隔10秒
factory.RegisterHttpGetHealthCheck("github是否访问正常", new Uri("https://github.com/"), TimeSpan.FromSeconds());
//检测是否能Ping通百度
factory.RegisterPingHealthCheck("百度 ping", "baidu.com", TimeSpan.FromSeconds());
//检测占用内存是否超过2G
factory.RegisterProcessPhysicalMemoryHealthCheck("占用内存是否超过阀值(2G)", (2048L * 1024L) * 1024L);
//检测专用内存占用量是否超过阀值(2G)
factory.RegisterProcessPrivateMemorySizeHealthCheck("专用内存占用量是否超过阀值(2G)", (2048L * 1024L) * 1024L); })//这里是健康检查的注入

2.5内置虚拟内存占用检测

没啥好说的,直接上代码:

               .AddHealthChecks(factory=> {

                   //通过HTTP访问GitHub,看是否正常,间隔10秒
factory.RegisterHttpGetHealthCheck("github是否访问正常", new Uri("https://github.com/"), TimeSpan.FromSeconds());
//检测是否能Ping通百度
factory.RegisterPingHealthCheck("百度 ping", "baidu.com", TimeSpan.FromSeconds());
//检测占用内存是否超过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中其实也给我们内置了相关的健康检测插件.(说明健康检测真的很重要)

https://github.com/dotnet-architecture/HealthChecks

有兴趣的朋友可以去看看.

ASP.NET Core之跨平台的实时性能监控(2.健康检查)的更多相关文章

  1. ASP.NET Core 之跨平台的实时性能监控

    前言 前面我们聊了一下一个应用程序 应该监控的8个关键位置. . 嗯..地址如下: 应用程序的8个关键性能指标以及测量方法 最后卖了个小关子,是关于如何监控ASP.NET Core的. 今天我们就来讲 ...

  2. ASP.NET Core之跨平台的实时性能监控

    前言 前面我们聊了一下一个应用程序 应该监控的8个关键位置. . 嗯..地址如下: 应用程序的8个关键性能指标以及测量方法 最后卖了个小关子,是关于如何监控ASP.NET Core的. 今天我们就来讲 ...

  3. 健康检查NET Core之跨平台的实时性能监控

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

  4. .Net Core 2.0+ InfluxDB+Grafana+App Metrics 实现跨平台的实时性能监控

    最近这段时间一直在忙,没时间写博客,负责了一个项目,从前端到后端一直忙,同时还有其他第几个项目的系统架构要处理. 去年就开始关注net core了,只是平时写写demo,没用在项目中,正好这次机会就用 ...

  5. [#] - .Net平台的实时性能监控

    App Metricshttps://www.app-metrics.io ASP.NET Core之跨平台的实时性能监控http://www.cnblogs.com/GuZhenYin/p/7170 ...

  6. .NetCore使用skywalking实现实时性能监控

    一.简介 很久之前写了一篇 <.Net Core 2.0+ InfluxDB+Grafana+App Metrics 实现跨平台的实时性能监控>关于NetCore性能监控的文章,使用Inf ...

  7. ASP.Net Core 3.1 使用实时应用SignalR入门

    参考文章:微软官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction?view=aspnetcore-3.1 和 ...

  8. .Net Core 2.*+ InfluxDB+Grafana+App Metrics实时性能监控

    前言 .net core 2.* 实施性能监控 这个工具其实给运维 大大们用起来是更爽的.但是Grafana现在还没有找到中文版. 本文需要了解的相关技术与内容: InfluxDb(分布式时序数据库, ...

  9. MySQL 的实时性能监控利器【转】

    操作系统及MySQL数据库的实时性能状态数据尤为重要,特别是在有性能抖动的时候,这些实时的性能数据可以快速帮助你定位系统或MySQL数据库的性能瓶颈,就像你在Linux系统上使用「top,sar,io ...

随机推荐

  1. Kotlin尝试之一:写代码前的准备

    Kotlin是一种静态类型的编程语言,可在Java虚拟机上运行,也可以编译为JavaScript源代码. 其主要发展来自位于俄罗斯圣彼得堡的JetBrains程序员团队. 虽然语法与Java不兼容,但 ...

  2. RSA加密算法

    class Program { static void Main(string[] args) { RSAPublicKey P = new RSAPublicKey(); P.Exponent = ...

  3. 尝试向树莓派3B引入Drbian 9 arm64-PART 1

    Stage 1:试图加入arm64软件包 笔者默认您清楚这些指令背后的意义以及其可能造成的后果,并默认您已备份重要资料 sudo dpkg --add-archietcture arm64 sudo ...

  4. [转] DDD领域驱动设计(三) 之 理论知识收集汇总

    最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一谈起领域驱动设计,就一定认为国外的那个Eric ...

  5. 如何将HLS延时缩短至4秒,HLS+技术详解

    在直播应用中,RTMP 和 HLS 是两种较为成熟且广泛应用的流媒体协议,基本上可以覆盖所有客户端.RTMP 是互联网 TCP/IP 五层体系结构中应用层的协议,主要优势就是实时性高,基本可将直播延时 ...

  6. SQL Server数据类型有哪些

    一. 整数数据类型 整数数据类型是最常用的数据类型之一. 1.INT (INTEGER) INT (或INTEGER)数据类型存储从-2的31次方 (-2 ,147 ,483 ,648) 到2的31次 ...

  7. centos 6.6 ios镜像文件 下载 官网和阿里云两种方式教你下载

    1百度一下:centos 打开打开官网.选择这一项 CET CENTOS 2选择 DVD ISO,双击下载 直接选择左键点击下载 这里需要迅雷 方法 二 打开 https://mirrors.aliy ...

  8. java编码详解

    举个例子 我们在开发过程中,特别是多种编码格式并存的情况下,很容易遇到乱码问题. 假如有一个GBK编码java文件,然后再使用-Dfile.encoding=GBK参数,写入的文件中哪些是乱码呢.那如 ...

  9. curl通过调用WebService查询当前天气

    <?php /** * curl通过调用WebService查询北京的当前天气 */ header("Content-type: text/html; charset=utf-8&qu ...

  10. Tp框架获取客户端IP地址

    /** * 获取客户端IP地址 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 * @return mixed */ function get_cl ...