Skip to content

Commit bcd4012

Browse files
author
Emanuele Palazzetti
committed
[pyramid] add distributed tracing
1 parent 49c9030 commit bcd4012

File tree

3 files changed

+44
-2
lines changed

3 files changed

+44
-2
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
SETTINGS_SERVICE = 'datadog_trace_service'
22
SETTINGS_TRACER = 'datadog_tracer'
33
SETTINGS_TRACE_ENABLED = 'datadog_trace_enabled'
4+
SETTINGS_DISTRIBUTED_TRACING = 'datadog_distributed_tracing'

ddtrace/contrib/pyramid/trace.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,21 @@
99
# project
1010
import ddtrace
1111
from ...ext import http, AppTypes
12-
from .constants import SETTINGS_SERVICE, SETTINGS_TRACE_ENABLED, SETTINGS_TRACER
12+
from ...propagation.http import HTTPPropagator
13+
from .constants import (
14+
SETTINGS_TRACER,
15+
SETTINGS_SERVICE,
16+
SETTINGS_TRACE_ENABLED,
17+
SETTINGS_DISTRIBUTED_TRACING,
18+
)
19+
1320

1421
log = logging.getLogger(__name__)
1522

1623
DD_TWEEN_NAME = 'ddtrace.contrib.pyramid:trace_tween_factory'
1724
DD_SPAN = '_datadog_span'
1825

26+
1927
def trace_pyramid(config):
2028
config.include('ddtrace.contrib.pyramid')
2129

@@ -49,6 +57,7 @@ def trace_tween_factory(handler, registry):
4957
service = settings.get(SETTINGS_SERVICE) or 'pyramid'
5058
tracer = settings.get(SETTINGS_TRACER) or ddtrace.tracer
5159
enabled = asbool(settings.get(SETTINGS_TRACE_ENABLED, tracer.enabled))
60+
distributed_tracing = asbool(settings.get(SETTINGS_DISTRIBUTED_TRACING, False))
5261

5362
# set the service info
5463
tracer.set_service_info(
@@ -59,6 +68,12 @@ def trace_tween_factory(handler, registry):
5968
if enabled:
6069
# make a request tracing function
6170
def trace_tween(request):
71+
if distributed_tracing:
72+
propagator = HTTPPropagator()
73+
context = propagator.extract(request.headers)
74+
# only need to active the new context if something was propagated
75+
if context.trace_id:
76+
tracer.context_provider.activate(context)
6277
with tracer.trace('pyramid.request', service=service, resource='404') as span:
6378
setattr(request, DD_SPAN, span) # used to find the tracer in templates
6479
response = None

tests/contrib/pyramid/test_pyramid.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
from nose.tools import eq_, assert_raises
55

6-
# project
76
from ddtrace import compat
87
from ddtrace.contrib.pyramid.patch import insert_tween_if_needed
98

@@ -267,3 +266,30 @@ def test_tween_overridden(self):
267266
self.app.get('/json', status=200)
268267
spans = self.tracer.writer.pop()
269268
eq_(len(spans), 0)
269+
270+
271+
class TestPyramidDistributedTracing(PyramidBase):
272+
instrument = True
273+
274+
def get_settings(self):
275+
return {
276+
'datadog_distributed_tracing': True,
277+
}
278+
279+
def test_distributed_tracing(self):
280+
# ensure the Context is properly created
281+
# if distributed tracing is enabled
282+
headers = {
283+
'x-datadog-trace-id': '100',
284+
'x-datadog-parent-id': '42',
285+
'x-datadog-sampling-priority': '2',
286+
}
287+
res = self.app.get('/', headers=headers, status=200)
288+
writer = self.tracer.writer
289+
spans = writer.pop()
290+
eq_(len(spans), 1)
291+
# check the propagated Context
292+
span = spans[0]
293+
eq_(span.trace_id, 100)
294+
eq_(span.parent_id, 42)
295+
eq_(span.get_metric('_sampling_priority_v1'), 2)

0 commit comments

Comments
 (0)