Skip to content

Commit 3b68fd0

Browse files
committed
Support disabling all manual OTel X-Ray setup
In case I ever want to do auto-instrumentation on Lambda in the future.
1 parent e37d908 commit 3b68fd0

2 files changed

Lines changed: 21 additions & 25 deletions

File tree

CloudFormation.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ Resources:
7373
DYNAMODB_TABLE: !Ref GroupsTable
7474
SLACK_TOKEN_SSM_NAME: !Sub '/${SlackTokenSSMName}'
7575
SLACK_TOKEN_SSM_TTL: !Ref SlackTokenSSMTTL
76-
AWS_XRAY_TRACING_ENABLED: !If [HasXRayTracingEnabled, '1', !Ref AWS::NoValue]
76+
AWS_XRAY_TRACER_PROVIDER_ENABLED: !If [HasXRayTracingEnabled, '1', !Ref AWS::NoValue]
7777
AWS_CLIENT_EMBEDDED_TLS_ROOTS: !If [HasAWSClientEmbeddedTLSRoots, '1', !Ref AWS::NoValue]
7878
FunctionUrlConfig:
7979
AuthType: NONE

cmd/randomizer-lambda/main.go

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,19 @@ func main() {
5151
os.Exit(2)
5252
}
5353

54-
// OpenTelemetry is always active, but traces are only exported to AWS X-Ray
55-
// (and charged for usage) if enabled in the environment.
56-
tp := initTracerProvider(ctx, logger)
57-
otel.SetTracerProvider(tp)
58-
if xrayTracingEnabled {
54+
var otellambdaOptions []otellambda.Option
55+
if xrayTracerProviderEnabled {
56+
tp := initXRayTracerProvider(ctx, logger)
57+
otel.SetTracerProvider(tp)
5958
otel.SetTextMapPropagator(xraypropagator.Propagator{})
59+
otellambdaOptions = xrayconfig.WithRecommendedOptions(tp)
60+
defer func() {
61+
err := tp.Shutdown(ctx)
62+
if err != nil {
63+
logger.Warn("Failed to shut down tracer provider", "err", err)
64+
}
65+
}()
6066
}
61-
defer func() {
62-
err := tp.Shutdown(ctx)
63-
if err != nil {
64-
logger.Warn("Failed to shut down tracer provider", "err", err)
65-
}
66-
}()
6767

6868
app := slack.App{
6969
TokenProvider: tokenProvider,
@@ -72,19 +72,19 @@ func main() {
7272
}
7373
httpHandler := otelhttp.NewHandler(app, "/")
7474
adapterHandler := httpadapter.NewV2(httpHandler).ProxyWithContext
75-
parentHandler := otellambda.InstrumentHandler(adapterHandler, xrayconfig.WithRecommendedOptions(tp)...)
75+
parentHandler := otellambda.InstrumentHandler(adapterHandler, otellambdaOptions...)
7676
lambda.Start(parentHandler)
7777
}
7878

79-
var xrayTracingEnabled = os.Getenv("AWS_XRAY_TRACING_ENABLED") == "1"
79+
// xrayTracerProviderEnabled indicates whether we should manually configure
80+
// OpenTelemetry to export spans to Lambda's X-Ray UDP collector. This could be
81+
// disabled if we don't want X-Ray tracing at all, or if we're configuring the
82+
// Auto SDK via eBPF (e.g. ADOT Lambda layers).
83+
var xrayTracerProviderEnabled = os.Getenv("AWS_XRAY_TRACER_PROVIDER_ENABLED") == "1"
8084

81-
func initTracerProvider(ctx context.Context, logger *slog.Logger) *trace.TracerProvider {
82-
traceResource := initTraceResource(ctx, logger)
83-
tp := trace.NewTracerProvider(trace.WithResource(traceResource))
84-
85-
if !xrayTracingEnabled {
86-
return tp
87-
}
85+
func initXRayTracerProvider(ctx context.Context, logger *slog.Logger) *trace.TracerProvider {
86+
tp := trace.NewTracerProvider(
87+
trace.WithResource(initTraceResource(ctx, logger)))
8888

8989
exporter, err := xrayudp.NewSpanExporter(ctx)
9090
if err != nil {
@@ -101,10 +101,6 @@ func initTraceResource(ctx context.Context, logger *slog.Logger) *resource.Resou
101101
semconv.SchemaURL,
102102
semconv.ServiceName(os.Getenv("AWS_LAMBDA_FUNCTION_NAME")))
103103

104-
if !xrayTracingEnabled {
105-
return baseResource
106-
}
107-
108104
lambdaResource, err := lambdadetector.NewResourceDetector().Detect(ctx)
109105
if err != nil {
110106
logger.Warn("Skipping Lambda resources in traces", "err", err, "step", "detect")

0 commit comments

Comments
 (0)