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

前言

上篇我们讲了《如何使用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(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即可.

 

2.使用内置的健康检查

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

   2.1内置的HTTP检测

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

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

 

   2.2内置的Ping检测

   代码如下:

.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));


               })//这里是健康检查的注入

2.3内置物理内存占用检测

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

.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);


               })//这里是健康检查的注入

2.4内置专用内存占用检测

说明一下,这个方法,通过源码可以看到,获取的是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);


               })//这里是健康检查的注入

2.5内置虚拟内存占用检测

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

.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中其实也给我们内置了相关的健康检测插件.(说明健康检测真的很重要)

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

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

相关文章: 

  • 互联网级监控系统必备-时序数据库之Influxdb技术

  • 互联网级监控系统必备-时序数据库之Influxdb集群及踩过的坑

  • 应用程序的8个关键性能指标以及测量方法

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

原文地址:http://www.cnblogs.com/GuZhenYin/p/7216724.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​通俗理解神经网络BP反向传播算法

转载自 ​通俗理解神经网络BP反向传播算法 通俗理解神经网络BP反向传播算法 在学习深度学习相关知识&#xff0c;无疑都是从神经网络开始入手&#xff0c;在神经网络对参数的学习算法bp算法&#xff0c;接触了很多次&#xff0c;每一次查找资料学习&#xff0c;都有着似懂非…

CSS动画示例(上一篇是CSS过渡…)

大家好&#xff0c;欢迎来到雄雄的小课堂&#xff0c;前面&#xff0c;我们将CSS的变形和过渡都整理了&#xff0c;有需要的可以移步这里看&#xff1a;CSS3中的动画示例CSS3的几个变形案例……今天&#xff0c;我们来看看CSS3的动画。CSS3使用动画分为两个步骤&#xff1a;1.通…

Health Check in eShop -- 解析微软微服务架构Demo(五)

引言 What is the Health Check Health Check&#xff08;健康状态检查&#xff09;不仅是对自己应用程序内部检测各个项目之间的健康状态&#xff08;各项目的运行情况、项目之间的连接情况等&#xff09;&#xff0c;还包括了应用程序对外部或者第三方依赖库的状态检测。 W…

为什么梯度反方向是函数下降最快的方向

转载自 为什么梯度反方向是函数下降最快的方向 为什么梯度反方向是函数下降最快的方向&#xff1f; 刚接触梯度下降这个概念的时候&#xff0c;是在学习机器学习算法的时候&#xff0c;很多训练算法用的就是梯度下降&#xff0c;然后资料和老师们也说朝着梯度的反方向变动&a…

javaweb中实现分页,持续更新……

大家好&#xff0c;欢迎来到雄雄的小课堂&#xff0c;昨天分享了个分页工具类一个简单的分页工具类&#xff0c;其实&#xff0c;也是为今天的分享做的铺垫&#xff0c;今天&#xff0c;给大家带来的是javaweb实现分页的全过程&#xff01;前言&#xff1a;为什么需要分页&…

Redis(入门)

文章目录一、 Redis简介二、 基于Docker安装Redis单机版三、 Redis常用命令1 Key操作2 字符串值(String)&#xff08;值的长度不超过512MB&#xff09;3 哈希表(Hash)4 列表&#xff08;List&#xff09;5 集合(Set)6 有序集合&#xff08;Sorted Set&#xff09;四、 Redis持久…

浅析神经网络为什么能够无限逼近任意连续函数

转载自 浅析神经网络为什么能够无限逼近任意连续函数 神经网络为什么能够无限逼近任意连续函数&#xff1f; 下面通过一个分类例子一步一步的引出为什么神经网络能够无限逼近任意函数这个观点&#xff0c;并且给出直观感觉! 我们首先有这个需求&#xff0c;需要将下面的数据…

前端模块化工具--webpack学习心得

话说前头 webpack前段时间有听说一下&#xff0c;现在已经到了3.x的版本&#xff0c;自己没去接触。因为之前使用gulp来作为自己的项目构建工具。现在感觉gulp使用的趋势在减少。现在这段时间去接触了webpack&#xff0c;感觉很不错&#xff0c;它的模块化打包机制&#xff0c…

基于.NET CORE微服务框架 -谈谈surging的服务容错降级

一、前言 对于不久开源的surging受到不少.net同学的青睐&#xff0c;也受到.net core学习小组的关注&#xff0c;邀请加入.NET China Foundation 以方便国内.net core开源项目的推广&#xff0c;我果断接受邀请加入了队伍进行互相交流学习&#xff0c;最近也更新了surging新的…

java中部的分页实现(二)

大家好&#xff0c;欢迎来到雄雄的小课堂&#xff0c;昨天分享了关于分页查询的理论知识&#xff0c;今天我们就来结合代码和案例实际的应用一下&#xff0c;方便大家理解。前言&#xff1a;我们都知道&#xff0c;实现分页需要三个步骤。第一&#xff0c;确定页大小&#xff0…

SpringSecurity授权(访问控制)

一、 访问控制url匹配 在前面讲解了认证中所有常用配置&#xff0c;主要是对httpSecurity.formLogin()进行操作。而在配置类中httphttpSecurity.authorizeRequests()主要是对url进行控制&#xff0c;也就是我们所说的授权&#xff08;访问控制&#xff09;。httpSecurity.autho…

剥析surging的架构思想

1、前言 前面第一篇阐述了采用基于.NET CORE微服务架构&#xff0c;应用surging服务端与客户端之间进行通信的简单示例以及对于surging服务化框架简单介绍。在这篇文章中&#xff0c;我们将剥析surging的架构思想。 surging源码下载 2、通信机制 2.1 简介 在单体应用中&am…

javaweb实现分页(二)

前言&#xff1a;我们都知道&#xff0c;实现分页需要三个步骤。第一&#xff0c;确定页大小&#xff08;每页显示的数据量&#xff09;。第二&#xff0c;计算显示的总页数。第三&#xff0c;写分页的sql语句。这三步已经在昨天的推文中详细说明&#xff0c;需要的可以点击这里…

滴滴出行基于RocketMQ构建企业级消息队列服务的实践

转载自 滴滴出行基于RocketMQ构建企业级消息队列服务的实践 本文整理自滴滴出行消息队列负责人 江海挺 在Apache RocketMQ开发者沙龙北京站的分享。通过本文&#xff0c;您将了解到滴滴出行&#xff1a; 1. 在消息队列技术选型方面的思考&#xff1b; 2. 为什么选择 RocketMQ…

[信息安全] 1.密码工具箱

0. 何谓安全&#xff1f; 对于信息安全性的重要性&#xff0c;我想大家都不会否认。那么具体来说应该具有哪些特性才能称之为安全呢&#xff1f;举个简单的例子&#xff1a;我给你发送一条消息“借给我100元”&#xff0c;当你收到这条消息并且处理后你的账户里面会少出来100块…

深入理解TCP/IP协议-TCP建立与终止连接

转载自 深入理解TCP/IP协议-TCP建立与终止连接 一、引言 TCP 是一个面向连接的协议。无论哪一方向另一方发送数据之前&#xff0c;都必须先在双方之间建立一条连接。连接创建与终止的状态变化图如下&#xff1a; 二、三次握手建立连接 过程如下&#xff1a; 客户端发送一个 SY…

在Docker中运行asp.net core 跨平台应用程序

概述 Docker已经热了有一两年了&#xff0c;而且我相信这不是一个昙花一现的技术&#xff0c;而是一个将深远影响我们日后开发和部署、运营应用系统的一种创新&#xff08;很多人将其作为devops的一种非常重要的基石&#xff09;。学习docker的最好方式&#xff0c;莫过于它的…

java中的Queue队列的用法

大家好&#xff0c;欢迎来到雄雄的小课堂&#xff0c;今天给大家分享的是“java中的Queue队列的用法” 前言&#xff1a;好多人对Queue不是很熟悉&#xff0c;毕竟平时也不怎么用&#xff0c;遇到集合要么List要么map这些常用的&#xff0c;殊不知&#xff0c;java中还有个Que…

SpringCloud Netflix Eureka

文章目录一、 Eureka简介Eureka组件二、 Eureka和Zookeeper 对比1 什么是CAP定理2 基于CAP定理比对Eureka和Zookeeper三、 搭建Eureka注册中心1 POM文件2 配置文件application.yml3 启动类4 访问Eureka Server WEB服务管理平台四、 Eureka 服务管理平台介绍1 Eureka Server服务…

使用枚举定义常量更好点儿

大家好&#xff0c;欢迎来到雄雄的小课堂&#xff0c;昨天给大家分享的是“java中的Queue队列的用法示例”&#xff0c;今天&#xff0c;分享的主题是“java中&#xff0c;推荐使用枚举定义常量”。 前言&#xff1a;常量&#xff0c;相信大家多不会陌生&#xff0c;常量值一般…