Skip to content

Commit 50f5c6c

Browse files
authored
Add fields property (#1374)
1 parent d202895 commit 50f5c6c

File tree

13 files changed

+172
-9
lines changed

13 files changed

+172
-9
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: bcec49cf2eccf8da66c9e63b9836ea8a20516efc
13+
CONTRIB_REPO_SHA: e1d4eeb951694afebb1767b4ea8f593753d894e3
1414

1515
jobs:
1616
build:

opentelemetry-api/CHANGELOG.md

+9-3
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,24 @@
22

33
## Unreleased
44

5+
- Add `fields` to propagators
6+
([#1374](https://github.com/open-telemetry/opentelemetry-python/pull/1374))
7+
58
## Version 0.16b0
69

710
Released 2020-11-25
811

9-
- Add optional parameter to `record_exception` method ([#1314](https://github.com/open-telemetry/opentelemetry-python/pull/1314))
10-
- Add pickle support to SpanContext class ([#1380](https://github.com/open-telemetry/opentelemetry-python/pull/1380))
12+
- Add optional parameter to `record_exception` method
13+
([#1314](https://github.com/open-telemetry/opentelemetry-python/pull/1314))
14+
- Add pickle support to SpanContext class
15+
([#1380](https://github.com/open-telemetry/opentelemetry-python/pull/1380))
1116

1217
## Version 0.15b0
1318

1419
Released 2020-11-02
1520

16-
- Updating status codes to adhere to specs ([#1282](https://github.com/open-telemetry/opentelemetry-python/pull/1282))
21+
- Updating status codes to adhere to specs
22+
([#1282](https://github.com/open-telemetry/opentelemetry-python/pull/1282))
1723

1824
## Version 0.14b0
1925

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

+5
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ 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+
return {self._BAGGAGE_HEADER_NAME}
94+
9095

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

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

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

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

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

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

+33-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({}, "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-api/tests/trace/propagation/test_tracecontexthttptextformat.py

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

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

1819
from opentelemetry import trace
1920
from opentelemetry.trace.propagation import tracecontext
@@ -232,7 +233,8 @@ def test_tracestate_keys(self):
232233
carrier_getter,
233234
{
234235
"traceparent": [
235-
"00-12345678901234567890123456789012-1234567890123456-00"
236+
"00-12345678901234567890123456789012-"
237+
"1234567890123456-00"
236238
],
237239
"tracestate": [tracestate_value],
238240
},
@@ -248,3 +250,33 @@ def test_tracestate_keys(self):
248250
self.assertEqual(
249251
span.get_span_context().trace_state["foo-_*/bar"], "bar4"
250252
)
253+
254+
@patch("opentelemetry.trace.INVALID_SPAN_CONTEXT")
255+
@patch("opentelemetry.trace.get_current_span")
256+
def test_fields(self, mock_get_current_span, mock_invalid_span_context):
257+
258+
mock_get_current_span.configure_mock(
259+
return_value=Mock(
260+
**{
261+
"get_span_context.return_value": Mock(
262+
**{
263+
"trace_id": 1,
264+
"span_id": 2,
265+
"trace_flags": 3,
266+
"trace_state": {"a": "b"},
267+
}
268+
)
269+
}
270+
)
271+
)
272+
273+
mock_set_in_carrier = Mock()
274+
275+
FORMAT.inject(mock_set_in_carrier, {})
276+
277+
inject_fields = set()
278+
279+
for mock_call in mock_set_in_carrier.mock_calls:
280+
inject_fields.add(mock_call[1][1])
281+
282+
self.assertEqual(inject_fields, FORMAT.fields)

opentelemetry-sdk/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
- Add meter reference to observers
66
([#1425](https://github.com/open-telemetry/opentelemetry-python/pull/1425))
7+
- Add `fields` to propagators
8+
([#1374](https://github.com/open-telemetry/opentelemetry-python/pull/1374))
79

810
## Version 0.16b0
911

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

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

+19-1
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
@@ -337,3 +337,21 @@ def setter(carrier, key, value):
337337

338338
ctx = FORMAT.extract(CarrierGetter(), {})
339339
FORMAT.inject(setter, {}, ctx)
340+
341+
def test_fields(self):
342+
"""Make sure the fields attribute returns the fields used in inject"""
343+
344+
tracer = trace.TracerProvider().get_tracer("sdk_tracer_provider")
345+
346+
mock_set_in_carrier = Mock()
347+
348+
with tracer.start_as_current_span("parent"):
349+
with tracer.start_as_current_span("child"):
350+
FORMAT.inject(mock_set_in_carrier, {})
351+
352+
inject_fields = set()
353+
354+
for call in mock_set_in_carrier.mock_calls:
355+
inject_fields.add(call[1][1])
356+
357+
self.assertEqual(FORMAT.fields, inject_fields)

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

+8
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)