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" } }
+ ]
+ }
+}