LocalDb adoption Phase 1 + 2: consolidate the site database, delete the bespoke replicators #23
@@ -27,6 +27,24 @@ namespace ZB.MOM.WW.ScadaBridge.Host;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class SiteServiceRegistration
|
public static class SiteServiceRegistration
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Every <see cref="System.Diagnostics.Metrics.Meter"/> OpenTelemetry is told to observe.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// <c>ZbTelemetryOptions.Meters</c> is an ALLOWLIST, and an unlisted meter's instruments
|
||||||
|
/// are simply never observed — no error, no warning, no missing-metric signal anywhere.
|
||||||
|
/// The LocalDb replication meter was silently absent from the rig's <c>/metrics</c>
|
||||||
|
/// scrape until the Phase 1 live gate went looking for it (the plan had assumed it
|
||||||
|
/// flowed through automatically). Hoisted to a named constant so the list is
|
||||||
|
/// assertable; adding a meter anywhere in the product means adding it here.
|
||||||
|
/// </remarks>
|
||||||
|
public static readonly string[] ObservedMeters =
|
||||||
|
[
|
||||||
|
ScadaBridgeTelemetry.MeterName,
|
||||||
|
// Emitted only on site nodes; harmless on central, which never records against it.
|
||||||
|
LocalDbMetrics.MeterName,
|
||||||
|
];
|
||||||
|
|
||||||
/// <summary>Registers all DI services required for the site role.</summary>
|
/// <summary>Registers all DI services required for the site role.</summary>
|
||||||
/// <param name="services">The service collection to register into.</param>
|
/// <param name="services">The service collection to register into.</param>
|
||||||
/// <param name="config">Application configuration for options binding.</param>
|
/// <param name="config">Application configuration for options binding.</param>
|
||||||
@@ -262,7 +280,7 @@ public static class SiteServiceRegistration
|
|||||||
o.ServiceName = "scadabridge";
|
o.ServiceName = "scadabridge";
|
||||||
o.SiteId = config["ScadaBridge:Node:SiteId"] ?? "central";
|
o.SiteId = config["ScadaBridge:Node:SiteId"] ?? "central";
|
||||||
o.NodeRole = config["ScadaBridge:Node:Role"];
|
o.NodeRole = config["ScadaBridge:Node:Role"];
|
||||||
o.Meters = [ScadaBridgeTelemetry.MeterName];
|
o.Meters = ObservedMeters;
|
||||||
if (Enum.TryParse<ZbExporter>(config["ScadaBridge:Telemetry:Exporter"], ignoreCase: true, out var exporter))
|
if (Enum.TryParse<ZbExporter>(config["ScadaBridge:Telemetry:Exporter"], ignoreCase: true, out var exporter))
|
||||||
o.Exporter = exporter;
|
o.Exporter = exporter;
|
||||||
var otlp = config["ScadaBridge:Telemetry:OtlpEndpoint"];
|
var otlp = config["ScadaBridge:Telemetry:OtlpEndpoint"];
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ using Microsoft.Extensions.Configuration;
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using Microsoft.Extensions.Logging.Abstractions;
|
using Microsoft.Extensions.Logging.Abstractions;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
using ZB.MOM.WW.ScadaBridge.HealthMonitoring;
|
using ZB.MOM.WW.ScadaBridge.HealthMonitoring;
|
||||||
|
using ZB.MOM.WW.Telemetry;
|
||||||
using ZB.MOM.WW.LocalDb;
|
using ZB.MOM.WW.LocalDb;
|
||||||
using ZB.MOM.WW.LocalDb.Replication;
|
using ZB.MOM.WW.LocalDb.Replication;
|
||||||
using ZB.MOM.WW.ScadaBridge.Host;
|
using ZB.MOM.WW.ScadaBridge.Host;
|
||||||
@@ -196,6 +198,23 @@ public class SiteLocalDbWiringTests : IDisposable
|
|||||||
Assert.Null(report.LocalDbOplogBacklog);
|
Assert.Null(report.LocalDbOplogBacklog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Site_Telemetry_Allowlists_TheLocalDbReplicationMeter()
|
||||||
|
{
|
||||||
|
// ZbTelemetryOptions.Meters is an ALLOWLIST: an unlisted Meter's instruments are
|
||||||
|
// never observed, with no error and no missing-metric warning anywhere. The
|
||||||
|
// replication meter was silently absent from the rig's /metrics scrape until the
|
||||||
|
// live gate looked for it, so pin the allowlist rather than trusting the next
|
||||||
|
// reader to remember.
|
||||||
|
//
|
||||||
|
// This asserts on the allowlist constant, not on OTel's observed-meter set:
|
||||||
|
// AddZbTelemetry applies its options to a local instance and never registers
|
||||||
|
// IOptions, so there is nothing resolvable to interrogate. The end-to-end proof
|
||||||
|
// that localdb_* actually reaches /metrics is the Task 12 live gate; this test
|
||||||
|
// exists to stop the entry being dropped again.
|
||||||
|
Assert.Contains(LocalDbMetrics.MeterName, SiteServiceRegistration.ObservedMeters);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Site_LocalDb_CreatesTheConfiguredFile()
|
public void Site_LocalDb_CreatesTheConfiguredFile()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user