using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using OpenTelemetry; using OpenTelemetry.Trace; using Shouldly; using Xunit; using ZB.MOM.WW.OtOpcUa.Cluster; using ZB.MOM.WW.OtOpcUa.Host.Observability; using ZB.MOM.WW.Telemetry; namespace ZB.MOM.WW.OtOpcUa.Host.IntegrationTests; /// /// scadaproj#55 — the OTel Resource carries site.id (the node's application Cluster id), /// node.role (its plain roles) and service.version (entry-assembly default), so two /// OtOpcUa nodes are distinguishable by more than service.instance.id. /// public sealed class ObservabilityResourceIdentityTests { private static IConfiguration EmptyConfig() => new ConfigurationBuilder().Build(); [Fact] public void FusedNode_ReportsClusterIdAndCanonicalRoles() { var roles = EffectiveRoles.Resolve(["driver", "cluster-SITE-A", "admin"], envRoles: null); var o = new ZbTelemetryOptions(); ObservabilityExtensions.ConfigureTelemetry(o, EmptyConfig(), roles); o.SiteId.ShouldBe("SITE-A"); o.NodeRole.ShouldBe("admin,driver"); o.ServiceVersion.ShouldBeNull(); // null = the library's entry-assembly default } [Fact] public void LegacyNodeWithoutClusterRole_OmitsSiteId() { var roles = EffectiveRoles.Resolve(["driver"], envRoles: null); var o = new ZbTelemetryOptions(); ObservabilityExtensions.ConfigureTelemetry(o, EmptyConfig(), roles); o.SiteId.ShouldBeNull(); o.NodeRole.ShouldBe("driver"); } [Fact] public void NoRoles_OmitsNodeRole() { ObservabilityExtensions.NodeRoleOf(EffectiveRoles.Resolve(null, null)).ShouldBeNull(); } [Fact] public void BuiltContainer_ResourceCarriesIdentityAndVersion() { var builder = WebApplication.CreateBuilder(new WebApplicationOptions { Args = [] }); builder.Services.AddOtOpcUaObservability( builder.Configuration, EffectiveRoles.Resolve(["admin", "driver", "cluster-MAIN"], null)); using var app = builder.Build(); var attributes = app.Services.GetRequiredService().GetResource().Attributes .ToDictionary(a => a.Key, a => a.Value); attributes["service.name"].ShouldBe("otopcua"); attributes["site.id"].ShouldBe("MAIN"); attributes["node.role"].ShouldBe("admin,driver"); attributes["service.version"].ShouldBe(ZbResource.DefaultServiceVersion); ((string)attributes["service.version"]).ShouldNotBeNullOrWhiteSpace(); } }