def test_is_not_match(self): span = Span(name="Name", tracer=None) span.set_tag(URL, r"http://anotherexample.com") filtr = FilterRequestsOnUrl("http://examp.*.com") trace = filtr.process_trace([span]) self.assertIsNotNone(trace)
def test_current_root_span(self): # it should return the current active root span ctx = Context() span = Span(tracer=None, name="fake_span") ctx.add_span(span) assert span == ctx.get_current_root_span()
def span_type_span(): s = Span(None, "span_name") s.span_type = SpanTypes.WEB return s
def _fill_ctx(): ctx = l_ctx.get() span = Span(tracer=None, name='fake_span') ctx.add_span(span) eq_(1, len(ctx._trace))
def test_finished(self): # a Context is finished if all spans inside are finished ctx = Context() span = Span(tracer=None, name="fake_span") ctx.add_span(span) ctx.close_span(span)
def test_keep_rate(self): statsd = mock.Mock() writer_run_periodic = mock.Mock() writer_put = mock.Mock() writer_put.return_value = Response(status=200) writer = AgentWriter(agent_url="http://asdf:1234", dogstatsd=statsd, report_metrics=False) writer.run_periodic = writer_run_periodic writer._put = writer_put traces = [ [Span(tracer=None, name="name", trace_id=i, span_id=j, parent_id=j - 1 or None) for j in range(5)] for i in range(4) ] traces_too_big = [ [Span(tracer=None, name="a" * 5000, trace_id=i, span_id=j, parent_id=j - 1 or None) for j in range(2 ** 10)] for i in range(4) ] # 1. We write 4 traces successfully. for trace in traces: writer.write(trace) writer.flush_queue() payload = msgpack.unpackb(writer_put.call_args.args[0]) # No previous drops. assert 0.0 == writer._drop_sma.get() # 4 traces written. assert 4 == len(payload) # 100% of traces kept (refers to the past). # No traces sent before now so 100% kept. for trace in payload: assert 1.0 == trace[0]["metrics"].get(KEEP_SPANS_RATE_KEY, -1) # 2. We fail to write 4 traces because of size limitation. for trace in traces_too_big: writer.write(trace) writer.flush_queue() # 50% of traces were dropped historically. # 4 successfully written before and 4 dropped now. assert 0.5 == writer._drop_sma.get() # put not called since no new traces are available. writer_put.assert_called_once() # 3. We write 2 traces successfully. for trace in traces[:2]: writer.write(trace) writer.flush_queue() payload = msgpack.unpackb(writer_put.call_args.args[0]) # 40% of traces were dropped historically. assert 0.4 == writer._drop_sma.get() # 2 traces written. assert 2 == len(payload) # 50% of traces kept (refers to the past). # We had 4 successfully written and 4 dropped. for trace in payload: assert 0.5 == trace[0]["metrics"].get(KEEP_SPANS_RATE_KEY, -1) # 4. We write 1 trace successfully and fail to write 3. writer.write(traces[0]) for trace in traces_too_big[:3]: writer.write(trace) writer.flush_queue() payload = msgpack.unpackb(writer_put.call_args.args[0]) # 50% of traces were dropped historically. assert 0.5 == writer._drop_sma.get() # 1 trace written. assert 1 == len(payload) # 60% of traces kept (refers to the past). # We had 4 successfully written, then 4 dropped, then 2 written. for trace in payload: assert 0.6 == trace[0]["metrics"].get(KEEP_SPANS_RATE_KEY, -1)
def test_flush_connection_uds(endpoint_uds_server): writer = AgentWriter(agent_url="unix://%s" % endpoint_uds_server.server_address) writer._encoder.put([Span(None, "foobar")]) writer.flush_queue(raise_exc=True)
def test_is_match(self): span = Span(name='Name', tracer=None) span.set_tag(URL, r'http://example.com') filtr = FilterRequestsOnUrl('http://examp.*.com') trace = filtr.process_trace([span]) self.assertIsNone(trace)
def test_numeric_tags_bad_value(self): s = Span(tracer=None, name='test.span') s.set_tag(ANALYTICS_SAMPLE_RATE_KEY, 'Hello') d = s.to_dict() assert d assert 'metrics' not in d
def test_finish_called_multiple_times(self): # we should only record a span the first time finish is called on it s = Span(self.tracer, "bar") s.finish() s.finish()
def test_numeric_tags_none(): s = Span(tracer=None, name='test.span') s.set_tag(ANALYTICS_SAMPLE_RATE_KEY, None) d = s.to_dict() assert d assert 'metrics' not in d
ref = refencoder.join_encoded([refencoder.encode_trace(trace) for _ in range(1)]) custom = encoder.join_encoded([encoder.encode_trace(trace) for _ in range(1)]) assert decode(ref) == decode(custom) def span_type_span(): s = Span(None, "span_name") s.span_type = SpanTypes.WEB return s @pytest.mark.parametrize( "span", [ Span(None, "span_name", span_type=SpanTypes.WEB), Span(None, "span_name", resource="/my-resource"), Span(None, "span_name", service="my-svc"), span_type_span(), ], ) def test_msgpack_span_property_variations(span): refencoder = RefMsgpackEncoder() encoder = MsgpackEncoder() # Finish the span to ensure a duration exists. span.finish() trace = [span] assert decode(refencoder.encode_trace(trace)) == decode(encoder.encode_trace(trace))
def _fill_ctx(): ctx = ctxm.get() span = Span(tracer=None, name='fake_span') ctx.add_span(span) assert 1 == len(ctx._trace)
sampling_priority=2), Context(trace_id=123, span_id=321, dd_origin="synthetics", sampling_priority=2), ), ], ) def test_eq(ctx1, ctx2): assert ctx1 == ctx2 @pytest.mark.parametrize( "ctx1,ctx2", [ (Context(), Span("")), (Context(), None), (Context(), object()), (None, Context()), (Context(), 5), (5, Context()), ( Context(trace_id=123, span_id=321, dd_origin="synthetics", sampling_priority=2), Context(trace_id=1234, span_id=321, dd_origin="synthetics", sampling_priority=2), ),
def test_set_tag_measured_no_value(): s = Span(tracer=None, name="test.span") s.set_tag(SPAN_MEASURED_KEY) assert_is_measured(s)
def test_set_tag_env(self): s = Span(tracer=None, name='test.span') s.set_tag(ENV_KEY, 'prod') assert s.get_tag(ENV_KEY) == 'prod'
def test_span_unicode_set_tag(): span = Span(None, None) span.set_tag("key", u"😌") span.set_tag("😐", u"😌") span._set_str_tag("key", u"😌") span._set_str_tag(u"😐", u"😌")
def test_sampling_rule_sample_rate_0(): rule = SamplingRule(sample_rate=0) iterations = int(1e4) assert sum(rule.sample(Span(name=str(i))) for i in range(iterations)) == 0
def test_flush_connection_timeout(endpoint_test_timeout_server): writer = AgentWriter(agent_url="http://%s:%s" % (_HOST, _TIMEOUT_PORT)) with pytest.raises(socket.timeout): writer._encoder.put([Span(None, "foobar")]) writer.flush_queue(raise_exc=True)
def test_numeric_tags_bad_value(self): s = Span(tracer=None, name="test.span") s.set_tag(ANALYTICS_SAMPLE_RATE_KEY, "Hello") d = s.to_dict() assert d assert "metrics" not in d
def do_write(i): writer.write([Span(None, str(i))])
def test_duration_zero(self): s = Span(tracer=None, name="foo.bar", service="s", resource="r", start=123) s.finish(finish_time=123) assert s.duration_ns == 0 assert s.duration == 0
def test_current_span(self): # it should return the current active span ctx = Context() span = Span(tracer=None, name='fake_span') ctx.add_span(span) eq_(span, ctx.get_current_span())
def test_set_tag_env(self): s = Span(tracer=None, name="test.span") s.set_tag(ENV_KEY, "prod") assert s.get_tag(ENV_KEY) == "prod"
def _fill_ctx(): span = Span(tracer=None, name="fake_span") ctx.add_span(span)
def test_set_tag_measured(value, assertion): s = Span(tracer=None, name="test.span") s.set_tag(SPAN_MEASURED_KEY, value) assertion(s)
[refencoder.encode_trace(trace) for _ in range(1)]) custom = encoder.join_encoded( [encoder.encode_trace(trace) for _ in range(1)]) assert decode(ref) == decode(custom) def span_type_span(): s = Span(None, "span_name") s.span_type = SpanTypes.WEB return s @pytest.mark.parametrize( "span", [ Span(None, "span_name", span_type=SpanTypes.WEB), Span(None, "span_name", resource="/my-resource"), Span(None, "span_name", service="my-svc"), span_type_span(), ], ) def test_msgpack_span_property_variations(span): refencoder = RefMsgpackEncoder() encoder = MsgpackEncoder() # Finish the span to ensure a duration exists. span.finish() trace = [span] assert decode(refencoder.encode_trace(trace)) == decode( encoder.encode_trace(trace))
def test_set_tag_measured_not_set(): # Span is not measured by default s = Span(tracer=None, name="test.span") assert_is_not_measured(s)
def test_finish_no_tracer(self): # ensure finish works with no tracer without raising exceptions s = Span(tracer=None, name='test.span') s.finish()
def test_span_preconditions(arg): Span("test", **{arg: None}) with pytest.raises(TypeError): Span("test", **{arg: "foo"})