@@ -4,30 +4,44 @@ import OpenTelemetrySdk
44import OpenTelemetryProtocolExporterHttp
55
66class OTel {
7- let spanExporter : SpanExporter
8- let spanProcessor : SpanProcessor
9- let tracerProvider : TracerProviderSdk
7+ let tracerProvider : TracerProviderSdk ?
108 let tracer : Tracer
119
1210 static let shared = OTel ( )
1311
1412 init ( ) {
13+ tracerProvider = Self . initializeTracing ( )
14+ tracer = OpenTelemetry . instance. tracerProvider. get ( instrumentationName: " tart " , instrumentationVersion: CI . version)
15+ }
16+
17+ static func initializeTracing( ) -> TracerProviderSdk ? {
18+ guard let _ = ProcessInfo . processInfo. environment [ " TRACEPARENT " ] else {
19+ return nil
20+ }
21+
22+ let spanExporter : SpanExporter
1523 if let endpointRaw = ProcessInfo . processInfo. environment [ " OTEL_EXPORTER_OTLP_TRACES_ENDPOINT " ] ,
1624 let endpoint = URL ( string: endpointRaw) {
1725 spanExporter = OtlpHttpTraceExporter ( endpoint: endpoint)
1826 } else {
1927 spanExporter = OtlpHttpTraceExporter ( )
2028 }
21- spanProcessor = SimpleSpanProcessor ( spanExporter: spanExporter)
22- tracerProvider = TracerProviderBuilder ( ) . add ( spanProcessor: spanProcessor) . build ( )
29+ let spanProcessor = SimpleSpanProcessor ( spanExporter: spanExporter)
30+ let tracerProvider = TracerProviderBuilder ( ) . add ( spanProcessor: spanProcessor) . build ( )
31+
2332 OpenTelemetry . registerTracerProvider ( tracerProvider: tracerProvider)
2433
25- tracer = OpenTelemetry . instance . tracerProvider. get ( instrumentationName : " tart " , instrumentationVersion : CI . version )
34+ return tracerProvider
2635 }
2736
2837 func flush( ) {
2938 OpenTelemetry . instance. contextProvider. activeSpan? . end ( )
3039
40+ guard let tracerProvider else {
41+ // No tracing was initialized, so just ending a span is enough
42+ return
43+ }
44+
3145 tracerProvider. forceFlush ( )
3246
3347 // Work around OpenTelemtry not flushing traces after explicitly asking it to do so
0 commit comments