Azure 函数和 IHealthCheck

Gus*_*ero 7 .net c# azure-functions

我需要为 Azure Functions 实施运行状况检查。

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks?view=aspnetcore-3.0

但是,在我的情况下,我们需要在 NETCORE 2.2 中实现它而不是使用 NETCORE 3.0

我们的主要问题是从FunctionsStartup继承的启动类,它与 MVC API 启动有很大的不同。因此,以下代码无法在 Startup.cs 中实现

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {            
            //Readiness check
            var port = int.Parse(Configuration["HealthManagementPort"]);
            app.UseHealthChecks("/ready", port, new HealthCheckOptions()
            {
                Predicate = (check) => check.Tags.Contains("ready"),
            });
            app.UseHealthChecks("/live", port, new HealthCheckOptions()
            {
                //Exclude all checks and return 200-OK
                Predicate = (_) => false,
            });

        }

Run Code Online (Sandbox Code Playgroud)

有没有人遇到过类似的事情?我怎样才能实现类似的行为?

谢谢。

小智 7

app.UseHealthChecks("/ready", port, new HealthCheckOptions()
          {
                Predicate = (check) => check.Tags.Contains("ready"),
          });
Run Code Online (Sandbox Code Playgroud)

UseHealthChecks 是一种注册HealthCheckMiddleware的扩展方法,该方法调用HealthCheckService类中名为 CheckHealthAsync 的方法

为了在 Azure 函数中实现这一点,您需要执行以下操作:

  1. 添加 Microsoft.Extensions.Diagnostics.HealthCheck 块包。
  2. 在您的 Startup.cs 类上注册您的健康检查
   services.AddHealthChecks()
                .AddCheck<SampleHealthCheck>("Sample")
                .AddCheck<Sample2HealthCheck>("Sample2");
Run Code Online (Sandbox Code Playgroud)
  1. 创建Http触发函数并注入HealthCheckService类
public class GetReady
    {
        private readonly HealthCheckService _healthCheckService;

        public GetReady(HealthCheckService healthCheckService)
        {
            _healthCheckService = healthCheckService;
        }

        [FunctionName(nameof(GetReady))]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = "ready")]
            HttpRequest req,
            CancellationToken cancellationToken)
        {
            var result = await _healthCheckService.CheckHealthAsync((check) => check.Tags.Contains("ready"), cancellationToken);
            return new OkObjectResult(result);
        }
    }
Run Code Online (Sandbox Code Playgroud)

并且您的端点应该与 aspnet 核心相同。

  • 执行此操作时出现此错误:启动操作“debf69cd-3112-4da2-9fe1-4e66fa07dcd9”期间发生主机错误。func:无效的主机服务。Microsoft.Azure.WebJobs.Script.WebHost:以下服务注册与预期服务不匹配:[无效] ServiceType:Microsoft.Extensions.Hosting.IHostedService,生命周期:Singleton,ImplementationType:Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckPublisherHostedService。值不能为空。(参数“提供者”) (2认同)

Moh*_*rma 2

如果您使用基于消耗的计划,则可以使用Azure功能的健康监控功能。

Functions Runtime 的主机运行状况监控功能可监控各种虚拟机沙箱施加的性能计数器。目标是在即将超过任何计数器的阈值时暂时停止主机执行更多工作。这允许主机避免达到可能导致硬关闭的硬沙箱限制,并且还允许主机在等待计数器返回到正常限制的同时优雅地完成正在进行的工作。

您可以在这里阅读更多详细信息:

https://github.com/Azure/azure-functions-host/wiki/Host-Health-Monitor

或者,您可以使用应用程序洞察进行运行状况检查。您可以查看这些博客以获取详细说明:

https://zimmergren.net/azure-functions-scheduled-trigger-not-firing-application-insights-monitoring/

如何在 azure 中创建 API 运行状况检查?

希望能帮助到你。