fix(django): avoid empty span name on empty path (#1788)

Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com>
Co-authored-by: Shalev Roda <65566801+shalevr@users.noreply.github.com>
Co-authored-by: Diego Hurtado <ocelotl@users.noreply.github.com>
This commit is contained in:
Marc Dougherty
2023-07-12 11:38:59 -07:00
committed by GitHub
parent db90ce38a2
commit acfe932f7d
3 changed files with 22 additions and 2 deletions

View File

@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- `opentelemetry-instrumentation-django` Fix empty span name when using
`path("", ...)` ([#1788](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1788)
- Fix elastic-search instrumentation sanitization to support bulk queries
([#1870](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1870))
- Update falcon instrumentation to follow semantic conventions

View File

@ -172,9 +172,12 @@ class _DjangoMiddleware(MiddlewareMixin):
else:
match = resolve(request.path)
if hasattr(match, "route"):
if hasattr(match, "route") and match.route:
return f"{request.method} {match.route}"
if hasattr(match, "url_name") and match.url_name:
return f"{request.method} {match.url_name}"
return request.method
except Resolver404:

View File

@ -74,10 +74,14 @@ DJANGO_2_2 = VERSION >= (2, 2)
DJANGO_3_0 = VERSION >= (3, 0)
if DJANGO_2_0:
from django.urls import re_path
from django.urls import path, re_path
else:
from django.conf.urls import url as re_path
def path(path_argument, *args, **kwargs):
return re_path(rf"^{path_argument}$", *args, **kwargs)
urlpatterns = [
re_path(r"^traced/", traced),
re_path(r"^traced_custom_header/", response_with_custom_header),
@ -87,6 +91,7 @@ urlpatterns = [
re_path(r"^excluded_noarg/", excluded_noarg),
re_path(r"^excluded_noarg2/", excluded_noarg2),
re_path(r"^span_name/([0-9]{4})/$", route_span_name),
path("", traced, name="empty"),
]
_django_instrumentor = DjangoInstrumentor()
@ -205,6 +210,16 @@ class TestMiddleware(WsgiTestBase):
self.assertFalse(mock_span.set_attribute.called)
self.assertFalse(mock_span.set_status.called)
def test_empty_path(self):
Client().get("/")
spans = self.memory_exporter.get_finished_spans()
self.assertEqual(len(spans), 1)
span = spans[0]
self.assertEqual(span.name, "GET empty")
def test_traced_post(self):
Client().post("/traced/")