From 70af386b9400b14f09e3f3879ef3e4a668ee0388 Mon Sep 17 00:00:00 2001 From: Shreya Malpani Date: Thu, 22 Jan 2026 11:52:25 -0500 Subject: [PATCH 1/2] move tracer initialization to lambda init --- internal/trace/listener.go | 61 +++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/internal/trace/listener.go b/internal/trace/listener.go index 89f3417..e5e8aa9 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,6 +64,39 @@ func MakeListener(config Config, extensionManager *extension.ExtensionManager) L traceContextExtractor: config.TraceContextExtractor, tracerOptions: config.TracerOptions, } + + // Initialize tracer during Lambda init phase (only if tracing enabled) + if l.ddTraceEnabled && !tracerInitialized { + l.initTracer() + } + + return l +} + +// initTracer starts the Datadog tracer or OpenTelemetry provider +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 @@ -79,31 +111,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) From f413acaf44d8e5c1eff6bd122c7b169e1501e3ed Mon Sep 17 00:00:00 2001 From: Shreya Malpani Date: Fri, 23 Jan 2026 14:58:30 -0500 Subject: [PATCH 2/2] fix comments --- internal/trace/listener.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/internal/trace/listener.go b/internal/trace/listener.go index e5e8aa9..401a931 100644 --- a/internal/trace/listener.go +++ b/internal/trace/listener.go @@ -65,7 +65,6 @@ func MakeListener(config Config, extensionManager *extension.ExtensionManager) L tracerOptions: config.TracerOptions, } - // Initialize tracer during Lambda init phase (only if tracing enabled) if l.ddTraceEnabled && !tracerInitialized { l.initTracer() } @@ -73,7 +72,6 @@ func MakeListener(config Config, extensionManager *extension.ExtensionManager) L return l } -// initTracer starts the Datadog tracer or OpenTelemetry provider func (l *Listener) initTracer() { serviceName := os.Getenv("DD_SERVICE") if serviceName == "" { @@ -99,7 +97,7 @@ func (l *Listener) initTracer() { 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