Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d75fb17

Browse files
authored
Added B3 single-header propagator (open-telemetry#1823)
1 parent 271f015 commit d75fb17

File tree

4 files changed

+256
-132
lines changed

4 files changed

+256
-132
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1313
### Added
1414
- Added example for running Django with auto instrumentation.
1515
([#1803](https://github.com/open-telemetry/opentelemetry-python/pull/1803))
16+
- Added `B3SingleFormat` and `B3MultiFormat` propagators to the `opentelemetry-propagator-b3` package.
17+
([#1823](https://github.com/open-telemetry/opentelemetry-python/pull/1823))
1618
- Added support for OTEL_SERVICE_NAME.
1719
([#1829](https://github.com/open-telemetry/opentelemetry-python/pull/1829))
1820

@@ -24,6 +26,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2426
- Propagators use the root context as default for `extract` and do not modify
2527
the context if extracting from carrier does not work.
2628
([#1811](https://github.com/open-telemetry/opentelemetry-python/pull/1811))
29+
- Fixed `b3` propagator entrypoint to point to `B3SingleFormat` propagator.
30+
([#1823](https://github.com/open-telemetry/opentelemetry-python/pull/1823))
31+
- Added `b3multi` propagator entrypoint to point to `B3MultiFormat` propagator.
32+
([#1823](https://github.com/open-telemetry/opentelemetry-python/pull/1823))
2733
- Improve warning when failing to decode byte attribute
2834
([#1810](https://github.com/open-telemetry/opentelemetry-python/pull/1810))
2935
- Fixed inconsistency in parent_id formatting from the ConsoleSpanExporter

propagator/opentelemetry-propagator-b3/setup.cfg

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ package_dir=
4141
packages=find_namespace:
4242
install_requires =
4343
opentelemetry-api == 1.2.0.dev0
44+
deprecated >= 1.2.6
4445

4546
[options.extras_require]
4647
test =
@@ -50,4 +51,5 @@ where = src
5051

5152
[options.entry_points]
5253
opentelemetry_propagator =
53-
b3 = opentelemetry.propagators.b3:B3Format
54+
b3 = opentelemetry.propagators.b3:B3SingleFormat
55+
b3multi = opentelemetry.propagators.b3:B3MultiFormat

propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/__init__.py

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import typing
1616
from re import compile as re_compile
1717

18+
from deprecated import deprecated
19+
1820
import opentelemetry.trace as trace
1921
from opentelemetry.context import Context
2022
from opentelemetry.propagators.textmap import (
@@ -28,10 +30,11 @@
2830
from opentelemetry.trace import format_span_id, format_trace_id
2931

3032

31-
class B3Format(TextMapPropagator):
32-
"""Propagator for the B3 HTTP header format.
33+
class B3MultiFormat(TextMapPropagator):
34+
"""Propagator for the B3 HTTP multi-header format.
3335
3436
See: https://github.com/openzipkin/b3-propagation
37+
https://github.com/openzipkin/b3-propagation#multiple-headers
3538
"""
3639

3740
SINGLE_HEADER_KEY = "b3"
@@ -165,6 +168,53 @@ def fields(self) -> typing.Set[str]:
165168
}
166169

167170

171+
class B3SingleFormat(B3MultiFormat):
172+
"""Propagator for the B3 HTTP single-header format.
173+
174+
See: https://github.com/openzipkin/b3-propagation
175+
https://github.com/openzipkin/b3-propagation#single-header
176+
"""
177+
178+
def inject(
179+
self,
180+
carrier: CarrierT,
181+
context: typing.Optional[Context] = None,
182+
setter: Setter = default_setter,
183+
) -> None:
184+
span = trace.get_current_span(context=context)
185+
186+
span_context = span.get_span_context()
187+
if span_context == trace.INVALID_SPAN_CONTEXT:
188+
return
189+
190+
sampled = (trace.TraceFlags.SAMPLED & span_context.trace_flags) != 0
191+
192+
fields = [
193+
format_trace_id(span_context.trace_id),
194+
format_span_id(span_context.span_id),
195+
"1" if sampled else "0",
196+
]
197+
198+
span_parent = getattr(span, "parent", None)
199+
if span_parent:
200+
fields.append(format_span_id(span_parent.span_id))
201+
202+
setter.set(carrier, self.SINGLE_HEADER_KEY, "-".join(fields))
203+
204+
@property
205+
def fields(self) -> typing.Set[str]:
206+
return {self.SINGLE_HEADER_KEY}
207+
208+
209+
class B3Format(B3MultiFormat):
210+
@deprecated(
211+
version="1.2.0",
212+
reason="B3Format is deprecated in favor of B3MultiFormat",
213+
)
214+
def __init__(self, *args, **kwargs):
215+
super().__init__(*args, **kwargs)
216+
217+
168218
def _extract_first_element(
169219
items: typing.Iterable[CarrierT],
170220
) -> typing.Optional[CarrierT]:

0 commit comments

Comments
 (0)