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.")));
                }
            }
        }