Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion tests/test_attributes.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ class Cat:
def test_user_attributes(sentry_init, capture_items):
sentry_init(
traces_sample_rate=1.0,
send_default_pii=True,
data_collection={"user_info": True},
)

items = capture_items("trace_metric", "span")
Expand Down
2 changes: 1 addition & 1 deletion tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -953,7 +953,7 @@ def test_dict_changed_during_iteration(sentry_init, capture_events):
See https://github.com/getsentry/sentry-python/pull/298 for discussion
"""
sentry_init(send_default_pii=True)
sentry_init(data_collection={})
events = capture_events()

class TooSmartClass:
Expand Down
175 changes: 35 additions & 140 deletions tests/test_data_collection.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import warnings

import pytest

import sentry_sdk
Expand Down Expand Up @@ -94,42 +92,10 @@ def _get(dc, path):


@pytest.mark.parametrize(
"options,expected",
"data_collection,expected",
[
pytest.param(
{},
{
"user_info": False,
"gen_ai.inputs": False,
"gen_ai.outputs": False,
"cookies.mode": "denylist",
"url_query_params.mode": "denylist",
"http_headers.request.mode": "denylist",
"http_bodies": _ALL_HTTP_BODY_TYPES,
"queues": False,
"frame_context_lines": 5,
},
id="no_options_collects_no_pii",
),
pytest.param(
{"send_default_pii": True},
{
"user_info": True,
"gen_ai.inputs": True,
"gen_ai.outputs": True,
"cookies.mode": "denylist",
"url_query_params.mode": "denylist",
"queues": True,
},
id="send_default_pii_true_collects_pii",
),
pytest.param(
{"send_default_pii": False},
{"user_info": False, "cookies.mode": "denylist", "queues": False},
id="send_default_pii_false_collects_no_pii",
),
pytest.param(
{"data_collection": {}},
{
"user_info": True,
"gen_ai.inputs": True,
Expand All @@ -142,7 +108,7 @@ def _get(dc, path):
id="explicit_data_collection_uses_spec_defaults",
),
pytest.param(
{"data_collection": {"user_info": False, "http_bodies": []}},
{"user_info": False, "http_bodies": []},
{
"user_info": False,
"http_bodies": [],
Expand All @@ -153,12 +119,10 @@ def _get(dc, path):
),
pytest.param(
{
"data_collection": {
"cookies": {"mode": "off"},
"url_query_params": {"mode": "allowlist", "terms": ["page"]},
"http_headers": {"request": {"mode": "off"}},
"gen_ai": {"inputs": False, "outputs": True},
}
"cookies": {"mode": "off"},
"url_query_params": {"mode": "allowlist", "terms": ["page"]},
"http_headers": {"request": {"mode": "off"}},
"gen_ai": {"inputs": False, "outputs": True},
},
{
"cookies.mode": "off",
Expand All @@ -172,13 +136,11 @@ def _get(dc, path):
),
pytest.param(
{
"data_collection": {
"cookies": None,
"http_headers": None,
"url_query_params": None,
"graphql": None,
"gen_ai": None,
}
"cookies": None,
"http_headers": None,
"url_query_params": None,
"graphql": None,
"gen_ai": None,
},
{
"cookies.mode": "denylist",
Expand All @@ -192,7 +154,7 @@ def _get(dc, path):
id="none_values_fall_back_to_spec_defaults",
),
pytest.param(
{"data_collection": {}},
{},
{
"graphql.document": True,
"graphql.variables": True,
Expand All @@ -201,67 +163,45 @@ def _get(dc, path):
id="explicit_graphql_database_defaults",
),
pytest.param(
{"send_default_pii": False},
{
"graphql.document": False,
"graphql.variables": False,
"database_query_data": False,
"queues": False,
},
id="legacy_pii_off_gates_graphql_database_and_queues",
),
pytest.param(
{"send_default_pii": True},
{
"graphql.document": True,
"graphql.variables": True,
"database_query_data": True,
"queues": True,
},
id="legacy_pii_on_collects_graphql_database_and_queues",
),
pytest.param(
{"data_collection": {"graphql": {"variables": False}}},
{"graphql": {"variables": False}},
{"graphql.document": True, "graphql.variables": False},
id="explicit_partial_graphql_fills_omitted",
),
pytest.param(
{"data_collection": {"frame_context_lines": True}},
{"frame_context_lines": True},
{"frame_context_lines": 5},
id="frame_context_lines_bool_fallback_true",
),
pytest.param(
{"data_collection": {"frame_context_lines": False}},
{"frame_context_lines": False},
{"frame_context_lines": 0},
id="frame_context_lines_bool_fallback_false",
),
pytest.param(
{"data_collection": {"frame_context_lines": 3}},
{"frame_context_lines": 3},
{"frame_context_lines": 3},
id="frame_context_lines_bool_fallback_3",
),
pytest.param(
{"data_collection": {"frame_context_lines": 0}},
{"frame_context_lines": 0},
{"frame_context_lines": 0},
id="frame_context_lines_bool_fallback_0",
),
pytest.param(
{"data_collection": {"stack_frame_variables": True}},
{"stack_frame_variables": True},
{"stack_frame_variables": True},
id="stack_frame_variables_explicit_true",
),
pytest.param(
{"data_collection": {"stack_frame_variables": False}},
{"stack_frame_variables": False},
{"stack_frame_variables": False},
id="stack_frame_variables_explicit_false",
),
pytest.param(
{
"data_collection": {
"stack_frame_variables": {
"mode": "allowlist",
"terms": ["order_id"],
}
"stack_frame_variables": {
"mode": "allowlist",
"terms": ["order_id"],
}
},
{
Expand All @@ -273,7 +213,7 @@ def _get(dc, path):
id="stack_frame_variables_allowlist_dict",
),
pytest.param(
{"data_collection": {"stack_frame_variables": {"terms": ["order_id"]}}},
{"stack_frame_variables": {"terms": ["order_id"]}},
{
"stack_frame_variables": {
"mode": "denylist",
Expand All @@ -283,64 +223,36 @@ def _get(dc, path):
id="stack_frame_variables_dict_defaults_mode_to_denylist",
),
pytest.param(
{"data_collection": {"stack_frame_variables": {"mode": "off"}}},
{"stack_frame_variables": {"mode": "off"}},
{"stack_frame_variables": {"mode": "off"}},
id="stack_frame_variables_off_dict_omits_terms",
),
pytest.param(
{"data_collection": {"stack_frame_variables": "yes"}},
{"stack_frame_variables": "yes"},
{"stack_frame_variables": True},
id="stack_frame_variables_non_bool_truthy_coerces_to_true",
),
pytest.param(
{"data_collection": {"stack_frame_variables": ""}},
{"stack_frame_variables": ""},
{"stack_frame_variables": False},
id="stack_frame_variables_non_bool_falsy_coerces_to_false",
),
pytest.param(
{"data_collection": {"frame_context_lines": None}},
{"frame_context_lines": None},
{"frame_context_lines": 5},
id="frame_context_lines_none_falls_back_to_spec_default",
),
],
)
def test_initialize_client_data_collection(sentry_init, options, expected):
dc = _initialize_client_with_config(sentry_init, **options)
def test_initialize_client_data_collection(sentry_init, data_collection, expected):
dc = _initialize_client_with_config(sentry_init, data_collection=data_collection)
for path, value in expected.items():
assert _get(dc, path) == value, f"{path} != {value!r}"


def test_initialize_client_data_collection_overrides_send_default_pii_and_warns(
sentry_init,
):
with warnings.catch_warnings(record=True) as caught:
warnings.simplefilter("always")
dc = _initialize_client_with_config(
sentry_init,
send_default_pii=True,
data_collection={"user_info": False},
)
assert dc["user_info"] is False # data_collection wins
assert any(issubclass(w.category, DeprecationWarning) for w in caught)


@pytest.mark.parametrize(
"init_kwargs,expected",
[
pytest.param(
{},
{
"user_info": False,
"provided_by_user": False,
"should_send_default_pii": False,
},
id="defaults_to_no_pii",
),
pytest.param(
{"send_default_pii": True},
{"user_info": True, "provided_by_user": False},
id="send_default_pii_enables_user_info",
),
pytest.param(
{"data_collection": {"user_info": False}},
{"user_info": False, "provided_by_user": True},
Expand All @@ -365,10 +277,7 @@ def test_client_data_collection_settings(sentry_init, init_kwargs, expected):
sentry_init(**init_kwargs)
client = sentry_sdk.get_client()
for key, value in expected.items():
if key == "should_send_default_pii":
assert client.should_send_default_pii() is value
else:
assert client.options["data_collection"][key] is value
assert client.options["data_collection"][key] is value


def test_has_data_collection_enabled_gates_on_user_provided_config():
Expand All @@ -390,37 +299,23 @@ def test_has_data_collection_enabled_gates_on_user_provided_config():


@pytest.mark.parametrize(
"init_kwargs, expected",
"data_collection, expected",
[
pytest.param({}, False, id="no_config"),
pytest.param({"send_default_pii": True}, False, id="send_default_pii_true"),
pytest.param({"send_default_pii": False}, False, id="send_default_pii_false"),
pytest.param({"data_collection": {}}, True, id="empty_data_collection"),
pytest.param({}, True, id="empty_data_collection"),
pytest.param(
{"data_collection": {"user_info": False}},
{"user_info": False},
True,
id="partial_data_collection",
),
],
)
def test_has_data_collection_enabled_after_resolution(
sentry_init, init_kwargs, expected
sentry_init, data_collection, expected
):
sentry_init(**init_kwargs)
sentry_init(data_collection=data_collection)
assert has_data_collection_enabled(sentry_sdk.get_client().options) is expected


def test_no_data_collection_values_fall_back_to_send_default_pii_configuration(
sentry_init,
):
sentry_init(send_default_pii=True)
client = sentry_sdk.get_client()
dc = client.options["data_collection"]
assert dc["provided_by_user"] is False
assert dc["user_info"] is True
assert has_data_collection_enabled(client.options) is False


def test_data_collection_via_experiments(sentry_init):
sentry_init(
_experiments={"data_collection": {"user_info": True}},
Expand Down
6 changes: 3 additions & 3 deletions tests/test_logs.py
Original file line number Diff line number Diff line change
Expand Up @@ -332,8 +332,8 @@ def test_auto_flush_logs_after_100(sentry_init, capture_envelopes):


def test_log_user_attributes(sentry_init, capture_items):
"""User attributes are sent if send_default_pii is True."""
sentry_init(send_default_pii=True)
"""User attributes are sent if user_info is True."""
sentry_init(data_collection={"user_info": True})

sentry_sdk.set_user({"id": "1", "email": "test@example.com", "username": "test"})
items = capture_items("log")
Expand All @@ -355,7 +355,7 @@ def test_log_user_attributes(sentry_init, capture_items):

def test_log_no_user_attributes_if_no_pii(sentry_init, capture_items):
"""User attributes are not if PII sending is off."""
sentry_init(send_default_pii=False)
sentry_init(data_collection={"user_info": False})

sentry_sdk.set_user({"id": "1", "email": "test@example.com", "username": "test"})
items = capture_items("log")
Expand Down
4 changes: 2 additions & 2 deletions tests/test_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def test_metrics_with_attributes(sentry_init, capture_items):


def test_metrics_with_user(sentry_init, capture_items):
sentry_init(send_default_pii=True)
sentry_init(data_collection={"user_info": True})
items = capture_items("trace_metric")

sentry_sdk.set_user(
Expand All @@ -83,7 +83,7 @@ def test_metrics_with_user(sentry_init, capture_items):


def test_metrics_no_user_if_pii_off(sentry_init, capture_items):
sentry_init(send_default_pii=False)
sentry_init(data_collection={"user_info": False})
items = capture_items("trace_metric")

sentry_sdk.set_user(
Expand Down
Loading
Loading