HealthChecksUI + память (GCInfo) - .NET Core 3 - PullRequest
0 голосов
/ 30 октября 2019

Как бы вы отобразили информацию о сборке мусора (GC) в HealthChecksUI в .NET Core 3?

NuGet ref: https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks

Я просматривал примеры здесь итам, но не могу найти то, что я ищу. Я пытаюсь представить выделение памяти GC для HC-UI и сообщить об ухудшении, если оно превысит некоторый предел. И у меня все получилось - но я считаю, что реализация может быть намного лучше из-за выделения кучи при проверке.

Соответствующий раздел отмечен комментарием @ startup.cs

Вот мой пример:

startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.
        .AddCustomHealthChecks()
        .AddHealthChecksUI();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app
        .UseRouting()
        .UseEndpoints(endpoints =>
            {
                endpoints.MapHealthChecks("/health", new HealthCheckOptions
                {
                    Predicate = (check) =>
                        check.Tags.Contains("self")
                        || check.Tags.Contains("memory"),
                    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
                });
                endpoints.MapHealthChecks("/liveness", new HealthCheckOptions
                {
                    Predicate = (check) => check.Tags.Contains("self")
                });
                endpoints.MapHealthChecksUI(setup =>
                {
                    setup.AddCustomStylesheet("healthcheck-ui.css");
                });
            });
}

public static IServiceCollection AddCustomHealthChecks(this IServiceCollection services)
{
        services
            .AddHealthChecks()
            .AddCheck(
                "Self", () =>
                HealthCheckResult.Healthy("Dynamic Config is OK!"),
                tags: new[] { "self" }
            )
            .AddCheck("Memory", () =>                
                new GCInfoHealthCheck()            // This section right here
                    .CheckHealthAsync(             // seems to be a very
                        new HealthCheckContext()   // poor implementation due
                    ).GetAwaiter().GetResult(),    // to constant Heap allocation.
                tags: new[] { "memory" }
            );

        return services;
}

GCInfoHealthCheck.cs

public class GCInfoHealthCheck : IHealthCheck
{
    public string Name { get; } = "GCInfo";

    public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken))
    {            
        var allocatedMegaBytes = GC.GetTotalMemory(forceFullCollection: false) / 1000000; // divided to get MB
        var data = new Dictionary<string, object>()
        {
            { "AllocatedMegaBytes", allocatedMegaBytes }
        };

        var status = (allocatedMegaBytes >= 20) ? HealthStatus.Unhealthy : HealthStatus.Healthy;

        return Task.FromResult(
            new HealthCheckResult(
                status,
                exception: null,
                description: $"reports degraded status if allocated MB >= 20MB, current: {allocatedMegaBytes} MB",
                data: data
            )
        );
    }        
}

Выход

HC Ok HC not Ok

Вот несколько примеров, на которые я смотрел: https://github.com/aspnet/Diagnostics/tree/d1cba1f55bab1e3b206a46cee81eb1583d8732e2/samples/HealthChecksSample

Я пробовал некоторые другие образцыи зарегистрировать HC как синглтоны, но я не могу заставить его работать и сообщать в HC-UI. Итак, есть ли лучший способ сделать это?

...