def test_datadog_sampler_tracer_start_span(dummy_tracer): rule = SamplingRule( sample_rate=1.0) # No rules means it gets applied to every span rule_spy = mock.Mock(spec=rule, wraps=rule) rule_spy.sample_rate = rule.sample_rate sampler = DatadogSampler(rules=[rule_spy]) limiter_spy = mock.Mock(spec=sampler.limiter, wraps=sampler.limiter) sampler.limiter = limiter_spy sampler_spy = mock.Mock(spec=sampler, wraps=sampler) dummy_tracer.configure(sampler=sampler_spy) assert dummy_tracer.sampler is sampler_spy span = dummy_tracer.start_span("test.span") span.finish() # Assert all of our expected functions were called sampler_spy.sample.assert_called_once_with(span) rule_spy.matches.assert_called_once_with(span) rule_spy.sample.assert_called_once_with(span) limiter_spy.is_allowed.assert_called_once_with() spans = dummy_tracer.pop() assert len(spans) == 1, "Span should have been sampled and written" assert spans[0].get_metric(SAMPLING_PRIORITY_KEY) is AUTO_KEEP assert spans[0].get_metric(SAMPLING_RULE_DECISION) == 1.0
def test_datadog_sampler_tracer_rate_0(dummy_tracer): rule = SamplingRule( sample_rate=0, name="test.span") # Sample rate of 0 means never sample rule_spy = mock.Mock(spec=rule, wraps=rule) rule_spy.sample_rate = rule.sample_rate sampler = DatadogSampler(rules=[rule_spy]) limiter_spy = mock.Mock(spec=sampler.limiter, wraps=sampler.limiter) sampler.limiter = limiter_spy sampler_spy = mock.Mock(spec=sampler, wraps=sampler) dummy_tracer.configure(sampler=sampler_spy) assert dummy_tracer.sampler is sampler_spy with dummy_tracer.trace("test.span") as span: # Assert all of our expected functions were called sampler_spy.sample.assert_called_once_with(span) rule_spy.matches.assert_called_once_with(span) rule_spy.sample.assert_called_once_with(span) limiter_spy.is_allowed.assert_not_called() spans = dummy_tracer.pop() assert len(spans) == 1, "Span should have been sampled and written" assert spans[0].get_metric(SAMPLING_PRIORITY_KEY) is AUTO_REJECT assert spans[0].get_metric(SAMPLING_RULE_DECISION) == 0
def test_datadog_sampler_tracer_child(dummy_tracer): rule = SamplingRule( sample_rate=1.0) # No rules means it gets applied to every span rule_spy = mock.Mock(spec=rule, wraps=rule) rule_spy.sample_rate = rule.sample_rate sampler = DatadogSampler(rules=[rule_spy]) limiter_spy = mock.Mock(spec=sampler.limiter, wraps=sampler.limiter) sampler.limiter = limiter_spy sampler_spy = mock.Mock(spec=sampler, wraps=sampler) dummy_tracer.configure(sampler=sampler_spy) assert dummy_tracer.sampler is sampler_spy with dummy_tracer.trace("parent.span") as parent: with dummy_tracer.trace("child.span"): # Assert all of our expected functions were called # DEV: `assert_called_once_with` ensures we didn't also call with the child span sampler_spy.sample.assert_called_once_with(parent) rule_spy.matches.assert_called_once_with(parent) rule_spy.sample.assert_called_once_with(parent) limiter_spy.is_allowed.assert_called_once_with() spans = dummy_tracer.pop() assert len(spans) == 2, "Trace should have been sampled and written" assert spans[0].get_metric(SAMPLING_PRIORITY_KEY) is AUTO_KEEP assert spans[0].get_metric(SAMPLING_RULE_DECISION) == 1.0
def test_datadog_sampler_tracer_start_span(dummy_tracer): rule = SamplingRule( sample_rate=1.0) # No rules means it gets applied to every span rule_spy = mock.Mock(spec=rule, wraps=rule) rule_spy.sample_rate = rule.sample_rate sampler = DatadogSampler(rules=[rule_spy]) limiter_spy = mock.Mock(spec=sampler.limiter, wraps=sampler.limiter) sampler.limiter = limiter_spy sampler_spy = mock.Mock(spec=sampler, wraps=sampler) # TODO: Remove `priority_sampling=False` when we remove fallback dummy_tracer.configure(sampler=sampler_spy, priority_sampling=False) assert dummy_tracer.sampler is sampler_spy span = dummy_tracer.start_span('test.span') # Assert all of our expected functions were called sampler_spy.sample.assert_called_once_with(span) rule_spy.matches.assert_called_once_with(span) rule_spy.sample.assert_called_once_with(span) limiter_spy.is_allowed.assert_called_once_with() # We know it was sampled because we have a sample rate of 1.0 assert span.sampled is True assert span._context.sampling_priority is AUTO_KEEP assert_sampling_decision_tags(span, rule=1.0)
def test_datadog_sampler_tracer_child(dummy_tracer): rule = SamplingRule( sample_rate=1.0) # No rules means it gets applied to every span rule_spy = mock.Mock(spec=rule, wraps=rule) rule_spy.sample_rate = rule.sample_rate sampler = DatadogSampler(rules=[rule_spy]) limiter_spy = mock.Mock(spec=sampler.limiter, wraps=sampler.limiter) sampler.limiter = limiter_spy sampler_spy = mock.Mock(spec=sampler, wraps=sampler) # TODO: Remove `priority_sampling=False` when we remove fallback dummy_tracer.configure(sampler=sampler_spy, priority_sampling=False) assert dummy_tracer.sampler is sampler_spy with dummy_tracer.trace('parent.span') as parent: with dummy_tracer.trace('child.span') as child: # Assert all of our expected functions were called # DEV: `assert_called_once_with` ensures we didn't also call with the child span sampler_spy.sample.assert_called_once_with(parent) rule_spy.matches.assert_called_once_with(parent) rule_spy.sample.assert_called_once_with(parent) limiter_spy.is_allowed.assert_called_once_with() # We know it was sampled because we have a sample rate of 1.0 assert parent.sampled is True assert parent._context.sampling_priority is AUTO_KEEP assert_sampling_decision_tags(parent, rule=1.0) assert child.sampled is True assert child._parent is parent assert child._context.sampling_priority is AUTO_KEEP
def test_datadog_sampler_tracer_rate_0(dummy_tracer): rule = SamplingRule( sample_rate=0, name='test.span') # Sample rate of 0 means never sample rule_spy = mock.Mock(spec=rule, wraps=rule) rule_spy.sample_rate = rule.sample_rate sampler = DatadogSampler(rules=[rule_spy]) limiter_spy = mock.Mock(spec=sampler.limiter, wraps=sampler.limiter) sampler.limiter = limiter_spy sampler_spy = mock.Mock(spec=sampler, wraps=sampler) # TODO: Remove `priority_sampling=False` when we remove fallback dummy_tracer.configure(sampler=sampler_spy, priority_sampling=False) assert dummy_tracer.sampler is sampler_spy with dummy_tracer.trace('test.span') as span: # Assert all of our expected functions were called sampler_spy.sample.assert_called_once_with(span) rule_spy.matches.assert_called_once_with(span) rule_spy.sample.assert_called_once_with(span) limiter_spy.is_allowed.assert_not_called() # We know it was not sampled because we have a sample rate of 0.0 assert span.sampled is False assert span._context.sampling_priority is AUTO_REJECT assert_sampling_decision_tags(span, rule=0)
def test_datadog_sampler_tracer_rate_limited(dummy_tracer): rule = SamplingRule(sample_rate=1.0, name='test.span') rule_spy = mock.Mock(spec=rule, wraps=rule) rule_spy.sample_rate = rule.sample_rate sampler = DatadogSampler(rules=[rule_spy]) limiter_spy = mock.Mock(spec=sampler.limiter, wraps=sampler.limiter) limiter_spy.is_allowed.return_value = False # Have the limiter deny the span sampler.limiter = limiter_spy sampler_spy = mock.Mock(spec=sampler, wraps=sampler) dummy_tracer.configure(sampler=sampler_spy) assert dummy_tracer.sampler is sampler_spy with dummy_tracer.trace('test.span') as span: # Assert all of our expected functions were called sampler_spy.sample.assert_called_once_with(span) rule_spy.matches.assert_called_once_with(span) rule_spy.sample.assert_called_once_with(span) limiter_spy.is_allowed.assert_called_once_with() # We know it was not sampled because of our limiter assert span.sampled is False assert span._context.sampling_priority is AUTO_REJECT assert_sampling_decision_tags(span, rule=1.0, limit=None)
def test_datadog_sampler_tracer(dummy_tracer): rule = SamplingRule(sample_rate=1.0, name='test.span') rule_spy = mock.Mock(spec=rule, wraps=rule) rule_spy.sample_rate = rule.sample_rate sampler = DatadogSampler(rules=[rule_spy]) limiter_spy = mock.Mock(spec=sampler.limiter, wraps=sampler.limiter) sampler.limiter = limiter_spy sampler_spy = mock.Mock(spec=sampler, wraps=sampler) dummy_tracer.configure(sampler=sampler_spy) assert dummy_tracer.sampler is sampler_spy with dummy_tracer.trace('test.span') as span: # Assert all of our expected functions were called sampler_spy.sample.assert_called_once_with(span) rule_spy.matches.assert_called_once_with(span) rule_spy.sample.assert_called_once_with(span) limiter_spy.is_allowed.assert_called_once_with() # We know it was sampled because we have a sample rate of 1.0 assert span.sampled is True assert span._context.sampling_priority is AUTO_KEEP assert_sampling_decision_tags(span, rule=1.0)