Skip to content

Commit 8565c64

Browse files
committed
Update opentelemetry-instrumentation/src/opentelemetry/instrumentation/propagators.py
1 parent 2f8c190 commit 8565c64

File tree

1 file changed

+30
-6
lines changed
  • opentelemetry-instrumentation/src/opentelemetry/instrumentation

1 file changed

+30
-6
lines changed

opentelemetry-instrumentation/src/opentelemetry/instrumentation/propagators.py

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
# limitations under the License.
1414

1515
"""
16-
This module implements experimental propagators to inject trace response context
17-
into HTTP responses. This is useful for server side frameworks that start traces
16+
This module implements experimental propagators to inject trace context
17+
into response carriers. This is useful for server side frameworks that start traces
1818
when server requests and want to share the trace context with the client so the
1919
client can add it's spans to the same trace.
2020
@@ -44,25 +44,47 @@ def set_global_response_propagator(propagator):
4444
_RESPONSE_PROPAGATOR = propagator
4545

4646

47-
class DictHeaderSetter:
47+
class Setter(ABC):
48+
@abstractmethod
49+
def set(self, carrier, key, value):
50+
"""Inject the provided key value pair in carrier."""
51+
52+
53+
class DictHeaderSetter(Setter):
4854
def set(self, carrier, key, value): # pylint: disable=no-self-use
4955
old_value = carrier.get(key, "")
5056
if old_value:
5157
value = "{0}, {1}".format(old_value, value)
5258
carrier[key] = value
5359

5460

55-
default_setter = DictHeaderSetter()
61+
class FuncSetter(Setter):
62+
"""FuncSetter coverts a function into a valid Setter. Any function that can
63+
set values in a carrier can be converted into a Setter by using FuncSetter.
64+
This is useful when injecting trace context into non-dict objects such
65+
HTTP Response objects for different framework.
66+
67+
For example, it can be used to create a setter for Falcon response object as:
68+
69+
setter = FuncSetter(falcon.api.Response.append_header)
5670
71+
and then used with the propagator as:
72+
73+
propagator.inject(falcon_response, setter=setter)
74+
75+
This would essentially make the propagator call `falcon_response.append_header(key, value)`
76+
"""
5777

58-
class FuncSetter:
5978
def __init__(self, func):
6079
self._func = func
6180

6281
def set(self, carrier, key, value):
6382
self._func(carrier, key, value)
6483

6584

85+
default_setter = DictHeaderSetter()
86+
87+
6688
class ResponsePropagator(ABC):
6789
@abstractmethod
6890
def inject(
@@ -100,5 +122,7 @@ def inject(
100122
),
101123
)
102124
setter.set(
103-
carrier, _HTTP_HEADER_ACCESS_CONTROL_EXPOSE_HEADERS, header_name,
125+
carrier,
126+
_HTTP_HEADER_ACCESS_CONTROL_EXPOSE_HEADERS,
127+
header_name,
104128
)

0 commit comments

Comments
 (0)