Skip to content
This repository was archived by the owner on Sep 17, 2025. It is now read-only.

Commit fbbe9c5

Browse files
authored
Update the should_sample logic for tracer (#166)
1 parent 6515aad commit fbbe9c5

3 files changed

Lines changed: 46 additions & 10 deletions

File tree

opencensus/trace/trace_options.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,14 @@ def get_enabled(self):
5959
enabled = bool(int(self.trace_options_byte) & _ENABLED_BITMASK)
6060

6161
return enabled
62+
63+
def set_enabled(self, enabled):
64+
"""Update the last bit of the trace options byte str.
65+
66+
:type enabled: bool
67+
:param enabled: Whether enable tracing in this span context or not.
68+
"""
69+
enabled_bit = '1' if enabled else '0'
70+
self.trace_options_byte = str(
71+
self.trace_options_byte)[:-1] + enabled_bit
72+
self.enabled = self.get_enabled

opencensus/trace/tracer.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,20 +67,21 @@ def __init__(
6767

6868
def should_sample(self):
6969
"""Determine whether to sample this request or not.
70-
If the context forces not tracing, just set enabled to False.
71-
Else follow the sampler.
70+
If the context enables tracing, return True.
71+
Else follow the decision of the sampler.
7272
7373
:rtype: bool
7474
:returns: Whether to trace the request or not.
7575
"""
7676
return self.span_context.trace_options.enabled \
77-
and self.sampler.should_sample(self.span_context.trace_id)
77+
or self.sampler.should_sample(self.span_context.trace_id)
7878

7979
def get_tracer(self):
8080
"""Return a tracer according to the sampling decision."""
8181
sampled = self.should_sample()
8282

8383
if sampled:
84+
self.span_context.trace_options.set_enabled(True)
8485
return context_tracer.ContextTracer(
8586
exporter=self.exporter,
8687
span_context=self.span_context)

tests/unit/trace/test_tracer.py

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def test_constructor_explicit(self):
4848
exporter = mock.Mock()
4949
propagator = mock.Mock()
5050
span_context = mock.Mock()
51+
span_context.trace_options.enabled = False
5152

5253
tracer = tracer_module.Tracer(
5354
span_context=span_context,
@@ -65,8 +66,10 @@ def test_should_sample_force_not_trace(self):
6566

6667
span_context = mock.Mock()
6768
span_context.trace_options.enabled = False
69+
sampler = mock.Mock()
70+
sampler.should_sample.return_value = False
6871
tracer = tracer_module.Tracer(
69-
span_context=span_context)
72+
span_context=span_context, sampler=sampler)
7073
sampled = tracer.should_sample()
7174

7275
self.assertFalse(sampled)
@@ -82,7 +85,10 @@ def test_should_sample_sampled(self):
8285
def test_should_sample_not_sampled(self):
8386
sampler = mock.Mock()
8487
sampler.should_sample.return_value = False
85-
tracer = tracer_module.Tracer(sampler=sampler)
88+
span_context = mock.Mock()
89+
span_context.trace_options.enabled = False
90+
tracer = tracer_module.Tracer(
91+
span_context=span_context, sampler=sampler)
8692
sampled = tracer.should_sample()
8793

8894
self.assertFalse(sampled)
@@ -108,13 +114,17 @@ def get_tracer_context_tracer(self):
108114
result = tracer.get_tracer()
109115

110116
assert isinstance(result, context_tracer.ContextTracer)
117+
self.assertTrue(tracer.span_context.trace_options.enabled)
111118

112119
def test_finish_not_sampled(self):
113120
from opencensus.trace.tracers import noop_tracer
114121

115122
sampler = mock.Mock()
116123
sampler.should_sample.return_value = False
117-
tracer = tracer_module.Tracer(sampler=sampler)
124+
span_context = mock.Mock()
125+
span_context.trace_options.enabled = False
126+
tracer = tracer_module.Tracer(
127+
span_context=span_context, sampler=sampler)
118128
assert isinstance(tracer.tracer, noop_tracer.NoopTracer)
119129
mock_tracer = mock.Mock()
120130
tracer.tracer = mock_tracer
@@ -138,12 +148,16 @@ def test_span_not_sampled(self):
138148

139149
sampler = mock.Mock()
140150
sampler.should_sample.return_value = False
141-
tracer = tracer_module.Tracer(sampler=sampler)
151+
span_context = mock.Mock()
152+
span_context.trace_options.enabled = False
153+
tracer = tracer_module.Tracer(
154+
span_context=span_context, sampler=sampler)
142155

143156
span = tracer.span()
144157

145158
# Test nested span not sampled
146159
child_span = span.span()
160+
tracer.finish()
147161

148162
assert isinstance(span, base.NullContextManager)
149163
assert isinstance(child_span, base.NullContextManager)
@@ -164,7 +178,10 @@ def test_start_span_not_sampled(self):
164178

165179
sampler = mock.Mock()
166180
sampler.should_sample.return_value = False
167-
tracer = tracer_module.Tracer(sampler=sampler)
181+
span_context = mock.Mock()
182+
span_context.trace_options.enabled = False
183+
tracer = tracer_module.Tracer(
184+
span_context=span_context, sampler=sampler)
168185

169186
span = tracer.start_span()
170187

@@ -184,6 +201,7 @@ def test_end_span_not_sampled(self):
184201
sampler = mock.Mock()
185202
sampler.should_sample.return_value = False
186203
span_context = mock.Mock()
204+
span_context.trace_options.enabled = False
187205
tracer = tracer_module.Tracer(
188206
sampler=sampler,
189207
span_context=span_context)
@@ -220,7 +238,10 @@ def test_current_span_not_sampled(self):
220238

221239
sampler = mock.Mock()
222240
sampler.should_sample.return_value = False
223-
tracer = tracer_module.Tracer(sampler=sampler)
241+
span_context = mock.Mock()
242+
span_context.trace_options.enabled = False
243+
tracer = tracer_module.Tracer(
244+
sampler=sampler, span_context=span_context)
224245

225246
span = tracer.current_span()
226247

@@ -244,7 +265,10 @@ def test_add_attribute_to_current_span_not_sampled(self):
244265

245266
sampler = mock.Mock()
246267
sampler.should_sample.return_value = False
247-
tracer = tracer_module.Tracer(sampler=sampler)
268+
span_context = mock.Mock()
269+
span_context.trace_options.enabled = False
270+
tracer = tracer_module.Tracer(
271+
span_context=span_context, sampler=sampler)
248272
tracer.add_attribute_to_current_span('key', 'value')
249273

250274
span = tracer.current_span()

0 commit comments

Comments
 (0)