Смотрите подробные сведения о проверке работоспособности .NET

#c# #.net #health-check

#c# #.net #проверка работоспособности

Вопрос:

Я включил .NET Health Checks в своем приложении. Я даю проверке имя и добавляю сообщение в зависимости от результата проверки. В приведенном ниже примере показана вызванная проверка Test Health Check и сообщение Server Is Healthy! , если возвращается исправный результат. Когда я обращаюсь к конечной точке api, я просто вижу Healthy . Где я могу увидеть более подробную информацию о проверке?

 .AddCheck("Test Health Check", () => HealthCheckResult.Healthy("Server Is Healthy!"))
  

Комментарии:

1. Он использует ResponseWriter по умолчанию. Вам нужно переопределить его. Я думаю, у меня где-то был учебник, … Я посмотрю … Проверьте это: youtube.com/watch?v=bdgtYbGYsK0amp;t=631s или вот это: youtube.com/watch?v=w8yAdoWnULY

2. ^^ Я знаю, что запрашивать учебные пособия запрещено. Я думаю, что предоставление руководств должно быть в порядке, если они у меня есть под рукой…

Ответ №1:

Это видео на YouTube от @Fildor было полезным.

Вот что я сделал:

В Program.cs я добавил:

 applicationBuilder.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapCustomHealthChecks("Health"); });
  

Затем я создал HealthCheckExtensions класс:

 using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mime;
using System.Text;

namespace my.namespace.Features.HealthChecks
{

    // a custom response class for the .NET Health Check
    public static class HealthCheckExtensions
    {
        public static IEndpointConventionBuilder MapCustomHealthChecks(
            this IEndpointRouteBuilder endpoints, string serviceName)
        {
            return endpoints.MapHealthChecks("/api/health", new HealthCheckOptions
            {
                ResponseWriter = async (context, report) =>
                {
                    var result = JsonConvert.SerializeObject(
                        new HealthResult
                        {
                            Name = serviceName,
                            Status = report.Status.ToString(),
                            Duration = report.TotalDuration,
                            Info = report.Entries.Select(e => new HealthInfo
                            {
                                Key = e.Key,
                                Description = e.Value.Description,
                                Duration = e.Value.Duration,
                                Status = Enum.GetName(typeof(HealthStatus),
                                                        e.Value.Status),
                                Error = e.Value.Exception?.Message
                            }).ToList()
                        }, Formatting.None,
                        new JsonSerializerSettings
                        {
                            NullValueHandling = NullValueHandling.Ignore
                        });
                    context.Response.ContentType = MediaTypeNames.Application.Json;
                    await context.Response.WriteAsync(result);
                }
            });
        }
    }
}

  

Класс HealthInfo :

 using System;
using System.Collections.Generic;
using System.Text;

namespace my.namespace.Features.HealthChecks
{
    public class HealthInfo
    {
        public string Key { get; set; }
        public string Description { get; set; }
        public TimeSpan Duration { get; set; }
        public string Status { get; set; }
        public string Error { get; set; }
    }
}
  

Класс HealthResult :

 using System;
using System.Collections.Generic;
using System.Text;

namespace my.namespace.Features.HealthChecks
{
    public class HealthResult
    {
        public string Name { get; set; }
        public string Status { get; set; }
        public TimeSpan Duration { get; set; }
        public ICollection<HealthInfo> Info { get; set; }
    }
}