首页 > 编程语言 >ASP .NET Core 健康检查

ASP .NET Core 健康检查

时间:2022-11-17 00:12:59浏览次数:40  
标签:Core ASP 健康检查 AspNetCore HealthCheckResult using HealthChecks NET Microsoft

简介

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

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

举例一些常见的健康检查内容:

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

健康检查有三个登记

  • Healthy 健康
  • Unhealthy 不良
  • Degraded 降级

ASP.NET Core实现

Neget安装以下包

AspNetCore.HealthChecks.UI		
AspNetCore.HealthChecks.UI.Client
AspNetCore.HealthChecks.UI.InMemory.Storage
Microsoft.Extensions.Diagnostics.HealthChecks

添加检查测试案例

services.AddHealthChecks()
    .AddCheck("Foo", () =>
        HealthCheckResult.Healthy("健康"), tags: new[] { "foo_tag" })
    .AddCheck("Bar", () =>
        HealthCheckResult.Unhealthy("不良"), tags: new[] { "bar_tag" })
    .AddCheck("Baz", () =>
        HealthCheckResult.Degraded("降级"), tags: new[] { "baz_tag" });

添加检查

using Microsoft.Extensions.Diagnostics.HealthChecks;
using System;
using System.Threading;
using System.Threading.Tasks;

namespace WebApplication6.HealthChecks
{
    public class DatabaseHealthCheck : IHealthCheck
    {
        public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken =
         default)
        {
            try
            {
                return Task.FromResult(HealthCheckResult.Healthy($"API is running."));

            }
            catch (Exception ex)
            {

                return Task.FromResult(HealthCheckResult.Unhealthy("DB is not Healthy", ex));
            }
        }
    }
}

appsettings.json添加HealthChecksUI配置

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "HealthChecks-UI": {
    "HealthChecks": [
      {
        "Name": "Local",
        "Uri": "http://localhost:5000/health"
      }
      //{
      //  "Name": "",
      //  "Uri": ""
      //}
    ],
    "Webhooks": [
      {
        "Name": "",
        "Uri": "",
        "Payload": "",
        "RestoredPayload": ""
      }
    ],
    "EvaluationTimeOnSeconds": 10,
    "MinimumSecondsBetweenFailureNotifications": 60
  }
}

Startup添加HealthCheck服务和HealthCheckUI界面

using HealthChecks.UI.Client;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
using WebApplication6.HealthChecks;

namespace WebApplication6
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }


        public void ConfigureServices(IServiceCollection services)
        {

            services.AddControllers();


            services.AddHealthChecks()
    .AddCheck("Foo", () =>
        HealthCheckResult.Healthy("健康"), tags: new[] { "foo_tag" })
    .AddCheck("Bar", () =>
        HealthCheckResult.Unhealthy("不良"), tags: new[] { "bar_tag" })
    .AddCheck("Baz", () =>
        HealthCheckResult.Degraded("降级"), tags: new[] { "baz_tag" });

            //添加DatabaseHealthCheck
            services.AddHealthChecks().AddCheck<DatabaseHealthCheck>(nameof(DatabaseHealthCheck));

            //添加UI 内存存储
            services.AddHealthChecksUI().AddInMemoryStorage();

        }


        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();



            app.UseHealthChecksUI();
            HealthCheckOptions healthCheckOptions = new HealthCheckOptions
            {
                AllowCachingResponses = false,
                Predicate = _ => true,
                ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse,
                ResultStatusCodes =
                {
                    [HealthStatus.Healthy] = StatusCodes.Status200OK,
                    [HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable,
                    [HealthStatus.Degraded] = StatusCodes.Status500InternalServerError,
                    [HealthStatus.Degraded] = StatusCodes.Status419AuthenticationTimeout
                }
            };

            app.UseHealthChecks("/health", healthCheckOptions);



            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

访问http://localhost:5000/health查看健康检查

访问http://localhost:5000/healthchecks-ui查看健康检查UI界面

标签:Core,ASP,健康检查,AspNetCore,HealthCheckResult,using,HealthChecks,NET,Microsoft
From: https://www.cnblogs.com/RainFate/p/16898043.html

相关文章

  • 如何像使用AspNetCore中的Controllers 和 Actions一样处理MQTT消息
    在物联网项目中, 处理MQTT的topic时费工费力,代码一团乱,什么才是最好的姿势?这里面我们极力介绍 MQTTnet.AspNetCore.Routing  项目,MQTTnetAspNetCoreRouting是https......
  • Netty源码-05-EventLoop
    前文已经了解过了NioEventLoopGroup和NioEventLoop在Netty中是用的是Reactor线程模型(IO多路复用器+多个线程),真正处理业务流程的worker线程都是单个线程,一个线程处理多个......
  • Netty源码-06-MpscQueue
    在IO线程NioEventLoop中维护了一个队列实现,用于存放非IO任务,一个IO线程负责N个Channel,为了保证一个线程贯穿始终负责一个Channel的所有任务(任务执行次序有先后区分需要),因......
  • Netty源码-07-Channel
    一类图关系在Java的NIO体系中定义了ServerSocketChannel和SocketChannelNetty为了支持Reactor线程模型和异步编程,自己也实现了与Java中对应的两个实现NioServerSocke......
  • Netty源码-09-ServerBootstrapAcceptor
    在ServerBootstrapAcceptor启用之前,此刻Reactor状态应该是NioServerSocketChannel在IO多路复用器上关注着Accept(16)事件pipeline中有4个handlerheadbossHandlerSer......
  • Netty源码-08-ChannelInitializer
    一回顾几个时机点pipeline的初始化用户向pipeline添加ChannelInitializer辅助实例Channel注册到复用器之后回调1pipeline的初始化初始化Channel的时候触发了pipel......
  • Netty源码-10-ChannelFuture
    Netty为了提高系统的吞吐,大量使用异步线程模型一DemopublicclassFutureTest00{publicstaticvoidmain(String[]args)throwsInterruptedException,Execut......
  • Netty源码-01-NioEventLoopGroup
    一定义摘自源码JavaDoc/***The{@linkEventExecutorGroup}isresponsibleforprovidingthe{@linkEventExecutor}'stouse*viaits{@link#next()}method......
  • Netty源码-02-FastThreadLocalThread
    一DemopublicclassFastThreadLocalTest00{privatefinalstaticFastThreadLocal<Long>v=newFastThreadLocal<Long>(){@Overrideprotec......
  • CSharp: Facade Pattern in donet 6
     ///<summary>///外观模式FacadePattern///银行///</summary>publicclassBank{publicboolIsUntrustworthy(Custome......