diff --git a/sentry_sdk/integrations/graphene.py b/sentry_sdk/integrations/graphene.py index c2df9e7907..4a115937da 100644 --- a/sentry_sdk/integrations/graphene.py +++ b/sentry_sdk/integrations/graphene.py @@ -143,7 +143,8 @@ def graphql_span( _graphql_span = sentry_sdk.start_span(op=op, name=operation_name) - _graphql_span.set_data("graphql.document", source) + if should_send_default_pii(): + _graphql_span.set_data("graphql.document", source) _graphql_span.set_data("graphql.operation.name", operation_name) _graphql_span.set_data("graphql.operation.type", operation_type) diff --git a/sentry_sdk/integrations/strawberry.py b/sentry_sdk/integrations/strawberry.py index a12ee63e2a..395f413b20 100644 --- a/sentry_sdk/integrations/strawberry.py +++ b/sentry_sdk/integrations/strawberry.py @@ -188,7 +188,8 @@ def on_operation(self) -> "Generator[None, None, None]": self.graphql_span.set_data("graphql.operation.type", operation_type) self.graphql_span.set_data("graphql.operation.name", self._operation_name) - self.graphql_span.set_data("graphql.document", self.execution_context.query) + if should_send_default_pii(): + self.graphql_span.set_data("graphql.document", self.execution_context.query) self.graphql_span.set_data("graphql.resource_name", self._resource_name) yield diff --git a/tests/integrations/graphene/test_graphene.py b/tests/integrations/graphene/test_graphene.py index 63bc5de5d2..3731e169a2 100644 --- a/tests/integrations/graphene/test_graphene.py +++ b/tests/integrations/graphene/test_graphene.py @@ -1,3 +1,4 @@ +import pytest from fastapi import FastAPI, Request from fastapi.testclient import TestClient from flask import Flask, request, jsonify @@ -204,11 +205,18 @@ def graphql_server_sync(): assert len(events) == 0 -def test_graphql_span_holds_query_information(sentry_init, capture_events): +@pytest.mark.parametrize( + "send_default_pii", + [True, False], +) +def test_graphql_span_holds_query_information( + sentry_init, capture_events, send_default_pii +): sentry_init( integrations=[GrapheneIntegration(), FlaskIntegration()], traces_sample_rate=1.0, default_integrations=False, + send_default_pii=send_default_pii, ) events = capture_events() @@ -237,10 +245,14 @@ def graphql_server_sync(): (span,) = event["spans"] assert span["op"] == OP.GRAPHQL_QUERY assert span["description"] == query["operationName"] - assert span["data"]["graphql.document"] == query["query"] assert span["data"]["graphql.operation.name"] == query["operationName"] assert span["data"]["graphql.operation.type"] == "query" + if send_default_pii is True: + assert span["data"]["graphql.document"] == query["query"] + else: + assert "graphql.document" not in span["data"] + def test_breadcrumbs_hold_query_information_on_error(sentry_init, capture_events): sentry_init( diff --git a/tests/integrations/strawberry/test_strawberry.py b/tests/integrations/strawberry/test_strawberry.py index d3174ed857..d4142daea0 100644 --- a/tests/integrations/strawberry/test_strawberry.py +++ b/tests/integrations/strawberry/test_strawberry.py @@ -282,6 +282,10 @@ def test_breadcrumb_no_operation_name( @parameterize_strawberry_test +@pytest.mark.parametrize( + "send_default_pii", + [True, False], +) def test_capture_transaction_on_error( request, sentry_init, @@ -289,9 +293,10 @@ def test_capture_transaction_on_error( client_factory, async_execution, framework_integrations, + send_default_pii, ): sentry_init( - send_default_pii=True, + send_default_pii=send_default_pii, integrations=[ StrawberryIntegration(async_execution=async_execution), ] @@ -323,9 +328,13 @@ def test_capture_transaction_on_error( assert query_span["description"] == "query ErrorQuery" assert query_span["data"]["graphql.operation.type"] == "query" assert query_span["data"]["graphql.operation.name"] == "ErrorQuery" - assert query_span["data"]["graphql.document"] == query assert query_span["data"]["graphql.resource_name"] + if send_default_pii is True: + assert query_span["data"]["graphql.document"] == query + else: + assert "graphql.document" not in query_span["data"] + parse_spans = [ span for span in transaction_event["spans"] if span["op"] == OP.GRAPHQL_PARSE ] @@ -360,6 +369,10 @@ def test_capture_transaction_on_error( @parameterize_strawberry_test +@pytest.mark.parametrize( + "send_default_pii", + [True, False], +) def test_capture_transaction_on_success( request, sentry_init, @@ -367,6 +380,7 @@ def test_capture_transaction_on_success( client_factory, async_execution, framework_integrations, + send_default_pii, ): sentry_init( integrations=[ @@ -374,6 +388,7 @@ def test_capture_transaction_on_success( ] + framework_integrations, traces_sample_rate=1, + send_default_pii=send_default_pii, ) events = capture_events() @@ -400,9 +415,13 @@ def test_capture_transaction_on_success( assert query_span["description"] == "query GreetingQuery" assert query_span["data"]["graphql.operation.type"] == "query" assert query_span["data"]["graphql.operation.name"] == "GreetingQuery" - assert query_span["data"]["graphql.document"] == query assert query_span["data"]["graphql.resource_name"] + if send_default_pii is True: + assert query_span["data"]["graphql.document"] == query + else: + assert "graphql.document" not in query_span["data"] + parse_spans = [ span for span in transaction_event["spans"] if span["op"] == OP.GRAPHQL_PARSE ] @@ -437,6 +456,10 @@ def test_capture_transaction_on_success( @parameterize_strawberry_test +@pytest.mark.parametrize( + "send_default_pii", + [True, False], +) def test_transaction_no_operation_name( request, sentry_init, @@ -444,6 +467,7 @@ def test_transaction_no_operation_name( client_factory, async_execution, framework_integrations, + send_default_pii, ): sentry_init( integrations=[ @@ -451,6 +475,7 @@ def test_transaction_no_operation_name( ] + framework_integrations, traces_sample_rate=1, + send_default_pii=send_default_pii, ) events = capture_events() @@ -480,9 +505,13 @@ def test_transaction_no_operation_name( assert query_span["description"] == "query" assert query_span["data"]["graphql.operation.type"] == "query" assert query_span["data"]["graphql.operation.name"] is None - assert query_span["data"]["graphql.document"] == query assert query_span["data"]["graphql.resource_name"] + if send_default_pii is True: + assert query_span["data"]["graphql.document"] == query + else: + assert "graphql.document" not in query_span["data"] + parse_spans = [ span for span in transaction_event["spans"] if span["op"] == OP.GRAPHQL_PARSE ] @@ -517,6 +546,10 @@ def test_transaction_no_operation_name( @parameterize_strawberry_test +@pytest.mark.parametrize( + "send_default_pii", + [True, False], +) def test_transaction_mutation( request, sentry_init, @@ -524,6 +557,7 @@ def test_transaction_mutation( client_factory, async_execution, framework_integrations, + send_default_pii, ): sentry_init( integrations=[ @@ -531,6 +565,7 @@ def test_transaction_mutation( ] + framework_integrations, traces_sample_rate=1, + send_default_pii=send_default_pii, ) events = capture_events() @@ -557,9 +592,13 @@ def test_transaction_mutation( assert query_span["description"] == "mutation" assert query_span["data"]["graphql.operation.type"] == "mutation" assert query_span["data"]["graphql.operation.name"] is None - assert query_span["data"]["graphql.document"] == query assert query_span["data"]["graphql.resource_name"] + if send_default_pii is True: + assert query_span["data"]["graphql.document"] == query + else: + assert "graphql.document" not in query_span["data"] + parse_spans = [ span for span in transaction_event["spans"] if span["op"] == OP.GRAPHQL_PARSE ]