open-telemetry / open-telemetry/opentelemetry-python

opentelemetry-propagator-b3 doesn't allow the receiver to make sampling decision when X-B3-Sampled header is absent

Open
#4,793 0 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
Python
Stars
2.6k
Forks
1k
Avg merge
4d 15h
Merged PRs (30d)
19

Description

Here is the pull request: #4794

Describe your environment

OS: ALL (Ubuntu, OS X, etc.)
Python version: ALL Python 3x - Python 3.9 and later.
Package version: 1.37.0

What happened?

opentelemetry-propagator-b3 doesn't allow the receiver to make sampling decision when X-B3-Sampled header is absent.

The Zipkin/B3 protocol - https://github.com/openzipkin/b3-propagation - leaves the sampling decision up to the receiver whenever it doesn't receive the "X-B3-Sampled" HTTP header:

An accept sampling decision is encoded as X-B3-Sampled: 1 and a deny as X-B3-Sampled: 0. Absent means defer the decision to the receiver of this header.

However, opentelemetry-propagator-b3 incorrectly hard-codes absent "X-B3-Sampled" as if "X-B3-Sampled: 0", not giving the application an opportunity to make this decision. The class B3MultiFormat does not provide the means for an application to specify it's preference for the default behavior when "X-B3-Sampled" is not received

Steps to Reproduce

Instantiate B3MultiFormat and observe that the class does't offer any parameters or alternate mechanism to specify the default behavior in the event that explicit sampling state (e.g. "X-B3-Sampled") is absent from carrier.

Expected Result

A mechanism in B3MultiFormat to allow the application to decide the desired sampled state in the event that "X-B3-Sampled" is not received.

Actual Result

B3MultiFormat always drops the received "X-B3-TraceId" and "X-B3-SpanId" whenever "X-B3-Sampled" is not received.

This contradicts the Zipkin/B3 protocol specification which explicitly leaves the sampling decision up to the receiver whenever it doesn't receive the "X-B3-Sampled" HTTP header:

An accept sampling decision is encoded as X-B3-Sampled: 1 and a deny as X-B3-Sampled: 0. Absent means defer the decision to the receiver of this header.

Additional context
Would you like to implement a fix?

Yes: Here is the pull request: #4794

Tip

React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding +1 or me too, to help us triage it. Learn more here.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at the B3MultiFormat class and trace how extraction handles a carrier without the X-B3-Sampled header. The change is complete when an application can choose the receiver's default sampling decision while explicit B3 sampling values retain their existing behavior; the issue references pull request #4794.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
distributed-systems
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.