Skip to content

Commit 353dde6

Browse files
committed
Add DD_TRACE_ENABLED and DD_MERGE_XRAY_TRACES options
1 parent c32bdec commit 353dde6

File tree

4 files changed

+50
-84
lines changed

4 files changed

+50
-84
lines changed

Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ WORKDIR /build
1010
# Install datadog_lambda and dependencies from local
1111
COPY . .
1212
RUN pip install . -t ./python/lib/$runtime/site-packages
13+
RUN pip install --find-links=https://s3.amazonaws.com/pypi.datadoghq.com/trace-dev/index.html ddtrace==0.35.1.dev5+g1e11b2dd -t ./python/lib/$runtime/site-packages
1314

1415
# Remove *.pyc files
1516
RUN find ./python/lib/$runtime/site-packages -name \*.pyc -delete

datadog_lambda/trace_wrapper.py

Lines changed: 0 additions & 66 deletions
This file was deleted.

datadog_lambda/tracing.py

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,25 @@
44
# Copyright 2019 Datadog, Inc.
55

66
import logging
7+
import os
78

89
from aws_xray_sdk.core import xray_recorder
910
from aws_xray_sdk.core.lambda_launcher import LambdaContext
1011

11-
from ddtrace import patch, tracer
1212
from datadog_lambda.constants import (
1313
SamplingPriority,
1414
TraceHeader,
1515
XraySubsegment,
1616
Source,
1717
)
18-
from datadog_lambda.trace_wrapper import trace_wrapper
18+
from ddtrace import tracer, patch
1919

2020
logger = logging.getLogger(__name__)
2121

2222
dd_trace_context = {}
23+
dd_native_tracing_enabled = (
24+
os.environ.get("DD_TRACE_ENABLED", "false").lower() == "true"
25+
)
2326

2427

2528
def _convert_xray_trace_id(xray_trace_id):
@@ -60,11 +63,26 @@ def _get_xray_trace_context():
6063
}
6164

6265

66+
def _get_dd_trace_native_context():
67+
span = tracer.current_span()
68+
if not span:
69+
return None
70+
71+
parent_id = span.context.span_id
72+
trace_id = span.context.trace_id
73+
return {
74+
"parent_id": str(parent_id),
75+
"trace_id": str(trace_id),
76+
"sampling_priority": SamplingPriority.AUTO_KEEP,
77+
"source": Source.DDTRACE,
78+
}
79+
80+
6381
def _context_obj_to_headers(obj):
6482
return {
65-
TraceHeader.TRACE_ID: str(obj.get("trace_id")),
66-
TraceHeader.PARENT_ID: str(obj.get("parent_id")),
67-
TraceHeader.SAMPLING_PRIORITY: str(obj.get("sampling_priority")),
83+
TraceHeader.TRACE_ID: str(obj.get("trace-id")),
84+
TraceHeader.PARENT_ID: str(obj.get("parent-id")),
85+
TraceHeader.SAMPLING_PRIORITY: str(obj.get("sampling-priority")),
6886
}
6987

7088

@@ -122,10 +140,11 @@ def get_dd_trace_context():
122140
"""
123141
global dd_trace_context
124142

125-
native_trace_context = trace_wrapper.trace_context
126-
if native_trace_context:
127-
logger.info("get_dd_trace_context using dd-trace context")
128-
return _context_obj_to_headers(native_trace_context)
143+
if dd_native_tracing_enabled:
144+
native_trace_context = _get_dd_trace_native_context()
145+
if native_trace_context is not None:
146+
logger.info("get_dd_trace_context using dd-trace context")
147+
return _context_obj_to_headers(native_trace_context)
129148

130149
try:
131150
trace_headers = _context_obj_to_headers(dd_trace_context)
@@ -155,6 +174,9 @@ def set_correlation_ids():
155174
if not is_lambda_context():
156175
logger.debug("set_correlation_ids is only supported in LambdaContext")
157176
return
177+
if dd_native_tracing_enabled:
178+
logger.debug("using ddtrace implementation for spans")
179+
return
158180

159181
context = get_dd_trace_context()
160182

datadog_lambda/wrapper.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616
from datadog_lambda.patch import patch_all
1717
from datadog_lambda.tracing import (
1818
extract_dd_trace_context,
19-
set_correlation_ids,
2019
inject_correlation_ids,
2120
get_dd_trace_context,
21+
dd_native_tracing_enabled,
22+
set_correlation_ids,
2223
)
23-
from datadog_lambda.trace_wrapper import trace_wrapper
2424
from datadog_lambda.constants import Source
25+
from ddtrace import tracer, Span
26+
from ddtrace.propagation.http import HTTPPropagator
2527

2628

2729
logger = logging.getLogger(__name__)
@@ -84,8 +86,12 @@ def __init__(self, func):
8486
self.logs_injection = (
8587
os.environ.get("DD_LOGS_INJECTION", "true").lower() == "true"
8688
)
89+
self.merge_xray_traces = (
90+
os.environ.get("DD_MERGE_XRAY_TRACES", "false").lower() == "true"
91+
)
8792
self.handler_name = os.environ.get("_HANDLER", "handler")
8893
self.function_name = os.environ.get("AWS_LAMBDA_FUNCTION_NAME", "function")
94+
self.propagator = HTTPPropagator()
8995

9096
# Inject trace correlation ids to logs
9197
if self.logs_injection:
@@ -116,8 +122,9 @@ def _before(self, event, context):
116122
# Extract Datadog trace context from incoming requests
117123
dd_context = extract_dd_trace_context(event)
118124
span_context = None
119-
if dd_context["source"] == Source.EVENT:
120-
span_context = trace_wrapper.extract(dd_context)
125+
if dd_context["source"] == Source.EVENT or self.merge_xray_traces:
126+
headers = get_dd_trace_context()
127+
span_context = self.propagator.extract(headers)
121128

122129
tags = {}
123130
if context:
@@ -134,12 +141,14 @@ def _before(self, event, context):
134141
"child_of": span_context,
135142
}
136143

137-
self.span = trace_wrapper.start_span("aws.lambda", **args)
138-
if self.span:
139-
self.span.set_tags(tags)
144+
self.span = None
145+
if dd_native_tracing_enabled:
146+
self.span = tracer.start_span("aws.lambda", **args)
147+
if self.span:
148+
self.span.set_tags(tags)
149+
else:
150+
set_correlation_ids()
140151

141-
# Set log correlation ids using extracted trace context
142-
set_correlation_ids()
143152
logger.debug("datadog_lambda_wrapper _before() done")
144153
except Exception:
145154
traceback.print_exc()

0 commit comments

Comments
 (0)