Last active
January 6, 2019 18:58
-
-
Save rodolfofadino/29824c40d63433cbef1807763ce6ffae to your computer and use it in GitHub Desktop.
GCInfoHealthCheck
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Microsoft.Extensions.DependencyInjection; | |
using Microsoft.Extensions.Diagnostics.HealthChecks; | |
using Microsoft.Extensions.Options; | |
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Threading; | |
using System.Threading.Tasks; | |
namespace WebApplication19.Checks | |
{ | |
// This is an example of a custom health check that implements IHealthCheck. | |
// | |
// This example also shows a technique for authoring a health check that needs to be registered | |
// with additional configuration data. This technique works via named options, and is useful | |
// for authoring health checks that can be disctributed as libraries. | |
public static class GCInfoHealthCheckBuilderExtensions | |
{ | |
public static IHealthChecksBuilder AddGCInfoCheck( | |
this IHealthChecksBuilder builder, | |
string name, | |
HealthStatus? failureStatus = null, | |
IEnumerable<string> tags = null, | |
long? thresholdInBytes = null) | |
{ | |
// Register a check of type GCInfo | |
builder.AddCheck<GCInfoHealthCheck>(name, failureStatus ?? HealthStatus.Degraded, tags); | |
// Configure named options to pass the threshold into the check. | |
if (thresholdInBytes.HasValue) | |
{ | |
builder.Services.Configure<GCInfoOptions>(name, options => | |
{ | |
options.Threshold = thresholdInBytes.Value; | |
}); | |
} | |
return builder; | |
} | |
} | |
public class GCInfoHealthCheck : IHealthCheck | |
{ | |
private readonly IOptionsMonitor<GCInfoOptions> _options; | |
public GCInfoHealthCheck(IOptionsMonitor<GCInfoOptions> options) | |
{ | |
_options = options; | |
} | |
public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken)) | |
{ | |
var options = _options.Get(context.Registration.Name); | |
// This example will report degraded status if the application is using | |
// more than the configured amount of memory (1gb by default). | |
// | |
// Additionally we include some GC info in the reported diagnostics. | |
var allocated = GC.GetTotalMemory(forceFullCollection: false); | |
var data = new Dictionary<string, object>() | |
{ | |
{ "Allocated", allocated }, | |
{ "Gen0Collections", GC.CollectionCount(0) }, | |
{ "Gen1Collections", GC.CollectionCount(1) }, | |
{ "Gen2Collections", GC.CollectionCount(2) }, | |
}; | |
// Report failure if the allocated memory is >= the threshold. | |
// | |
// Using context.Registration.FailureStatus means that the application developer can configure | |
// how they want failures to appear. | |
var result = allocated >= options.Threshold ? context.Registration.FailureStatus : HealthStatus.Healthy; | |
return Task.FromResult(new HealthCheckResult( | |
result, | |
description: "reports degraded status if allocated bytes >= 1gb", | |
data: data)); | |
} | |
} | |
public class GCInfoOptions | |
{ | |
// The failure threshold (in bytes) | |
public long Threshold { get; set; } = 1024L * 1024L * 1024L; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment