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