Skip to content

Commit 1d4a264

Browse files
committed
WSGI: Changed default span-name, added callback to change span-name.
Signed-off-by: Emil Madsen <sovende@gmail.com>
1 parent ad7a809 commit 1d4a264

2 files changed

Lines changed: 21 additions & 10 deletions

File tree

ext/opentelemetry-ext-wsgi/src/opentelemetry/ext/wsgi/__init__.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,8 @@ def add_response_attributes(
142142

143143

144144
def get_default_span_name(environ):
145-
"""Calculates a (generic) span name for an incoming HTTP request based on the PEP3333 conforming WSGI environ."""
146-
147-
# TODO: Update once
148-
# https://github.com/open-telemetry/opentelemetry-specification/issues/270
149-
# is resolved
150-
return environ.get("PATH_INFO", "/")
145+
"""Default implementation for name_callback, returns HTTP {METHOD_NAME}."""
146+
return "HTTP " + environ.get("REQUEST_METHOD")
151147

152148

153149
class OpenTelemetryMiddleware:
@@ -158,11 +154,15 @@ class OpenTelemetryMiddleware:
158154
159155
Args:
160156
wsgi: The WSGI application callable to forward requests to.
157+
name_callback: Callback which calculates a generic span name for an
158+
incoming HTTP request based on the PEP3333 WSGI environ.
159+
Optional: Defaults to get_default_span_name.
161160
"""
162161

163-
def __init__(self, wsgi):
162+
def __init__(self, wsgi, name_callback=None):
164163
self.wsgi = wsgi
165164
self.tracer = trace.tracer_source().get_tracer(__name__, __version__)
165+
self.name_callback = name_callback or get_default_span_name
166166

167167
@staticmethod
168168
def _create_start_response(span, start_response):
@@ -182,7 +182,7 @@ def __call__(self, environ, start_response):
182182
"""
183183

184184
parent_span = propagators.extract(get_header_from_environ, environ)
185-
span_name = get_default_span_name(environ)
185+
span_name = self.name_callback(environ)
186186

187187
span = self.tracer.start_span(
188188
span_name,

ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def error_wsgi(environ, start_response):
7474

7575

7676
class TestWsgiApplication(WsgiTestBase):
77-
def validate_response(self, response, error=None):
77+
def validate_response(self, response, error=None, span_name="HTTP GET"):
7878
while True:
7979
try:
8080
value = next(response)
@@ -95,7 +95,7 @@ def validate_response(self, response, error=None):
9595

9696
span_list = self.memory_exporter.get_finished_spans()
9797
self.assertEqual(len(span_list), 1)
98-
self.assertEqual(span_list[0].name, "/")
98+
self.assertEqual(span_list[0].name, span_name)
9999
self.assertEqual(span_list[0].kind, trace_api.SpanKind.SERVER)
100100
self.assertEqual(
101101
span_list[0].attributes,
@@ -147,6 +147,17 @@ def test_wsgi_exc_info(self):
147147
response = app(self.environ, self.start_response)
148148
self.validate_response(response, error=ValueError)
149149

150+
def test_override_span_name(self):
151+
"""Test that span_names can be overwritten by our callback function."""
152+
span_name = "Dymaxion"
153+
def get_predefined_span_name(scope):
154+
return span_name
155+
app = otel_wsgi.OpenTelemetryMiddleware(
156+
simple_wsgi, name_callback=get_predefined_span_name
157+
)
158+
response = app(self.environ, self.start_response)
159+
self.validate_response(response, span_name=span_name)
160+
150161

151162
class TestWsgiAttributes(unittest.TestCase):
152163
def setUp(self):

0 commit comments

Comments
 (0)