【问题标题】:ASP.NET Core Health checks in multi tenant environment using routing configuration使用路由配置在多租户环境中进行 ASP.NET Core Health 检查
【发布时间】:2019-09-16 13:57:34
【问题描述】:

我开始使用来自 Asp.net Core 的运行状况检查,我喜欢它们,但我找不到一种简单的方法将它与基于租户的路由连接起来,例如支持:

  • /health [通用非租户特定检查]
  • /{tenant}/health [租户特定检查]

如果我成功地使用了这种方法,我可以使用标签来过滤要使用的健康检查,但不幸的是我未能为请求配置路由。

app.UseEndpointRouting();
app.UseHealthChecks("/{tenant}/health", new HealthCheckOptions
    {
        ResponseWriter = WriteCustomHealthResponse,
        AllowCachingResponses = false,
        Predicate = _ => _.Tags.Contains("tenant-specific")
    });

上面的代码没有正确路由。 我探索了使用类似以下内容的可能性:

app.MapWhen(context => 
    context.Request.Method == HttpMethod.Get.Method &&
    context.Request.?ROUTEDATA?.SOMECHECK("/{tenant}/HealthCheck"),
                builder => builder.UseHealthChecks());

但在这种情况下,我没有办法检查路由是否正确。

【问题讨论】:

  • 你为什么需要这个?运行状况检查是针对整个应用程序的。
  • 好吧,我不同意,在我的架构中,我可能会遇到仅影响某些租户的可用性问题,例如,我还有租户特定的数据库,以及各种租户驱动的配置、集成等。我想检查多租户资源(以及更多),但也要检查特定于租户的资源,我不一定知道它们是否存在。也许我正在重载该功能,但这确实让我对系统状态有了很好的了解。

标签: c# asp.net-core health-monitoring


【解决方案1】:

到目前为止,我找到的解决方案是使用查询字符串参数并使用IHttpContextAccessor 来搜索租户参数。 为此,我创建了IHealthCheck 的基本抽象实现。

public abstract class BaseTenantHealthCheck : IHealthCheck
{
    private IHttpContextAccessor _httpContextAccessor;

    public BaseTenantHealthCheck(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    protected string GetTenant()
    {
        return _httpContextAccessor?.HttpContext?.Request?.Query["tenant"].ToString();
    }

    protected bool IsTenantSpecificCheck() => !string.IsNullOrEmpty(GetTenant());

    public abstract Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context,
        CancellationToken cancellationToken = default(CancellationToken));
}

然后我在实现类中传递如下所示的上下文访问器。

public class MylAvailabilityHealthCheck : BaseTenantHealthCheck
{
    public MyAvailabilityHealthCheck(IOptionsMonitor<MyAvailabilityCheckOptions> options, IHttpContextAccessor httpContextAccessor)
    : base(httpContextAccessor)
    {
        [..]

要访问我使用的运行状况检查:

  • http://{url}/health [用于多租户检查]
  • http://{url}/health?tenant=TenantName [用于租户特定检查]

我期待听到是否有更优雅的方式来做到这一点。

【讨论】:

  • here 你有一篇关于健康检查实现的好文章
  • @Norcino - 假设 Asp.Net Core 3.0(可能需要 3.1) - 您可以在运行状况检查中使用 Endpoint Routing 解析路径参数。您需要将 HttpContextAccessor 注入运行状况检查并从上下文中提取 RouteData 对象。 //In Health Check var routeData = _accessor.HttpContext.GetRouteData(); var databaseName = routeData.Values["nameOfPathParameter"].ToString(); //Startup.cs - ConfigureServices registry .AddHealthChecks() .AddTypeActivatedCheck&lt;SqlServerHealthCheck&gt;("mssql", HealthStatus.Degraded);
  • 代码的其余部分:app.UseEndpoints(endpoints =&gt; { endpoints.MapControllers(); endpoints.MapHealthChecks("/api/health-check/db/mssql/{nameOfPathParameter}", new HealthCheckOptions { Predicate = SqlServerHealthCheckPredicate }); }); public static Func&lt;HealthCheckRegistration, bool&gt; SqlServerHealthCheckPredicate = registration =&gt; registration.Name.Equals("mssql", StringComparison.OrdinalIgnoreCase);
  • 感谢 JGx714791,我会尝试您提出的不同映射
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2019-08-08
  • 2020-03-26
相关资源
最近更新 更多