Skip to content

Commit 3b587d2

Browse files
gabsnEmanuele Palazzetti
authored andcommitted
Add language and extra metadata as headers (#289)
1 parent 69693dc commit 3b587d2

File tree

4 files changed

+44
-9
lines changed

4 files changed

+44
-9
lines changed

ddtrace/api.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
# stdlib
22
import logging
33
import time
4+
import ddtrace
45

56
# project
67
from .encoding import get_encoder, JSONEncoder
7-
from .compat import httplib
8+
from .compat import httplib, PYTHON_VERSION, PYTHON_INTERPRETER
89

910

1011
log = logging.getLogger(__name__)
@@ -25,7 +26,13 @@ def __init__(self, hostname, port, headers=None, encoder=None):
2526

2627
# overwrite the Content-type with the one chosen in the Encoder
2728
self._headers = headers or {}
28-
self._headers.update({'Content-Type': self._encoder.content_type})
29+
self._headers.update({
30+
'Content-Type': self._encoder.content_type,
31+
'Datadog-Meta-Lang': 'python',
32+
'Datadog-Meta-Lang-Version': PYTHON_VERSION,
33+
'Datadog-Meta-Lang-Interpreter': PYTHON_INTERPRETER,
34+
'Datadog-Meta-Tracer-Version': ddtrace.__version__,
35+
})
2936

3037
def _downgrade(self):
3138
"""

ddtrace/compat.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import sys
2+
import platform
23

3-
PYTHON_VERSION = sys.version_info
4+
PYTHON_VERSION_INFO = sys.version_info
45
PY2 = sys.version_info[0] == 2
56

7+
# Infos about python passed to the trace agent through the header
8+
PYTHON_VERSION = platform.python_version()
9+
PYTHON_INTERPRETER = platform.python_implementation()
10+
611
stringify = str
712

813
if PY2:

ddtrace/contrib/aiobotocore/patch.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from aiobotocore.endpoint import ClientResponseContentProxy
99

1010
from ...ext import http, aws
11-
from ...compat import PYTHON_VERSION
11+
from ...compat import PYTHON_VERSION_INFO
1212

1313

1414
ARGS_NAME = ('action', 'params', 'path', 'verb')
@@ -53,7 +53,7 @@ def read(self, *args, **kwargs):
5353
return result
5454

5555
# wrapt doesn't proxy `async with` context managers
56-
if PYTHON_VERSION >= (3, 5, 0):
56+
if PYTHON_VERSION_INFO >= (3, 5, 0):
5757
@asyncio.coroutine
5858
def __aenter__(self):
5959
# call the wrapped method but return the object proxy

tests/test_integration.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import msgpack
55
import logging
66
import mock
7+
import ddtrace
78

89
from unittest import TestCase, skipUnless
910
from nose.tools import eq_, ok_
@@ -15,11 +16,10 @@
1516
from ddtrace.span import Span
1617
from ddtrace.tracer import Tracer
1718
from ddtrace.encoding import JSONEncoder, MsgpackEncoder, get_encoder
18-
from ddtrace.compat import httplib
19+
from ddtrace.compat import httplib, PYTHON_INTERPRETER, PYTHON_VERSION
1920
from tests.test_tracer import get_dummy_tracer
2021

2122

22-
2323
class MockedLogHandler(logging.Handler):
2424
"""Record log messages to verify error logging logic"""
2525

@@ -257,10 +257,19 @@ def test_send_presampler_headers(self, mocked_http):
257257
eq_(request_call.call_count, 1)
258258

259259
# retrieve the headers from the mocked request call
260+
expected_headers = {
261+
'Datadog-Meta-Lang': 'python',
262+
'Datadog-Meta-Lang-Interpreter': PYTHON_INTERPRETER,
263+
'Datadog-Meta-Lang-Version': PYTHON_VERSION,
264+
'Datadog-Meta-Tracer-Version': ddtrace.__version__,
265+
'X-Datadog-Trace-Count': '1',
266+
'Content-Type': 'application/msgpack'
267+
}
260268
params, _ = request_call.call_args_list[0]
261269
headers = params[3]
262-
ok_('X-Datadog-Trace-Count' in headers.keys())
263-
eq_(headers['X-Datadog-Trace-Count'], '1')
270+
eq_(len(expected_headers), len(headers))
271+
for k, v in expected_headers.items():
272+
eq_(v, headers[k])
264273

265274
@mock.patch('ddtrace.api.httplib.HTTPConnection')
266275
def test_send_presampler_headers_not_in_services(self, mocked_http):
@@ -277,6 +286,20 @@ def test_send_presampler_headers_not_in_services(self, mocked_http):
277286
request_call = mocked_http.return_value.request
278287
eq_(request_call.call_count, 1)
279288

289+
# retrieve the headers from the mocked request call
290+
expected_headers = {
291+
'Datadog-Meta-Lang': 'python',
292+
'Datadog-Meta-Lang-Interpreter': PYTHON_INTERPRETER,
293+
'Datadog-Meta-Lang-Version': PYTHON_VERSION,
294+
'Datadog-Meta-Tracer-Version': ddtrace.__version__,
295+
'Content-Type': 'application/msgpack'
296+
}
297+
params, _ = request_call.call_args_list[0]
298+
headers = params[3]
299+
eq_(len(expected_headers), len(headers))
300+
for k, v in expected_headers.items():
301+
eq_(v, headers[k])
302+
280303
# retrieve the headers from the mocked request call
281304
params, _ = request_call.call_args_list[0]
282305
headers = params[3]

0 commit comments

Comments
 (0)