diff --git a/internal/trace/listener.go b/internal/trace/listener.go index 89f3417..401a931 100644 --- a/internal/trace/listener.go +++ b/internal/trace/listener.go @@ -55,8 +55,7 @@ var tracerInitialized = false // MakeListener initializes a new trace lambda Listener func MakeListener(config Config, extensionManager *extension.ExtensionManager) Listener { - - return Listener{ + l := Listener{ ddTraceEnabled: config.DDTraceEnabled, mergeXrayTraces: config.MergeXrayTraces, universalInstrumentation: config.UniversalInstrumentation, @@ -65,9 +64,40 @@ func MakeListener(config Config, extensionManager *extension.ExtensionManager) L traceContextExtractor: config.TraceContextExtractor, tracerOptions: config.TracerOptions, } + + if l.ddTraceEnabled && !tracerInitialized { + l.initTracer() + } + + return l +} + +func (l *Listener) initTracer() { + serviceName := os.Getenv("DD_SERVICE") + if serviceName == "" { + serviceName = "aws.lambda" + } + extensionNotRunning := !l.extensionManager.IsExtensionRunning() + opts := append([]tracer.StartOption{ + tracer.WithService(serviceName), + tracer.WithLambdaMode(extensionNotRunning), + tracer.WithGlobalTag("_dd.origin", "lambda"), + tracer.WithSendRetries(2), + }, l.tracerOptions...) + if l.otelTracerEnabled { + provider := ddotel.NewTracerProvider( + opts..., + ) + otel.SetTracerProvider(provider) + } else { + tracer.Start( + opts..., + ) + } + tracerInitialized = true } -// HandlerStarted sets up tracing and starts the function execution span if Datadog tracing is enabled +// HandlerStarted starts the function execution span if Datadog tracing is enabled func (l *Listener) HandlerStarted(ctx context.Context, msg json.RawMessage) context.Context { if !l.ddTraceEnabled { return ctx @@ -79,31 +109,6 @@ func (l *Listener) HandlerStarted(ctx context.Context, msg json.RawMessage) cont ctx, _ = contextWithRootTraceContext(ctx, msg, l.mergeXrayTraces, l.traceContextExtractor) - if !tracerInitialized { - serviceName := os.Getenv("DD_SERVICE") - if serviceName == "" { - serviceName = "aws.lambda" - } - extensionNotRunning := !l.extensionManager.IsExtensionRunning() - opts := append([]tracer.StartOption{ - tracer.WithService(serviceName), - tracer.WithLambdaMode(extensionNotRunning), - tracer.WithGlobalTag("_dd.origin", "lambda"), - tracer.WithSendRetries(2), - }, l.tracerOptions...) - if l.otelTracerEnabled { - provider := ddotel.NewTracerProvider( - opts..., - ) - otel.SetTracerProvider(provider) - } else { - tracer.Start( - opts..., - ) - } - tracerInitialized = true - } - isDdServerlessSpan := l.universalInstrumentation && l.extensionManager.IsExtensionRunning() functionExecutionSpan, ctx = startFunctionExecutionSpan(ctx, l.mergeXrayTraces, isDdServerlessSpan)