Skip to content

Commit 20d0523

Browse files
herin049xrmx
andauthored
opentelemetry-instrumentation-django: remove usage of deprecated SpanAttributes where applicable (#4059)
* refactor: remove usage of deprecated SpanAttributes where applicable * Update CHANGELOG.md --------- Co-authored-by: Riccardo Magliocchetti <riccardo.magliocchetti@gmail.com>
1 parent 8a2bcfe commit 20d0523

File tree

3 files changed

+55
-54
lines changed

3 files changed

+55
-54
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4040
([#3956](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3956))
4141
- `opentelemetry-instrumentation-dbapi`: Replace SpanAttributes with semconv constants where applicable
4242
([#4058](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4058))
43+
- `opentelemetry-instrumentation-django`: Replace SpanAttributes with semconv constants where applicable
44+
([#4059](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4059))
4345

4446
## Version 1.39.0/0.60b0 (2025-12-03)
4547

instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware/otel_middleware.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@
5353
from opentelemetry.instrumentation.wsgi import (
5454
collect_request_attributes as wsgi_collect_request_attributes,
5555
)
56+
from opentelemetry.semconv._incubating.attributes.http_attributes import (
57+
HTTP_TARGET,
58+
)
5659
from opentelemetry.semconv.attributes.http_attributes import HTTP_ROUTE
57-
from opentelemetry.semconv.trace import SpanAttributes
5860
from opentelemetry.trace import Span, SpanKind, use_span
5961
from opentelemetry.util.http import (
6062
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS,
@@ -320,12 +322,12 @@ def process_view(self, request, view_func, *args, **kwargs):
320322
if route:
321323
if span.is_recording():
322324
# http.route is present for both old and new semconv
323-
span.set_attribute(SpanAttributes.HTTP_ROUTE, route)
325+
span.set_attribute(HTTP_ROUTE, route)
324326
duration_attrs = request.META[
325327
self._environ_duration_attr_key
326328
]
327329
if _report_old(self._sem_conv_opt_in_mode):
328-
duration_attrs[SpanAttributes.HTTP_TARGET] = route
330+
duration_attrs[HTTP_TARGET] = route
329331
if _report_new(self._sem_conv_opt_in_mode):
330332
duration_attrs[HTTP_ROUTE] = route
331333

@@ -424,9 +426,9 @@ def process_response(self, request, response):
424426
duration_attrs, _StabilityMode.DEFAULT
425427
)
426428
# http.target to be included in old semantic conventions
427-
target = duration_attrs.get(SpanAttributes.HTTP_TARGET)
429+
target = duration_attrs.get(HTTP_TARGET)
428430
if target:
429-
duration_attrs_old[SpanAttributes.HTTP_TARGET] = target
431+
duration_attrs_old[HTTP_TARGET] = target
430432
self._duration_histogram_old.record(
431433
max(round(duration_s * 1000), 0),
432434
duration_attrs_old,

instrumentation/opentelemetry-instrumentation-django/tests/test_middleware_asgi.py

Lines changed: 46 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@
3939
from opentelemetry.sdk import resources
4040
from opentelemetry.sdk.trace import Span
4141
from opentelemetry.sdk.trace.id_generator import RandomIdGenerator
42+
from opentelemetry.semconv._incubating.attributes.http_attributes import (
43+
HTTP_METHOD,
44+
HTTP_SCHEME,
45+
HTTP_STATUS_CODE,
46+
HTTP_URL,
47+
)
4248
from opentelemetry.semconv.attributes.client_attributes import CLIENT_ADDRESS
4349
from opentelemetry.semconv.attributes.exception_attributes import (
4450
EXCEPTION_MESSAGE,
@@ -55,7 +61,6 @@
5561
)
5662
from opentelemetry.semconv.attributes.server_attributes import SERVER_PORT
5763
from opentelemetry.semconv.attributes.url_attributes import URL_SCHEME
58-
from opentelemetry.semconv.trace import SpanAttributes
5964
from opentelemetry.test.test_base import TestBase
6065
from opentelemetry.trace import (
6166
SpanKind,
@@ -171,17 +176,17 @@ async def test_templated_route_get(self):
171176
self.assertEqual(span.name, "GET ^route/(?P<year>[0-9]{4})/template/$")
172177
self.assertEqual(span.kind, SpanKind.SERVER)
173178
self.assertEqual(span.status.status_code, StatusCode.UNSET)
174-
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "GET")
179+
self.assertEqual(span.attributes[HTTP_METHOD], "GET")
175180
self.assertEqual(
176-
span.attributes[SpanAttributes.HTTP_URL],
181+
span.attributes[HTTP_URL],
177182
"http://testserver/route/2020/template/",
178183
)
179184
self.assertEqual(
180-
span.attributes[SpanAttributes.HTTP_ROUTE],
185+
span.attributes[HTTP_ROUTE],
181186
"^route/(?P<year>[0-9]{4})/template/$",
182187
)
183-
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
184-
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 200)
188+
self.assertEqual(span.attributes[HTTP_SCHEME], "http")
189+
self.assertEqual(span.attributes[HTTP_STATUS_CODE], 200)
185190

186191
async def test_templated_route_get_new_semconv(self):
187192
await self.async_client.get("/route/2020/template/")
@@ -216,13 +221,13 @@ async def test_templated_route_get_both_semconv(self):
216221
self.assertEqual(span.name, "GET ^route/(?P<year>[0-9]{4})/template/$")
217222
self.assertEqual(span.kind, SpanKind.SERVER)
218223
self.assertEqual(span.status.status_code, StatusCode.UNSET)
219-
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "GET")
224+
self.assertEqual(span.attributes[HTTP_METHOD], "GET")
220225
self.assertEqual(
221-
span.attributes[SpanAttributes.HTTP_URL],
226+
span.attributes[HTTP_URL],
222227
"http://testserver/route/2020/template/",
223228
)
224-
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
225-
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 200)
229+
self.assertEqual(span.attributes[HTTP_SCHEME], "http")
230+
self.assertEqual(span.attributes[HTTP_STATUS_CODE], 200)
226231
self.assertEqual(span.attributes[HTTP_REQUEST_METHOD], "GET")
227232
self.assertEqual(span.attributes[SERVER_PORT], 80)
228233
self.assertEqual(span.attributes[CLIENT_ADDRESS], "127.0.0.1")
@@ -245,16 +250,14 @@ async def test_traced_get(self):
245250
self.assertEqual(span.name, "GET ^traced/")
246251
self.assertEqual(span.kind, SpanKind.SERVER)
247252
self.assertEqual(span.status.status_code, StatusCode.UNSET)
248-
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "GET")
253+
self.assertEqual(span.attributes[HTTP_METHOD], "GET")
249254
self.assertEqual(
250-
span.attributes[SpanAttributes.HTTP_URL],
255+
span.attributes[HTTP_URL],
251256
"http://testserver/traced/",
252257
)
253-
self.assertEqual(
254-
span.attributes[SpanAttributes.HTTP_ROUTE], "^traced/"
255-
)
256-
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
257-
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 200)
258+
self.assertEqual(span.attributes[HTTP_ROUTE], "^traced/")
259+
self.assertEqual(span.attributes[HTTP_SCHEME], "http")
260+
self.assertEqual(span.attributes[HTTP_STATUS_CODE], 200)
258261

259262
async def test_traced_get_new_semconv(self):
260263
await self.async_client.get("/traced/")
@@ -286,13 +289,13 @@ async def test_traced_get_both_semconv(self):
286289
self.assertEqual(span.name, "GET ^traced/")
287290
self.assertEqual(span.kind, SpanKind.SERVER)
288291
self.assertEqual(span.status.status_code, StatusCode.UNSET)
289-
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "GET")
292+
self.assertEqual(span.attributes[HTTP_METHOD], "GET")
290293
self.assertEqual(
291-
span.attributes[SpanAttributes.HTTP_URL],
294+
span.attributes[HTTP_URL],
292295
"http://testserver/traced/",
293296
)
294-
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
295-
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 200)
297+
self.assertEqual(span.attributes[HTTP_SCHEME], "http")
298+
self.assertEqual(span.attributes[HTTP_STATUS_CODE], 200)
296299
self.assertEqual(span.attributes[HTTP_REQUEST_METHOD], "GET")
297300
self.assertEqual(span.attributes[URL_SCHEME], "http")
298301
self.assertEqual(span.attributes[SERVER_PORT], 80)
@@ -325,16 +328,14 @@ async def test_traced_post(self):
325328
self.assertEqual(span.name, "POST ^traced/")
326329
self.assertEqual(span.kind, SpanKind.SERVER)
327330
self.assertEqual(span.status.status_code, StatusCode.UNSET)
328-
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "POST")
331+
self.assertEqual(span.attributes[HTTP_METHOD], "POST")
329332
self.assertEqual(
330-
span.attributes[SpanAttributes.HTTP_URL],
333+
span.attributes[HTTP_URL],
331334
"http://testserver/traced/",
332335
)
333-
self.assertEqual(
334-
span.attributes[SpanAttributes.HTTP_ROUTE], "^traced/"
335-
)
336-
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
337-
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 200)
336+
self.assertEqual(span.attributes[HTTP_ROUTE], "^traced/")
337+
self.assertEqual(span.attributes[HTTP_SCHEME], "http")
338+
self.assertEqual(span.attributes[HTTP_STATUS_CODE], 200)
338339

339340
async def test_traced_post_new_semconv(self):
340341
await self.async_client.post("/traced/")
@@ -366,13 +367,13 @@ async def test_traced_post_both_semconv(self):
366367
self.assertEqual(span.name, "POST ^traced/")
367368
self.assertEqual(span.kind, SpanKind.SERVER)
368369
self.assertEqual(span.status.status_code, StatusCode.UNSET)
369-
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "POST")
370+
self.assertEqual(span.attributes[HTTP_METHOD], "POST")
370371
self.assertEqual(
371-
span.attributes[SpanAttributes.HTTP_URL],
372+
span.attributes[HTTP_URL],
372373
"http://testserver/traced/",
373374
)
374-
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
375-
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 200)
375+
self.assertEqual(span.attributes[HTTP_SCHEME], "http")
376+
self.assertEqual(span.attributes[HTTP_STATUS_CODE], 200)
376377
self.assertEqual(span.attributes[HTTP_REQUEST_METHOD], "POST")
377378
self.assertEqual(span.attributes[URL_SCHEME], "http")
378379
self.assertEqual(span.attributes[SERVER_PORT], 80)
@@ -393,24 +394,20 @@ async def test_error(self):
393394
self.assertEqual(span.name, "GET ^error/")
394395
self.assertEqual(span.kind, SpanKind.SERVER)
395396
self.assertEqual(span.status.status_code, StatusCode.ERROR)
396-
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "GET")
397+
self.assertEqual(span.attributes[HTTP_METHOD], "GET")
397398
self.assertEqual(
398-
span.attributes[SpanAttributes.HTTP_URL],
399+
span.attributes[HTTP_URL],
399400
"http://testserver/error/",
400401
)
401-
self.assertEqual(span.attributes[SpanAttributes.HTTP_ROUTE], "^error/")
402-
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
403-
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 500)
402+
self.assertEqual(span.attributes[HTTP_ROUTE], "^error/")
403+
self.assertEqual(span.attributes[HTTP_SCHEME], "http")
404+
self.assertEqual(span.attributes[HTTP_STATUS_CODE], 500)
404405

405406
self.assertEqual(len(span.events), 1)
406407
event = span.events[0]
407408
self.assertEqual(event.name, "exception")
408-
self.assertEqual(
409-
event.attributes[SpanAttributes.EXCEPTION_TYPE], "ValueError"
410-
)
411-
self.assertEqual(
412-
event.attributes[SpanAttributes.EXCEPTION_MESSAGE], "error"
413-
)
409+
self.assertEqual(event.attributes[EXCEPTION_TYPE], "ValueError")
410+
self.assertEqual(event.attributes[EXCEPTION_MESSAGE], "error")
414411

415412
async def test_error_new_semconv(self):
416413
with self.assertRaises(ValueError):
@@ -447,14 +444,14 @@ async def test_error_both_semconv(self):
447444
self.assertEqual(span.name, "GET ^error/")
448445
self.assertEqual(span.kind, SpanKind.SERVER)
449446
self.assertEqual(span.status.status_code, StatusCode.ERROR)
450-
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "GET")
447+
self.assertEqual(span.attributes[HTTP_METHOD], "GET")
451448
self.assertEqual(
452-
span.attributes[SpanAttributes.HTTP_URL],
449+
span.attributes[HTTP_URL],
453450
"http://testserver/error/",
454451
)
455-
self.assertEqual(span.attributes[SpanAttributes.HTTP_ROUTE], "^error/")
456-
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
457-
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 500)
452+
self.assertEqual(span.attributes[HTTP_ROUTE], "^error/")
453+
self.assertEqual(span.attributes[HTTP_SCHEME], "http")
454+
self.assertEqual(span.attributes[HTTP_STATUS_CODE], 500)
458455
self.assertEqual(span.attributes[HTTP_REQUEST_METHOD], "GET")
459456
self.assertEqual(span.attributes[HTTP_ROUTE], "^error/")
460457
self.assertEqual(span.attributes[URL_SCHEME], "http")
@@ -544,7 +541,7 @@ async def test_nonstandard_http_method_span_name_both_semconv(self):
544541

545542
span = span_list[0]
546543
self.assertEqual(span.name, "HTTP")
547-
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "_OTHER")
544+
self.assertEqual(span.attributes[HTTP_METHOD], "_OTHER")
548545
self.assertEqual(span.attributes[HTTP_REQUEST_METHOD], "_OTHER")
549546
self.assertEqual(
550547
span.attributes[HTTP_REQUEST_METHOD_ORIGINAL], "NONSTANDARD"

0 commit comments

Comments
 (0)