From 795bc867ffe41bf0c70dee487cd2d808647025b5 Mon Sep 17 00:00:00 2001 From: Marcin Zaremba Date: Thu, 25 Mar 2021 16:46:02 +0100 Subject: [PATCH] Reimplement the keys method in WSGI CarrierGetter (#379) --- CHANGELOG.md | 2 ++ .../instrumentation/wsgi/__init__.py | 8 +++++++- .../tests/test_getter.py | 17 ++++++++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d5c5ceaa..c408a041b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#364](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/364)) - `opentelemetry-propagator-ot-trace` Do not throw an exception when headers are not present ([#378](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/378)) +- `opentelemetry-instrumentation-wsgi` Reimplement `keys` method to return actual keys from the carrier instead of an empty list. + ([#379](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/379)) ### Changed - Rename `IdsGenerator` to `IdGenerator` diff --git a/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/__init__.py b/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/__init__.py index ec2fc162f..e8335c3fc 100644 --- a/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/__init__.py @@ -66,6 +66,8 @@ from opentelemetry.propagators.textmap import DictGetter from opentelemetry.trace.status import Status, StatusCode _HTTP_VERSION_PREFIX = "HTTP/" +_CARRIER_KEY_PREFIX = "HTTP_" +_CARRIER_KEY_PREFIX_LEN = len(_CARRIER_KEY_PREFIX) class CarrierGetter(DictGetter): @@ -89,7 +91,11 @@ class CarrierGetter(DictGetter): return None def keys(self, carrier): - return [] + return [ + key[_CARRIER_KEY_PREFIX_LEN:].lower().replace("_", "-") + for key in carrier + if key.startswith(_CARRIER_KEY_PREFIX) + ] carrier_getter = CarrierGetter() diff --git a/instrumentation/opentelemetry-instrumentation-wsgi/tests/test_getter.py b/instrumentation/opentelemetry-instrumentation-wsgi/tests/test_getter.py index 80cf6b1ec..1e6d5ef79 100644 --- a/instrumentation/opentelemetry-instrumentation-wsgi/tests/test_getter.py +++ b/instrumentation/opentelemetry-instrumentation-wsgi/tests/test_getter.py @@ -22,15 +22,30 @@ class TestCarrierGetter(TestCase): getter = CarrierGetter() carrier = {} val = getter.get(carrier, "test") + self.assertIsNone(val) - def test_get_(self): + def test_get(self): getter = CarrierGetter() carrier = {"HTTP_TEST_KEY": "val"} val = getter.get(carrier, "test-key") + self.assertEqual(val, ["val"]) def test_keys(self): + getter = CarrierGetter() + keys = getter.keys( + { + "HTTP_TEST_KEY": "val", + "HTTP_OTHER_KEY": 42, + "NON_HTTP_KEY": "val", + } + ) + + self.assertEqual(keys, ["test-key", "other-key"]) + + def test_keys_empty(self): getter = CarrierGetter() keys = getter.keys({}) + self.assertEqual(keys, [])