From 7f74b660b3760f4396ce09fce6a003aec4c4faeb Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Mon, 23 Mar 2026 00:07:58 -0400 Subject: [PATCH] feat(lmxproxy): add delivered/dropped message counts to subscription stats Subscription metrics (totalDelivered, totalDropped) now visible in /api/status JSON and HTML dashboard. Card turns yellow if drops > 0. Aggregated from per-client counters in SubscriptionManager. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../Domain/SubscriptionStats.cs | 7 ++++++- .../ZB.MOM.WW.LmxProxy.Host/Status/StatusModels.cs | 2 ++ .../Status/StatusReportService.cs | 12 ++++++++++-- .../Subscriptions/SubscriptionManager.cs | 12 +++++++++++- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Domain/SubscriptionStats.cs b/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Domain/SubscriptionStats.cs index d679488..6c6626f 100644 --- a/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Domain/SubscriptionStats.cs +++ b/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Domain/SubscriptionStats.cs @@ -3,15 +3,20 @@ namespace ZB.MOM.WW.LmxProxy.Host.Domain /// Subscription statistics for monitoring. public class SubscriptionStats { - public SubscriptionStats(int totalClients, int totalTags, int activeSubscriptions) + public SubscriptionStats(int totalClients, int totalTags, int activeSubscriptions, + long totalDelivered = 0, long totalDropped = 0) { TotalClients = totalClients; TotalTags = totalTags; ActiveSubscriptions = activeSubscriptions; + TotalDelivered = totalDelivered; + TotalDropped = totalDropped; } public int TotalClients { get; } public int TotalTags { get; } public int ActiveSubscriptions { get; } + public long TotalDelivered { get; } + public long TotalDropped { get; } } } diff --git a/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Status/StatusModels.cs b/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Status/StatusModels.cs index 1a2a193..05b9db1 100644 --- a/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Status/StatusModels.cs +++ b/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Status/StatusModels.cs @@ -28,6 +28,8 @@ namespace ZB.MOM.WW.LmxProxy.Host.Status public int TotalClients { get; set; } public int TotalTags { get; set; } public int ActiveSubscriptions { get; set; } + public long TotalDelivered { get; set; } + public long TotalDropped { get; set; } } public class PerformanceStatus diff --git a/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Status/StatusReportService.cs b/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Status/StatusReportService.cs index d8c1ee3..10b3b25 100644 --- a/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Status/StatusReportService.cs +++ b/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Status/StatusReportService.cs @@ -96,7 +96,9 @@ namespace ZB.MOM.WW.LmxProxy.Host.Status { TotalClients = subStats.TotalClients, TotalTags = subStats.TotalTags, - ActiveSubscriptions = subStats.ActiveSubscriptions + ActiveSubscriptions = subStats.ActiveSubscriptions, + TotalDelivered = subStats.TotalDelivered, + TotalDropped = subStats.TotalDropped }; // Performance stats @@ -216,11 +218,17 @@ namespace ZB.MOM.WW.LmxProxy.Host.Status sb.AppendLine(" "); // Subscriptions card - sb.AppendLine("
"); + var subCardCss = statusData.Subscriptions.TotalDropped > 0 ? "card-yellow" : "card-green"; + sb.AppendLine($"
"); sb.AppendLine("

Subscriptions

"); sb.AppendLine($"

Clients: {statusData.Subscriptions.TotalClients}

"); sb.AppendLine($"

Tags: {statusData.Subscriptions.TotalTags}

"); sb.AppendLine($"

Active: {statusData.Subscriptions.ActiveSubscriptions}

"); + sb.AppendLine($"

Delivered: {statusData.Subscriptions.TotalDelivered:N0}

"); + if (statusData.Subscriptions.TotalDropped > 0) + { + sb.AppendLine($"

Dropped: {statusData.Subscriptions.TotalDropped:N0}

"); + } sb.AppendLine("
"); sb.AppendLine("
"); diff --git a/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Subscriptions/SubscriptionManager.cs b/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Subscriptions/SubscriptionManager.cs index 05e709a..bbcfb40 100644 --- a/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Subscriptions/SubscriptionManager.cs +++ b/lmxproxy/src/ZB.MOM.WW.LmxProxy.Host/Subscriptions/SubscriptionManager.cs @@ -242,10 +242,20 @@ namespace ZB.MOM.WW.LmxProxy.Host.Subscriptions /// Returns subscription statistics. public SubscriptionStats GetStats() { + long totalDelivered = 0; + long totalDropped = 0; + foreach (var kvp in _clientSubscriptions) + { + totalDelivered += kvp.Value.DeliveredCount; + totalDropped += kvp.Value.DroppedCount; + } + return new SubscriptionStats( _clientSubscriptions.Count, _tagSubscriptions.Count, - _clientSubscriptions.Values.Sum(c => c.Addresses.Count)); + _clientSubscriptions.Values.Sum(c => c.Addresses.Count), + totalDelivered, + totalDropped); } public void Dispose()