server(metrics): alarm provider mode gauge + provider switch counter (Task 13)

This commit is contained in:
Joseph Doherty
2026-06-13 09:18:11 -04:00
parent f113ca53a1
commit a46ce90e6f
2 changed files with 126 additions and 0 deletions
@@ -1,3 +1,4 @@
using System.Diagnostics.Metrics;
using ZB.MOM.WW.MxGateway.Server.Metrics;
namespace ZB.MOM.WW.MxGateway.Tests.Metrics;
@@ -63,6 +64,98 @@ public sealed class GatewayMetricsTests
Assert.Equal("depth", exception.ParamName);
}
/// <summary>
/// Verifies that <see cref="GatewayMetrics.AlarmProviderSwitched"/> increments
/// <c>mxgateway.alarms.provider_switches</c> by one with the expected from/to/reason tags.
/// The listener filters by the specific <see cref="System.Diagnostics.Metrics.Meter"/> instance
/// to avoid cross-talk between parallel tests (Tests-027).
/// </summary>
[Fact]
public void AlarmProviderSwitched_IncrementsCounterWithExpectedTags()
{
using GatewayMetrics metrics = new();
using MeterListener listener = new();
long capturedValue = 0;
string? capturedFrom = null;
string? capturedTo = null;
string? capturedReason = null;
listener.InstrumentPublished = (instrument, meterListener) =>
{
if (ReferenceEquals(instrument.Meter, metrics.Meter)
&& instrument.Name == "mxgateway.alarms.provider_switches")
{
meterListener.EnableMeasurementEvents(instrument);
}
};
listener.SetMeasurementEventCallback<long>(
(instrument, measurement, tags, _) =>
{
if (!ReferenceEquals(instrument.Meter, metrics.Meter)
|| instrument.Name != "mxgateway.alarms.provider_switches")
{
return;
}
capturedValue += measurement;
foreach (KeyValuePair<string, object?> tag in tags)
{
switch (tag.Key)
{
case "from": capturedFrom = tag.Value as string; break;
case "to": capturedTo = tag.Value as string; break;
case "reason": capturedReason = tag.Value as string; break;
}
}
});
listener.Start();
metrics.AlarmProviderSwitched(1, 2, "test");
Assert.Equal(1, capturedValue);
Assert.Equal("1", capturedFrom);
Assert.Equal("2", capturedTo);
Assert.Equal("test", capturedReason);
}
/// <summary>
/// Verifies that <see cref="GatewayMetrics.AlarmProviderSwitched"/> updates the
/// <c>mxgateway.alarms.provider_mode</c> observable gauge to the <paramref name="toMode"/> value.
/// </summary>
[Fact]
public void AlarmProviderSwitched_UpdatesProviderModeGauge()
{
using GatewayMetrics metrics = new();
using MeterListener listener = new();
int? capturedMode = null;
listener.InstrumentPublished = (instrument, meterListener) =>
{
if (ReferenceEquals(instrument.Meter, metrics.Meter)
&& instrument.Name == "mxgateway.alarms.provider_mode")
{
meterListener.EnableMeasurementEvents(instrument);
}
};
listener.SetMeasurementEventCallback<int>(
(instrument, measurement, _, _) =>
{
if (ReferenceEquals(instrument.Meter, metrics.Meter)
&& instrument.Name == "mxgateway.alarms.provider_mode")
{
capturedMode = measurement;
}
});
listener.Start();
metrics.AlarmProviderSwitched(1, 2, "test");
listener.RecordObservableInstruments();
Assert.Equal(2, capturedMode);
}
/// <summary>Verifies that removing session events only affects that session.</summary>
[Fact]
public void RemoveSessionEvents_RemovesOnlyThatSession()