private Dictionary <string, string> HealthData() { lock (_lock) { return(new Dictionary <string, string> { { "ReachableHosts", string.Join(",", ReachableHosts.Select(_ => _.HostName)) }, { "UnreachableHosts", string.Join(",", UnreachableHosts.Select(_ => _.HostName)) } }); } }
private ValueTask <HealthCheckResult> CheckHealth() { var config = GetConfig(); if (IsHealthCheckSuppressed(config)) { return(new ValueTask <HealthCheckResult>(HealthCheckResult.Healthy($"Health check suppressed because service was not in use for more than {config.SuppressHealthCheckAfterServiceUnused.TotalSeconds} seconds."))); } int reachableCount; int unreachableCount; Exception exception; string[] unreachableHosts; lock (_lock) { reachableCount = ReachableHosts.Count; unreachableHosts = UnreachableHosts.Select(x => $"{x.HostName}:{x.Port}").ToArray(); unreachableCount = unreachableHosts.Length; exception = UnreachableHosts.FirstOrDefault()?.LastException; } if (reachableCount == 0) { return(new ValueTask <HealthCheckResult>(HealthCheckResult.Unhealthy($"All of the {unreachableCount} hosts are unreachable: " + $"{string.Join(",", unreachableHosts)}. Last exception: {HealthMonitor.GetMessages(exception)}"))); } else { if (unreachableCount > 0) { return(new ValueTask <HealthCheckResult>(HealthCheckResult.Unhealthy($"The following {unreachableCount} hosts " + $"(out of {unreachableCount + reachableCount}) are unreachable: {string.Join(",", unreachableHosts)}. " + $"Last exception: {HealthMonitor.GetMessages(exception)}"))); } else { return(new ValueTask <HealthCheckResult>(HealthCheckResult.Healthy($"All {reachableCount} hosts are reachable."))); } } }