diff --git a/.changelog/5328.changed b/.changelog/5328.changed new file mode 100644 index 0000000000..94c13b2b6f --- /dev/null +++ b/.changelog/5328.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()