using Akka.Actor; using Akka.Cluster; using Microsoft.Extensions.Diagnostics.HealthChecks; namespace ZB.MOM.WW.OtOpcUa.Host.Health; public sealed class AkkaClusterHealthCheck : IHealthCheck { private readonly ActorSystem _system; /// /// Initializes a new instance of the AkkaClusterHealthCheck class. /// /// The Akka actor system to check cluster health for. public AkkaClusterHealthCheck(ActorSystem system) { _system = system; } /// /// Checks the health of the Akka cluster asynchronously. /// /// The health check context. /// Cancellation token. public Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) { var cluster = Akka.Cluster.Cluster.Get(_system); var selfUp = cluster.State.Members.Any(m => m.Address == cluster.SelfAddress && m.Status == MemberStatus.Up); return Task.FromResult(selfUp ? HealthCheckResult.Healthy($"Self Up; {cluster.State.Members.Count} member(s)") : HealthCheckResult.Degraded("Self not yet Up in cluster")); } }