using ScadaLink.Commons.Types.Enums; namespace ScadaLink.Commons.Messages.Health; public record SiteHealthReport( string SiteId, long SequenceNumber, DateTimeOffset ReportTimestamp, IReadOnlyDictionary DataConnectionStatuses, IReadOnlyDictionary TagResolutionCounts, int ScriptErrorCount, int AlarmEvaluationErrorCount, IReadOnlyDictionary StoreAndForwardBufferDepths, int DeadLetterCount, int DeployedInstanceCount, int EnabledInstanceCount, int DisabledInstanceCount, string NodeRole = "Unknown", string NodeHostname = "", IReadOnlyDictionary? DataConnectionEndpoints = null, IReadOnlyDictionary? DataConnectionTagQuality = null, int ParkedMessageCount = 0, IReadOnlyList? ClusterNodes = null); /// /// Broadcast wrapper used between central nodes to keep per-node /// CentralHealthAggregator state in sync. ClusterClient load-balances each /// incoming SiteHealthReport to one central node; that node re-publishes /// this wrapper on a DistributedPubSub topic so the peer node's aggregator /// also processes the report (idempotently — sequence numbers guard against /// double-counting). /// public record SiteHealthReportReplica(SiteHealthReport Report);