如何在托管服务中实现.NET Core健康检查?

3

问题就如标题所问。对于数据库操作、查询、命令和事件存储,进行检查很简单,但我不知道在hostedservice上执行健康检查的最佳方式是什么。可以给出建议吗?


这个链接回答了你的问题吗?您需要在应用程序中配置特定的端点,然后可以通过kubernetes执行健康检查探测。 - mario
@mario 不是的!哈哈,我希望是这样,但我特别想要一个HostedService来检查它的健康状况,即它的内存使用情况(如果可能的话),或者至少是否仍然正常工作。 - Nicholas
@ 尼古拉斯,很遗憾这次我不能帮助你了。 ;) 我也没有找到有关在托管服务上执行健康检查的任何信息。祝你好运! - mario
3个回答

7

此外,根据Simon B提供的信息,这份 Microsoft 官方文档 提供了编写托管服务的健康检查结构的完整指南。

您需要三个元素:

  1. 用于托管服务的HealthCheck类
  2. HealthCheck提供程序 DI,以及 HealthCheck 类的 DI。
  3. 一个HealthCheck发布器

6

IHostedService 接口(以及 BackgroundService 基础实现)具有可重写的方法 StartAsync()StopAsync()。 在我们的后台服务中,我们有:

public override Task StopAsync(CancellationToken cancellationToken)
{
      _logger.LogWarning("Background service stopping");
      return Task.CompletedTask;
}

你可以使用这个方法,在你的HostedService启动或停止时运行希望通知的任何内容。
如果你需要轮询服务的方式,你可以注入一个具有简单状态的单例,并通过这些方法设置它。然后,在你的API/网站上,健康检查控制器也可以被注入并读取单例的状态。例如:
    public interface IHostedServiceStatus
    {
        bool IsHostedServiceRunning { get; set; }
    }

    public class HostedServiceStatus : IHostedServiceStatus
    {
        public bool IsHostedServiceRunning { get; set; }
    }

将其设置为单例,注入到您的HostedService中,并在StartAsync()StopAsync()方法中适当地设置IsHostedServiceRunning。 然后还要注入到您的健康检查控制器中,并读取IsHostedServiceRunning


抱歉,Simon。请给我一些时间处理这个问题。我会按照您的指导进行,并在能够回复时做出回应! - Nicholas

0
另一个选择是使用ExecuteTask属性和BackgroundService类:
/// <summary>
/// Gets the Task that executes the background operation.
/// </summary>
/// <remarks>
/// Will return <see langword="null"/> if the background operation hasn't started.
/// </remarks>
public virtual Task? ExecuteTask => _executeTask;

使用此方法,您可以推断后台服务的状态如下:

@if (service.ExecuteTask == null)
{
    // Status = "Loading"
}
else
{
    if(!service.ExecuteTask.IsCompleted)
    {
        // Status = "Running"
    }
    else
    {
        // Status = "Stopped"
    }
}

或者你甚至可以使用任务的任务状态


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接