diff --git a/src/ZB.MOM.WW.MxGateway.Server/Dashboard/DashboardSnapshotService.cs b/src/ZB.MOM.WW.MxGateway.Server/Dashboard/DashboardSnapshotService.cs
index 290879c..15852aa 100644
--- a/src/ZB.MOM.WW.MxGateway.Server/Dashboard/DashboardSnapshotService.cs
+++ b/src/ZB.MOM.WW.MxGateway.Server/Dashboard/DashboardSnapshotService.cs
@@ -195,6 +195,7 @@ public sealed class DashboardSnapshotService : IDashboardSnapshotService
new("mxgateway.workers.exited", snapshot.WorkerExits),
new("mxgateway.heartbeats.failed", snapshot.HeartbeatFailures),
new("mxgateway.grpc.streams.disconnected", snapshot.StreamDisconnects),
+ new("mxgateway.alarms.provider_switches", snapshot.AlarmProviderSwitchCount),
];
metrics.AddRange(snapshot.CommandFailuresByMethod
diff --git a/src/ZB.MOM.WW.MxGateway.Tests/Gateway/Dashboard/DashboardSnapshotServiceTests.cs b/src/ZB.MOM.WW.MxGateway.Tests/Gateway/Dashboard/DashboardSnapshotServiceTests.cs
index a50b374..a2e15ef 100644
--- a/src/ZB.MOM.WW.MxGateway.Tests/Gateway/Dashboard/DashboardSnapshotServiceTests.cs
+++ b/src/ZB.MOM.WW.MxGateway.Tests/Gateway/Dashboard/DashboardSnapshotServiceTests.cs
@@ -94,6 +94,24 @@ public sealed class DashboardSnapshotServiceTests
Assert.Equal("worker pipe disconnected", fault.Message);
}
+ ///
+ /// Verifies snapshot metrics include the cumulative alarm provider switch count.
+ ///
+ [Fact]
+ public void GetSnapshot_IncludesAlarmProviderSwitchCountMetric()
+ {
+ SessionRegistry registry = new();
+ using GatewayMetrics metrics = new();
+ metrics.AlarmProviderSwitched(1, 2, AlarmProviderSwitchReason.Failover);
+ DashboardSnapshotService service = CreateService(registry, metrics);
+
+ DashboardSnapshot snapshot = service.GetSnapshot();
+
+ Assert.Contains(
+ snapshot.Metrics,
+ metric => metric.Name == "mxgateway.alarms.provider_switches" && metric.Value == 1);
+ }
+
///
/// Verifies snapshot redacts sensitive values from client identity, session name, and fault messages.
///