.Net Core实现健康检查

news2024/11/15 15:59:47
  • ASP.NET Core 提供运行状况检查中间件和库,以用于报告应用基础结构组件的运行状况。
  • 运行状况检查由应用程序作为 HTTP
    终结点公开。
  • 可以为各种实时监视方案配置运行状况检查终结点:
  1. 运行状况探测可以由容器业务流程协调程和负载均衡器用于检查应用的状态 例如,容器业务流程协调程序可以通过停止滚动部署或重新启动容器来响应失败的运行状况检查。
  2. 负载均衡器可以通过将流量从失败的实例路由到正常实例,来应对不正常的应用。
    可以监视内存、磁盘和其他物理服务器资源的使用情况来了解是否处于正常状态。
  3. 运行状况检查可以测试应用的依赖项(如数据库和外部服务终结点)以确认是否可用和正常工作。

这个示例展示数据库的运行状态,他在其验证数据库连接并返回相应的结果

 [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来请求查看我们的应用程序的健康程度的

在这里插入图片描述
还有一个问题?但是这样对于我们刚才的需求是满足不了的,那么我们如何自定义我们的健康度检查呢?

以下两种方式来处理
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个选项

Healthy 健康
Unhealthy 不良
Degraded 降级

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
  }
}

在这里插入图片描述
这样就可以看到健康状态了

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

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

相关文章

MySQL 8.0 多实例安装

规划&#xff1a;主要就是data目录和port 端口以及socket 文件路径的差异管理&#xff1a; 配置文件准备 mkdir -p /data/330{6..8}/data chown -R mysql.mysql /data/* cat > /data/3306/my.cnf <<EOF [mysqld] usermysql basedir/usr/local/mysql datadir/data/3306…

新华三命令行基础

命令使用基础命令行视图用户视图• <h3c>• 只能查看配置&#xff0c;不能修改配置只能进行查看系统视图• [h3c]• 可以查看和修改全局配置接口视图• [H3C-GigabitEthernet0/0]• 可以对接口修改配置视图的切换system-view• 从用户视图进入系统视图interface g0/0• 从…

websocket_flask

1.使用socket协议构建server client文件&#xff0c;服务端构建maskrcnn分割模型&#xff0c;客户端发送图片返回分割结果&#xff1b;使用纯socket通信&#xff0c;通信传输效率较低&#xff0c;接收数据需要1024byte连续接收代码如下#server.py import socket import torchvi…

社区发现系列03-Louvain算法分辨率

1、分辨率局限 louvain算法存在的问题&#xff1a;分辨率局限。就是说当通过优化模块度来发现社区结构时&#xff0c;网络在存在一个固有的分辨率局限&#xff0c;导致一些规模较小但是结构显著的社区淹没在大的社区中&#xff0c;无法被识别到。 造成这个问题的根本原因是模块…

曝光:超算实习生的训练模式很独特

升职无望&#xff0c;随时被裁&#xff1b;内卷压力&#xff0c;无情996现如今的打工人实惨&#xff0c;但无论客观行情如何、经济到底有多难&#xff0c;背靠国家政策支持的高级技术人才&#xff0c;任何时候都吃香。超算、先进计算就是这样的行业&#xff0c;已经被定为未来3…

持续交付-Blue Ocean 应用

Blue Ocean 提供了一套可视化操作界面来帮助创建、编辑 Pipeline 任务。Blue Ocean 特性&#xff1a;流水线编辑器&#xff1a;用于创建贯穿始终的持续交付流水线&#xff0c;是一种直观并可视化的流水线编辑器。流水线的可视化&#xff1a;对流水线的可视化表示&#xff0c;提…

vm虚拟机及Linux系统安装教程详解

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

Java集合源码学习(2)ArrayList

1 概述 ArrayList是基于数组实现的&#xff0c;是一个动态数组&#xff0c;其容量能自动增长&#xff0c;类似于C语言中的动态申请内存&#xff0c;动态增长内存。 ArrayList不是线程安全的&#xff0c;只能用在单线程环境下&#xff0c;多线程环境下可以考虑用Collections.s…

Commonsense and Named Entity Aware Knowledge Grounded Dialogue Generation

摘要 motivation&#xff1a; 以外部知识为基础&#xff0c;在对话历史背景下解释语言模式&#xff0c;如省写、回指和共同引用&#xff0c;对对话的理解和生成至关重要。 this paper&#xff1a; 在本文中&#xff0c;我们提出了一种新的开放域对话生成模型&#xff0c;该模型…

【C++】vector的使用及其迭代器失效问题

文章目录一、vector介绍二、vector使用1. 常用构造函数2. 迭代器3. 空间操作4. 增删查改5. 动态二维数组三、vector迭代器失效问题1. 扩容导致迭代器失效2. erase导致迭代器失效3. g对迭代器失效的处理一、vector介绍 vector是表示可变大小数组的序列容器。与数组一样&#xf…

vue打包exe

文章目录一、前言二、实现方法1.跑通示例代码 electron-quick-start<1>clone示例代码<2>进入项目根目录&#xff0c;下载依赖<3>测试运行2.打包自己的 vue 项目3.将vue项目整合到示例代码中打包exe<1>将打包好的 dist 文件夹复制到示例代码 electron-q…

【Linux】gdb调试器的使用

All is well that ends well.结果好就是好。 个人主页&#xff1a;阿润菜菜 简介 GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具。 Windows 操作系统中&#xff0c;我们更习惯使用一些已经集成好的开发环境&#xff08;IDE&#xff09;&#xff0c;如 VS、VC、Dev-…

LeetCode461. 汉明距离,x与y异或,之后用f(x)=x (x−1))次数与Integer.bitCount求二进制1的个数

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 1.x ^ y异或&#xff0c;用f(x)x & (x−1)&#xff09;次数求二进制中1的个数&#xff0c;那么 f(x) 恰为x删去其二进制表示中…

C语言_文件操作(上)

目录 1. 什么是文件 2. 文件名 3. 文件类型 4. 文件缓冲区 5. 文件指针 6. 文件的打开和关闭_fopen_fclose 7. 文件的顺序读写 7.1 fputc 7.2 fgetc 7.3 fputs 7.4 fgets 7.5 fscanf 7.6 fprintf 7.7 fread 7.8 fwrite 7.9 对比scanf/printf、fscanf/fprintf、…

java实现dwg转pdf

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、无奈选择第二种二、jar引入1.jar地址2.使用jar,完成dwg转为pdf总结前言 由于公司需要最近研究一个cad文件需要在浏览器中展示,经过研究发现大致有两种方式:…

JVM-围观如何打破双亲委派机制

下面手把手用代码来实现打破JVM的双亲委派机制一、Tomcat打破双亲委派机制以Tomcat类加载为例&#xff0c;Tomcat作为web容器&#xff0c; 那么它要解决什么问题呢&#xff1f;Tomcat 如果使用默认的双亲委派类加载机制行不行&#xff1f;1.1 Tomcat作为web容器&#xff0c; 那…

科技云报道:CES 2023:自动驾驶、元宇宙备受瞩目

科技云报道原创。 在被疫情扰乱了两年之后&#xff0c;2023年CES终于回归正常了。 1月5日-8日&#xff0c;CES 2023在拉斯维加斯举行。作为当前全球规模最大、影响力最广泛的消费类电子技术年展&#xff0c;本届展会涵盖的重要主题包括可持续性、数字健康、Web3与元宇宙以及人…

教你如何快速使用店铺管理系统

一、客户管理1、客户资料客户资料报表展示所有新客的数据信息&#xff0c;在此报表可进行会员开卡及新增客户操作&#xff1b;提交会员开卡表单之后&#xff0c;由数据助手更新该客户的会员卡信息至客户信息表单&#xff1b;点击新增客户弹出客户信息表单&#xff0c;默认客户分…

python自学之《21天学通Python》(8)

第11章 文件与文件系统 编写程序来解决实际项目时&#xff0c;很多时候都离不开文件和文件系统的操作。程序本身就是保存在文件系统的文件中的。文件既可以保存程序代码&#xff0c;也可以用来保存各种输入与输出数据。文件和文件系统的处理是任何高级程序设计语言必不可少的一…

Node.js教程笔记(一)

学习目标 1、初识Nodejs 2、fs文件系统模块 3、path路径模块 4、http模块 一、初识Node.js 1.1 浏览器中的JavaScript的运行环境 1、浏览器中的JavaScript的组成部分 2、为什么JavaScript可以在浏览器中被执行&#xff1f; 3、为什么JavaScript可以操作Dom和Bom&#xff…