Example #1
0
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"}
Example #2
0
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)
Example #7
0
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
Example #8
0
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
Example #9
0
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)
Example #10
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)
Example #12
0
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")