From 04ed3535126cc08f13f904b06da5df339cdf034f Mon Sep 17 00:00:00 2001 From: Adriel Perkins Date: Mon, 2 Jun 2025 19:10:06 -0400 Subject: [PATCH] [carriers] add env carrier --- .../opentelemetry/propagators/envcarrier.py | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 opentelemetry-api/src/opentelemetry/propagators/envcarrier.py diff --git a/opentelemetry-api/src/opentelemetry/propagators/envcarrier.py b/opentelemetry-api/src/opentelemetry/propagators/envcarrier.py new file mode 100644 index 0000000000..87456d0b08 --- /dev/null +++ b/opentelemetry-api/src/opentelemetry/propagators/envcarrier.py @@ -0,0 +1,60 @@ +import os +import typing +from opentelemetry.propagators.textmap import Getter, Setter + +class EnvironmentGetter(Getter[dict]): + """This class decorates Getter to enable extracting from context and baggage + from environment variables. + """ + + KEY_MAPPING = { + "TRACEPARENT": "traceparent", + "TRACESTATE": "tracestate", + "BAGGAGE": "baggage" + } + + def __init__(self): + self.env_copy = dict(os.environ) + self.carrier = {} + + for env_key, env_value in self.env_copy.items(): + if env_key in self.KEY_MAPPING: + self.carrier[self.KEY_MAPPING[env_key]] = env_value + else: + self.carrier[env_key] = env_value + + def get(self, carrier: dict, key: str) -> typing.Optional[typing.List[str]]: + """Get a value from the carrier for the given key""" + val = self.carrier.get(key, None) + if val is None: + return None + if isinstance(val, typing.Iterable) and not isinstance(val, str): + return list(val) + return [val] + + def keys(self, carrier: dict) -> typing.List[str]: + """Get all keys from the carrier""" + return list(self.carrier.keys()) + +class EnvironmentSetter(Setter[dict]): + """This class decorates Setter to enable setting context and baggage + to environment variables. + """ + + KEY_MAPPING = { + "TRACEPARENT": "traceparent", + "TRACESTATE": "tracestate", + "BAGGAGE": "baggage" + } + + def set(self, carrier: typing.Optional[dict], key: str, value: str) -> None: + """Set a value in the environment for the given key. + + Args: + carrier: Not used for environment setter, but kept for interface compatibility + key: The key to set + value: The value to set + """ + env_key = self.KEY_MAPPING.get(key, key.upper()) + + os.environ[env_key] = value