Как бы вы отобразили информацию о сборке мусора (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
)
);
}
}
Выход

Вот несколько примеров, на которые я смотрел: https://github.com/aspnet/Diagnostics/tree/d1cba1f55bab1e3b206a46cee81eb1583d8732e2/samples/HealthChecksSample
Я пробовал некоторые другие образцыи зарегистрировать HC как синглтоны, но я не могу заставить его работать и сообщать в HC-UI. Итак, есть ли лучший способ сделать это?