OpenTelemetry: only initialize tracing when TRACEPARENT env. var. is set

This commit is contained in:
Nikolay Edigaryev 2026-01-23 13:08:11 +01:00
parent 7038c45f8b
commit 08bb73ec02
1 changed files with 20 additions and 6 deletions

View File

@ -4,30 +4,44 @@ import OpenTelemetrySdk
import OpenTelemetryProtocolExporterHttp
class OTel {
let spanExporter: SpanExporter
let spanProcessor: SpanProcessor
let tracerProvider: TracerProviderSdk
let tracerProvider: TracerProviderSdk?
let tracer: Tracer
static let shared = OTel()
init() {
tracerProvider = Self.initializeTracing()
tracer = OpenTelemetry.instance.tracerProvider.get(instrumentationName: "tart", instrumentationVersion: CI.version)
}
static func initializeTracing() -> TracerProviderSdk? {
guard let _ = ProcessInfo.processInfo.environment["TRACEPARENT"] else {
return nil
}
let spanExporter: SpanExporter
if let endpointRaw = ProcessInfo.processInfo.environment["OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"],
let endpoint = URL(string: endpointRaw) {
spanExporter = OtlpHttpTraceExporter(endpoint: endpoint)
} else {
spanExporter = OtlpHttpTraceExporter()
}
spanProcessor = SimpleSpanProcessor(spanExporter: spanExporter)
tracerProvider = TracerProviderBuilder().add(spanProcessor: spanProcessor).build()
let spanProcessor = SimpleSpanProcessor(spanExporter: spanExporter)
let tracerProvider = TracerProviderBuilder().add(spanProcessor: spanProcessor).build()
OpenTelemetry.registerTracerProvider(tracerProvider: tracerProvider)
tracer = OpenTelemetry.instance.tracerProvider.get(instrumentationName: "tart", instrumentationVersion: CI.version)
return tracerProvider
}
func flush() {
OpenTelemetry.instance.contextProvider.activeSpan?.end()
guard let tracerProvider else {
// No tracing was initialized, so just ending a span is enough
return
}
tracerProvider.forceFlush()
// Work around OpenTelemtry not flushing traces after explicitly asking it to do so