Skip to content

Commit f630760

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

File tree

8 files changed

+126
-3
lines changed

8 files changed

+126
-3
lines changed

Diff for: opentelemetry-api/src/opentelemetry/baggage/propagation/__init__.py

+9
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(

Diff for: opentelemetry-api/src/opentelemetry/propagators/composite.py

+15
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

Diff for: opentelemetry-api/src/opentelemetry/trace/propagation/textmap.py

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

Diff for: opentelemetry-api/src/opentelemetry/trace/propagation/tracecontext.py

+11
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,17 @@ 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 {
143+
self._TRACEPARENT_HEADER_NAME, self._TRACESTATE_HEADER_NAME
144+
}
145+
135146

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

Diff for: opentelemetry-api/tests/baggage/test_baggage_propagation.py

+16-1
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 patch, Mock
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.args[1])
158+
159+
self.assertEqual(inject_fields, self.propagator.fields)

Diff for: opentelemetry-api/tests/propagators/test_composite.py

+35-2
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(None, "inject_field_{}_0".format(name), None)
30+
setter(None, "inject_field_{}_1".format(name), None)
2931

3032
return wrapped
3133

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

4143

44+
def mock_fields(name):
45+
return {
46+
"inject_field_{}_0".format(name), "inject_field_{}_1".format(name)
47+
}
48+
49+
4250
class TestCompositePropagator(unittest.TestCase):
4351
@classmethod
4452
def setUpClass(cls):
4553
cls.mock_propagator_0 = Mock(
46-
inject=mock_inject("mock-0"), extract=mock_extract("mock-0")
54+
inject=mock_inject("mock-0"),
55+
extract=mock_extract("mock-0"),
56+
fields=mock_fields("mock-0"),
4757
)
4858
cls.mock_propagator_1 = Mock(
49-
inject=mock_inject("mock-1"), extract=mock_extract("mock-1")
59+
inject=mock_inject("mock-1"),
60+
extract=mock_extract("mock-1"),
61+
fields=mock_fields("mock-1"),
5062
)
5163
cls.mock_propagator_2 = Mock(
5264
inject=mock_inject("mock-0", value="data2"),
5365
extract=mock_extract("mock-0", value="context2"),
66+
fields=mock_fields("mock-0"),
5467
)
5568

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

Diff for: opentelemetry-sdk/src/opentelemetry/sdk/trace/propagation/b3_format.py

+9
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."""

Diff for: opentelemetry-sdk/tests/trace/propagation/test_b3_format.py

+19
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import unittest
1616
from unittest.mock import patch
17+
from unittest.mock import Mock
1718

1819
import opentelemetry.sdk.trace as trace
1920
import opentelemetry.sdk.trace.propagation.b3_format as b3_format
@@ -329,3 +330,21 @@ def setter(carrier, key, value):
329330

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

0 commit comments

Comments
 (0)