| File: ManualHealthCheckTracker.cs | Web Access |
| Project: src\src\Libraries\Microsoft.Extensions.Diagnostics.HealthChecks.Common\Microsoft.Extensions.Diagnostics.HealthChecks.Common.csproj (Microsoft.Extensions.Diagnostics.HealthChecks.Common) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Concurrent; using System.Text; using Microsoft.Extensions.ObjectPool; using Microsoft.Shared.Pools; namespace Microsoft.Extensions.Diagnostics.HealthChecks; internal sealed class ManualHealthCheckTracker { private static readonly HealthCheckResult _healthy = HealthCheckResult.Healthy(); private readonly ConcurrentDictionary<IManualHealthCheck, bool> _checks = new(); public void Register(IManualHealthCheck check) { _ = _checks.AddOrUpdate(check, true, (_, _) => true); } public void Unregister(IManualHealthCheck checkToRemove) { _ = _checks.TryRemove(checkToRemove, out _); } public HealthCheckResult GetHealthCheckResult() { // Construct string showing all reasons for unhealthy manual health checks StringBuilder? stringBuilder = null; try { var worstStatus = HealthStatus.Healthy; foreach (var checkPair in _checks) { var check = checkPair.Key.Result; if (check.Status != HealthStatus.Healthy) { stringBuilder = (stringBuilder == null) ? PoolFactory.SharedStringBuilderPool.Get() : stringBuilder.Append(", "); _ = stringBuilder.Append(check.Description); if (worstStatus > check.Status) { worstStatus = check.Status; } } } if (stringBuilder == null) { return _healthy; } return new HealthCheckResult(worstStatus, stringBuilder.ToString()); } finally { if (stringBuilder != null) { PoolFactory.SharedStringBuilderPool.Return(stringBuilder); } } } }