.Net Core 애플리케이션에 상태 확인 추가

이 일련의 게시물에서는 상태 확인에 대해 이야기하고 웹 애플리케이션/웹 API를 모니터링합니다.

또한 다른 기사가 있는 내 블로그를 확인하십시오 --> https://rmauro.dev

이 블로그 게시물에서는 애플리케이션 상태를 모니터링하는 엔드포인트를 추가합니다.

그리고 .Net Core 애플리케이션에서는 매우 간단하다는 것을 알 수 있습니다. 몇 줄의 코드만으로 서비스의 상태를 표시할 수 있는 인프라가 준비되었습니다.

다음과 같은 서비스를 모니터링할 수 있습니다.
  • 데이터베이스(SQL Server, Oracle, MySql, MongoDB 등)
  • 외부 API 연결
  • 디스크 연결(읽기/쓰기)
  • 캐시 서비스(Redis, Memcache 등)

  • 기본적으로 생각할 수 있는 모든 것. 적합한 구현을 찾지 못한 경우 맞춤형 구현을 생성할 수 있습니다.

    상태 엔드포인트 모니터링 패턴



    하지만. 왜요?

    Implement functional checks in an application that external tools can access through exposed endpoints at regular intervals. This can help to verify that applications and services are performing correctly.



    참조: https://docs.microsoft.com/en-us/azure/architecture/patterns/health-endpoint-monitoring

    기본 상태 확인 추가



    먼저 ConfigureServices 메서드에 HealthCheck 서비스를 추가합니다.

    public void ConfigureServices(IServiceCollection services)
    {
        //adding health check services to container
        services.AddHealthChecks();
    }
    


    Startup.cs



    둘째, 파이프라인 구성에 상태 확인 엔드포인트를 추가합니다.

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
    
        //adding health check endpoint
        app.UseHealthChecks("/healthcheck");
    
        app.UseMvcWithDefaultRoute();
    }
    


    Startup.cs for .Net Core 2.2



    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseRouting();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapHealthChecks("/healthcheck");
                    endpoints.MapDefaultControllerRoute();
                });
            }
    


    Startup.cs for .Net Core 3.1



    항상 UseMvc 앞에 놓습니다. 엔드포인트 이전에 MVC 파이프라인이 실행되는 것을 원하지 않습니다.

    URLhttp://{YOUR-URL}/healthcheck을 빌드, 실행 및 액세스하면 다음과 같이 표시됩니다.



    모니터링 목록에 서비스를 추가하기 위해 모든 설정 및 완료가 완료되었습니다. 이제 모니터 목록에 하나의 서비스인 MongoDb를 추가해 보겠습니다.

    MongoDb를 모니터 서비스로 추가



    xabaril의 목록에서 선택합시다. xabaril의 Github 리포지토리에는 사용할 준비가 된 많은 AspNetCore.Diagnostics.HealthChecks 패키지가 포함되어 있습니다.

    AspNetCore.HealthChecks.System
    AspNetCore.HealthChecks.Network
    AspNetCore.HealthChecks.SqlServer
    AspNetCore.HealthChecks.MongoDb
    AspNetCore.HealthChecks.Npgsql
    AspNetCore.HealthChecks.Elasticsearch
    AspNetCore.HealthChecks.Redis
    AspNetCore.HealthChecks.EventStore
    AspNetCore.HealthChecks.AzureStorage
    AspNetCore.HealthChecks.AzureServiceBus
    AspNetCore.HealthChecks.AzureKeyVault
    AspNetCore.HealthChecks.MySql
    

    https://github.com/xabaril/AspNetCore.Diagnostics.HealthChecks



    그리고 다른 많은 패키지.


    사업으로 돌아갑니다.

    먼저 프로젝트에 Nuget 패키지AspNetCore.HealthChecks.MongoDb를 추가합니다.

    그리고 MongoDB 상태 확인을 포함하도록 AddHealthChecks를 수정합니다.

    public void ConfigureServices(IServiceCollection services)
    {
        //adding health check services to container
        services.AddHealthChecks()
            .AddMongoDb(mongodbConnectionString: "YOUR-CONNECTION-STRING",
            name: "mongo", 
            failureStatus: HealthStatus.Unhealthy); //adding MongoDb Health Check
    }
    


    Startup.cs



    이러한 변경 후에 모든 것이 설정됩니다. 애플리케이션을 실행하고 건강 상태 페이지를 다시 확인할 수 있습니다.



    자세한 정보가 있는 다른 끝점 추가



    이제 모니터링되는 끝점에 대한 자세한 정보를 표시할 다른 끝점을 만들어 보겠습니다.

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        //... ommited code
    
        //adding health check endpoint
        app.UseHealthChecks("/healthcheck");
    
        //adding custom json response
        app.UseHealthChecks("/hc",
           new HealthCheckOptions
           {
               ResponseWriter = async (context, report) =>
               {
                   var result = JsonConvert.SerializeObject(
                       new
                       {
                           status = report.Status.ToString(),
                           errors = report.Entries.Select(e => new { key = e.Key, value = Enum.GetName(typeof(HealthStatus), e.Value.Status) })
                       });
                   context.Response.ContentType = MediaTypeNames.Application.Json;
                   await context.Response.WriteAsync(result);
               }
           });
    
        app.UseMvcWithDefaultRoute();
    }
    


    Startup.cs for .Net 2.2



    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                //... ommited code
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapHealthChecks("/healthcheck");
                    endpoints.MapHealthChecks("/hc",
                       new HealthCheckOptions
                       {
                           ResponseWriter = async (context, report) =>
                           {   //using the new json serializer
                               var result = JsonSerializer.Serialize(
                                   new
                                   {
                                       status = report.Status.ToString(),
                                       errors = report.Entries.Select(e => new { key = e.Key, value = Enum.GetName(typeof(HealthStatus), e.Value.Status) })
                                   });
    
                               context.Response.ContentType = MediaTypeNames.Application.Json;
    
                               await context.Response.WriteAsync(result);
                           }
                       });
    
                    endpoints.MapGet("/", async context => await context.Response.WriteAsync("Hello World!"));
                    endpoints.MapDefaultControllerRoute();
                });
            }
    


    Startup.cs for .Net 3.1



    다시 실행하고 끝점에 액세스합니다/hc.



    그게 다야!

    다음 글에서는 좋은 UI(사용자 인터페이스)를 넣는 방법을 보여드리겠습니다.

    소스 코드 At - 브랜치 Article-1


  • https://github.com/ricardodemauro/Health-Check-Series

  • 원래 게시 위치:


  • https://rmauro.dev/adding-health-checks-to-net-core-application/

  • 참조 기사


  • https://docs.microsoft.com/en-us/azure/architecture/patterns/health-endpoint-monitoring
  • https://www.hanselman.com/blog/HowToSetUpASPNETCore22HealthChecksWithBeatPulsesAspNetCoreDiagnosticsHealthChecks.aspx
  • https://github.com/xabaril/AspNetCore.Diagnostics.HealthChecks
  • 좋은 웹페이지 즐겨찾기