Skip to content

Commit 3c6583d

Browse files
committed
Remove setters and getters
Fixes open-telemetry#1644
1 parent c81fd5e commit 3c6583d

File tree

9 files changed

+355
-479
lines changed

9 files changed

+355
-479
lines changed

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

+39-52
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,27 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14-
#
15-
import typing
16-
import urllib.parse
14+
15+
from typing import Optional, Set
16+
from urllib.parse import unquote, quote_plus
1717

1818
from opentelemetry import baggage
1919
from opentelemetry.context import get_current
2020
from opentelemetry.context.context import Context
21-
from opentelemetry.propagators import textmap
21+
from opentelemetry.propagators.textmap import (
22+
TextMapPropagator, TextMapPropagatorT
23+
)
2224

2325

24-
class W3CBaggagePropagator(textmap.TextMapPropagator):
26+
class W3CBaggagePropagator(TextMapPropagator):
2527
"""Extracts and injects Baggage which is used to annotate telemetry."""
2628

27-
_MAX_HEADER_LENGTH = 8192
28-
_MAX_PAIR_LENGTH = 4096
29-
_MAX_PAIRS = 180
30-
_BAGGAGE_HEADER_NAME = "baggage"
29+
_baggage_header_name = "baggage"
3130

3231
def extract(
3332
self,
34-
getter: textmap.Getter[textmap.TextMapPropagatorT],
35-
carrier: textmap.TextMapPropagatorT,
36-
context: typing.Optional[Context] = None,
33+
carrier: TextMapPropagatorT,
34+
context: Optional[Context] = None,
3735
) -> Context:
3836
"""Extract Baggage from the carrier.
3937
@@ -44,67 +42,56 @@ def extract(
4442
if context is None:
4543
context = get_current()
4644

47-
header = _extract_first_element(
48-
getter.get(carrier, self._BAGGAGE_HEADER_NAME)
49-
)
45+
value = carrier.get(self._baggage_header_name)
46+
47+
if value is None:
48+
header = None
49+
else:
50+
header = next(iter(value), None)
5051

51-
if not header or len(header) > self._MAX_HEADER_LENGTH:
52+
# 8192 is the maximum header length
53+
if header is None or len(header) > 8192:
5254
return context
5355

54-
baggage_entries = header.split(",")
55-
total_baggage_entries = self._MAX_PAIRS
56-
for entry in baggage_entries:
56+
# 180 is the maximum amount of pairs
57+
total_baggage_entries = 180
58+
59+
for entry in header.split(","):
5760
if total_baggage_entries <= 0:
5861
return context
5962
total_baggage_entries -= 1
60-
if len(entry) > self._MAX_PAIR_LENGTH:
63+
# 4096 is the maximum pair length
64+
if len(entry) > 4096:
6165
continue
62-
try:
66+
if "=" in entry:
6367
name, value = entry.split("=", 1)
64-
except Exception: # pylint: disable=broad-except
65-
continue
66-
context = baggage.set_baggage(
67-
urllib.parse.unquote(name).strip(),
68-
urllib.parse.unquote(value).strip(),
69-
context=context,
70-
)
68+
context = baggage.set_baggage(
69+
unquote(name).strip(),
70+
unquote(value).strip(),
71+
context=context,
72+
)
7173

7274
return context
7375

7476
def inject(
7577
self,
76-
set_in_carrier: textmap.Setter[textmap.TextMapPropagatorT],
77-
carrier: textmap.TextMapPropagatorT,
78-
context: typing.Optional[Context] = None,
78+
carrier: TextMapPropagatorT,
79+
context: Optional[Context] = None,
7980
) -> None:
8081
"""Injects Baggage into the carrier.
8182
8283
See
8384
`opentelemetry.propagators.textmap.TextMapPropagator.inject`
8485
"""
8586
baggage_entries = baggage.get_all(context=context)
86-
if not baggage_entries:
87-
return
8887

89-
baggage_string = _format_baggage(baggage_entries)
90-
set_in_carrier(carrier, self._BAGGAGE_HEADER_NAME, baggage_string)
88+
if baggage_entries:
89+
carrier[self._baggage_header_name] = ",".join(
90+
key + "=" + quote_plus(str(value))
91+
for key, value in baggage_entries.items()
92+
)
9193

9294
@property
93-
def fields(self) -> typing.Set[str]:
95+
def fields(self) -> Set[str]:
9496
"""Returns a set with the fields set in `inject`."""
95-
return {self._BAGGAGE_HEADER_NAME}
96-
97-
98-
def _format_baggage(baggage_entries: typing.Mapping[str, object]) -> str:
99-
return ",".join(
100-
key + "=" + urllib.parse.quote_plus(str(value))
101-
for key, value in baggage_entries.items()
102-
)
103-
104-
105-
def _extract_first_element(
106-
items: typing.Optional[typing.Iterable[textmap.TextMapPropagatorT]],
107-
) -> typing.Optional[textmap.TextMapPropagatorT]:
108-
if items is None:
109-
return None
110-
return next(iter(items), None)
97+
return {self._baggage_header_name}

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

+23-35
Original file line numberDiff line numberDiff line change
@@ -40,23 +40,12 @@
4040
PROPAGATOR = propagators.get_global_textmap()
4141
4242
43-
def get_header_from_flask_request(request, key):
44-
return request.headers.get_all(key)
45-
46-
def set_header_into_requests_request(request: requests.Request,
47-
key: str, value: str):
48-
request.headers[key] = value
49-
5043
def example_route():
51-
context = PROPAGATOR.extract(
52-
get_header_from_flask_request,
53-
flask.request
54-
)
44+
context = PROPAGATOR.extract(flask.request)
5545
request_to_downstream = requests.Request(
5646
"GET", "http://httpbin.org/get"
5747
)
5848
PROPAGATOR.inject(
59-
set_header_into_requests_request,
6049
request_to_downstream,
6150
context=context
6251
)
@@ -68,23 +57,26 @@ def example_route():
6857
https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/context/api-propagators.md
6958
"""
7059

71-
import typing
60+
from typing import Optional
7261
from logging import getLogger
7362
from os import environ
7463

7564
from pkg_resources import iter_entry_points
7665

7766
from opentelemetry.context.context import Context
7867
from opentelemetry.environment_variables import OTEL_PROPAGATORS
79-
from opentelemetry.propagators import composite, textmap
68+
from opentelemetry.propagators import composite
69+
from opentelemetry.propagators.textmap import (
70+
TextMapPropagator, TextMapPropagatorT
71+
)
72+
8073

81-
logger = getLogger(__name__)
74+
_logger = getLogger(__name__)
8275

8376

8477
def extract(
85-
getter: textmap.Getter[textmap.TextMapPropagatorT],
86-
carrier: textmap.TextMapPropagatorT,
87-
context: typing.Optional[Context] = None,
78+
carrier: TextMapPropagatorT,
79+
context: Optional[Context] = None,
8880
) -> Context:
8981
"""Uses the configured propagator to extract a Context from the carrier.
9082
@@ -99,26 +91,22 @@ def extract(
9991
context: an optional Context to use. Defaults to current
10092
context if not set.
10193
"""
102-
return get_global_textmap().extract(getter, carrier, context)
94+
return get_global_textmap().extract(carrier, context)
10395

10496

10597
def inject(
106-
set_in_carrier: textmap.Setter[textmap.TextMapPropagatorT],
107-
carrier: textmap.TextMapPropagatorT,
108-
context: typing.Optional[Context] = None,
98+
carrier: TextMapPropagatorT,
99+
context: Optional[Context] = None,
109100
) -> None:
110101
"""Uses the configured propagator to inject a Context into the carrier.
111102
112103
Args:
113-
set_in_carrier: A setter function that can set values
114-
on the carrier.
115-
carrier: An object that contains a representation of HTTP
116-
headers. Should be paired with set_in_carrier, which
117-
should know how to set header values on the carrier.
104+
carrier: A dict-like object that contains a representation of HTTP
105+
headers.
118106
context: an optional Context to use. Defaults to current
119107
context if not set.
120108
"""
121-
get_global_textmap().inject(set_in_carrier, carrier, context)
109+
get_global_textmap().inject(carrier, context)
122110

123111

124112
try:
@@ -138,16 +126,16 @@ def inject(
138126
)
139127

140128
except Exception: # pylint: disable=broad-except
141-
logger.exception("Failed to load configured propagators")
129+
_logger.error("Failed to load configured propagators")
142130
raise
143131

144-
_HTTP_TEXT_FORMAT = composite.CompositeHTTPPropagator(propagators) # type: ignore
132+
_textmap_propagator = composite.CompositeHTTPPropagator(propagators) # type: ignore
145133

146134

147-
def get_global_textmap() -> textmap.TextMapPropagator:
148-
return _HTTP_TEXT_FORMAT
135+
def get_global_textmap() -> TextMapPropagator:
136+
return _textmap_propagator
149137

150138

151-
def set_global_textmap(http_text_format: textmap.TextMapPropagator,) -> None:
152-
global _HTTP_TEXT_FORMAT # pylint:disable=global-statement
153-
_HTTP_TEXT_FORMAT = http_text_format # type: ignore
139+
def set_global_textmap(http_text_format: TextMapPropagator,) -> None:
140+
global _textmap_propagator # pylint:disable=global-statement
141+
_textmap_propagator = http_text_format # type: ignore

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

+24-22
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,19 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14-
import logging
15-
import typing
14+
15+
from logging import getLogger
16+
from typing import Optional, Set, Sequence
1617

1718
from opentelemetry.context.context import Context
18-
from opentelemetry.propagators import textmap
19+
from opentelemetry.propagators.textmap import (
20+
TextMapPropagator, TextMapPropagatorT
21+
)
1922

20-
logger = logging.getLogger(__name__)
23+
_logger = getLogger(__name__)
2124

2225

23-
class CompositeHTTPPropagator(textmap.TextMapPropagator):
26+
class CompositeHTTPPropagator(TextMapPropagator):
2427
"""CompositeHTTPPropagator provides a mechanism for combining multiple
2528
propagators into a single one.
2629
@@ -29,45 +32,44 @@ class CompositeHTTPPropagator(textmap.TextMapPropagator):
2932
"""
3033

3134
def __init__(
32-
self, propagators: typing.Sequence[textmap.TextMapPropagator]
35+
self, propagators: Sequence[TextMapPropagator]
3336
) -> None:
3437
self._propagators = propagators
3538

3639
def extract(
3740
self,
38-
getter: textmap.Getter[textmap.TextMapPropagatorT],
39-
carrier: textmap.TextMapPropagatorT,
40-
context: typing.Optional[Context] = None,
41+
carrier: TextMapPropagatorT,
42+
context: Optional[Context] = None,
4143
) -> Context:
42-
"""Run each of the configured propagators with the given context and carrier.
44+
"""Run each of the configured propagators with the given context and
45+
carrier.
4346
Propagators are run in the order they are configured, if multiple
44-
propagators write the same context key, the propagator later in the list
45-
will override previous propagators.
47+
propagators write the same context key, the last propagator that writes
48+
the context key will override previous propagators.
4649
4750
See `opentelemetry.propagators.textmap.TextMapPropagator.extract`
4851
"""
4952
for propagator in self._propagators:
50-
context = propagator.extract(getter, carrier, context)
53+
context = propagator.extract(carrier, context)
5154
return context # type: ignore
5255

5356
def inject(
5457
self,
55-
set_in_carrier: textmap.Setter[textmap.TextMapPropagatorT],
56-
carrier: textmap.TextMapPropagatorT,
57-
context: typing.Optional[Context] = None,
58+
carrier: TextMapPropagatorT,
59+
context: Optional[Context] = None,
5860
) -> None:
59-
"""Run each of the configured propagators with the given context and carrier.
60-
Propagators are run in the order they are configured, if multiple
61-
propagators write the same carrier key, the propagator later in the list
62-
will override previous propagators.
61+
"""Run each of the configured propagators with the given context and
62+
carrier. Propagators are run in the order they are configured, if
63+
multiple propagators write the same carrier key, the last propagator
64+
that writes the carrier key will override previous propagators.
6365
6466
See `opentelemetry.propagators.textmap.TextMapPropagator.inject`
6567
"""
6668
for propagator in self._propagators:
67-
propagator.inject(set_in_carrier, carrier, context)
69+
propagator.inject(carrier, context)
6870

6971
@property
70-
def fields(self) -> typing.Set[str]:
72+
def fields(self) -> Set[str]:
7173
"""Returns a set with the fields set in `inject`.
7274
7375
See

0 commit comments

Comments
 (0)