def test_span_labelling(zuqa_client): zuqa_client.begin_transaction("test") with zuqa.capture_span("test", labels={"foo": "bar", "ba.z": "baz.zinga"}) as span: span.tag(lorem="ipsum") zuqa_client.end_transaction("test", "OK") span = zuqa_client.events[SPAN][0] assert span["context"]["tags"] == {"foo": "bar", "ba_z": "baz.zinga", "lorem": "ipsum"}
def test_disable_breakdowns(zuqa_client): with pytest.raises(LookupError): zuqa_client._metrics.get_metricset( "zuqa.metrics.sets.breakdown.BreakdownMetricSet") transaction_metrics = zuqa_client._metrics.get_metricset( "zuqa.metrics.sets.transactions.TransactionsMetricSet") with mock.patch("zuqa.traces.BaseSpan.child_started" ) as mock_child_started, mock.patch( "zuqa.traces.BaseSpan.child_ended" ) as mock_child_ended, mock.patch( "zuqa.traces.Transaction.track_span_duration" ) as mock_track_span_duration: transaction = zuqa_client.begin_transaction("test") assert transaction._breakdown is None with zuqa.capture_span("test", span_type="template", span_subtype="django", duration=5): pass zuqa_client.end_transaction("test", "OK", duration=5) assert mock_child_started.call_count == 0 assert mock_child_ended.call_count == 0 assert mock_track_span_duration.call_count == 0 # transaction duration should still be captured data = list(transaction_metrics.collect()) assert len(data) == 1 assert data[0]["samples"]["transaction.duration.sum.us"][ "value"] == 5000000
def test_skip_ignored_frames(zuqa_client): zuqa_client.begin_transaction("test") with zuqa.capture_span("test"): pass zuqa_client.end_transaction("test", "test") span = zuqa_client.events[SPAN][0] for frame in span["stacktrace"]: assert not frame["module"].startswith("zuqa")
def test_end_nonexisting_span(caplog, zuqa_client): with caplog.at_level(logging.INFO, "zuqa.traces"): t = zuqa_client.begin_transaction("test") # we're purposefully creating a case where we don't begin a span # and then try to end the non-existing span t.is_sampled = False with zuqa.capture_span("test_name", "test_type"): t.is_sampled = True zuqa_client.end_transaction("test", "") record = caplog.records[0] assert record.args == ("test_name", "test_type")
def test_transactions_processing(zuqa_client): for i in range(5): zuqa_client.begin_transaction("dummy") with zuqa.capture_span("bla"): pass zuqa_client.end_transaction("dummy_transaction", "success") for transaction in zuqa_client.events[TRANSACTION]: assert transaction["processed"] is True assert "processed_no_events" not in transaction for span in zuqa_client.events[SPAN]: assert span["processed"] is True assert "processed_no_events" not in span
def call(self, module, method, wrapped, instance, args, kwargs): signature = self.get_signature(args, kwargs) context = self.get_context(instance, args, kwargs) with zuqa.capture_span( signature, span_type="db", span_subtype="elasticsearch", span_action="query", extra=context, skip_frames=2, leaf=True, ): return wrapped(*args, **kwargs)
def test_single_span(zuqa_client): zuqa_client.begin_transaction("request", start=0) with zuqa.capture_span("test", span_type="db", span_subtype="mysql", start=10, duration=5): pass zuqa_client.end_transaction("test", "OK", duration=15) breakdown = zuqa_client._metrics.get_metricset( "zuqa.metrics.sets.breakdown.BreakdownMetricSet") data = list(breakdown.collect()) assert len(data) == 3 asserts = 0 for elem in data: if "transaction.breakdown.count" in elem["samples"]: assert elem["samples"]["transaction.breakdown.count"]["value"] == 1 assert elem["transaction"] == {"name": "test", "type": "request"} asserts += 1 elif "span.self_time.sum.us" in elem["samples"]: if elem["span"] == {"type": "app", "subtype": ""}: assert elem["transaction"] == { "name": "test", "type": "request" } assert elem["samples"]["span.self_time.sum.us"][ "value"] == 10000000 assert elem["samples"]["span.self_time.count"]["value"] == 1 asserts += 1 elif elem["span"] == {"type": "db", "subtype": "mysql"}: assert elem["samples"]["span.self_time.count"]["value"] == 1 assert elem["samples"]["span.self_time.sum.us"][ "value"] == 5000000 assert elem["transaction"] == { "name": "test", "type": "request" } asserts += 1 assert asserts == 3 transaction_metrics = zuqa_client._metrics.get_metricset( "zuqa.metrics.sets.transactions.TransactionsMetricSet") transaction_data = list(transaction_metrics.collect()) assert len(transaction_data) == 1 assert transaction_data[0]["samples"]["transaction.duration.sum.us"][ "value"] == 15000000
def test_multiple_transactions(zuqa_client): for i in (1, 2): zuqa_client.begin_transaction("request") with zuqa.capture_span("test", duration=5): pass zuqa_client.end_transaction("test", "OK", duration=10) breakdown = zuqa_client._metrics.get_metricset( "zuqa.metrics.sets.breakdown.BreakdownMetricSet") data = list(breakdown.collect()) asserts = 0 for elem in data: if "transaction.breakdown.count" in elem["samples"]: assert elem["samples"]["transaction.breakdown.count"]["value"] == 2 assert elem["transaction"] == {"name": "test", "type": "request"} asserts += 1 elif "span.self_time.sum.us" in elem["samples"]: if elem["span"] == {"type": "app", "subtype": ""}: assert elem["transaction"] == { "name": "test", "type": "request" } # precision lost due to float arithmetic assert 9999999 <= elem["samples"]["span.self_time.sum.us"][ "value"] <= 10000000 assert elem["samples"]["span.self_time.count"]["value"] == 2 asserts += 1 elif elem["span"] == {"type": "code", "subtype": "custom"}: assert elem["transaction"] == { "name": "test", "type": "request" } assert 9999999 <= elem["samples"]["span.self_time.sum.us"][ "value"] <= 10000000 assert elem["samples"]["span.self_time.count"]["value"] == 2 asserts += 1 assert asserts == 3 transaction_metrics = zuqa_client._metrics.get_metricset( "zuqa.metrics.sets.transactions.TransactionsMetricSet") transaction_data = list(transaction_metrics.collect()) assert len(transaction_data) == 1 assert 19999999 <= transaction_data[0]["samples"][ "transaction.duration.sum.us"]["value"] <= 20000000 assert transaction_data[0]["samples"]["transaction.duration.count"][ "value"] == 2
def test_metrics_reset_after_collect(zuqa_client): zuqa_client.begin_transaction("request") with zuqa.capture_span("test", span_type="db", span_subtype="mysql", duration=5): pass zuqa_client.end_transaction("test", "OK", duration=15) breakdown = zuqa_client._metrics.get_metricset( "zuqa.metrics.sets.breakdown.BreakdownMetricSet") transaction_metrics = zuqa_client._metrics.get_metricset( "zuqa.metrics.sets.transactions.TransactionsMetricSet") for metricset in (breakdown, transaction_metrics): for labels, c in compat.iteritems(metricset._counters): assert c.val != 0 for labels, t in compat.iteritems(metricset._timers): assert t.val != (0, 0) list(metricset.collect()) for labels, c in compat.iteritems(metricset._counters): assert c.val == 0 for labels, t in compat.iteritems(metricset._timers): assert t.val == (0, 0)
def test_explicit_app_span(zuqa_client): transaction = zuqa_client.begin_transaction("request") with zuqa.capture_span("test", span_type="app"): pass zuqa_client.end_transaction("test", "OK") breakdown = zuqa_client._metrics.get_metricset( "zuqa.metrics.sets.breakdown.BreakdownMetricSet") data = list(breakdown.collect()) assert len(data) == 2 asserts = 0 for elem in data: if "transaction.breakdown.count" in elem["samples"]: assert elem["samples"]["transaction.breakdown.count"]["value"] == 1 assert elem["transaction"] == {"name": "test", "type": "request"} asserts += 1 elif "span.self_time.sum.us" in elem["samples"]: if elem["span"] == {"type": "app", "subtype": ""}: assert elem["transaction"] == { "name": "test", "type": "request" } assert elem["samples"]["span.self_time.count"]["value"] == 2 asserts += 1 assert asserts == 2
def call(self, module, method, wrapped, instance, args, kwargs): kwargs = kwargs or {} kwargs["call_args"] = (module, method) with zuqa.capture_span("dummy"): return wrapped(*args, **kwargs)
def test_span_tagging_raises_deprecation_warning(zuqa_client): zuqa_client.begin_transaction("test") with pytest.warns(DeprecationWarning, match="The tags argument to capture_span is deprecated"): with zuqa.capture_span("test", tags={"foo": "bar", "ba.z": "baz.zinga"}) as span: span.tag(lorem="ipsum") zuqa_client.end_transaction("test", "OK")