Skip to content

Commit cba1c06

Browse files
committed
Add fields property
Fixes #1104
1 parent 2701445 commit cba1c06

File tree

12 files changed

+137
-4
lines changed

12 files changed

+137
-4
lines changed

opentelemetry-api/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Unreleased
44

5+
- Add `fields` to propagators ([#1374](https://github.com/open-telemetry/opentelemetry-python/pull/1374))
56
- Add optional parameter to `record_exception` method ([#1314](https://github.com/open-telemetry/opentelemetry-python/pull/1314))
67

78
## Version 0.15b0

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,15 @@ def inject(
8787
baggage_string = _format_baggage(baggage_entries)
8888
set_in_carrier(carrier, self._BAGGAGE_HEADER_NAME, baggage_string)
8989

90+
@property
91+
def fields(self) -> typing.Set[str]:
92+
"""Returns a set with the fields set in `inject`.
93+
94+
See
95+
`opentelemetry.trace.propagation.textmap.TextMapPropagator.fields`
96+
"""
97+
return {self._BAGGAGE_HEADER_NAME}
98+
9099

91100
def _format_baggage(baggage_entries: typing.Mapping[str, object]) -> str:
92101
return ",".join(

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,18 @@ def inject(
6565
"""
6666
for propagator in self._propagators:
6767
propagator.inject(set_in_carrier, carrier, context)
68+
69+
@property
70+
def fields(self) -> typing.Set[str]:
71+
"""Returns a set with the fields set in `inject`.
72+
73+
See
74+
`opentelemetry.trace.propagation.textmap.TextMapPropagator.fields`
75+
"""
76+
composite_fields = set()
77+
78+
for propagator in self._propagators:
79+
for field in propagator.fields:
80+
composite_fields.add(field)
81+
82+
return composite_fields

opentelemetry-api/src/opentelemetry/trace/propagation/textmap.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,16 @@ def inject(
129129
context if not set.
130130
131131
"""
132+
133+
@property
134+
@abc.abstractmethod
135+
def fields(self) -> typing.Set[str]:
136+
"""
137+
Gets the fields set in the carrier by the `inject` method.
138+
139+
If the carrier is reused, its fields that correspond with the ones
140+
present in this attribute should be deleted before calling `inject`.
141+
142+
Returns:
143+
A set with the fields set in `inject`.
144+
"""

opentelemetry-api/src/opentelemetry/trace/propagation/tracecontext.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,15 @@ def inject(
132132
carrier, self._TRACESTATE_HEADER_NAME, tracestate_string
133133
)
134134

135+
@property
136+
def fields(self) -> typing.Set[str]:
137+
"""Returns a set with the fields set in `inject`.
138+
139+
See
140+
`opentelemetry.trace.propagation.textmap.TextMapPropagator.fields`
141+
"""
142+
return {self._TRACEPARENT_HEADER_NAME, self._TRACESTATE_HEADER_NAME}
143+
135144

136145
def _parse_tracestate(header_list: typing.List[str]) -> trace.TraceState:
137146
"""Parse one or more w3c tracestate header into a TraceState.

opentelemetry-api/tests/baggage/test_baggage_propagation.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
#
15-
import typing
1615
import unittest
16+
from unittest.mock import Mock, patch
1717

1818
from opentelemetry import baggage
1919
from opentelemetry.baggage.propagation import BaggagePropagator
@@ -142,3 +142,18 @@ def test_inject_non_string_values(self):
142142
self.assertIn("key1=True", output)
143143
self.assertIn("key2=123", output)
144144
self.assertIn("key3=123.567", output)
145+
146+
@patch("opentelemetry.baggage.propagation.baggage")
147+
@patch("opentelemetry.baggage.propagation._format_baggage")
148+
def test_fields(self, mock_format_baggage, mock_baggage):
149+
150+
mock_set_in_carrier = Mock()
151+
152+
self.propagator.inject(mock_set_in_carrier, {})
153+
154+
inject_fields = set()
155+
156+
for mock_call in mock_set_in_carrier.mock_calls:
157+
inject_fields.add(mock_call[1][1])
158+
159+
self.assertEqual(inject_fields, self.propagator.fields)

opentelemetry-api/tests/propagators/test_composite.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ def get_as_list(dict_object, key):
2626
def mock_inject(name, value="data"):
2727
def wrapped(setter, carrier=None, context=None):
2828
carrier[name] = value
29+
setter({}, "inject_field_{}_0".format(name), None)
30+
setter({}, "inject_field_{}_1".format(name), None)
2931

3032
return wrapped
3133

@@ -39,18 +41,27 @@ def wrapped(getter, carrier=None, context=None):
3941
return wrapped
4042

4143

44+
def mock_fields(name):
45+
return {"inject_field_{}_0".format(name), "inject_field_{}_1".format(name)}
46+
47+
4248
class TestCompositePropagator(unittest.TestCase):
4349
@classmethod
4450
def setUpClass(cls):
4551
cls.mock_propagator_0 = Mock(
46-
inject=mock_inject("mock-0"), extract=mock_extract("mock-0")
52+
inject=mock_inject("mock-0"),
53+
extract=mock_extract("mock-0"),
54+
fields=mock_fields("mock-0"),
4755
)
4856
cls.mock_propagator_1 = Mock(
49-
inject=mock_inject("mock-1"), extract=mock_extract("mock-1")
57+
inject=mock_inject("mock-1"),
58+
extract=mock_extract("mock-1"),
59+
fields=mock_fields("mock-1"),
5060
)
5161
cls.mock_propagator_2 = Mock(
5262
inject=mock_inject("mock-0", value="data2"),
5363
extract=mock_extract("mock-0", value="context2"),
64+
fields=mock_fields("mock-0"),
5465
)
5566

5667
def test_no_propagators(self):
@@ -105,3 +116,23 @@ def test_multiple_propagators_same_key(self):
105116
get_as_list, carrier=new_carrier, context={}
106117
)
107118
self.assertEqual(context, {"mock-0": "context2"})
119+
120+
def test_fields(self):
121+
propagator = CompositeHTTPPropagator(
122+
[
123+
self.mock_propagator_0,
124+
self.mock_propagator_1,
125+
self.mock_propagator_2,
126+
]
127+
)
128+
129+
mock_set_in_carrier = Mock()
130+
131+
propagator.inject(mock_set_in_carrier, {})
132+
133+
inject_fields = set()
134+
135+
for mock_call in mock_set_in_carrier.mock_calls:
136+
inject_fields.add(mock_call[1][1])
137+
138+
self.assertEqual(inject_fields, propagator.fields)

opentelemetry-sdk/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Unreleased
44

5+
- Add `fields` to propagators ([#1374](https://github.com/open-telemetry/opentelemetry-python/pull/1374))
56
- Add optional parameter to `record_exception` method ([#1314](https://github.com/open-telemetry/opentelemetry-python/pull/1314))
67

78
## Version 0.15b0

opentelemetry-sdk/src/opentelemetry/sdk/trace/propagation/b3_format.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,15 @@ def inject(
152152
)
153153
set_in_carrier(carrier, self.SAMPLED_KEY, "1" if sampled else "0")
154154

155+
@property
156+
def fields(self) -> typing.Set[str]:
157+
return {
158+
self.TRACE_ID_KEY,
159+
self.SPAN_ID_KEY,
160+
self.PARENT_SPAN_ID_KEY,
161+
self.SAMPLED_KEY,
162+
}
163+
155164

156165
def format_trace_id(trace_id: int) -> str:
157166
"""Format the trace id according to b3 specification."""

opentelemetry-sdk/tests/trace/propagation/test_b3_format.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# limitations under the License.
1414

1515
import unittest
16-
from unittest.mock import patch
16+
from unittest.mock import Mock, patch
1717

1818
import opentelemetry.sdk.trace as trace
1919
import opentelemetry.sdk.trace.propagation.b3_format as b3_format
@@ -329,3 +329,21 @@ def setter(carrier, key, value):
329329

330330
ctx = FORMAT.extract(CarrierGetter(), {})
331331
FORMAT.inject(setter, {}, ctx)
332+
333+
def test_fields(self):
334+
"""Make sure the fields attribute returns the fields used in inject"""
335+
336+
tracer = trace.TracerProvider().get_tracer("sdk_tracer_provider")
337+
338+
mock_set_in_carrier = Mock()
339+
340+
with tracer.start_as_current_span("parent"):
341+
with tracer.start_as_current_span("child"):
342+
FORMAT.inject(mock_set_in_carrier, {})
343+
344+
inject_fields = set()
345+
346+
for call in mock_set_in_carrier.mock_calls:
347+
inject_fields.add(call.args[1])
348+
349+
self.assertEqual(FORMAT.fields, inject_fields)

tato.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
tato = {1, 2, 4, 3}
2+
3+
for tat in tato:
4+
print(tat)

tests/util/src/opentelemetry/test/mock_textmap.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ def inject(
4747
) -> None:
4848
return None
4949

50+
@property
51+
def fields(self):
52+
return set()
53+
5054

5155
class MockTextMapPropagator(TextMapPropagator):
5256
"""Mock propagator for testing purposes."""
@@ -89,3 +93,7 @@ def inject(
8993
set_in_carrier(
9094
carrier, self.SPAN_ID_KEY, str(span.get_span_context().span_id)
9195
)
96+
97+
@property
98+
def fields(self):
99+
return {self.TRACE_ID_KEY, self.SPAN_ID_KEY}

0 commit comments

Comments
 (0)