Skip to content

Commit 8ce8e09

Browse files
committed
fix fof wsgi, test in falcon
1 parent b7d362f commit 8ce8e09

File tree

2 files changed

+34
-6
lines changed
  • instrumentation
    • opentelemetry-instrumentation-falcon/tests
    • opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi

2 files changed

+34
-6
lines changed

instrumentation/opentelemetry-instrumentation-falcon/tests/test_falcon.py

+20
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,26 @@ def test_custom_request_header_added_in_server_span(self):
490490
for key, _ in not_expected.items():
491491
self.assertNotIn(key, span.attributes)
492492

493+
def test_repeated_request_header_added_in_server_span(self):
494+
headers = [
495+
("Custom-Test-Header-1", "Test Value 1"),
496+
("Custom-Test-Header-1", "Test Value 2"),
497+
]
498+
self.client().simulate_request(
499+
method="GET", path="/hello", headers=headers
500+
)
501+
span = self.memory_exporter.get_finished_spans()[0]
502+
assert span.status.is_ok
503+
504+
expected = {
505+
"http.request.header.custom_test_header_1": (
506+
"Test Value 1,Test Value 2",
507+
),
508+
}
509+
510+
self.assertEqual(span.kind, trace.SpanKind.SERVER)
511+
self.assertSpanHasAttributes(span, expected)
512+
493513
def test_custom_request_header_not_added_in_internal_span(self):
494514
tracer = trace.get_tracer(__name__)
495515
with tracer.start_as_current_span("test", kind=trace.SpanKind.SERVER):

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

+14-6
Original file line numberDiff line numberDiff line change
@@ -358,12 +358,15 @@ def collect_custom_request_headers_attributes(environ):
358358
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS
359359
)
360360
)
361+
headers = {}
361362

362-
headers = {
363-
key[_CARRIER_KEY_PREFIX_LEN:].replace("_", "-"): val
364-
for key, val in environ.items()
365-
if key.startswith(_CARRIER_KEY_PREFIX)
366-
}
363+
for key, val in environ.items():
364+
if key.startswith(_CARRIER_KEY_PREFIX):
365+
header_key = key[_CARRIER_KEY_PREFIX_LEN:].replace("_", "-").lower()
366+
if header_key in headers:
367+
headers[header_key] += "," + val
368+
else:
369+
headers[header_key] = val
367370

368371
return sanitize.sanitize_header_values(
369372
headers,
@@ -387,7 +390,12 @@ def collect_custom_response_headers_attributes(response_headers):
387390
)
388391
response_headers_dict = {}
389392
if response_headers:
390-
response_headers_dict = dict(response_headers)
393+
for key, val in response_headers:
394+
key = key.lower()
395+
if key in response_headers_dict:
396+
response_headers_dict[key] += "," + val
397+
else:
398+
response_headers_dict[key] = val
391399

392400
return sanitize.sanitize_header_values(
393401
response_headers_dict,

0 commit comments

Comments
 (0)