OpenTelemetry: only initialize tracing when TRACEPARENT env. var. is set (#1182)

This commit is contained in:
Nikolay Edigaryev 2026-01-23 14:57:53 +01:00 committed by GitHub
parent 7038c45f8b
commit e0147448a8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 20 additions and 6 deletions

View File

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