From b788b0052ec79779daf7aa1a8a12597ef60d2e6f Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Thu, 13 Nov 2025 11:38:02 +0100 Subject: [PATCH 1/6] feat: Increase databag serialization limits --- sentry_sdk/serializer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/serializer.py b/sentry_sdk/serializer.py index 1775b1b555..a9358150ab 100644 --- a/sentry_sdk/serializer.py +++ b/sentry_sdk/serializer.py @@ -50,8 +50,8 @@ # Maximum depth and breadth of databags. Excess data will be trimmed. If # max_request_body_size is "always", request bodies won't be trimmed. -MAX_DATABAG_DEPTH = 5 -MAX_DATABAG_BREADTH = 10 +MAX_DATABAG_DEPTH = 100 +MAX_DATABAG_BREADTH = 100 CYCLE_MARKER = "" From 1a7ee374adb880a8335c6bae80071365bb48cca4 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Mon, 17 Nov 2025 10:36:41 +0100 Subject: [PATCH 2/6] tests --- .../test_clickhouse_driver.py | 16 +++++++++++++-- .../integrations/pure_eval/test_pure_eval.py | 10 +++++++++- tests/test_client.py | 20 +++++-------------- tests/test_scrubber.py | 2 +- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/tests/integrations/clickhouse_driver/test_clickhouse_driver.py b/tests/integrations/clickhouse_driver/test_clickhouse_driver.py index 635f9334c4..edd814121f 100644 --- a/tests/integrations/clickhouse_driver/test_clickhouse_driver.py +++ b/tests/integrations/clickhouse_driver/test_clickhouse_driver.py @@ -5,6 +5,8 @@ ``` """ +from unittest import mock + import clickhouse_driver from clickhouse_driver import Client, connect @@ -631,6 +633,8 @@ def test_clickhouse_dbapi_breadcrumbs_with_pii(sentry_init, capture_events) -> N "server.address": "localhost", "server.port": 9000, "db.result": [[], []], + "thread.id": mock.ANY, + "thread.name": mock.ANY, }, "message": "DROP TABLE IF EXISTS test", "type": "default", @@ -644,6 +648,8 @@ def test_clickhouse_dbapi_breadcrumbs_with_pii(sentry_init, capture_events) -> N "server.address": "localhost", "server.port": 9000, "db.result": [[], []], + "thread.id": mock.ANY, + "thread.name": mock.ANY, }, "message": "CREATE TABLE test (x Int32) ENGINE = Memory", "type": "default", @@ -657,6 +663,8 @@ def test_clickhouse_dbapi_breadcrumbs_with_pii(sentry_init, capture_events) -> N "server.address": "localhost", "server.port": 9000, "db.params": [{"x": 100}], + "thread.id": mock.ANY, + "thread.name": mock.ANY, }, "message": "INSERT INTO test (x) VALUES", "type": "default", @@ -670,6 +678,8 @@ def test_clickhouse_dbapi_breadcrumbs_with_pii(sentry_init, capture_events) -> N "server.address": "localhost", "server.port": 9000, "db.params": [[170], [200]], + "thread.id": mock.ANY, + "thread.name": mock.ANY, }, "message": "INSERT INTO test (x) VALUES", "type": "default", @@ -683,7 +693,9 @@ def test_clickhouse_dbapi_breadcrumbs_with_pii(sentry_init, capture_events) -> N "server.address": "localhost", "server.port": 9000, "db.params": {"minv": 150}, - "db.result": [[["370"]], [["'sum(x)'", "'Int64'"]]], + "db.result": [[[370]], [["sum(x)", "Int64"]]], + "thread.id": mock.ANY, + "thread.name": mock.ANY, }, "message": "SELECT sum(x) FROM test WHERE x > 150", "type": "default", @@ -699,7 +711,7 @@ def test_clickhouse_dbapi_breadcrumbs_with_pii(sentry_init, capture_events) -> N for crumb in event["breadcrumbs"]["values"]: crumb.pop("timestamp", None) - assert event["breadcrumbs"]["values"] == expected_breadcrumbs + assert event["breadcrumbs"]["values"][0]["data"] == expected_breadcrumbs[0]["data"] def test_clickhouse_dbapi_spans(sentry_init, capture_events, capture_envelopes) -> None: diff --git a/tests/integrations/pure_eval/test_pure_eval.py b/tests/integrations/pure_eval/test_pure_eval.py index 497a8768d0..5993a72dfb 100644 --- a/tests/integrations/pure_eval/test_pure_eval.py +++ b/tests/integrations/pure_eval/test_pure_eval.py @@ -62,6 +62,14 @@ def foo(): "i", "u", "y", + "t", + "r", + "e", + "w", + "q", + "(q, w, e, r, t, y, u, i, o, p, a, s)", + "str((q, w, e, r, t, y, u, i, o, p, a, s))", + "events", ] assert list(frame_vars.keys()) == expected_keys assert frame_vars["namespace.d"] == {"1": "2"} @@ -85,4 +93,4 @@ def foo(): "s", "events", } - assert len(frame_vars) == serializer.MAX_DATABAG_BREADTH + assert len(frame_vars) == 14 diff --git a/tests/test_client.py b/tests/test_client.py index a5b0b44931..5a557ac9eb 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -771,23 +771,13 @@ def test_databag_depth_stripping(sentry_init, capture_events): stacktrace_frame = event["exception"]["values"][0]["stacktrace"]["frames"][0] a_var = stacktrace_frame["vars"]["a"] - assert type(a_var) == list - assert len(a_var) == 1 and type(a_var[0]) == list + for _ in range(99): + assert type(a_var) == list + assert len(a_var) == 1 - first_level_list = a_var[0] - assert type(first_level_list) == list - assert len(first_level_list) == 1 + a_var = a_var[0] - second_level_list = first_level_list[0] - assert type(second_level_list) == list - assert len(second_level_list) == 1 - - third_level_list = second_level_list[0] - assert type(third_level_list) == list - assert len(third_level_list) == 1 - - inner_value_repr = third_level_list[0] - assert type(inner_value_repr) == str + assert type(a_var) == str def test_databag_string_stripping(sentry_init, capture_events): diff --git a/tests/test_scrubber.py b/tests/test_scrubber.py index 2cc5f4139f..fa3d340a5a 100644 --- a/tests/test_scrubber.py +++ b/tests/test_scrubber.py @@ -230,7 +230,7 @@ def test_recursive_event_scrubber(sentry_init, capture_events): capture_event({"extra": complex_structure}) (event,) = events - assert event["extra"]["deep"]["deeper"][0]["deepest"]["password"] == "'[Filtered]'" + assert event["extra"]["deep"]["deeper"][0]["deepest"]["password"] == "[Filtered]" def test_recursive_scrubber_does_not_override_original(sentry_init, capture_events): From a8d0d953ea9da9bfd5c3898e7efcbf29d552ab9d Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Mon, 17 Nov 2025 10:37:39 +0100 Subject: [PATCH 3/6] . --- tests/integrations/clickhouse_driver/test_clickhouse_driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integrations/clickhouse_driver/test_clickhouse_driver.py b/tests/integrations/clickhouse_driver/test_clickhouse_driver.py index edd814121f..0fe90da679 100644 --- a/tests/integrations/clickhouse_driver/test_clickhouse_driver.py +++ b/tests/integrations/clickhouse_driver/test_clickhouse_driver.py @@ -711,7 +711,7 @@ def test_clickhouse_dbapi_breadcrumbs_with_pii(sentry_init, capture_events) -> N for crumb in event["breadcrumbs"]["values"]: crumb.pop("timestamp", None) - assert event["breadcrumbs"]["values"][0]["data"] == expected_breadcrumbs[0]["data"] + assert event["breadcrumbs"]["values"] == expected_breadcrumbs def test_clickhouse_dbapi_spans(sentry_init, capture_events, capture_envelopes) -> None: From bcfd6b5f860ce0904a777c796fedff9e36f2ee94 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Mon, 17 Nov 2025 10:41:38 +0100 Subject: [PATCH 4/6] . --- tests/integrations/pure_eval/test_pure_eval.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/integrations/pure_eval/test_pure_eval.py b/tests/integrations/pure_eval/test_pure_eval.py index 5993a72dfb..d9d16a7367 100644 --- a/tests/integrations/pure_eval/test_pure_eval.py +++ b/tests/integrations/pure_eval/test_pure_eval.py @@ -67,8 +67,6 @@ def foo(): "e", "w", "q", - "(q, w, e, r, t, y, u, i, o, p, a, s)", - "str((q, w, e, r, t, y, u, i, o, p, a, s))", "events", ] assert list(frame_vars.keys()) == expected_keys From c819ec23dfe221896ec031c401467651cce38bbd Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Mon, 17 Nov 2025 10:47:53 +0100 Subject: [PATCH 5/6] . --- tests/integrations/pure_eval/test_pure_eval.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/integrations/pure_eval/test_pure_eval.py b/tests/integrations/pure_eval/test_pure_eval.py index d9d16a7367..5993a72dfb 100644 --- a/tests/integrations/pure_eval/test_pure_eval.py +++ b/tests/integrations/pure_eval/test_pure_eval.py @@ -67,6 +67,8 @@ def foo(): "e", "w", "q", + "(q, w, e, r, t, y, u, i, o, p, a, s)", + "str((q, w, e, r, t, y, u, i, o, p, a, s))", "events", ] assert list(frame_vars.keys()) == expected_keys From 0eef812ce7f57d5867f2b37159d68180762d0661 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Mon, 17 Nov 2025 11:32:28 +0100 Subject: [PATCH 6/6] . --- tests/integrations/pure_eval/test_pure_eval.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/integrations/pure_eval/test_pure_eval.py b/tests/integrations/pure_eval/test_pure_eval.py index 5993a72dfb..dfa4050e69 100644 --- a/tests/integrations/pure_eval/test_pure_eval.py +++ b/tests/integrations/pure_eval/test_pure_eval.py @@ -67,11 +67,19 @@ def foo(): "e", "w", "q", + "events", + ] + for key in expected_keys: + assert key in frame_vars + + possible_keys = expected_keys + [ "(q, w, e, r, t, y, u, i, o, p, a, s)", "str((q, w, e, r, t, y, u, i, o, p, a, s))", - "events", ] - assert list(frame_vars.keys()) == expected_keys + + for frame_var in frame_vars: + assert frame_var in possible_keys + assert frame_vars["namespace.d"] == {"1": "2"} assert frame_vars["namespace.d[1]"] == "2" else: