88c557dee8
Fix 1 — symmetric OTLP trigger: ZbSerilogConfig.ApplyOpenTelemetryExport now activates only when options.Exporter == ZbExporter.Otlp, matching the core OTel metrics/traces path. The previous fallback that also triggered on a bare OtlpEndpoint is removed; OtlpEndpoint is the address to use when Otlp is selected, not an independent enable. Fix 2 — deterministic service.instance.id: ZbResource.InstanceId (MachineName:ProcessId) is a new public property that produces a stable, process-unique id without a random GUID. ZbResource.Configure passes autoGenerateServiceInstanceId:false + serviceInstanceId:InstanceId so metrics and traces never get a random auto-generated id. ZbSerilogConfig.BuildResourceAttributes adds service.instance.id from ZbResource.InstanceId so the Serilog OTLP log sink carries the exact same value — all three signals now share an identical resource for cross-signal joins. Tests: +2 in ZbResourceTests (InstanceId determinism, no-GUID check), +2 in RedactionTests (service.instance.id parity assertion in BuildResourceAttributes, symmetric OTLP trigger tests). Total: 9 + 14 = 23 tests, all green.