Skip to content

Commit d5c2c16

Browse files
authored
[core] Add API to configure Trace Search (#781)
* Add API to configure Trace Search, enable it for Pylons * fix up styles * allow asserting on span metrics * all integrations have a default 'event_sample_rate' option * [core] set event sample rate key for flask.request spans * remove unnecessary Django test * fix root span comparison * [core] set event sample rate key for aiohttp.request spans * ensure all bottle tests are running * [core] set event sample rate key for bottle.request spans * work on other integrations and django tests * update tests for pylons * update falcon tests * fix pyramid tests * assert that we have a root span * fix molten tests * fix tornado tests * fix broken tests
1 parent e7b07dc commit d5c2c16

File tree

31 files changed

+594
-350
lines changed

31 files changed

+594
-350
lines changed

ddtrace/constants.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
FILTERS_KEY = 'FILTERS'
2-
SAMPLE_RATE_METRIC_KEY = "_sample_rate"
2+
SAMPLE_RATE_METRIC_KEY = '_sample_rate'
33
SAMPLING_PRIORITY_KEY = '_sampling_priority_v1'
4+
EVENT_SAMPLE_RATE_KEY = '_dd1.sr.eausr'
5+
6+
NUMERIC_TAGS = (EVENT_SAMPLE_RATE_KEY, )

ddtrace/contrib/aiohttp/middlewares.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import asyncio
22

33
from ..asyncio import context_provider
4-
from ...ext import AppTypes, http
54
from ...compat import stringify
6-
from ...context import Context
5+
from ...constants import EVENT_SAMPLE_RATE_KEY
6+
from ...ext import AppTypes, http
77
from ...propagation.http import HTTPPropagator
8+
from ...settings import config
89

910

1011
CONFIG_KEY = 'datadog_trace'
@@ -45,6 +46,10 @@ def attach_context(request):
4546
span_type=http.TYPE,
4647
)
4748

49+
# Configure trace search sample rate
50+
if config.aiohttp.event_sample_rate is not None:
51+
request_span.set_tag(EVENT_SAMPLE_RATE_KEY, config.aiohttp.event_sample_rate)
52+
4853
# attach the context and the root span to the request; the Context
4954
# may be freely used by the application code
5055
request[REQUEST_CONTEXT_KEY] = request_span.context

ddtrace/contrib/bottle/trace.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
from ddtrace.ext import http, AppTypes
77

88
# project
9+
from ...constants import EVENT_SAMPLE_RATE_KEY
910
from ...propagation.http import HTTPPropagator
11+
from ...settings import config
1012

1113
SPAN_TYPE = 'web'
1214

@@ -41,6 +43,10 @@ def wrapped(*args, **kwargs):
4143
self.tracer.context_provider.activate(context)
4244

4345
with self.tracer.trace('bottle.request', service=self.service, resource=resource, span_type=SPAN_TYPE) as s:
46+
# Configure trace search sample rate
47+
if config.bottle.event_sample_rate is not None:
48+
s.set_tag(EVENT_SAMPLE_RATE_KEY, config.bottle.event_sample_rate)
49+
4450
code = 0
4551
try:
4652
return callback(*args, **kwargs)

ddtrace/contrib/django/middleware.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
from .conf import settings
55
from .compat import user_is_authenticated, get_resolver
66

7-
from ...ext import http
7+
from ...constants import EVENT_SAMPLE_RATE_KEY
88
from ...contrib import func_name
9+
from ...ext import http
910
from ...propagation.http import HTTPPropagator
11+
from ...settings import config
1012

1113
# 3p
1214
from django.core.exceptions import MiddlewareNotUsed
@@ -118,6 +120,10 @@ def process_request(self, request):
118120
span_type=http.TYPE,
119121
)
120122

123+
# Configure trace search sample rate
124+
if config.django.event_sample_rate is not None:
125+
span.set_tag(EVENT_SAMPLE_RATE_KEY, config.django.event_sample_rate)
126+
121127
span.set_tag(http.METHOD, request.method)
122128
span.set_tag(http.URL, request.path)
123129
_set_req_span(request, span)

ddtrace/contrib/falcon/middleware.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
from ddtrace.ext import http as httpx
44
from ddtrace.http import store_request_headers, store_response_headers
55
from ddtrace.propagation.http import HTTPPropagator
6+
67
from ...compat import iteritems
8+
from ...constants import EVENT_SAMPLE_RATE_KEY
79
from ...ext import AppTypes
810
from ...settings import config
911

@@ -37,6 +39,10 @@ def process_request(self, req, resp):
3739
span_type=httpx.TYPE,
3840
)
3941

42+
# Configure trace search sample rate
43+
if config.falcon.event_sample_rate is not None:
44+
span.set_tag(EVENT_SAMPLE_RATE_KEY, config.falcon.event_sample_rate)
45+
4046
span.set_tag(httpx.METHOD, req.method)
4147
span.set_tag(httpx.URL, req.url)
4248

ddtrace/contrib/flask/patch.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from ddtrace import config, Pin
99

10+
from ...constants import EVENT_SAMPLE_RATE_KEY
1011
from ...ext import AppTypes
1112
from ...ext import http
1213
from ...propagation.http import HTTPPropagator
@@ -284,6 +285,10 @@ def traced_wsgi_app(pin, wrapped, instance, args, kwargs):
284285
# We will override this below in `traced_dispatch_request` when we have a `RequestContext` and possibly a url rule
285286
resource = u'{} {}'.format(request.method, request.path)
286287
with pin.tracer.trace('flask.request', service=pin.service, resource=resource, span_type=http.TYPE) as s:
288+
# Configure trace search sample rate
289+
if config.flask.event_sample_rate is not None:
290+
s.set_tag(EVENT_SAMPLE_RATE_KEY, config.flask.event_sample_rate)
291+
287292
s.set_tag(FLASK_VERSION, flask_version_str)
288293

289294
# Wrap the `start_response` handler to extract response code

ddtrace/contrib/molten/patch.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import molten
55

66
from ... import Pin, config
7+
from ...constants import EVENT_SAMPLE_RATE_KEY
78
from ...ext import AppTypes, http
89
from ...propagation.http import HTTPPropagator
910
from ...utils.formats import asbool, get_env
@@ -83,6 +84,10 @@ def patch_app_call(wrapped, instance, args, kwargs):
8384
pin.tracer.context_provider.activate(context)
8485

8586
with pin.tracer.trace('molten.request', service=pin.service, resource=resource) as span:
87+
# Configure trace search sample rate
88+
if config.molten.event_sample_rate is not None:
89+
span.set_tag(EVENT_SAMPLE_RATE_KEY, config.molten.event_sample_rate)
90+
8691
@wrapt.function_wrapper
8792
def _w_start_response(wrapped, instance, args, kwargs):
8893
""" Patch respond handling to set metadata """

ddtrace/contrib/pylons/middleware.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@
88
from .constants import CONFIG_MIDDLEWARE
99

1010
from ...compat import reraise
11+
from ...constants import EVENT_SAMPLE_RATE_KEY
1112
from ...ext import http, AppTypes
1213
from ...propagation.http import HTTPPropagator
14+
from ...settings import config as ddconfig
15+
1316

1417
log = logging.getLogger(__name__)
1518

@@ -49,6 +52,10 @@ def __call__(self, environ, start_response):
4952
# set as early as possible when different services share one single agent.
5053
span.span_type = http.TYPE
5154

55+
# Configure trace search sample rate
56+
if ddconfig.pylons.event_sample_rate is not None:
57+
span.set_tag(EVENT_SAMPLE_RATE_KEY, ddconfig.pylons.event_sample_rate)
58+
5259
if not span.sampled:
5360
return self.app(environ, start_response)
5461

ddtrace/contrib/pyramid/trace.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77

88
# project
99
import ddtrace
10+
from ...constants import EVENT_SAMPLE_RATE_KEY
1011
from ...ext import http, AppTypes
1112
from ...propagation.http import HTTPPropagator
13+
from ...settings import config
1214
from .constants import (
1315
SETTINGS_TRACER,
1416
SETTINGS_SERVICE,
@@ -76,6 +78,10 @@ def trace_tween(request):
7678
if context.trace_id:
7779
tracer.context_provider.activate(context)
7880
with tracer.trace('pyramid.request', service=service, resource='404') as span:
81+
# Configure trace search sample rate
82+
if config.pyramid.event_sample_rate is not None:
83+
span.set_tag(EVENT_SAMPLE_RATE_KEY, config.pyramid.event_sample_rate)
84+
7985
setattr(request, DD_SPAN, span) # used to find the tracer in templates
8086
response = None
8187
try:

ddtrace/contrib/tornado/handlers.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
from .constants import CONFIG_KEY, REQUEST_CONTEXT_KEY, REQUEST_SPAN_KEY
44
from .stack_context import TracerStackContext
5+
from ...constants import EVENT_SAMPLE_RATE_KEY
56
from ...ext import http
67
from ...propagation.http import HTTPPropagator
8+
from ...settings import config
79

810

911
def execute(func, handler, args, kwargs):
@@ -35,6 +37,10 @@ def execute(func, handler, args, kwargs):
3537
service=service,
3638
span_type=http.TYPE
3739
)
40+
# Configure trace search sample rate
41+
if config.tornado.event_sample_rate is not None:
42+
request_span.set_tag(EVENT_SAMPLE_RATE_KEY, config.tornado.event_sample_rate)
43+
3844
setattr(handler.request, REQUEST_SPAN_KEY, request_span)
3945

4046
return func(*args, **kwargs)

0 commit comments

Comments
 (0)