Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7b6884031d | |||
| 7ff7a60ae0 | |||
| 8faa2bf23d | |||
| 2099713ed8 | |||
| c05ffc7b39 | |||
| 60017177cb | |||
| 26bae36f8b | |||
| 368390ea9d | |||
| 8f950722c6 |
@@ -79,11 +79,11 @@
|
|||||||
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.15.3" />
|
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.15.3" />
|
||||||
<PackageVersion Include="Polly.Core" Version="8.6.6" />
|
<PackageVersion Include="Polly.Core" Version="8.6.6" />
|
||||||
<PackageVersion Include="S7netplus" Version="0.20.0" />
|
<PackageVersion Include="S7netplus" Version="0.20.0" />
|
||||||
<PackageVersion Include="Serilog" Version="4.3.0" />
|
<PackageVersion Include="Serilog" Version="4.3.1" />
|
||||||
<PackageVersion Include="Serilog.AspNetCore" Version="9.0.0" />
|
<PackageVersion Include="Serilog.AspNetCore" Version="10.0.0" />
|
||||||
<PackageVersion Include="Serilog.Extensions.Hosting" Version="9.0.0" />
|
<PackageVersion Include="Serilog.Extensions.Hosting" Version="10.0.0" />
|
||||||
<PackageVersion Include="Serilog.Formatting.Compact" Version="3.0.0" />
|
<PackageVersion Include="Serilog.Formatting.Compact" Version="3.0.0" />
|
||||||
<PackageVersion Include="Serilog.Settings.Configuration" Version="9.0.0" />
|
<PackageVersion Include="Serilog.Settings.Configuration" Version="10.0.0" />
|
||||||
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
|
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
|
||||||
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
|
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
|
||||||
<PackageVersion Include="Shouldly" Version="4.3.0" />
|
<PackageVersion Include="Shouldly" Version="4.3.0" />
|
||||||
@@ -99,6 +99,8 @@
|
|||||||
<PackageVersion Include="ZB.MOM.WW.Health" Version="0.1.0" />
|
<PackageVersion Include="ZB.MOM.WW.Health" Version="0.1.0" />
|
||||||
<PackageVersion Include="ZB.MOM.WW.Health.Akka" Version="0.1.0" />
|
<PackageVersion Include="ZB.MOM.WW.Health.Akka" Version="0.1.0" />
|
||||||
<PackageVersion Include="ZB.MOM.WW.Health.EntityFrameworkCore" Version="0.1.0" />
|
<PackageVersion Include="ZB.MOM.WW.Health.EntityFrameworkCore" Version="0.1.0" />
|
||||||
|
<PackageVersion Include="ZB.MOM.WW.Telemetry" Version="0.1.0" />
|
||||||
|
<PackageVersion Include="ZB.MOM.WW.Telemetry.Serilog" Version="0.1.0" />
|
||||||
<PackageVersion Include="ZB.MOM.WW.MxGateway.Client" Version="0.1.0" />
|
<PackageVersion Include="ZB.MOM.WW.MxGateway.Client" Version="0.1.0" />
|
||||||
<PackageVersion Include="ZB.MOM.WW.MxGateway.Contracts" Version="0.1.0" />
|
<PackageVersion Include="ZB.MOM.WW.MxGateway.Contracts" Version="0.1.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<packageSources>
|
<packageSources>
|
||||||
|
<clear />
|
||||||
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
|
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
|
||||||
<add key="local-mxgw" value="./nuget-packages" />
|
<add key="local-mxgw" value="./nuget-packages" />
|
||||||
<add key="dohertj2-gitea" value="https://gitea.dohertylan.com/api/packages/dohertj2/nuget/index.json" />
|
<add key="dohertj2-gitea" value="https://gitea.dohertylan.com/api/packages/dohertj2/nuget/index.json" />
|
||||||
@@ -15,6 +16,8 @@
|
|||||||
<packageSource key="dohertj2-gitea">
|
<packageSource key="dohertj2-gitea">
|
||||||
<package pattern="ZB.MOM.WW.Health" />
|
<package pattern="ZB.MOM.WW.Health" />
|
||||||
<package pattern="ZB.MOM.WW.Health.*" />
|
<package pattern="ZB.MOM.WW.Health.*" />
|
||||||
|
<package pattern="ZB.MOM.WW.Telemetry" />
|
||||||
|
<package pattern="ZB.MOM.WW.Telemetry.*" />
|
||||||
</packageSource>
|
</packageSource>
|
||||||
</packageSourceMapping>
|
</packageSourceMapping>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using OpenTelemetry.Metrics;
|
using Microsoft.Extensions.Configuration;
|
||||||
using OpenTelemetry.Trace;
|
|
||||||
using ZB.MOM.WW.OtOpcUa.Commons.Observability;
|
using ZB.MOM.WW.OtOpcUa.Commons.Observability;
|
||||||
|
using ZB.MOM.WW.Telemetry;
|
||||||
|
|
||||||
namespace ZB.MOM.WW.OtOpcUa.Host.Observability;
|
namespace ZB.MOM.WW.OtOpcUa.Host.Observability;
|
||||||
|
|
||||||
@@ -15,16 +15,25 @@ public static class ObservabilityExtensions
|
|||||||
{
|
{
|
||||||
/// <summary>Adds OtOpcUa observability (metrics and tracing) to the service collection.</summary>
|
/// <summary>Adds OtOpcUa observability (metrics and tracing) to the service collection.</summary>
|
||||||
/// <param name="services">The service collection to add observability services to.</param>
|
/// <param name="services">The service collection to add observability services to.</param>
|
||||||
public static IServiceCollection AddOtOpcUaObservability(this IServiceCollection services)
|
/// <param name="configuration">
|
||||||
|
/// Configuration read for the opt-in OTLP exporter. <c>OtOpcUa:Telemetry:Exporter</c>
|
||||||
|
/// (parsed case-insensitively to <see cref="ZbExporter"/>) switches to OTLP when set to
|
||||||
|
/// <c>Otlp</c>; <c>OtOpcUa:Telemetry:OtlpEndpoint</c> sets the OTLP endpoint. With no
|
||||||
|
/// config the exporter stays Prometheus (the default).
|
||||||
|
/// </param>
|
||||||
|
public static IServiceCollection AddOtOpcUaObservability(this IServiceCollection services, IConfiguration configuration)
|
||||||
{
|
{
|
||||||
services.AddOpenTelemetry()
|
return services.AddZbTelemetry(o =>
|
||||||
.WithMetrics(b => b
|
{
|
||||||
.AddMeter(OtOpcUaTelemetry.MeterName)
|
o.ServiceName = "otopcua";
|
||||||
.AddPrometheusExporter())
|
o.Meters = [OtOpcUaTelemetry.MeterName];
|
||||||
.WithTracing(b => b
|
o.ActivitySources = [OtOpcUaTelemetry.ActivitySourceName];
|
||||||
.AddSource(OtOpcUaTelemetry.ActivitySourceName));
|
if (Enum.TryParse<ZbExporter>(configuration["OtOpcUa:Telemetry:Exporter"], ignoreCase: true, out var exporter))
|
||||||
|
o.Exporter = exporter;
|
||||||
return services;
|
var otlp = configuration["OtOpcUa:Telemetry:OtlpEndpoint"];
|
||||||
|
if (!string.IsNullOrWhiteSpace(otlp))
|
||||||
|
o.OtlpEndpoint = otlp;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -35,7 +44,7 @@ public static class ObservabilityExtensions
|
|||||||
/// <param name="app">The endpoint route builder.</param>
|
/// <param name="app">The endpoint route builder.</param>
|
||||||
public static IEndpointRouteBuilder MapOtOpcUaMetrics(this IEndpointRouteBuilder app)
|
public static IEndpointRouteBuilder MapOtOpcUaMetrics(this IEndpointRouteBuilder app)
|
||||||
{
|
{
|
||||||
app.MapPrometheusScrapingEndpoint("/metrics");
|
app.MapZbMetrics();
|
||||||
return app;
|
return app;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ using ZB.MOM.WW.OtOpcUa.Runtime;
|
|||||||
using ZB.MOM.WW.OtOpcUa.Security;
|
using ZB.MOM.WW.OtOpcUa.Security;
|
||||||
using ZB.MOM.WW.OtOpcUa.Security.Endpoints;
|
using ZB.MOM.WW.OtOpcUa.Security.Endpoints;
|
||||||
using ZB.MOM.WW.OtOpcUa.Security.Ldap;
|
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.
|
// Roles drive the entire conditional wiring below — see ZB.MOM.WW.OtOpcUa.Cluster.RoleParser.
|
||||||
var roles = RoleParser.Parse(Environment.GetEnvironmentVariable("OTOPCUA_ROLES"));
|
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)
|
if (roleSuffix is not null)
|
||||||
builder.Configuration.AddJsonFile($"appsettings.{roleSuffix}.json", optional: true, reloadOnChange: true);
|
builder.Configuration.AddJsonFile($"appsettings.{roleSuffix}.json", optional: true, reloadOnChange: true);
|
||||||
|
|
||||||
// Serilog — rolling daily file sink per CLAUDE.md. Console for local dev.
|
// Serilog — shared ZB.MOM.WW.Telemetry bootstrap. Sinks (Console + rolling daily file)
|
||||||
builder.Host.UseSerilog((ctx, lc) => lc
|
// now live in appsettings.json (ReadFrom.Configuration); AddZbSerilog layers in the
|
||||||
.ReadFrom.Configuration(ctx.Configuration)
|
// shared NodeHostname / TraceContext / Redaction enrichers and trace correlation.
|
||||||
.WriteTo.Console()
|
builder.AddZbSerilog(o => o.ServiceName = "otopcua");
|
||||||
.WriteTo.File("logs/otopcua-.log", rollingInterval: RollingInterval.Day));
|
|
||||||
|
|
||||||
// Windows-service registration is handled at install time by scripts/install/Install-Services.ps1
|
// 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.
|
// (Task 62) rather than in-process, so the binary stays cross-platform-compilable.
|
||||||
@@ -135,7 +135,7 @@ if (hasAdmin)
|
|||||||
}
|
}
|
||||||
|
|
||||||
builder.Services.AddOtOpcUaHealth();
|
builder.Services.AddOtOpcUaHealth();
|
||||||
builder.Services.AddOtOpcUaObservability();
|
builder.Services.AddOtOpcUaObservability(builder.Configuration);
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
app.UseSerilogRequestLogging();
|
app.UseSerilogRequestLogging();
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
<PackageReference Include="ZB.MOM.WW.Health" />
|
<PackageReference Include="ZB.MOM.WW.Health" />
|
||||||
<PackageReference Include="ZB.MOM.WW.Health.Akka" />
|
<PackageReference Include="ZB.MOM.WW.Health.Akka" />
|
||||||
<PackageReference Include="ZB.MOM.WW.Health.EntityFrameworkCore" />
|
<PackageReference Include="ZB.MOM.WW.Health.EntityFrameworkCore" />
|
||||||
|
<PackageReference Include="ZB.MOM.WW.Telemetry" />
|
||||||
|
<PackageReference Include="ZB.MOM.WW.Telemetry.Serilog" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -1 +1,9 @@
|
|||||||
{}
|
{
|
||||||
|
"Serilog": {
|
||||||
|
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
|
||||||
|
"WriteTo": [
|
||||||
|
{ "Name": "Console" },
|
||||||
|
{ "Name": "File", "Args": { "path": "logs/otopcua-.log", "rollingInterval": "Day" } }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user