From f7fbd464e716d8709e1894c33f82efb4027d787d Mon Sep 17 00:00:00 2001 From: Shreya Malpani Date: Fri, 23 Jan 2026 17:11:43 -0500 Subject: [PATCH 1/2] move tracer initialization to lambda init --- .../internal/trace/listener.go | 64 ++++++++++--------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/contrib/aws/datadog-lambda-go/internal/trace/listener.go b/contrib/aws/datadog-lambda-go/internal/trace/listener.go index be224412dc..1cc026438c 100644 --- a/contrib/aws/datadog-lambda-go/internal/trace/listener.go +++ b/contrib/aws/datadog-lambda-go/internal/trace/listener.go @@ -17,6 +17,7 @@ import ( "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/logger" "github.com/DataDog/dd-trace-go/v2/ddtrace" ddotel "github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ddtracer "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/aws/aws-lambda-go/lambdacontext" @@ -53,8 +54,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, @@ -63,9 +63,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 @@ -77,36 +108,11 @@ 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 = internal.Instr.ServiceName(instrumentation.ComponentDefault, instrumentation.OperationContext{}) - } - extensionNotRunning := !l.extensionManager.IsExtensionRunning() - opts := append([]ddtracer.StartOption{ - ddtracer.WithService(serviceName), - ddtracer.WithLambdaMode(extensionNotRunning), - ddtracer.WithGlobalTag("_dd.origin", "lambda"), - ddtracer.WithSendRetries(2), - }, l.tracerOptions...) - if l.otelTracerEnabled { - provider := ddotel.NewTracerProvider( - opts..., - ) - otel.SetTracerProvider(provider) - } else { - ddtracer.Start( - opts..., - ) - } - tracerInitialized = true - } - isDdServerlessSpan := l.universalInstrumentation && l.extensionManager.IsExtensionRunning() functionExecutionSpan, ctx = startFunctionExecutionSpan(ctx, l.mergeXrayTraces, isDdServerlessSpan) // Add the span to the context so the user can create child spans - ctx = ddtracer.ContextWithSpan(ctx, functionExecutionSpan) + ctx = tracer.ContextWithSpan(ctx, functionExecutionSpan) return ctx } From 4062818ac05298805280acc07343f4c045300876 Mon Sep 17 00:00:00 2001 From: Shreya Malpani Date: Fri, 23 Jan 2026 17:16:55 -0500 Subject: [PATCH 2/2] use ddtracer --- .../internal/trace/listener.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/contrib/aws/datadog-lambda-go/internal/trace/listener.go b/contrib/aws/datadog-lambda-go/internal/trace/listener.go index 1cc026438c..193479a17c 100644 --- a/contrib/aws/datadog-lambda-go/internal/trace/listener.go +++ b/contrib/aws/datadog-lambda-go/internal/trace/listener.go @@ -17,7 +17,6 @@ import ( "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/logger" "github.com/DataDog/dd-trace-go/v2/ddtrace" ddotel "github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry" - "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ddtracer "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/aws/aws-lambda-go/lambdacontext" @@ -74,14 +73,14 @@ func MakeListener(config Config, extensionManager *extension.ExtensionManager) L func (l *Listener) initTracer() { serviceName := os.Getenv("DD_SERVICE") if serviceName == "" { - serviceName = "aws.lambda" + serviceName = internal.Instr.ServiceName(instrumentation.ComponentDefault, instrumentation.OperationContext{}) } extensionNotRunning := !l.extensionManager.IsExtensionRunning() - opts := append([]tracer.StartOption{ - tracer.WithService(serviceName), - tracer.WithLambdaMode(extensionNotRunning), - tracer.WithGlobalTag("_dd.origin", "lambda"), - tracer.WithSendRetries(2), + opts := append([]ddtracer.StartOption{ + ddtracer.WithService(serviceName), + ddtracer.WithLambdaMode(extensionNotRunning), + ddtracer.WithGlobalTag("_dd.origin", "lambda"), + ddtracer.WithSendRetries(2), }, l.tracerOptions...) if l.otelTracerEnabled { provider := ddotel.NewTracerProvider( @@ -89,7 +88,7 @@ func (l *Listener) initTracer() { ) otel.SetTracerProvider(provider) } else { - tracer.Start( + ddtracer.Start( opts..., ) } @@ -112,7 +111,7 @@ func (l *Listener) HandlerStarted(ctx context.Context, msg json.RawMessage) cont functionExecutionSpan, ctx = startFunctionExecutionSpan(ctx, l.mergeXrayTraces, isDdServerlessSpan) // Add the span to the context so the user can create child spans - ctx = tracer.ContextWithSpan(ctx, functionExecutionSpan) + ctx = ddtracer.ContextWithSpan(ctx, functionExecutionSpan) return ctx }