1919 + [ Process Spawning] ( #process-spawning )
2020 + [ Security] ( #security )
2121 + [ Case Sensitivity] ( #case-sensitivity )
22+ - [ Supplementary Guidelines] ( #supplementary-guidelines )
23+ * [ Approach 1: Providing a dedicated ` EnvironmentContextPropagator ` ] ( #approach-1-providing-a-dedicated-environmentcontextpropagator )
24+ * [ Approach 2: Using the carriers directly through ` Setters ` and ` Getters ` ] ( #approach-2-using-the-carriers-directly-through-setters-and-getters )
25+ * [ Common Behaviors] ( #common-behaviors )
2226
2327<!-- tocstop -->
2428
@@ -129,6 +133,9 @@ When spawning child processes:
129133- When spawning multiple child processes with different contexts or baggage,
130134 each child SHOULD receive its own copy of the environment variables with
131135 appropriate information.
136+ - The onus is on the application owner for receiving the set context from the
137+ SDK and passing it to its own process spawning mechanism. The language
138+ implementations MUST NOT handle spawning processes.
132139
133140#### Security
134141
@@ -149,3 +156,52 @@ Windows.
149156- For maximum compatibility, implementations MUST:
150157 - Use uppercase names consistently (` TRACEPARENT ` not ` TraceParent ` ).
151158 - Use the canonical case when setting environment variables.
159+
160+ ## Supplementary Guidelines
161+
162+ > ** IMPORTANT** : This section is non-normative and provides implementation
163+ > guidance only. It does not add requirements to the specification.
164+
165+ Language implementations of OpenTelemetry have flexibility in how they implement
166+ environment variable context propagation. Two main approaches have been
167+ identified as viable.
168+
169+ ### Approach 1: Providing a dedicated ` EnvironmentContextPropagator `
170+
171+ SDKs can create a dedicated propagator for environment variables. For example,
172+ the [ OTel Swift] [ swift ] implements a custom ` EnvironmentContextPropagator ` that
173+ handles the environment-specific logic internally, in essence decorating the
174+ ` TextMapPropagator ` .
175+
176+ ### Approach 2: Using the carriers directly through ` Setters ` and ` Getters `
177+
178+ Language implementations can use the existing ` TextMapPropagator ` interface directly with
179+ environment-specific carriers. Go and Python SDKs follow this pattern by
180+ providing:
181+
182+ - ` EnvironmentGetter ` - creates an in-memory copy of the current environment
183+ variables and reads context from that copy.
184+ - ` EnvironmentSetter ` - writes context to a dictionary/map and provides the
185+ dictionary/map to the application owner for them to use when spawning processes.
186+
187+ Examples:
188+
189+ - [ OpenTelemetry Prototype Go Implementation] [ gi ]
190+ - [ OpenTelemetry Prototype Python Implementation] [ pi ]
191+
192+ [ gi ] : https://github.com/open-telemetry/opentelemetry-go/pull/6778
193+ [ pi ] : https://github.com/open-telemetry/opentelemetry-python/pull/4609
194+
195+ ### Common Behaviors
196+
197+ Both approaches achieve the same outcome while offering different developer
198+ experiences. Language implementations may choose either approach based on their
199+ language's idioms and ecosystem conventions. The behaviors in both approaches
200+ are the same in that they:
201+
202+ 1 . ** Extract context** : Read from environment variables and delegate to the
203+ configured ` TextMapPropagator ` (e.g. W3C, B3) for parsing
204+ 2 . ** Inject context** : Return a dictionary/map of environment variables that
205+ application owners can pass to their process spawning libraries
206+
207+ [ swift ] : https://github.com/open-telemetry/opentelemetry-swift/blob/main/Sources/OpenTelemetrySdk/Trace/Propagation/EnvironmentContextPropagator.swift
0 commit comments