diff --git a/Directory.Packages.props b/Directory.Packages.props index 95f12360..3cfe564c 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -99,6 +99,8 @@ + + diff --git a/NuGet.config b/NuGet.config index b7b4042e..10fb209a 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,6 +1,7 @@ + @@ -15,6 +16,8 @@ + + diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Host/Observability/ObservabilityExtensions.cs b/src/Server/ZB.MOM.WW.OtOpcUa.Host/Observability/ObservabilityExtensions.cs index be79d120..9257cdf6 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Host/Observability/ObservabilityExtensions.cs +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Host/Observability/ObservabilityExtensions.cs @@ -1,6 +1,5 @@ -using OpenTelemetry.Metrics; -using OpenTelemetry.Trace; using ZB.MOM.WW.OtOpcUa.Commons.Observability; +using ZB.MOM.WW.Telemetry; namespace ZB.MOM.WW.OtOpcUa.Host.Observability; @@ -17,14 +16,12 @@ public static class ObservabilityExtensions /// The service collection to add observability services to. public static IServiceCollection AddOtOpcUaObservability(this IServiceCollection services) { - services.AddOpenTelemetry() - .WithMetrics(b => b - .AddMeter(OtOpcUaTelemetry.MeterName) - .AddPrometheusExporter()) - .WithTracing(b => b - .AddSource(OtOpcUaTelemetry.ActivitySourceName)); - - return services; + return services.AddZbTelemetry(o => + { + o.ServiceName = "otopcua"; + o.Meters = [OtOpcUaTelemetry.MeterName]; + o.ActivitySources = [OtOpcUaTelemetry.ActivitySourceName]; + }); } /// @@ -35,7 +32,7 @@ public static class ObservabilityExtensions /// The endpoint route builder. public static IEndpointRouteBuilder MapOtOpcUaMetrics(this IEndpointRouteBuilder app) { - app.MapPrometheusScrapingEndpoint("/metrics"); + app.MapZbMetrics(); return app; } } diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Host/Program.cs b/src/Server/ZB.MOM.WW.OtOpcUa.Host/Program.cs index 4a9dd50c..9ae0abb7 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Host/Program.cs +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Host/Program.cs @@ -20,6 +20,7 @@ using ZB.MOM.WW.OtOpcUa.Runtime; using ZB.MOM.WW.OtOpcUa.Security; using ZB.MOM.WW.OtOpcUa.Security.Endpoints; using ZB.MOM.WW.OtOpcUa.Security.Ldap; +using ZB.MOM.WW.Telemetry.Serilog; // Roles drive the entire conditional wiring below — see ZB.MOM.WW.OtOpcUa.Cluster.RoleParser. var roles = RoleParser.Parse(Environment.GetEnvironmentVariable("OTOPCUA_ROLES")); @@ -45,11 +46,10 @@ var roleSuffix = roles.Length == 0 ? null : string.Join('-', roles.OrderBy(r => if (roleSuffix is not null) builder.Configuration.AddJsonFile($"appsettings.{roleSuffix}.json", optional: true, reloadOnChange: true); -// Serilog — rolling daily file sink per CLAUDE.md. Console for local dev. -builder.Host.UseSerilog((ctx, lc) => lc - .ReadFrom.Configuration(ctx.Configuration) - .WriteTo.Console() - .WriteTo.File("logs/otopcua-.log", rollingInterval: RollingInterval.Day)); +// Serilog — shared ZB.MOM.WW.Telemetry bootstrap. Sinks (Console + rolling daily file) +// now live in appsettings.json (ReadFrom.Configuration); AddZbSerilog layers in the +// shared NodeHostname / TraceContext / Redaction enrichers and trace correlation. +builder.AddZbSerilog(o => o.ServiceName = "otopcua"); // Windows-service registration is handled at install time by scripts/install/Install-Services.ps1 // (Task 62) rather than in-process, so the binary stays cross-platform-compilable. diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Host/ZB.MOM.WW.OtOpcUa.Host.csproj b/src/Server/ZB.MOM.WW.OtOpcUa.Host/ZB.MOM.WW.OtOpcUa.Host.csproj index 667dd36a..9317e6c4 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Host/ZB.MOM.WW.OtOpcUa.Host.csproj +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Host/ZB.MOM.WW.OtOpcUa.Host.csproj @@ -30,6 +30,8 @@ + + diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Host/appsettings.json b/src/Server/ZB.MOM.WW.OtOpcUa.Host/appsettings.json index 0967ef42..ec8ed457 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Host/appsettings.json +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Host/appsettings.json @@ -1 +1,9 @@ -{} +{ + "Serilog": { + "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ], + "WriteTo": [ + { "Name": "Console" }, + { "Name": "File", "Args": { "path": "logs/otopcua-.log", "rollingInterval": "Day" } } + ] + } +}