Skip to content

Commit e8195a6

Browse files
authored
Merge pull request #1182 from DataDog/brettlangdon/http.status_code.meta
core: ensure http.status_code is always set as str on meta
2 parents 2f9c827 + 11eea43 commit e8195a6

31 files changed

+231
-189
lines changed

ddtrace/contrib/flask/middleware.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ def _finish_span(self, span, exception=None):
135135
if not span or not span.sampled:
136136
return
137137

138-
code = span.get_metric(http.STATUS_CODE) or 0
138+
code = span.get_tag(http.STATUS_CODE) or 0
139139
try:
140140
code = int(code)
141141
except Exception:

ddtrace/span.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,13 +153,18 @@ def set_tag(self, key, value=None):
153153
must be strings (or stringable). If a casting error occurs, it will
154154
be ignored.
155155
"""
156+
# Special case, force `http.status_code` as a string
157+
# DEV: `http.status_code` *has* to be in `meta` for metrics
158+
# calculated in the trace agent
159+
if key == http.STATUS_CODE:
160+
value = str(value)
156161

157162
# Determine once up front
158163
is_an_int = is_integer(value)
159164

160165
# Explicitly try to convert expected integers to `int`
161166
# DEV: Some integrations parse these values from strings, but don't call `int(value)` themselves
162-
INT_TYPES = (net.TARGET_PORT, http.STATUS_CODE)
167+
INT_TYPES = (net.TARGET_PORT, )
163168
if key in INT_TYPES and not is_an_int:
164169
try:
165170
value = int(value)

tests/contrib/aiobotocore/py35/test.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from ..utils import aiobotocore_client
66
from ...asyncio.utils import AsyncioTestCase, mark_asyncio
77
from ....test_tracer import get_dummy_tracer
8+
from ....utils import assert_span_http_status_code
89

910

1011
class AIOBotocoreTest(AsyncioTestCase):
@@ -45,13 +46,13 @@ async def test_response_context_manager(self):
4546

4647
span = traces[0][0]
4748
assert span.get_tag('aws.operation') == 'GetObject'
48-
assert span.get_metric('http.status_code') == 200
49+
assert_span_http_status_code(span, 200)
4950
assert span.service == 'aws.s3'
5051
assert span.resource == 's3.getobject'
5152

5253
read_span = traces[1][0]
5354
assert read_span.get_tag('aws.operation') == 'GetObject'
54-
assert read_span.get_metric('http.status_code') == 200
55+
assert_span_http_status_code(read_span, 200)
5556
assert read_span.service == 'aws.s3'
5657
assert read_span.resource == 's3.getobject'
5758
assert read_span.name == 's3.command.read'
@@ -64,7 +65,7 @@ async def test_response_context_manager(self):
6465

6566
span = traces[0][0]
6667
assert span.get_tag('aws.operation') == 'GetObject'
67-
assert span.get_metric('http.status_code') == 200
68+
assert_span_http_status_code(span, 200)
6869
assert span.service == 'aws.s3'
6970
assert span.resource == 's3.getobject'
7071
assert span.name == 's3.command'

tests/contrib/aiobotocore/test.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33

44
from ddtrace.contrib.aiobotocore.patch import patch, unpatch
55
from ddtrace.constants import ANALYTICS_SAMPLE_RATE_KEY
6-
from ddtrace.ext import http
76
from ddtrace.compat import stringify
87

98
from .utils import aiobotocore_client
109
from ..asyncio.utils import AsyncioTestCase, mark_asyncio
1110
from ...test_tracer import get_dummy_tracer
11+
from ...utils import assert_span_http_status_code
1212

1313

1414
class AIOBotocoreTest(AsyncioTestCase):
@@ -36,7 +36,7 @@ def test_traced_client(self):
3636
self.assertEqual(span.get_tag('aws.agent'), 'aiobotocore')
3737
self.assertEqual(span.get_tag('aws.region'), 'us-west-2')
3838
self.assertEqual(span.get_tag('aws.operation'), 'DescribeInstances')
39-
self.assertEqual(span.get_metric('http.status_code'), 200)
39+
assert_span_http_status_code(span, 200)
4040
self.assertEqual(span.get_metric('retry_attempts'), 0)
4141
self.assertEqual(span.service, 'aws.ec2')
4242
self.assertEqual(span.resource, 'ec2.describeinstances')
@@ -70,7 +70,7 @@ def test_s3_client(self):
7070
span = traces[0][0]
7171

7272
self.assertEqual(span.get_tag('aws.operation'), 'ListBuckets')
73-
self.assertEqual(span.get_metric('http.status_code'), 200)
73+
assert_span_http_status_code(span, 200)
7474
self.assertEqual(span.service, 'aws.s3')
7575
self.assertEqual(span.resource, 's3.listbuckets')
7676
self.assertEqual(span.name, 's3.command')
@@ -87,7 +87,7 @@ def test_s3_put(self):
8787
assert spans
8888
self.assertEqual(len(spans), 2)
8989
self.assertEqual(spans[0].get_tag('aws.operation'), 'CreateBucket')
90-
self.assertEqual(spans[0].get_metric(http.STATUS_CODE), 200)
90+
assert_span_http_status_code(spans[0], 200)
9191
self.assertEqual(spans[0].service, 'aws.s3')
9292
self.assertEqual(spans[0].resource, 's3.createbucket')
9393
self.assertEqual(spans[1].get_tag('aws.operation'), 'PutObject')
@@ -136,14 +136,14 @@ def test_s3_client_read(self):
136136

137137
span = traces[0][0]
138138
self.assertEqual(span.get_tag('aws.operation'), 'GetObject')
139-
self.assertEqual(span.get_metric('http.status_code'), 200)
139+
assert_span_http_status_code(span, 200)
140140
self.assertEqual(span.service, 'aws.s3')
141141
self.assertEqual(span.resource, 's3.getobject')
142142

143143
if pre_08:
144144
read_span = traces[1][0]
145145
self.assertEqual(read_span.get_tag('aws.operation'), 'GetObject')
146-
self.assertEqual(read_span.get_metric('http.status_code'), 200)
146+
assert_span_http_status_code(read_span, 200)
147147
self.assertEqual(read_span.service, 'aws.s3')
148148
self.assertEqual(read_span.resource, 's3.getobject')
149149
self.assertEqual(read_span.name, 's3.command.read')
@@ -163,7 +163,7 @@ def test_sqs_client(self):
163163
span = traces[0][0]
164164
self.assertEqual(span.get_tag('aws.region'), 'us-west-2')
165165
self.assertEqual(span.get_tag('aws.operation'), 'ListQueues')
166-
self.assertEqual(span.get_metric('http.status_code'), 200)
166+
assert_span_http_status_code(span, 200)
167167
self.assertEqual(span.service, 'aws.sqs')
168168
self.assertEqual(span.resource, 'sqs.listqueues')
169169

@@ -179,7 +179,7 @@ def test_kinesis_client(self):
179179
span = traces[0][0]
180180
self.assertEqual(span.get_tag('aws.region'), 'us-west-2')
181181
self.assertEqual(span.get_tag('aws.operation'), 'ListStreams')
182-
self.assertEqual(span.get_metric('http.status_code'), 200)
182+
assert_span_http_status_code(span, 200)
183183
self.assertEqual(span.service, 'aws.kinesis')
184184
self.assertEqual(span.resource, 'kinesis.liststreams')
185185

@@ -196,7 +196,7 @@ def test_lambda_client(self):
196196
span = traces[0][0]
197197
self.assertEqual(span.get_tag('aws.region'), 'us-west-2')
198198
self.assertEqual(span.get_tag('aws.operation'), 'ListFunctions')
199-
self.assertEqual(span.get_metric('http.status_code'), 200)
199+
assert_span_http_status_code(span, 200)
200200
self.assertEqual(span.service, 'aws.lambda')
201201
self.assertEqual(span.resource, 'lambda.listfunctions')
202202

@@ -212,7 +212,7 @@ def test_kms_client(self):
212212
span = traces[0][0]
213213
self.assertEqual(span.get_tag('aws.region'), 'us-west-2')
214214
self.assertEqual(span.get_tag('aws.operation'), 'ListKeys')
215-
self.assertEqual(span.get_metric('http.status_code'), 200)
215+
assert_span_http_status_code(span, 200)
216216
self.assertEqual(span.service, 'aws.kms')
217217
self.assertEqual(span.resource, 'kms.listkeys')
218218
# checking for protection on STS against security leak
@@ -264,7 +264,7 @@ def test_opentraced_client(self):
264264
self.assertEqual(dd_span.get_tag('aws.agent'), 'aiobotocore')
265265
self.assertEqual(dd_span.get_tag('aws.region'), 'us-west-2')
266266
self.assertEqual(dd_span.get_tag('aws.operation'), 'DescribeInstances')
267-
self.assertEqual(dd_span.get_metric('http.status_code'), 200)
267+
assert_span_http_status_code(dd_span, 200)
268268
self.assertEqual(dd_span.get_metric('retry_attempts'), 0)
269269
self.assertEqual(dd_span.service, 'aws.ec2')
270270
self.assertEqual(dd_span.resource, 'ec2.describeinstances')
@@ -305,13 +305,13 @@ def test_opentraced_s3_client(self):
305305
self.assertEqual(ot_inner_span2.parent_id, ot_outer_span.span_id)
306306

307307
self.assertEqual(dd_span.get_tag('aws.operation'), 'ListBuckets')
308-
self.assertEqual(dd_span.get_metric('http.status_code'), 200)
308+
assert_span_http_status_code(dd_span, 200)
309309
self.assertEqual(dd_span.service, 'aws.s3')
310310
self.assertEqual(dd_span.resource, 's3.listbuckets')
311311
self.assertEqual(dd_span.name, 's3.command')
312312

313313
self.assertEqual(dd_span2.get_tag('aws.operation'), 'ListBuckets')
314-
self.assertEqual(dd_span2.get_metric('http.status_code'), 200)
314+
assert_span_http_status_code(dd_span2, 200)
315315
self.assertEqual(dd_span2.service, 'aws.s3')
316316
self.assertEqual(dd_span2.resource, 's3.listbuckets')
317317
self.assertEqual(dd_span2.name, 's3.command')

tests/contrib/aiohttp/test_middleware.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from tests.opentracer.utils import init_tracer
1212
from .utils import TraceTestCase
1313
from .app.web import setup_app, noop_middleware
14+
from ...utils import assert_span_http_status_code
1415

1516

1617
class TestTraceMiddleware(TraceTestCase):
@@ -42,7 +43,7 @@ def test_handler(self):
4243
assert 'GET /' == span.resource
4344
assert str(self.client.make_url('/')) == span.get_tag(http.URL)
4445
assert 'GET' == span.get_tag('http.method')
45-
assert 200 == span.get_metric('http.status_code')
46+
assert_span_http_status_code(span, 200)
4647
assert 0 == span.error
4748

4849
@asyncio.coroutine
@@ -64,7 +65,7 @@ def _test_param_handler(self, query_string=''):
6465
# with the right fields
6566
assert 'GET /echo/{name}' == span.resource
6667
assert str(self.client.make_url('/echo/team')) == span.get_tag(http.URL)
67-
assert 200 == span.get_metric('http.status_code')
68+
assert_span_http_status_code(span, 200)
6869
if self.app[CONFIG_KEY].get('trace_query_string'):
6970
assert query_string == span.get_tag(http.QUERY_STRING)
7071
else:
@@ -112,7 +113,7 @@ def test_404_handler(self):
112113
assert '404' == span.resource
113114
assert str(self.client.make_url('/404/not_found')) == span.get_tag(http.URL)
114115
assert 'GET' == span.get_tag('http.method')
115-
assert 404 == span.get_metric('http.status_code')
116+
assert_span_http_status_code(span, 404)
116117

117118
@unittest_run_loop
118119
@asyncio.coroutine
@@ -128,7 +129,7 @@ def test_server_error(self):
128129
assert len(traces[0]) == 1
129130
span = traces[0][0]
130131
assert span.get_tag('http.method') == 'GET'
131-
assert span.get_metric('http.status_code') == 500
132+
assert_span_http_status_code(span, 500)
132133
assert span.error == 1
133134

134135
@unittest_run_loop
@@ -145,7 +146,7 @@ def test_500_response_code(self):
145146
assert len(traces[0]) == 1
146147
span = traces[0][0]
147148
assert span.get_tag('http.method') == 'GET'
148-
assert span.get_metric('http.status_code') == 503
149+
assert_span_http_status_code(span, 503)
149150
assert span.error == 1
150151

151152
@unittest_run_loop
@@ -168,7 +169,7 @@ def test_coroutine_chaining(self):
168169
assert 'GET /chaining/' == root.resource
169170
assert str(self.client.make_url('/chaining/')) == root.get_tag(http.URL)
170171
assert 'GET' == root.get_tag('http.method')
171-
assert 200 == root.get_metric('http.status_code')
172+
assert_span_http_status_code(root, 200)
172173
# span created in the coroutine_chaining handler
173174
assert 'aiohttp.coro_1' == handler.name
174175
assert root.span_id == handler.parent_id
@@ -196,7 +197,7 @@ def test_static_handler(self):
196197
assert 'GET /statics' == span.resource
197198
assert str(self.client.make_url('/statics/empty.txt')) == span.get_tag(http.URL)
198199
assert 'GET' == span.get_tag('http.method')
199-
assert 200 == span.get_metric('http.status_code')
200+
assert_span_http_status_code(span, 200)
200201

201202
@unittest_run_loop
202203
@asyncio.coroutine
@@ -421,7 +422,7 @@ def _assert_200_parenting(self, traces):
421422
assert 'GET /' == inner_span.resource
422423
assert str(self.client.make_url('/')) == inner_span.get_tag(http.URL)
423424
assert 'GET' == inner_span.get_tag('http.method')
424-
assert 200 == inner_span.get_metric('http.status_code')
425+
assert_span_http_status_code(inner_span, 200)
425426
assert 0 == inner_span.error
426427

427428
@unittest_run_loop

tests/contrib/boto/test.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from unittest import skipUnless
1919
from tests.opentracer.utils import init_tracer
2020
from ...base import BaseTracerTestCase
21+
from ...utils import assert_span_http_status_code
2122

2223

2324
class BotoTest(BaseTracerTestCase):
@@ -41,7 +42,7 @@ def test_ec2_client(self):
4142
self.assertEqual(len(spans), 1)
4243
span = spans[0]
4344
self.assertEqual(span.get_tag('aws.operation'), 'DescribeInstances')
44-
self.assertEqual(span.get_metric(http.STATUS_CODE), 200)
45+
assert_span_http_status_code(span, 200)
4546
self.assertEqual(span.get_tag(http.METHOD), 'POST')
4647
self.assertEqual(span.get_tag('aws.region'), 'us-west-2')
4748
self.assertIsNone(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY))
@@ -53,7 +54,7 @@ def test_ec2_client(self):
5354
self.assertEqual(len(spans), 1)
5455
span = spans[0]
5556
self.assertEqual(span.get_tag('aws.operation'), 'RunInstances')
56-
self.assertEqual(span.get_metric(http.STATUS_CODE), 200)
57+
assert_span_http_status_code(span, 200)
5758
self.assertEqual(span.get_tag(http.METHOD), 'POST')
5859
self.assertEqual(span.get_tag('aws.region'), 'us-west-2')
5960
self.assertEqual(span.service, 'test-boto-tracing.ec2')
@@ -107,7 +108,7 @@ def test_s3_client(self):
107108
assert spans
108109
self.assertEqual(len(spans), 1)
109110
span = spans[0]
110-
self.assertEqual(span.get_metric(http.STATUS_CODE), 200)
111+
assert_span_http_status_code(span, 200)
111112
self.assertEqual(span.get_tag(http.METHOD), 'GET')
112113
self.assertEqual(span.get_tag('aws.operation'), 'get_all_buckets')
113114

@@ -117,7 +118,7 @@ def test_s3_client(self):
117118
assert spans
118119
self.assertEqual(len(spans), 1)
119120
span = spans[0]
120-
self.assertEqual(span.get_metric(http.STATUS_CODE), 200)
121+
assert_span_http_status_code(span, 200)
121122
self.assertEqual(span.get_tag(http.METHOD), 'PUT')
122123
self.assertEqual(span.get_tag('path'), '/')
123124
self.assertEqual(span.get_tag('aws.operation'), 'create_bucket')
@@ -128,7 +129,7 @@ def test_s3_client(self):
128129
assert spans
129130
self.assertEqual(len(spans), 1)
130131
span = spans[0]
131-
self.assertEqual(span.get_metric(http.STATUS_CODE), 200)
132+
assert_span_http_status_code(span, 200)
132133
self.assertEqual(span.get_tag(http.METHOD), 'HEAD')
133134
self.assertEqual(span.get_tag('aws.operation'), 'head_bucket')
134135
self.assertEqual(span.service, 'test-boto-tracing.s3')
@@ -161,7 +162,7 @@ def test_s3_put(self):
161162
# create bucket
162163
self.assertEqual(len(spans), 3)
163164
self.assertEqual(spans[0].get_tag('aws.operation'), 'create_bucket')
164-
self.assertEqual(spans[0].get_metric(http.STATUS_CODE), 200)
165+
assert_span_http_status_code(spans[0], 200)
165166
self.assertEqual(spans[0].service, 'test-boto-tracing.s3')
166167
self.assertEqual(spans[0].resource, 's3.put')
167168
# get bucket
@@ -215,7 +216,7 @@ def test_lambda_client(self):
215216
assert spans
216217
self.assertEqual(len(spans), 2)
217218
span = spans[0]
218-
self.assertEqual(span.get_metric(http.STATUS_CODE), 200)
219+
assert_span_http_status_code(span, 200)
219220
self.assertEqual(span.get_tag(http.METHOD), 'GET')
220221
self.assertEqual(span.get_tag('aws.region'), 'us-east-2')
221222
self.assertEqual(span.get_tag('aws.operation'), 'list_functions')
@@ -285,7 +286,7 @@ def test_ec2_client_ot(self):
285286

286287
self.assertEqual(ot_span.resource, 'ot_span')
287288
self.assertEqual(dd_span.get_tag('aws.operation'), 'DescribeInstances')
288-
self.assertEqual(dd_span.get_metric(http.STATUS_CODE), 200)
289+
assert_span_http_status_code(dd_span, 200)
289290
self.assertEqual(dd_span.get_tag(http.METHOD), 'POST')
290291
self.assertEqual(dd_span.get_tag('aws.region'), 'us-west-2')
291292

@@ -301,7 +302,7 @@ def test_ec2_client_ot(self):
301302
self.assertEqual(dd_span.parent_id, ot_span.span_id)
302303

303304
self.assertEqual(dd_span.get_tag('aws.operation'), 'RunInstances')
304-
self.assertEqual(dd_span.get_metric(http.STATUS_CODE), 200)
305+
assert_span_http_status_code(dd_span, 200)
305306
self.assertEqual(dd_span.get_tag(http.METHOD), 'POST')
306307
self.assertEqual(dd_span.get_tag('aws.region'), 'us-west-2')
307308
self.assertEqual(dd_span.service, 'test-boto-tracing.ec2')

0 commit comments

Comments
 (0)