Skip to content

Commit 25edfef

Browse files
ocelotlalrex
and
alrex
authored
Make setters and getters optional (#1690)
Co-authored-by: alrex <[email protected]>
1 parent c533ac1 commit 25edfef

File tree

25 files changed

+201
-192
lines changed

25 files changed

+201
-192
lines changed

.github/workflows/test.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ env:
1010
# Otherwise, set variable to the commit of your branch on
1111
# opentelemetry-python-contrib which is compatible with these Core repo
1212
# changes.
13-
CONTRIB_REPO_SHA: 5bc0fa1611502be47a1f4eb550fe255e4b707ba1
13+
CONTRIB_REPO_SHA: 0d12fa39523212e268ef435825af2039a876fd75
1414

1515
jobs:
1616
build:

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased](https://github.com/open-telemetry/opentelemetry-python/compare/v0.18b0...HEAD)
8+
- Make setters and getters optional
9+
([#1690](https://github.com/open-telemetry/opentelemetry-python/pull/1690))
810

911
### Added
1012
- Document how to work with fork process web server models(Gunicorn, uWSGI etc...)

docs/conf.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@
104104
("py:class", "opentelemetry.trace._LinkBase",),
105105
# TODO: Understand why sphinx is not able to find this local class
106106
("py:class", "opentelemetry.propagators.textmap.TextMapPropagator",),
107-
("py:class", "opentelemetry.propagators.textmap.DictGetter",),
107+
("py:class", "opentelemetry.propagators.textmap.DefaultGetter",),
108108
("any", "opentelemetry.propagators.textmap.TextMapPropagator.extract",),
109109
("any", "opentelemetry.propagators.textmap.TextMapPropagator.inject",),
110110
]

docs/examples/auto-instrumentation/README.rst

+1-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ Manually instrumented server
3737
def server_request():
3838
with tracer.start_as_current_span(
3939
"server_request",
40-
context=propagators.extract(DictGetter(), request.headers
41-
),
40+
context=propagators.extract(request.headers),
4241
):
4342
print(request.args.get("param"))
4443
return "served"

docs/examples/auto-instrumentation/client.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737

3838
with tracer.start_as_current_span("client-server"):
3939
headers = {}
40-
propagators.inject(dict.__setitem__, headers)
40+
propagators.inject(headers)
4141
requested = get(
4242
"http://localhost:8082/server_request",
4343
params={"param": argv[1]},

docs/examples/auto-instrumentation/server_instrumented.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
from opentelemetry import trace
1818
from opentelemetry.instrumentation.wsgi import collect_request_attributes
1919
from opentelemetry.propagate import extract
20-
from opentelemetry.propagators.textmap import DictGetter
2120
from opentelemetry.sdk.trace import TracerProvider
2221
from opentelemetry.sdk.trace.export import (
2322
ConsoleSpanExporter,
@@ -38,7 +37,7 @@
3837
def server_request():
3938
with tracer.start_as_current_span(
4039
"server_request",
41-
context=extract(DictGetter(), request.headers),
40+
context=extract(request.headers),
4241
kind=trace.SpanKind.SERVER,
4342
attributes=collect_request_attributes(request.environ),
4443
):

docs/examples/datadog_exporter/client.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747

4848
with tracer.start_as_current_span("client-server"):
4949
headers = {}
50-
inject(dict.__setitem__, headers)
50+
inject(headers)
5151
requested = get(
5252
"http://localhost:8082/server_request",
5353
params={"param": argv[1]},

docs/examples/django/client.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636

3737
with tracer.start_as_current_span("client-server"):
3838
headers = {}
39-
inject(dict.__setitem__, headers)
39+
inject(headers)
4040
requested = get(
4141
"http://localhost:8000",
4242
params={"param": argv[1]},

opentelemetry-api/src/opentelemetry/baggage/propagation/__init__.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ class W3CBaggagePropagator(textmap.TextMapPropagator):
3131

3232
def extract(
3333
self,
34-
getter: textmap.Getter[textmap.TextMapPropagatorT],
35-
carrier: textmap.TextMapPropagatorT,
34+
carrier: textmap.CarrierT,
3635
context: typing.Optional[Context] = None,
36+
getter: textmap.Getter = textmap.default_getter,
3737
) -> Context:
3838
"""Extract Baggage from the carrier.
3939
@@ -73,9 +73,9 @@ def extract(
7373

7474
def inject(
7575
self,
76-
set_in_carrier: textmap.Setter[textmap.TextMapPropagatorT],
77-
carrier: textmap.TextMapPropagatorT,
76+
carrier: textmap.CarrierT,
7877
context: typing.Optional[Context] = None,
78+
setter: textmap.Setter = textmap.default_setter,
7979
) -> None:
8080
"""Injects Baggage into the carrier.
8181
@@ -87,7 +87,7 @@ def inject(
8787
return
8888

8989
baggage_string = _format_baggage(baggage_entries)
90-
set_in_carrier(carrier, self._BAGGAGE_HEADER_NAME, baggage_string)
90+
setter.set(carrier, self._BAGGAGE_HEADER_NAME, baggage_string)
9191

9292
@property
9393
def fields(self) -> typing.Set[str]:
@@ -103,8 +103,8 @@ def _format_baggage(baggage_entries: typing.Mapping[str, object]) -> str:
103103

104104

105105
def _extract_first_element(
106-
items: typing.Optional[typing.Iterable[textmap.TextMapPropagatorT]],
107-
) -> typing.Optional[textmap.TextMapPropagatorT]:
106+
items: typing.Optional[typing.Iterable[textmap.CarrierT]],
107+
) -> typing.Optional[textmap.CarrierT]:
108108
if items is None:
109109
return None
110110
return next(iter(items), None)

opentelemetry-api/src/opentelemetry/propagate/__init__.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ def example_route():
8282

8383

8484
def extract(
85-
getter: textmap.Getter[textmap.TextMapPropagatorT],
86-
carrier: textmap.TextMapPropagatorT,
85+
carrier: textmap.CarrierT,
8786
context: typing.Optional[Context] = None,
87+
getter: textmap.Getter = textmap.default_getter,
8888
) -> Context:
8989
"""Uses the configured propagator to extract a Context from the carrier.
9090
@@ -99,26 +99,26 @@ def extract(
9999
context: an optional Context to use. Defaults to current
100100
context if not set.
101101
"""
102-
return get_global_textmap().extract(getter, carrier, context)
102+
return get_global_textmap().extract(carrier, context, getter=getter)
103103

104104

105105
def inject(
106-
set_in_carrier: textmap.Setter[textmap.TextMapPropagatorT],
107-
carrier: textmap.TextMapPropagatorT,
106+
carrier: textmap.CarrierT,
108107
context: typing.Optional[Context] = None,
108+
setter: textmap.Setter = textmap.default_setter,
109109
) -> None:
110110
"""Uses the configured propagator to inject a Context into the carrier.
111111
112112
Args:
113-
set_in_carrier: A setter function that can set values
114-
on the carrier.
115113
carrier: An object that contains a representation of HTTP
116-
headers. Should be paired with set_in_carrier, which
114+
headers. Should be paired with setter, which
117115
should know how to set header values on the carrier.
118-
context: an optional Context to use. Defaults to current
116+
context: An optional Context to use. Defaults to current
119117
context if not set.
118+
setter: An optional `Setter` object that can set values
119+
on the carrier.
120120
"""
121-
get_global_textmap().inject(set_in_carrier, carrier, context)
121+
get_global_textmap().inject(carrier, context=context, setter=setter)
122122

123123

124124
try:

opentelemetry-api/src/opentelemetry/propagators/composite.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ def __init__(
3535

3636
def extract(
3737
self,
38-
getter: textmap.Getter[textmap.TextMapPropagatorT],
39-
carrier: textmap.TextMapPropagatorT,
38+
carrier: textmap.CarrierT,
4039
context: typing.Optional[Context] = None,
40+
getter: textmap.Getter = textmap.default_getter,
4141
) -> Context:
4242
"""Run each of the configured propagators with the given context and carrier.
4343
Propagators are run in the order they are configured, if multiple
@@ -47,14 +47,14 @@ def extract(
4747
See `opentelemetry.propagators.textmap.TextMapPropagator.extract`
4848
"""
4949
for propagator in self._propagators:
50-
context = propagator.extract(getter, carrier, context)
50+
context = propagator.extract(carrier, context, getter=getter)
5151
return context # type: ignore
5252

5353
def inject(
5454
self,
55-
set_in_carrier: textmap.Setter[textmap.TextMapPropagatorT],
56-
carrier: textmap.TextMapPropagatorT,
55+
carrier: textmap.CarrierT,
5756
context: typing.Optional[Context] = None,
57+
setter: textmap.Setter = textmap.default_setter,
5858
) -> None:
5959
"""Run each of the configured propagators with the given context and carrier.
6060
Propagators are run in the order they are configured, if multiple
@@ -64,7 +64,7 @@ def inject(
6464
See `opentelemetry.propagators.textmap.TextMapPropagator.inject`
6565
"""
6666
for propagator in self._propagators:
67-
propagator.inject(set_in_carrier, carrier, context)
67+
propagator.inject(carrier, context, setter=setter)
6868

6969
@property
7070
def fields(self) -> typing.Set[str]:

opentelemetry-api/src/opentelemetry/propagators/textmap.py

+61-21
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,18 @@
1717

1818
from opentelemetry.context.context import Context
1919

20-
TextMapPropagatorT = typing.TypeVar("TextMapPropagatorT")
20+
CarrierT = typing.TypeVar("CarrierT")
2121
CarrierValT = typing.Union[typing.List[str], str]
2222

23-
Setter = typing.Callable[[TextMapPropagatorT, str, str], None]
2423

25-
26-
class Getter(typing.Generic[TextMapPropagatorT]):
24+
class Getter(abc.ABC):
2725
"""This class implements a Getter that enables extracting propagated
2826
fields from a carrier.
2927
"""
3028

29+
@abc.abstractmethod
3130
def get(
32-
self, carrier: TextMapPropagatorT, key: str
31+
self, carrier: CarrierT, key: str
3332
) -> typing.Optional[typing.List[str]]:
3433
"""Function that can retrieve zero
3534
or more values from the carrier. In the case that
@@ -42,9 +41,9 @@ def get(
4241
Returns: first value of the propagation key or None if the key doesn't
4342
exist.
4443
"""
45-
raise NotImplementedError()
4644

47-
def keys(self, carrier: TextMapPropagatorT) -> typing.List[str]:
45+
@abc.abstractmethod
46+
def keys(self, carrier: CarrierT) -> typing.List[str]:
4847
"""Function that can retrieve all the keys in a carrier object.
4948
5049
Args:
@@ -53,17 +52,33 @@ def keys(self, carrier: TextMapPropagatorT) -> typing.List[str]:
5352
Returns:
5453
list of keys from the carrier.
5554
"""
56-
raise NotImplementedError()
5755

5856

59-
class DictGetter(Getter[typing.Dict[str, CarrierValT]]):
60-
def get(
61-
self, carrier: typing.Dict[str, CarrierValT], key: str
57+
class Setter(abc.ABC):
58+
"""This class implements a Setter that enables injecting propagated
59+
fields into a carrier.
60+
"""
61+
62+
@abc.abstractmethod
63+
def set(self, carrier: CarrierT, key: str, value: str) -> None:
64+
"""Function that can set a value into a carrier""
65+
66+
Args:
67+
carrier: An object which contains values that are used to
68+
construct a Context.
69+
key: key of a field in carrier.
70+
value: value for a field in carrier.
71+
"""
72+
73+
74+
class DefaultGetter(Getter):
75+
def get( # type: ignore
76+
self, carrier: typing.Mapping[str, CarrierValT], key: str
6277
) -> typing.Optional[typing.List[str]]:
6378
"""Getter implementation to retrieve a value from a dictionary.
6479
6580
Args:
66-
carrier: dictionary in which header
81+
carrier: dictionary in which to get value
6782
key: the key used to get the value
6883
Returns:
6984
A list with a single string with the value if it exists, else None.
@@ -75,11 +90,36 @@ def get(
7590
return list(val)
7691
return [val]
7792

78-
def keys(self, carrier: typing.Dict[str, CarrierValT]) -> typing.List[str]:
93+
def keys( # type: ignore
94+
self, carrier: typing.Dict[str, CarrierValT]
95+
) -> typing.List[str]:
7996
"""Keys implementation that returns all keys from a dictionary."""
8097
return list(carrier.keys())
8198

8299

100+
default_getter = DefaultGetter()
101+
102+
103+
class DefaultSetter(Setter):
104+
def set( # type: ignore
105+
self,
106+
carrier: typing.MutableMapping[str, CarrierValT],
107+
key: str,
108+
value: CarrierValT,
109+
) -> None:
110+
"""Setter implementation to set a value into a dictionary.
111+
112+
Args:
113+
carrier: dictionary in which to set value
114+
key: the key used to set the value
115+
value: the value to set
116+
"""
117+
carrier[key] = value
118+
119+
120+
default_setter = DefaultSetter()
121+
122+
83123
class TextMapPropagator(abc.ABC):
84124
"""This class provides an interface that enables extracting and injecting
85125
context into headers of HTTP requests. HTTP frameworks and clients
@@ -92,9 +132,9 @@ class TextMapPropagator(abc.ABC):
92132
@abc.abstractmethod
93133
def extract(
94134
self,
95-
getter: Getter[TextMapPropagatorT],
96-
carrier: TextMapPropagatorT,
135+
carrier: CarrierT,
97136
context: typing.Optional[Context] = None,
137+
getter: Getter = default_getter,
98138
) -> Context:
99139
"""Create a Context from values in the carrier.
100140
@@ -120,25 +160,25 @@ def extract(
120160
@abc.abstractmethod
121161
def inject(
122162
self,
123-
set_in_carrier: Setter[TextMapPropagatorT],
124-
carrier: TextMapPropagatorT,
163+
carrier: CarrierT,
125164
context: typing.Optional[Context] = None,
165+
setter: Setter = default_setter,
126166
) -> None:
127167
"""Inject values from a Context into a carrier.
128168
129169
inject enables the propagation of values into HTTP clients or
130170
other objects which perform an HTTP request. Implementations
131-
should use the set_in_carrier method to set values on the
171+
should use the `Setter` 's set method to set values on the
132172
carrier.
133173
134174
Args:
135-
set_in_carrier: A setter function that can set values
136-
on the carrier.
137175
carrier: An object that a place to define HTTP headers.
138-
Should be paired with set_in_carrier, which should
176+
Should be paired with setter, which should
139177
know how to set header values on the carrier.
140178
context: an optional Context to use. Defaults to current
141179
context if not set.
180+
setter: An optional `Setter` object that can set values
181+
on the carrier.
142182
143183
"""
144184

0 commit comments

Comments
 (0)