Skip to content

Commit c138cfb

Browse files
committed
core: ensure http.status_code is always set as str on meta
1 parent 2f9c827 commit c138cfb

30 files changed

+214
-172
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 & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from .utils import aiobotocore_client
1010
from ..asyncio.utils import AsyncioTestCase, mark_asyncio
1111
from ...test_tracer import get_dummy_tracer
12+
from ...utils import assert_span_http_status_code
1213

1314

1415
class AIOBotocoreTest(AsyncioTestCase):
@@ -36,7 +37,7 @@ def test_traced_client(self):
3637
self.assertEqual(span.get_tag('aws.agent'), 'aiobotocore')
3738
self.assertEqual(span.get_tag('aws.region'), 'us-west-2')
3839
self.assertEqual(span.get_tag('aws.operation'), 'DescribeInstances')
39-
self.assertEqual(span.get_metric('http.status_code'), 200)
40+
assert_span_http_status_code(span, 200)
4041
self.assertEqual(span.get_metric('retry_attempts'), 0)
4142
self.assertEqual(span.service, 'aws.ec2')
4243
self.assertEqual(span.resource, 'ec2.describeinstances')
@@ -70,7 +71,7 @@ def test_s3_client(self):
7071
span = traces[0][0]
7172

7273
self.assertEqual(span.get_tag('aws.operation'), 'ListBuckets')
73-
self.assertEqual(span.get_metric('http.status_code'), 200)
74+
assert_span_http_status_code(span, 200)
7475
self.assertEqual(span.service, 'aws.s3')
7576
self.assertEqual(span.resource, 's3.listbuckets')
7677
self.assertEqual(span.name, 's3.command')
@@ -87,7 +88,7 @@ def test_s3_put(self):
8788
assert spans
8889
self.assertEqual(len(spans), 2)
8990
self.assertEqual(spans[0].get_tag('aws.operation'), 'CreateBucket')
90-
self.assertEqual(spans[0].get_metric(http.STATUS_CODE), 200)
91+
assert_span_http_status_code(spans[0], 200)
9192
self.assertEqual(spans[0].service, 'aws.s3')
9293
self.assertEqual(spans[0].resource, 's3.createbucket')
9394
self.assertEqual(spans[1].get_tag('aws.operation'), 'PutObject')
@@ -136,14 +137,14 @@ def test_s3_client_read(self):
136137

137138
span = traces[0][0]
138139
self.assertEqual(span.get_tag('aws.operation'), 'GetObject')
139-
self.assertEqual(span.get_metric('http.status_code'), 200)
140+
assert_span_http_status_code(span, 200)
140141
self.assertEqual(span.service, 'aws.s3')
141142
self.assertEqual(span.resource, 's3.getobject')
142143

143144
if pre_08:
144145
read_span = traces[1][0]
145146
self.assertEqual(read_span.get_tag('aws.operation'), 'GetObject')
146-
self.assertEqual(read_span.get_metric('http.status_code'), 200)
147+
assert_span_http_status_code(read_span, 200)
147148
self.assertEqual(read_span.service, 'aws.s3')
148149
self.assertEqual(read_span.resource, 's3.getobject')
149150
self.assertEqual(read_span.name, 's3.command.read')
@@ -163,7 +164,7 @@ def test_sqs_client(self):
163164
span = traces[0][0]
164165
self.assertEqual(span.get_tag('aws.region'), 'us-west-2')
165166
self.assertEqual(span.get_tag('aws.operation'), 'ListQueues')
166-
self.assertEqual(span.get_metric('http.status_code'), 200)
167+
assert_span_http_status_code(span, 200)
167168
self.assertEqual(span.service, 'aws.sqs')
168169
self.assertEqual(span.resource, 'sqs.listqueues')
169170

@@ -179,7 +180,7 @@ def test_kinesis_client(self):
179180
span = traces[0][0]
180181
self.assertEqual(span.get_tag('aws.region'), 'us-west-2')
181182
self.assertEqual(span.get_tag('aws.operation'), 'ListStreams')
182-
self.assertEqual(span.get_metric('http.status_code'), 200)
183+
assert_span_http_status_code(span, 200)
183184
self.assertEqual(span.service, 'aws.kinesis')
184185
self.assertEqual(span.resource, 'kinesis.liststreams')
185186

@@ -196,7 +197,7 @@ def test_lambda_client(self):
196197
span = traces[0][0]
197198
self.assertEqual(span.get_tag('aws.region'), 'us-west-2')
198199
self.assertEqual(span.get_tag('aws.operation'), 'ListFunctions')
199-
self.assertEqual(span.get_metric('http.status_code'), 200)
200+
assert_span_http_status_code(span, 200)
200201
self.assertEqual(span.service, 'aws.lambda')
201202
self.assertEqual(span.resource, 'lambda.listfunctions')
202203

@@ -212,7 +213,7 @@ def test_kms_client(self):
212213
span = traces[0][0]
213214
self.assertEqual(span.get_tag('aws.region'), 'us-west-2')
214215
self.assertEqual(span.get_tag('aws.operation'), 'ListKeys')
215-
self.assertEqual(span.get_metric('http.status_code'), 200)
216+
assert_span_http_status_code(span, 200)
216217
self.assertEqual(span.service, 'aws.kms')
217218
self.assertEqual(span.resource, 'kms.listkeys')
218219
# checking for protection on STS against security leak
@@ -264,7 +265,7 @@ def test_opentraced_client(self):
264265
self.assertEqual(dd_span.get_tag('aws.agent'), 'aiobotocore')
265266
self.assertEqual(dd_span.get_tag('aws.region'), 'us-west-2')
266267
self.assertEqual(dd_span.get_tag('aws.operation'), 'DescribeInstances')
267-
self.assertEqual(dd_span.get_metric('http.status_code'), 200)
268+
assert_span_http_status_code(dd_span, 200)
268269
self.assertEqual(dd_span.get_metric('retry_attempts'), 0)
269270
self.assertEqual(dd_span.service, 'aws.ec2')
270271
self.assertEqual(dd_span.resource, 'ec2.describeinstances')
@@ -305,13 +306,13 @@ def test_opentraced_s3_client(self):
305306
self.assertEqual(ot_inner_span2.parent_id, ot_outer_span.span_id)
306307

307308
self.assertEqual(dd_span.get_tag('aws.operation'), 'ListBuckets')
308-
self.assertEqual(dd_span.get_metric('http.status_code'), 200)
309+
assert_span_http_status_code(dd_span, 200)
309310
self.assertEqual(dd_span.service, 'aws.s3')
310311
self.assertEqual(dd_span.resource, 's3.listbuckets')
311312
self.assertEqual(dd_span.name, 's3.command')
312313

313314
self.assertEqual(dd_span2.get_tag('aws.operation'), 'ListBuckets')
314-
self.assertEqual(dd_span2.get_metric('http.status_code'), 200)
315+
assert_span_http_status_code(dd_span2, 200)
315316
self.assertEqual(dd_span2.service, 'aws.s3')
316317
self.assertEqual(dd_span2.resource, 's3.listbuckets')
317318
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)