c4f97d0e87
Extend CommunicationOptionsValidator with eager bounds for the four T4 live-alarm-cache options (linger >= 0, reconcile > 0, seed concurrency 1..64, subscribers-per-site >= 1). Enforce the per-site viewer cap fail-safe in SiteAlarmLiveCacheService.Subscribe (reject excess viewers with a no-op disposable rather than growing the list or throwing into the Blazor render path). Surface two telemetry instruments on the existing ScadaBridgeTelemetry meter: an active-aggregator observable gauge and a reconnect counter, wired from the aggregator actor's PreStart/PostStop and its NodeA<->NodeB flip / reconcile-driven reopen. Claude-Session: https://claude.ai/code/session_01MtdgwpEeCUn6cUA5f1LMPj
36 lines
1.2 KiB
C#
36 lines
1.2 KiB
C#
using ZB.MOM.WW.ScadaBridge.Commons.Observability;
|
|
|
|
namespace ZB.MOM.WW.ScadaBridge.Host.Tests;
|
|
|
|
/// <summary>
|
|
/// Infrastructure-free guards for <see cref="ScadaBridgeTelemetry"/>: the meter name is the
|
|
/// stable value registered with OTel, and the emit helpers are safe to call (they are no-op
|
|
/// until follow-on tasks wire real emit points and a listener attaches).
|
|
/// </summary>
|
|
public class ScadaBridgeTelemetryTests
|
|
{
|
|
[Fact]
|
|
public void MeterName_IsStableValue()
|
|
{
|
|
Assert.Equal("ZB.MOM.WW.ScadaBridge", ScadaBridgeTelemetry.MeterName);
|
|
}
|
|
|
|
[Fact]
|
|
public void EmitHelpers_DoNotThrow()
|
|
{
|
|
var ex = Record.Exception(() =>
|
|
{
|
|
ScadaBridgeTelemetry.RecordDeploymentApplied();
|
|
ScadaBridgeTelemetry.RecordInboundApiRequest("X");
|
|
ScadaBridgeTelemetry.SiteConnectionOpened();
|
|
ScadaBridgeTelemetry.SiteConnectionClosed();
|
|
ScadaBridgeTelemetry.LiveAlarmAggregatorStarted();
|
|
ScadaBridgeTelemetry.LiveAlarmAggregatorStopped();
|
|
ScadaBridgeTelemetry.RecordLiveAlarmStreamReconnect();
|
|
ScadaBridgeTelemetry.SetQueueDepthProvider(() => 5);
|
|
});
|
|
|
|
Assert.Null(ex);
|
|
}
|
|
}
|