Skip to content

Commit 84b2057

Browse files
committed
handle empty request method
1 parent f15652d commit 84b2057

2 files changed

Lines changed: 34 additions & 22 deletions

File tree

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@ def collect_request_attributes(environ):
9393

9494
result = {
9595
"component": "http",
96-
"http.method": environ["REQUEST_METHOD"],
97-
"http.server_name": environ["SERVER_NAME"],
98-
"http.scheme": environ["wsgi.url_scheme"],
99-
"host.port": int(environ["SERVER_PORT"]),
96+
"http.method": environ.get("REQUEST_METHOD"),
97+
"http.server_name": environ.get("SERVER_NAME"),
98+
"http.scheme": environ.get("wsgi.url_scheme"),
99+
"host.port": int(environ.get("SERVER_PORT")),
100100
}
101101

102102
setifnotnone(result, "http.host", environ.get("HTTP_HOST"))
@@ -150,7 +150,12 @@ def add_response_attributes(
150150

151151
def get_default_span_name(environ):
152152
"""Default implementation for name_callback, returns HTTP {METHOD_NAME}."""
153-
return "HTTP " + environ.get("REQUEST_METHOD")
153+
request_method = environ.get("REQUEST_METHOD")
154+
return "HTTP" + (
155+
" " + request_method
156+
if request_method is not None and request_method != ""
157+
else ""
158+
)
154159

155160

156161
class OpenTelemetryMiddleware:
@@ -191,7 +196,6 @@ def __call__(self, environ, start_response):
191196
token = context.attach(
192197
propagators.extract(get_header_from_environ, environ)
193198
)
194-
span_name = get_default_span_name(environ)
195199
span_name = self.name_callback(environ)
196200

197201
span = self.tracer.start_span(

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

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

7575

7676
class TestWsgiApplication(WsgiTestBase):
77-
def validate_response(self, response, error=None, span_name="HTTP GET"):
77+
def validate_response(
78+
self, response, error=None, span_name="HTTP GET", http_method="GET"
79+
):
7880
while True:
7981
try:
8082
value = next(response)
@@ -97,21 +99,20 @@ def validate_response(self, response, error=None, span_name="HTTP GET"):
9799
self.assertEqual(len(span_list), 1)
98100
self.assertEqual(span_list[0].name, span_name)
99101
self.assertEqual(span_list[0].kind, trace_api.SpanKind.SERVER)
100-
self.assertEqual(
101-
span_list[0].attributes,
102-
{
103-
"component": "http",
104-
"http.method": "GET",
105-
"http.server_name": "127.0.0.1",
106-
"http.scheme": "http",
107-
"host.port": 80,
108-
"http.host": "127.0.0.1",
109-
"http.flavor": "1.0",
110-
"http.url": "http://127.0.0.1/",
111-
"http.status_text": "OK",
112-
"http.status_code": 200,
113-
},
114-
)
102+
expected_attributes = {
103+
"component": "http",
104+
"http.server_name": "127.0.0.1",
105+
"http.scheme": "http",
106+
"host.port": 80,
107+
"http.host": "127.0.0.1",
108+
"http.flavor": "1.0",
109+
"http.url": "http://127.0.0.1/",
110+
"http.status_text": "OK",
111+
"http.status_code": 200,
112+
}
113+
if http_method is not None:
114+
expected_attributes["http.method"] = http_method
115+
self.assertEqual(span_list[0].attributes, expected_attributes)
115116

116117
def test_basic_wsgi_call(self):
117118
app = otel_wsgi.OpenTelemetryMiddleware(simple_wsgi)
@@ -161,6 +162,13 @@ def get_predefined_span_name(scope):
161162
response = app(self.environ, self.start_response)
162163
self.validate_response(response, span_name=span_name)
163164

165+
def test_default_span_name_missing_request_method(self):
166+
"""Test that default span_names with missing request method."""
167+
self.environ.pop("REQUEST_METHOD")
168+
app = otel_wsgi.OpenTelemetryMiddleware(simple_wsgi)
169+
response = app(self.environ, self.start_response)
170+
self.validate_response(response, span_name="HTTP", http_method=None)
171+
164172

165173
class TestWsgiAttributes(unittest.TestCase):
166174
def setUp(self):

0 commit comments

Comments
 (0)