From 2f81ad29f942293488805a58e4edc56f863124bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Paj=C4=85k?= Date: Thu, 18 Jun 2026 19:15:53 +0000 Subject: [PATCH 1/2] opentelemetry-api: normalize empty environment propagation names to "_" in EnvironmentSetter and EnvironmentGetter --- .changelog/5330.changed | 1 + .../src/opentelemetry/propagators/_envcarrier.py | 4 +++- .../tests/propagators/test__envcarrier.py | 16 +++++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 .changelog/5330.changed diff --git a/.changelog/5330.changed b/.changelog/5330.changed new file mode 100644 index 0000000000..94c13b2b6f --- /dev/null +++ b/.changelog/5330.changed @@ -0,0 +1 @@ +`opentelemetry-api`: normalize empty environment propagation names to `_` in `EnvironmentSetter` and `EnvironmentGetter` \ No newline at end of file diff --git a/opentelemetry-api/src/opentelemetry/propagators/_envcarrier.py b/opentelemetry-api/src/opentelemetry/propagators/_envcarrier.py index 0e51e2606f..5b597cece6 100644 --- a/opentelemetry-api/src/opentelemetry/propagators/_envcarrier.py +++ b/opentelemetry-api/src/opentelemetry/propagators/_envcarrier.py @@ -9,6 +9,8 @@ def _normalize_key(key: str) -> str: + if not key: + return "_" result = re.sub(r"[^A-Za-z0-9_]", "_", key).upper() if result and result[0].isdigit(): result = "_" + result @@ -95,7 +97,7 @@ def set( Args: carrier: Dictionary to store environment variables - key: The key to set (will be converted to uppercase) + key: The key to set (normalized) value: The value to set """ carrier[_normalize_key(key)] = value diff --git a/opentelemetry-api/tests/propagators/test__envcarrier.py b/opentelemetry-api/tests/propagators/test__envcarrier.py index 63aac7e958..8d00c62bd9 100644 --- a/opentelemetry-api/tests/propagators/test__envcarrier.py +++ b/opentelemetry-api/tests/propagators/test__envcarrier.py @@ -41,7 +41,7 @@ def test_already_valid(self): self.assertEqual(_normalize_key("ALREADY_VALID"), "ALREADY_VALID") def test_empty_string(self): - self.assertEqual(_normalize_key(""), "") + self.assertEqual(_normalize_key(""), "_") class TestIsNormalizedKey(unittest.TestCase): @@ -94,6 +94,13 @@ def test_get_empty_value(self): result = getter.get({}, "empty_key") self.assertEqual(result, [""]) + def test_get_empty_key_maps_to_underscore(self): + """Test empty key lookup uses the normalized underscore name.""" + with patch.dict(os.environ, {"_": "underscore_value"}, clear=True): + getter = EnvironmentGetter() + result = getter.get({}, "") + self.assertEqual(result, ["underscore_value"]) + def test_get_with_special_characters(self): """Test environment variables with special characters.""" with patch.dict( @@ -234,6 +241,13 @@ def test_set_empty_value(self): setter.set(carrier, "empty_key", "") self.assertEqual(carrier, {"EMPTY_KEY": ""}) + def test_set_empty_key_maps_to_underscore(self): + """Test setting an empty key uses the normalized underscore name.""" + setter = EnvironmentSetter() + carrier = {} + setter.set(carrier, "", "value") + self.assertEqual(carrier, {"_": "value"}) + def test_does_not_modify_os_environ(self): """Test that setter does not modify os.environ.""" setter = EnvironmentSetter() From 9b6cf462dbf9cebb55cccedc5188a6295d3efd81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Paj=C4=85k?= Date: Thu, 18 Jun 2026 19:17:08 +0000 Subject: [PATCH 2/2] fix PR number --- .changelog/{5330.changed => 5328.changed} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .changelog/{5330.changed => 5328.changed} (100%) diff --git a/.changelog/5330.changed b/.changelog/5328.changed similarity index 100% rename from .changelog/5330.changed rename to .changelog/5328.changed