Могу ли я добавлять и удалять проверки работоспособности, когда приложение запускается через http-запрос (ядро asp.net)

Есть ли возможность для проверки работоспособности в ядре aspnet, которые необходимо настроить после запуска приложения через HTTP-запрос. Вся документация и примеры, которые я просмотрел, в настоящее время настраивают проверки работоспособности только в Startup.cs Configure method.

Например, я хотел бы определить контроллер HealthChecksController, у которого есть методы действий для добавления проверок работоспособности удаления в моем приложении через внешнее приложение.

public class HealthChecksController : Controller
{ 
    [HttpPost]  
    public Customer CreateHealthCheck(HealthCheck healthCheck)  
    {  
      //Add to existing health checks
    }  

    [HttpDelete]  
    public void DeleteHealthCheck(int id)  
    {  
      //Remove from existing health checks
    } 
}

Причина, по которой я задаю этот вопрос, заключается в том, что я хочу разработать систему мониторинга для проверки состояния определенных служб, работающих на моем сервере, и существующая структура проверки работоспособности выглядит как подходящая для моих требований, а не изобретает велосипед. Службы, подлежащие мониторингу, неизвестны на этапе разработки приложения, и их необходимо настроить после развертывания приложения. Следовательно, необходимо настроить их при запуске приложения asp.net.

Возможно ли это вообще с существующими проверками работоспособности, если нет другого жизнеспособного решения?


person Durga Prasad    schedule 28.04.2021    source источник


Ответы (1)


Вы видели Документы по проверке работоспособности

Как вы проверяете статус динамических служб? Я собираюсь предположить, что это API (для простоты моего примера)

Одним из решений может быть создание службы для хранения URL-адресов для проверки состояния работоспособности:

ПРИМЕЧАНИЕ. Этот пример не содержит проверки ошибок или защиты от параллелизма.

public class HealthCheckService
{
    private readonly List<string> _urls = new List<string>();

    public void Add(string url)
    {
        _urls.Add(url);
    }

    public void Remove(string url)
    {
        _urls.Remove(url);
    }

    public IEnumerable<string> GetServices()
    {
        return _urls;
    }
}

Зарегистрируйте это как синглтон в вашем стартапе.

services.AddSingleton<HealthCheckService>();

Вы можете ввести это в свой контроллер и добавить URL-адреса

[ApiController]
[Route("/api/health")]
public class HealthCheckController : ControllerBase
{
    private readonly HealthCheckService _service;

    public HealthCheckController(HealthCheckService service)
    {
        _service = service;
    }

    [HttpPost]
    public IActionResult Add(string url)
    {
        _service.Add(url);

        return Ok();
    }

    [HttpDelete]
    public IActionResult Remove(string url)
    {
        _service.Remove(url);

        return Ok();
    }
}

Затем вам нужно создать класс, который наследуется от IHealthCheck

public class MyHealthChecks : IHealthCheck
{
    private readonly HealthCheckService _service;

    public MyHealthChecks(HealthCheckService service)
    {
        _service = service;
    }

    public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        foreach(var svc in _service.GetServices())
        {
            // call the URL to verify?
            // var response = await httpClient.SendAsync(url);
            //
            // do something with response and store it in results[svc]
            // if (!response.IsSuccessStatusCode)
            // {
            //     return Task.FromResult(new HealthCheckResult(
            //         HealthStatus.Unhealthy, svc));
            // }
        }

        return Task.FromResult(new HealthCheckResult(
            HealthStatus.Healthy));
    }
}

Вам нужно будет изменить код в CheckHealthAsync, чтобы вызвать свои службы и ответить соответствующим образом.

Наконец, зарегистрируйте класс проверки работоспособности во время запуска:

services.AddHealthChecks()
    .AddCheck<MyHealthChecks>("CustomHealthChecks");

Вы можете добавить специальный автор ответа, если вы хотите вернуть более подробную информацию о состоянии здоровья.

person Simply Ged    schedule 29.04.2021
comment
Это выглядит как хорошая отправная точка для моего требования. Мое требование не ограничивается только URL-адресами, мне нужно добавить проверки БД, проверки системы, а также средство наблюдения за файлами. Я попытаюсь развить класс HealthcheckService, добавив свойства, соответствующие этим требованиям. Спасибо. - person Durga Prasad; 29.04.2021
comment
Я начал реализовывать упомянутое предложение и столкнулся с одной проблемой. Возвращаемое значение — это только один результат проверки работоспособности. Если у меня много URL-адресов, мне нужен результат проверки работоспособности для каждого URL-адреса. В настоящее время в качестве обходного пути я оборачиваю информацию в параметр данных HealthcheckResult и извлекаю ее. Как-то некрасиво выглядит. Есть ли более изощренный подход? - person Durga Prasad; 01.05.2021
comment
В конце своего ответа я добавил ссылку на создание пользовательского автора ответов. Это может быть то, что вы ищете - person Simply Ged; 01.05.2021