feat(health): redesign health dashboard with 4-column layout and new metrics
New fields in SiteHealthReport: NodeHostname, DataConnectionEndpoints (primary/secondary), DataConnectionTagQuality (good/bad/uncertain), ParkedMessageCount. New collector methods to populate them. Health dashboard redesigned to match mockup: Nodes | Data Connections (with per-connection tag quality) | Instances + S&F Buffers | Error Counts + Parked Messages. Site names resolved from repository.
This commit is contained in:
@@ -15,8 +15,12 @@ public class SiteHealthCollector : ISiteHealthCollector
|
||||
private int _deadLetterCount;
|
||||
private readonly ConcurrentDictionary<string, ConnectionHealth> _connectionStatuses = new();
|
||||
private readonly ConcurrentDictionary<string, TagResolutionStatus> _tagResolutionCounts = new();
|
||||
private readonly ConcurrentDictionary<string, string> _connectionEndpoints = new();
|
||||
private readonly ConcurrentDictionary<string, TagQualityCounts> _tagQualityCounts = new();
|
||||
private IReadOnlyDictionary<string, int> _sfBufferDepths = new Dictionary<string, int>();
|
||||
private int _deployedInstanceCount, _enabledInstanceCount, _disabledInstanceCount;
|
||||
private int _parkedMessageCount;
|
||||
private volatile string _nodeHostname = "";
|
||||
private volatile bool _isActiveNode;
|
||||
|
||||
/// <summary>
|
||||
@@ -60,6 +64,8 @@ public class SiteHealthCollector : ISiteHealthCollector
|
||||
{
|
||||
_connectionStatuses.TryRemove(connectionName, out _);
|
||||
_tagResolutionCounts.TryRemove(connectionName, out _);
|
||||
_connectionEndpoints.TryRemove(connectionName, out _);
|
||||
_tagQualityCounts.TryRemove(connectionName, out _);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -71,6 +77,23 @@ public class SiteHealthCollector : ISiteHealthCollector
|
||||
_tagResolutionCounts[connectionName] = new TagResolutionStatus(totalSubscribed, successfullyResolved);
|
||||
}
|
||||
|
||||
public void UpdateConnectionEndpoint(string connectionName, string endpoint)
|
||||
{
|
||||
_connectionEndpoints[connectionName] = endpoint;
|
||||
}
|
||||
|
||||
public void UpdateTagQuality(string connectionName, int good, int bad, int uncertain)
|
||||
{
|
||||
_tagQualityCounts[connectionName] = new TagQualityCounts(good, bad, uncertain);
|
||||
}
|
||||
|
||||
public void SetParkedMessageCount(int count)
|
||||
{
|
||||
Interlocked.Exchange(ref _parkedMessageCount, count);
|
||||
}
|
||||
|
||||
public void SetNodeHostname(string hostname) => _nodeHostname = hostname;
|
||||
|
||||
/// <summary>
|
||||
/// Set the current store-and-forward buffer depths snapshot.
|
||||
/// Called before report collection with data from the S&F service.
|
||||
@@ -110,6 +133,8 @@ public class SiteHealthCollector : ISiteHealthCollector
|
||||
// Snapshot current connection and tag resolution state
|
||||
var connectionStatuses = new Dictionary<string, ConnectionHealth>(_connectionStatuses);
|
||||
var tagResolution = new Dictionary<string, TagResolutionStatus>(_tagResolutionCounts);
|
||||
var connectionEndpoints = new Dictionary<string, string>(_connectionEndpoints);
|
||||
var tagQuality = new Dictionary<string, TagQualityCounts>(_tagQualityCounts);
|
||||
|
||||
// Snapshot current S&F buffer depths
|
||||
var sfBufferDepths = new Dictionary<string, int>(_sfBufferDepths);
|
||||
@@ -130,6 +155,10 @@ public class SiteHealthCollector : ISiteHealthCollector
|
||||
DeployedInstanceCount: _deployedInstanceCount,
|
||||
EnabledInstanceCount: _enabledInstanceCount,
|
||||
DisabledInstanceCount: _disabledInstanceCount,
|
||||
NodeRole: nodeRole);
|
||||
NodeRole: nodeRole,
|
||||
NodeHostname: _nodeHostname,
|
||||
DataConnectionEndpoints: connectionEndpoints,
|
||||
DataConnectionTagQuality: tagQuality,
|
||||
ParkedMessageCount: Interlocked.CompareExchange(ref _parkedMessageCount, 0, 0));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user