diff --git a/sentry_sdk/integrations/clickhouse_driver.py b/sentry_sdk/integrations/clickhouse_driver.py index ddff377135..eb7fa59e93 100644 --- a/sentry_sdk/integrations/clickhouse_driver.py +++ b/sentry_sdk/integrations/clickhouse_driver.py @@ -7,8 +7,7 @@ from sentry_sdk.scope import should_send_default_pii from sentry_sdk.traces import StreamedSpan from sentry_sdk.tracing import Span -from sentry_sdk.tracing_utils import has_span_streaming_enabled -from sentry_sdk.utils import capture_internal_exceptions, has_data_collection_enabled +from sentry_sdk.utils import has_data_collection_enabled # Hack to get new Python features working in older versions # without introducing a hard dependency on `typing_extensions` @@ -81,38 +80,18 @@ def _inner(*args: "P.args", **kwargs: "P.kwargs") -> "T": connection = args[0] query = args[1] - query_id = args[2] if len(args) > 2 else kwargs.get("query_id") - params = args[3] if len(args) > 3 else kwargs.get("params") - - if has_span_streaming_enabled(client.options): - span = None - if sentry_sdk.traces.get_current_span() is not None: - span = sentry_sdk.traces.start_span( - name=query, # type: ignore - attributes={ - "sentry.op": OP.DB, - "sentry.origin": ClickhouseDriverIntegration.origin, - SPANDATA.DB_QUERY_TEXT: str(query), - }, - ) - else: - span = sentry_sdk.start_span( - op=OP.DB, - name=query, - origin=ClickhouseDriverIntegration.origin, - ) - - span.set_data("query", query) - if query_id: - span.set_data("db.query_id", query_id) + if sentry_sdk.traces.get_current_span() is None: + return f(*args, **kwargs) - if params: - if has_data_collection_enabled(client.options): - if client.options["data_collection"]["database_query_data"]: - span.set_data("db.params", params) - elif should_send_default_pii(): - span.set_data("db.params", params) + span = sentry_sdk.traces.start_span( + name=query, # type: ignore + attributes={ + "sentry.op": OP.DB, + "sentry.origin": ClickhouseDriverIntegration.origin, + SPANDATA.DB_QUERY_TEXT: str(query), + }, + ) connection._sentry_span = span # type: ignore[attr-defined] @@ -136,23 +115,7 @@ def _inner_end(*args: "P.args", **kwargs: "P.kwargs") -> "T": if span is None: return res - if isinstance(span, StreamedSpan): - span.end() - else: - if res is not None: - client_options = sentry_sdk.get_client().options - if has_data_collection_enabled(client_options): - if client_options["data_collection"]["database_query_data"]: - span.set_data("db.result", res) - elif should_send_default_pii(): - span.set_data("db.result", res) - - with capture_internal_exceptions(): - span.scope.add_breadcrumb( - message=span._data.pop("query"), category="query", data=span._data - ) - - span.finish() + span.end() return res diff --git a/tests/integrations/clickhouse_driver/test_clickhouse_driver.py b/tests/integrations/clickhouse_driver/test_clickhouse_driver.py index 1cec232548..52e34e7956 100644 --- a/tests/integrations/clickhouse_driver/test_clickhouse_driver.py +++ b/tests/integrations/clickhouse_driver/test_clickhouse_driver.py @@ -8,11 +8,10 @@ from unittest import mock import clickhouse_driver -import pytest from clickhouse_driver import Client, connect import sentry_sdk -from sentry_sdk import capture_message, start_transaction +from sentry_sdk import capture_message from sentry_sdk.integrations.clickhouse_driver import ClickhouseDriverIntegration from tests.conftest import ApproxDict @@ -733,546 +732,268 @@ def test_clickhouse_client_send_data_generator_with_data_collection_disabled( assert "db.params" not in insert_breadcrumb["data"] -@pytest.mark.parametrize("span_streaming", [True, False]) def test_clickhouse_client_spans( sentry_init, - capture_events, capture_items, - span_streaming, ): sentry_init( integrations=[ClickhouseDriverIntegration()], - trace_lifecycle="stream" if span_streaming else "static", + trace_lifecycle="stream", _experiments={ "record_sql_params": True, }, traces_sample_rate=1.0, ) - if span_streaming: - items = capture_items("span") - - trace_id = None - span_id = None - - with sentry_sdk.traces.start_span(name="custom parent") as span: - trace_id = span.trace_id - span_id = span.span_id - - client = Client("localhost") - client.execute("DROP TABLE IF EXISTS test") - client.execute("CREATE TABLE test (x Int32) ENGINE = Memory") - client.execute("INSERT INTO test (x) VALUES", [{"x": 100}]) - client.execute("INSERT INTO test (x) VALUES", [[170], [200]]) - - res = client.execute( - "SELECT sum(x) FROM test WHERE x > %(minv)i", {"minv": 150} - ) - assert res[0][0] == 370 - - sentry_sdk.flush() - spans = [item.payload for item in items] - - expected_spans = [ - { - "name": "DROP TABLE IF EXISTS test", - "attributes": { - "db.system.name": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.namespace": "", - "db.user": "default", - "sentry.op": "db", - "db.query.text": "DROP TABLE IF EXISTS test", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "CREATE TABLE test (x Int32) ENGINE = Memory", - "attributes": { - "db.system.name": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.namespace": "", - "db.user": "default", - "sentry.op": "db", - "db.query.text": "CREATE TABLE test (x Int32) ENGINE = Memory", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "INSERT INTO test (x) VALUES", - "attributes": { - "db.system.name": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.namespace": "", - "db.user": "default", - "sentry.op": "db", - "db.query.text": "INSERT INTO test (x) VALUES", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "INSERT INTO test (x) VALUES", - "attributes": { - "db.system.name": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.namespace": "", - "db.user": "default", - "sentry.op": "db", - "db.query.text": "INSERT INTO test (x) VALUES", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "SELECT sum(x) FROM test WHERE x > 150", - "attributes": { - "db.system.name": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.namespace": "", - "db.user": "default", - "sentry.op": "db", - "db.query.text": "SELECT sum(x) FROM test WHERE x > 150", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "custom parent", - "attributes": [], - "trace_id": trace_id, - }, - ] - - for span in expected_spans: - span["attributes"] = ApproxDict(span["attributes"]) - - for span in spans: - span.pop("span_id", None) - span.pop("start_timestamp", None) - span.pop("end_timestamp", None) - span.pop("is_segment", None) - span.pop("status", None) - - assert spans == expected_spans - else: - events = capture_events() - - transaction_trace_id = None - transaction_span_id = None - - with start_transaction(name="test_clickhouse_transaction") as transaction: - transaction_trace_id = transaction.trace_id - transaction_span_id = transaction.span_id - - client = Client("localhost") - client.execute("DROP TABLE IF EXISTS test") - client.execute("CREATE TABLE test (x Int32) ENGINE = Memory") - client.execute("INSERT INTO test (x) VALUES", [{"x": 100}]) - client.execute("INSERT INTO test (x) VALUES", [[170], [200]]) - - res = client.execute( - "SELECT sum(x) FROM test WHERE x > %(minv)i", {"minv": 150} - ) - assert res[0][0] == 370 - - (event,) = events - - expected_spans = [ - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "DROP TABLE IF EXISTS test", - "data": { - "db.system": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, - }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "CREATE TABLE test (x Int32) ENGINE = Memory", - "data": { - "db.system": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, - }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "INSERT INTO test (x) VALUES", - "data": { - "db.system": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, - }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "INSERT INTO test (x) VALUES", - "data": { - "db.system": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, - }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "SELECT sum(x) FROM test WHERE x > 150", - "data": { - "db.system": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, - }, - ] - - if not EXPECT_PARAMS_IN_SELECT: - expected_spans[-1]["data"].pop("db.params", None) - - for span in expected_spans: - span["data"] = ApproxDict(span["data"]) - - for span in event["spans"]: - span.pop("span_id", None) - span.pop("start_timestamp", None) - span.pop("timestamp", None) - - assert event["spans"] == expected_spans - + items = capture_items("span") -def test_clickhouse_spans_with_generator(sentry_init, capture_events): - sentry_init( - integrations=[ClickhouseDriverIntegration()], - send_default_pii=True, - traces_sample_rate=1.0, - ) - events = capture_events() + trace_id = None + span_id = None - # Use a generator to test that the integration obtains values from the generator, - # without consuming the generator. - values = ({"x": i} for i in range(3)) + with sentry_sdk.traces.start_span(name="custom parent") as span: + trace_id = span.trace_id + span_id = span.span_id - with start_transaction(name="test_clickhouse_transaction"): client = Client("localhost") client.execute("DROP TABLE IF EXISTS test") client.execute("CREATE TABLE test (x Int32) ENGINE = Memory") - client.execute("INSERT INTO test (x) VALUES", values) - res = client.execute("SELECT x FROM test") + client.execute("INSERT INTO test (x) VALUES", [{"x": 100}]) + client.execute("INSERT INTO test (x) VALUES", [[170], [200]]) - # Verify that the integration did not consume the generator - assert res == [(0,), (1,), (2,)] + res = client.execute( + "SELECT sum(x) FROM test WHERE x > %(minv)i", {"minv": 150} + ) + assert res[0][0] == 370 - (event,) = events - spans = event["spans"] + sentry_sdk.flush() + spans = [item.payload for item in items] - [span] = [ - span for span in spans if span["description"] == "INSERT INTO test (x) VALUES" + expected_spans = [ + { + "name": "DROP TABLE IF EXISTS test", + "attributes": { + "db.system.name": "clickhouse", + "db.driver.name": "clickhouse-driver", + "db.namespace": "", + "db.user": "default", + "sentry.op": "db", + "db.query.text": "DROP TABLE IF EXISTS test", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, + }, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "CREATE TABLE test (x Int32) ENGINE = Memory", + "attributes": { + "db.system.name": "clickhouse", + "db.driver.name": "clickhouse-driver", + "db.namespace": "", + "db.user": "default", + "sentry.op": "db", + "db.query.text": "CREATE TABLE test (x Int32) ENGINE = Memory", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, + }, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "INSERT INTO test (x) VALUES", + "attributes": { + "db.system.name": "clickhouse", + "db.driver.name": "clickhouse-driver", + "db.namespace": "", + "db.user": "default", + "sentry.op": "db", + "db.query.text": "INSERT INTO test (x) VALUES", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, + }, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "INSERT INTO test (x) VALUES", + "attributes": { + "db.system.name": "clickhouse", + "db.driver.name": "clickhouse-driver", + "db.namespace": "", + "db.user": "default", + "sentry.op": "db", + "db.query.text": "INSERT INTO test (x) VALUES", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, + }, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "SELECT sum(x) FROM test WHERE x > 150", + "attributes": { + "db.system.name": "clickhouse", + "db.driver.name": "clickhouse-driver", + "db.namespace": "", + "db.user": "default", + "sentry.op": "db", + "db.query.text": "SELECT sum(x) FROM test WHERE x > 150", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, + }, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "custom parent", + "attributes": [], + "trace_id": trace_id, + }, ] - assert span["data"]["db.params"] == [{"x": 0}, {"x": 1}, {"x": 2}] + for span in expected_spans: + span["attributes"] = ApproxDict(span["attributes"]) + + for span in spans: + span.pop("span_id", None) + span.pop("start_timestamp", None) + span.pop("end_timestamp", None) + span.pop("is_segment", None) + span.pop("status", None) + + assert spans == expected_spans -@pytest.mark.parametrize("span_streaming", [True, False]) def test_clickhouse_client_spans_with_pii( sentry_init, - capture_events, capture_items, - capture_envelopes, - span_streaming, ): sentry_init( integrations=[ClickhouseDriverIntegration()], - trace_lifecycle="stream" if span_streaming else "static", + trace_lifecycle="stream", _experiments={ "record_sql_params": True, }, traces_sample_rate=1.0, send_default_pii=True, ) - if span_streaming: - items = capture_items("span") - - trace_id = None - span_id = None - - with sentry_sdk.traces.start_span(name="custom parent") as span: - trace_id = span.trace_id - span_id = span.span_id - - client = Client("localhost") - client.execute("DROP TABLE IF EXISTS test") - client.execute("CREATE TABLE test (x Int32) ENGINE = Memory") - client.execute("INSERT INTO test (x) VALUES", [{"x": 100}]) - client.execute("INSERT INTO test (x) VALUES", [[170], [200]]) - - res = client.execute( - "SELECT sum(x) FROM test WHERE x > %(minv)i", {"minv": 150} - ) - assert res[0][0] == 370 - - sentry_sdk.flush() - spans = [item.payload for item in items] - - expected_spans = [ - { - "name": "DROP TABLE IF EXISTS test", - "attributes": { - "db.system.name": "clickhouse", - "db.namespace": "", - "db.user": "default", - "db.query.text": "DROP TABLE IF EXISTS test", - "server.address": "localhost", - "server.port": 9000, - "thread.id": mock.ANY, - "thread.name": mock.ANY, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "CREATE TABLE test (x Int32) ENGINE = Memory", - "attributes": { - "db.system.name": "clickhouse", - "db.namespace": "", - "db.user": "default", - "db.query.text": "CREATE TABLE test (x Int32) ENGINE = Memory", - "server.address": "localhost", - "server.port": 9000, - "thread.id": mock.ANY, - "thread.name": mock.ANY, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "INSERT INTO test (x) VALUES", - "attributes": { - "db.system.name": "clickhouse", - "db.namespace": "", - "db.user": "default", - "db.query.text": "INSERT INTO test (x) VALUES", - "server.address": "localhost", - "server.port": 9000, - "thread.id": mock.ANY, - "thread.name": mock.ANY, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "INSERT INTO test (x) VALUES", - "attributes": { - "db.system.name": "clickhouse", - "db.namespace": "", - "db.user": "default", - "db.query.text": "INSERT INTO test (x) VALUES", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "SELECT sum(x) FROM test WHERE x > 150", - "attributes": { - "db.system.name": "clickhouse", - "db.namespace": "", - "db.user": "default", - "db.query.text": "SELECT sum(x) FROM test WHERE x > 150", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "custom parent", - "attributes": [], - "trace_id": trace_id, - }, - ] - - for span in expected_spans: - span["attributes"] = ApproxDict(span["attributes"]) - - for span in spans: - span.pop("span_id", None) - span.pop("start_timestamp", None) - span.pop("end_timestamp", None) - span.pop("is_segment", None) - span.pop("status", None) - - assert spans == expected_spans - else: - events = capture_events() - - transaction_trace_id = None - transaction_span_id = None - - with start_transaction(name="test_clickhouse_transaction") as transaction: - transaction_trace_id = transaction.trace_id - transaction_span_id = transaction.span_id - - client = Client("localhost") - client.execute("DROP TABLE IF EXISTS test") - client.execute("CREATE TABLE test (x Int32) ENGINE = Memory") - client.execute("INSERT INTO test (x) VALUES", [{"x": 100}]) - client.execute("INSERT INTO test (x) VALUES", [[170], [200]]) - - res = client.execute( - "SELECT sum(x) FROM test WHERE x > %(minv)i", {"minv": 150} - ) - assert res[0][0] == 370 - - (event,) = events - - expected_spans = [ - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "DROP TABLE IF EXISTS test", - "data": { - "db.system": "clickhouse", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - "db.result": [], - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + items = capture_items("span") + + trace_id = None + span_id = None + + with sentry_sdk.traces.start_span(name="custom parent") as span: + trace_id = span.trace_id + span_id = span.span_id + + client = Client("localhost") + client.execute("DROP TABLE IF EXISTS test") + client.execute("CREATE TABLE test (x Int32) ENGINE = Memory") + client.execute("INSERT INTO test (x) VALUES", [{"x": 100}]) + client.execute("INSERT INTO test (x) VALUES", [[170], [200]]) + + res = client.execute( + "SELECT sum(x) FROM test WHERE x > %(minv)i", {"minv": 150} + ) + assert res[0][0] == 370 + + sentry_sdk.flush() + spans = [item.payload for item in items] + + expected_spans = [ + { + "name": "DROP TABLE IF EXISTS test", + "attributes": { + "db.system.name": "clickhouse", + "db.namespace": "", + "db.user": "default", + "db.query.text": "DROP TABLE IF EXISTS test", + "server.address": "localhost", + "server.port": 9000, + "thread.id": mock.ANY, + "thread.name": mock.ANY, }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "CREATE TABLE test (x Int32) ENGINE = Memory", - "data": { - "db.system": "clickhouse", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - "db.result": [], - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "CREATE TABLE test (x Int32) ENGINE = Memory", + "attributes": { + "db.system.name": "clickhouse", + "db.namespace": "", + "db.user": "default", + "db.query.text": "CREATE TABLE test (x Int32) ENGINE = Memory", + "server.address": "localhost", + "server.port": 9000, + "thread.id": mock.ANY, + "thread.name": mock.ANY, }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "INSERT INTO test (x) VALUES", - "data": { - "db.system": "clickhouse", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - "db.params": [{"x": 100}], - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "INSERT INTO test (x) VALUES", + "attributes": { + "db.system.name": "clickhouse", + "db.namespace": "", + "db.user": "default", + "db.query.text": "INSERT INTO test (x) VALUES", + "server.address": "localhost", + "server.port": 9000, + "thread.id": mock.ANY, + "thread.name": mock.ANY, }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "INSERT INTO test (x) VALUES", - "data": { - "db.system": "clickhouse", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - "db.params": [[170], [200]], - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "INSERT INTO test (x) VALUES", + "attributes": { + "db.system.name": "clickhouse", + "db.namespace": "", + "db.user": "default", + "db.query.text": "INSERT INTO test (x) VALUES", + "server.address": "localhost", + "server.port": 9000, }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "SELECT sum(x) FROM test WHERE x > 150", - "data": { - "db.system": "clickhouse", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - "db.params": {"minv": 150}, - "db.result": [[370]], - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "SELECT sum(x) FROM test WHERE x > 150", + "attributes": { + "db.system.name": "clickhouse", + "db.namespace": "", + "db.user": "default", + "db.query.text": "SELECT sum(x) FROM test WHERE x > 150", + "server.address": "localhost", + "server.port": 9000, }, - ] - - if not EXPECT_PARAMS_IN_SELECT: - expected_spans[-1]["data"].pop("db.params", None) + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "custom parent", + "attributes": [], + "trace_id": trace_id, + }, + ] - for span in expected_spans: - span["data"] = ApproxDict(span["data"]) + for span in expected_spans: + span["attributes"] = ApproxDict(span["attributes"]) - for span in event["spans"]: - span.pop("span_id", None) - span.pop("start_timestamp", None) - span.pop("timestamp", None) + for span in spans: + span.pop("span_id", None) + span.pop("start_timestamp", None) + span.pop("end_timestamp", None) + span.pop("is_segment", None) + span.pop("status", None) - assert event["spans"] == expected_spans + assert spans == expected_spans def test_clickhouse_dbapi_breadcrumbs(sentry_init, capture_events) -> None: @@ -1479,554 +1200,289 @@ def test_clickhouse_dbapi_breadcrumbs_with_pii(sentry_init, capture_events) -> N assert event["breadcrumbs"]["values"] == expected_breadcrumbs -@pytest.mark.parametrize("span_streaming", [True, False]) def test_clickhouse_dbapi_spans( sentry_init, - capture_events, capture_items, - capture_envelopes, - span_streaming, ): sentry_init( integrations=[ClickhouseDriverIntegration()], - trace_lifecycle="stream" if span_streaming else "static", + trace_lifecycle="stream", _experiments={ "record_sql_params": True, }, traces_sample_rate=1.0, ) - if span_streaming: - items = capture_items("span") - - trace_id = None - span_id = None - - with sentry_sdk.traces.start_span(name="custom parent") as span: - trace_id = span.trace_id - span_id = span.span_id - - conn = connect("clickhouse://localhost") - cursor = conn.cursor() - cursor.execute("DROP TABLE IF EXISTS test") - cursor.execute("CREATE TABLE test (x Int32) ENGINE = Memory") - cursor.executemany("INSERT INTO test (x) VALUES", [{"x": 100}]) - cursor.executemany("INSERT INTO test (x) VALUES", [[170], [200]]) - cursor.execute("SELECT sum(x) FROM test WHERE x > %(minv)i", {"minv": 150}) - res = cursor.fetchall() - - sentry_sdk.flush() - spans = [item.payload for item in items] - - expected_spans = [ - { - "name": "DROP TABLE IF EXISTS test", - "attributes": { - "db.system.name": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.namespace": "", - "db.user": "default", - "db.query.text": "DROP TABLE IF EXISTS test", - "sentry.op": "db", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "CREATE TABLE test (x Int32) ENGINE = Memory", - "attributes": { - "db.system.name": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.namespace": "", - "db.user": "default", - "db.query.text": "CREATE TABLE test (x Int32) ENGINE = Memory", - "sentry.op": "db", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "INSERT INTO test (x) VALUES", - "attributes": { - "db.system.name": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.namespace": "", - "db.user": "default", - "db.query.text": "INSERT INTO test (x) VALUES", - "sentry.op": "db", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "INSERT INTO test (x) VALUES", - "attributes": { - "db.system.name": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.namespace": "", - "db.user": "default", - "db.query.text": "INSERT INTO test (x) VALUES", - "sentry.op": "db", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "SELECT sum(x) FROM test WHERE x > 150", - "attributes": { - "db.system.name": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.namespace": "", - "db.user": "default", - "db.query.text": "SELECT sum(x) FROM test WHERE x > 150", - "sentry.op": "db", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "custom parent", - "attributes": [], - "trace_id": trace_id, - }, - ] - - for span in expected_spans: - span["attributes"] = ApproxDict(span["attributes"]) - - for span in spans: - span.pop("span_id", None) - span.pop("start_timestamp", None) - span.pop("end_timestamp", None) - span.pop("is_segment", None) - span.pop("status", None) - - assert spans == expected_spans - else: - events = capture_events() - - transaction_trace_id = None - transaction_span_id = None - - with start_transaction(name="test_clickhouse_transaction") as transaction: - transaction_trace_id = transaction.trace_id - transaction_span_id = transaction.span_id - - conn = connect("clickhouse://localhost") - cursor = conn.cursor() - cursor.execute("DROP TABLE IF EXISTS test") - cursor.execute("CREATE TABLE test (x Int32) ENGINE = Memory") - cursor.executemany("INSERT INTO test (x) VALUES", [{"x": 100}]) - cursor.executemany("INSERT INTO test (x) VALUES", [[170], [200]]) - cursor.execute("SELECT sum(x) FROM test WHERE x > %(minv)i", {"minv": 150}) - res = cursor.fetchall() + items = capture_items("span") - assert res[0][0] == 370 + trace_id = None + span_id = None + + with sentry_sdk.traces.start_span(name="custom parent") as span: + trace_id = span.trace_id + span_id = span.span_id + + conn = connect("clickhouse://localhost") + cursor = conn.cursor() + cursor.execute("DROP TABLE IF EXISTS test") + cursor.execute("CREATE TABLE test (x Int32) ENGINE = Memory") + cursor.executemany("INSERT INTO test (x) VALUES", [{"x": 100}]) + cursor.executemany("INSERT INTO test (x) VALUES", [[170], [200]]) + cursor.execute("SELECT sum(x) FROM test WHERE x > %(minv)i", {"minv": 150}) + + sentry_sdk.flush() + spans = [item.payload for item in items] - (event,) = events - - expected_spans = [ - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "DROP TABLE IF EXISTS test", - "data": { - "db.system": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + expected_spans = [ + { + "name": "DROP TABLE IF EXISTS test", + "attributes": { + "db.system.name": "clickhouse", + "db.driver.name": "clickhouse-driver", + "db.namespace": "", + "db.user": "default", + "db.query.text": "DROP TABLE IF EXISTS test", + "sentry.op": "db", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "CREATE TABLE test (x Int32) ENGINE = Memory", - "data": { - "db.system": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "CREATE TABLE test (x Int32) ENGINE = Memory", + "attributes": { + "db.system.name": "clickhouse", + "db.driver.name": "clickhouse-driver", + "db.namespace": "", + "db.user": "default", + "db.query.text": "CREATE TABLE test (x Int32) ENGINE = Memory", + "sentry.op": "db", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "INSERT INTO test (x) VALUES", - "data": { - "db.system": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "INSERT INTO test (x) VALUES", + "attributes": { + "db.system.name": "clickhouse", + "db.driver.name": "clickhouse-driver", + "db.namespace": "", + "db.user": "default", + "db.query.text": "INSERT INTO test (x) VALUES", + "sentry.op": "db", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "INSERT INTO test (x) VALUES", - "data": { - "db.system": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "INSERT INTO test (x) VALUES", + "attributes": { + "db.system.name": "clickhouse", + "db.driver.name": "clickhouse-driver", + "db.namespace": "", + "db.user": "default", + "db.query.text": "INSERT INTO test (x) VALUES", + "sentry.op": "db", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "SELECT sum(x) FROM test WHERE x > 150", - "data": { - "db.system": "clickhouse", - "db.driver.name": "clickhouse-driver", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "SELECT sum(x) FROM test WHERE x > 150", + "attributes": { + "db.system.name": "clickhouse", + "db.driver.name": "clickhouse-driver", + "db.namespace": "", + "db.user": "default", + "db.query.text": "SELECT sum(x) FROM test WHERE x > 150", + "sentry.op": "db", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, }, - ] - - if not EXPECT_PARAMS_IN_SELECT: - expected_spans[-1]["data"].pop("db.params", None) + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "custom parent", + "attributes": [], + "trace_id": trace_id, + }, + ] - for span in expected_spans: - span["data"] = ApproxDict(span["data"]) + for span in expected_spans: + span["attributes"] = ApproxDict(span["attributes"]) - for span in event["spans"]: - span.pop("span_id", None) - span.pop("start_timestamp", None) - span.pop("timestamp", None) + for span in spans: + span.pop("span_id", None) + span.pop("start_timestamp", None) + span.pop("end_timestamp", None) + span.pop("is_segment", None) + span.pop("status", None) - assert event["spans"] == expected_spans + assert spans == expected_spans -@pytest.mark.parametrize("span_streaming", [True, False]) def test_clickhouse_dbapi_spans_with_pii( sentry_init, - capture_events, capture_items, - capture_envelopes, - span_streaming, ): sentry_init( integrations=[ClickhouseDriverIntegration()], - trace_lifecycle="stream" if span_streaming else "static", + trace_lifecycle="stream", _experiments={ "record_sql_params": True, }, traces_sample_rate=1.0, send_default_pii=True, ) - if span_streaming: - items = capture_items("span") - - trace_id = None - span_id = None + items = capture_items("span") - with sentry_sdk.traces.start_span(name="custom parent") as span: - trace_id = span.trace_id - span_id = span.span_id + trace_id = None + span_id = None - conn = connect("clickhouse://localhost") - cursor = conn.cursor() - cursor.execute("DROP TABLE IF EXISTS test") - cursor.execute("CREATE TABLE test (x Int32) ENGINE = Memory") - cursor.executemany("INSERT INTO test (x) VALUES", [{"x": 100}]) - cursor.executemany("INSERT INTO test (x) VALUES", [[170], [200]]) - cursor.execute("SELECT sum(x) FROM test WHERE x > %(minv)i", {"minv": 150}) - res = cursor.fetchall() + with sentry_sdk.traces.start_span(name="custom parent") as span: + trace_id = span.trace_id + span_id = span.span_id - assert res[0][0] == 370 + conn = connect("clickhouse://localhost") + cursor = conn.cursor() + cursor.execute("DROP TABLE IF EXISTS test") + cursor.execute("CREATE TABLE test (x Int32) ENGINE = Memory") + cursor.executemany("INSERT INTO test (x) VALUES", [{"x": 100}]) + cursor.executemany("INSERT INTO test (x) VALUES", [[170], [200]]) + cursor.execute("SELECT sum(x) FROM test WHERE x > %(minv)i", {"minv": 150}) + res = cursor.fetchall() - sentry_sdk.flush() - spans = [item.payload for item in items] - - expected_spans = [ - { - "name": "DROP TABLE IF EXISTS test", - "attributes": { - "db.system.name": "clickhouse", - "db.namespace": "", - "db.user": "default", - "db.query.text": "DROP TABLE IF EXISTS test", - "sentry.op": "db", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "CREATE TABLE test (x Int32) ENGINE = Memory", - "attributes": { - "db.system.name": "clickhouse", - "db.namespace": "", - "db.user": "default", - "db.query.text": "CREATE TABLE test (x Int32) ENGINE = Memory", - "sentry.op": "db", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "INSERT INTO test (x) VALUES", - "attributes": { - "db.system.name": "clickhouse", - "db.namespace": "", - "db.user": "default", - "db.query.text": "INSERT INTO test (x) VALUES", - "sentry.op": "db", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "INSERT INTO test (x) VALUES", - "attributes": { - "db.system.name": "clickhouse", - "db.namespace": "", - "db.user": "default", - "db.query.text": "INSERT INTO test (x) VALUES", - "sentry.op": "db", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "SELECT sum(x) FROM test WHERE x > 150", - "attributes": { - "db.system.name": "clickhouse", - "db.namespace": "", - "db.user": "default", - "db.query.text": "SELECT sum(x) FROM test WHERE x > 150", - "sentry.op": "db", - "sentry.origin": "auto.db.clickhouse_driver", - "server.address": "localhost", - "server.port": 9000, - }, - "trace_id": trace_id, - "parent_span_id": span_id, - }, - { - "name": "custom parent", - "attributes": [], - "trace_id": trace_id, - }, - ] - - for span in expected_spans: - span["attributes"] = ApproxDict(span["attributes"]) - - for span in spans: - span.pop("span_id", None) - span.pop("start_timestamp", None) - span.pop("end_timestamp", None) - span.pop("is_segment", None) - span.pop("status", None) - - assert spans == expected_spans - else: - events = capture_events() - - transaction_trace_id = None - transaction_span_id = None - - with start_transaction(name="test_clickhouse_transaction") as transaction: - transaction_trace_id = transaction.trace_id - transaction_span_id = transaction.span_id - - conn = connect("clickhouse://localhost") - cursor = conn.cursor() - cursor.execute("DROP TABLE IF EXISTS test") - cursor.execute("CREATE TABLE test (x Int32) ENGINE = Memory") - cursor.executemany("INSERT INTO test (x) VALUES", [{"x": 100}]) - cursor.executemany("INSERT INTO test (x) VALUES", [[170], [200]]) - cursor.execute("SELECT sum(x) FROM test WHERE x > %(minv)i", {"minv": 150}) - res = cursor.fetchall() + assert res[0][0] == 370 - assert res[0][0] == 370 + sentry_sdk.flush() + spans = [item.payload for item in items] - (event,) = events - - expected_spans = [ - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "DROP TABLE IF EXISTS test", - "data": { - "db.system": "clickhouse", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - "db.result": [[], []], - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + expected_spans = [ + { + "name": "DROP TABLE IF EXISTS test", + "attributes": { + "db.system.name": "clickhouse", + "db.namespace": "", + "db.user": "default", + "db.query.text": "DROP TABLE IF EXISTS test", + "sentry.op": "db", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "CREATE TABLE test (x Int32) ENGINE = Memory", - "data": { - "db.system": "clickhouse", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - "db.result": [[], []], - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "CREATE TABLE test (x Int32) ENGINE = Memory", + "attributes": { + "db.system.name": "clickhouse", + "db.namespace": "", + "db.user": "default", + "db.query.text": "CREATE TABLE test (x Int32) ENGINE = Memory", + "sentry.op": "db", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "INSERT INTO test (x) VALUES", - "data": { - "db.system": "clickhouse", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - "db.params": [{"x": 100}], - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "INSERT INTO test (x) VALUES", + "attributes": { + "db.system.name": "clickhouse", + "db.namespace": "", + "db.user": "default", + "db.query.text": "INSERT INTO test (x) VALUES", + "sentry.op": "db", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "INSERT INTO test (x) VALUES", - "data": { - "db.system": "clickhouse", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - "db.params": [[170], [200]], - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "INSERT INTO test (x) VALUES", + "attributes": { + "db.system.name": "clickhouse", + "db.namespace": "", + "db.user": "default", + "db.query.text": "INSERT INTO test (x) VALUES", + "sentry.op": "db", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, }, - { - "op": "db", - "origin": "auto.db.clickhouse_driver", - "description": "SELECT sum(x) FROM test WHERE x > 150", - "data": { - "db.system": "clickhouse", - "db.name": "", - "db.user": "default", - "server.address": "localhost", - "server.port": 9000, - "db.params": {"minv": 150}, - "db.result": [[[370]], [["sum(x)", "Int64"]]], - }, - "same_process_as_parent": True, - "trace_id": transaction_trace_id, - "parent_span_id": transaction_span_id, + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "SELECT sum(x) FROM test WHERE x > 150", + "attributes": { + "db.system.name": "clickhouse", + "db.namespace": "", + "db.user": "default", + "db.query.text": "SELECT sum(x) FROM test WHERE x > 150", + "sentry.op": "db", + "sentry.origin": "auto.db.clickhouse_driver", + "server.address": "localhost", + "server.port": 9000, }, - ] - - if not EXPECT_PARAMS_IN_SELECT: - expected_spans[-1]["data"].pop("db.params", None) + "trace_id": trace_id, + "parent_span_id": span_id, + }, + { + "name": "custom parent", + "attributes": [], + "trace_id": trace_id, + }, + ] - for span in expected_spans: - span["data"] = ApproxDict(span["data"]) + for span in expected_spans: + span["attributes"] = ApproxDict(span["attributes"]) - for span in event["spans"]: - span.pop("span_id", None) - span.pop("start_timestamp", None) - span.pop("timestamp", None) + for span in spans: + span.pop("span_id", None) + span.pop("start_timestamp", None) + span.pop("end_timestamp", None) + span.pop("is_segment", None) + span.pop("status", None) - assert event["spans"] == expected_spans + assert spans == expected_spans -@pytest.mark.parametrize("span_streaming", [True, False]) def test_span_origin( sentry_init, - capture_events, capture_items, - capture_envelopes, - span_streaming, ): sentry_init( integrations=[ClickhouseDriverIntegration()], traces_sample_rate=1.0, - trace_lifecycle="stream" if span_streaming else "static", + trace_lifecycle="stream", ) - if span_streaming: - items = capture_items("span") - - with sentry_sdk.traces.start_span(name="custom parent"): - conn = connect("clickhouse://localhost") - cursor = conn.cursor() - cursor.execute("SELECT 1") - - sentry_sdk.flush() - spans = [item.payload for item in items] - - assert spans[1]["attributes"]["sentry.origin"] == "manual" - assert spans[0]["attributes"]["sentry.origin"] == "auto.db.clickhouse_driver" - else: - events = capture_events() + items = capture_items("span") - with start_transaction(name="test_clickhouse_transaction"): - conn = connect("clickhouse://localhost") - cursor = conn.cursor() - cursor.execute("SELECT 1") + with sentry_sdk.traces.start_span(name="custom parent"): + conn = connect("clickhouse://localhost") + cursor = conn.cursor() + cursor.execute("SELECT 1") - (event,) = events + sentry_sdk.flush() + spans = [item.payload for item in items] - assert event["contexts"]["trace"]["origin"] == "manual" - assert event["spans"][0]["origin"] == "auto.db.clickhouse_driver" + assert spans[1]["attributes"]["sentry.origin"] == "manual" + assert spans[0]["attributes"]["sentry.origin"] == "auto.db.clickhouse_driver"