Skip to content

Commit c66c1a0

Browse files
committed
Add sensitive data control
1 parent 5d6d32c commit c66c1a0

File tree

2 files changed

+67
-4
lines changed

2 files changed

+67
-4
lines changed

sentry_sdk/integrations/rust_tracing.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import sentry_sdk
3838
from sentry_sdk.integrations import Integration
3939
from sentry_sdk.tracing import Span as SentrySpan
40+
from sentry_sdk.utils import SENSITIVE_DATA_SUBSTITUTE
4041

4142
TraceState = Optional[Tuple[Optional[SentrySpan], SentrySpan]]
4243

@@ -149,10 +150,12 @@ def __init__(
149150
[Dict[str, Any]], EventTypeMapping
150151
] = default_event_type_mapping,
151152
span_filter: Callable[[Dict[str, Any]], bool] = default_span_filter,
153+
send_sensitive_data: bool = None,
152154
):
153155
self.origin = origin
154156
self.event_type_mapping = event_type_mapping
155157
self.span_filter = span_filter
158+
self.send_sensitive_data = send_sensitive_data
156159

157160
def on_event(self, event: str, _span_state: TraceState) -> None:
158161
deserialized_event = json.loads(event)
@@ -221,9 +224,19 @@ def on_record(self, span_id: str, values: str, span_state: TraceState) -> None:
221224
return
222225
_parent_sentry_span, sentry_span = span_state
223226

227+
client_options = sentry_sdk.get_client().options
228+
send_sensitive_data = (
229+
client_options["send_default_pii"]
230+
if self.send_sensitive_data is None
231+
else self.send_sensitive_data
232+
)
233+
224234
deserialized_values = json.loads(values)
225235
for key, value in deserialized_values.items():
226-
sentry_span.set_data(key, value)
236+
if send_sensitive_data:
237+
sentry_span.set_data(key, value)
238+
else:
239+
sentry_span.set_data(key, SENSITIVE_DATA_SUBSTITUTE)
227240

228241

229242
class RustTracingIntegration(Integration):
@@ -246,11 +259,13 @@ def __init__(
246259
[Dict[str, Any]], EventTypeMapping
247260
] = default_event_type_mapping,
248261
span_filter: Callable[[Dict[str, Any]], bool] = default_span_filter,
262+
send_sensitive_data: Optional[bool] = None,
249263
):
250264
self.identifier = identifier
251-
252265
origin = f"auto.function.rust_tracing.{identifier}"
253-
self.tracing_layer = RustTracingLayer(origin, event_type_mapping, span_filter)
266+
self.tracing_layer = RustTracingLayer(
267+
origin, event_type_mapping, span_filter, send_sensitive_data
268+
)
254269

255270
initializer(self.tracing_layer)
256271

tests/integrations/rust_tracing/test_rust_tracing.py

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import pytest
2+
13
from string import Template
24
from typing import Dict
35

@@ -360,7 +362,11 @@ def span_filter(metadata: Dict[str, object]) -> bool:
360362

361363
def test_record(sentry_init):
362364
rust_tracing = FakeRustTracing()
363-
integration = RustTracingIntegration("test_record", rust_tracing.set_layer_impl)
365+
integration = RustTracingIntegration(
366+
"test_record",
367+
initializer=rust_tracing.set_layer_impl,
368+
send_sensitive_data=True,
369+
)
364370
sentry_init(integrations=[integration], traces_sample_rate=1.0)
365371

366372
with start_transaction():
@@ -400,3 +406,45 @@ def span_filter(metadata: Dict[str, object]) -> bool:
400406
# `on_record()` should not do anything to the current Sentry span if the associated Rust span was ignored
401407
span_after_record = sentry_sdk.get_current_span().to_json()
402408
assert span_after_record["data"]["version"] is None
409+
410+
411+
@pytest.mark.parametrize(
412+
"send_default_pii, send_sensitive_data, sensitive_data_expected",
413+
[
414+
(True, True, True),
415+
(True, False, False),
416+
(True, None, True),
417+
(False, True, True),
418+
(False, False, False),
419+
(False, None, False),
420+
],
421+
)
422+
def test_sensitive_data(
423+
sentry_init, send_default_pii, send_sensitive_data, sensitive_data_expected
424+
):
425+
rust_tracing = FakeRustTracing()
426+
integration = RustTracingIntegration(
427+
"test_record",
428+
initializer=rust_tracing.set_layer_impl,
429+
send_sensitive_data=send_sensitive_data,
430+
)
431+
432+
sentry_init(
433+
integrations=[integration],
434+
traces_sample_rate=1.0,
435+
send_default_pii=send_default_pii,
436+
)
437+
with start_transaction():
438+
rust_tracing.new_span(RustTracingLevel.Info, 3)
439+
440+
span_before_record = sentry_sdk.get_current_span().to_json()
441+
assert span_before_record["data"]["version"] is None
442+
443+
rust_tracing.record(3)
444+
445+
span_after_record = sentry_sdk.get_current_span().to_json()
446+
447+
if sensitive_data_expected:
448+
assert span_after_record["data"]["version"] == "memoized"
449+
else:
450+
assert span_after_record["data"]["version"] == "[Filtered]"

0 commit comments

Comments
 (0)