Skip to content

Commit 9817d2a

Browse files
antonpirkermatt-codecov
authored andcommitted
fix: include_tracing_fields arg to control unvetted data in rust_tracing integration
1 parent 4bec4a4 commit 9817d2a

File tree

2 files changed

+55
-24
lines changed

2 files changed

+55
-24
lines changed

sentry_sdk/integrations/rust_tracing.py

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,21 @@ def __init__(
151151
[Dict[str, Any]], EventTypeMapping
152152
] = default_event_type_mapping,
153153
span_filter: Callable[[Dict[str, Any]], bool] = default_span_filter,
154-
send_sensitive_data: Optional[bool] = None,
154+
include_tracing_fields: Optional[bool] = None,
155155
):
156156
self.origin = origin
157157
self.event_type_mapping = event_type_mapping
158158
self.span_filter = span_filter
159-
self.send_sensitive_data = send_sensitive_data
159+
self.include_tracing_fields = include_tracing_fields
160+
161+
def _include_tracing_fields(self) -> bool:
162+
"""
163+
By default, the values of tracing fields are not included in case they
164+
contain PII. A user may override that by passing `True` for the
165+
`include_tracing_fields` keyword argument of this integration or by
166+
setting `send_default_pii` to `True` in their Sentry client options.
167+
"""
168+
return should_send_default_pii() if self.include_tracing_fields is None else self.include_tracing_fields
160169

161170
def on_event(self, event: str, _span_state: TraceState) -> None:
162171
deserialized_event = json.loads(event)
@@ -207,7 +216,10 @@ def on_new_span(self, attrs: str, span_id: str) -> TraceState:
207216

208217
fields = metadata.get("fields", [])
209218
for field in fields:
210-
sentry_span.set_data(field, attrs.get(field))
219+
if self._include_tracing_fields():
220+
sentry_span.set_data(field, attrs.get(field))
221+
else:
222+
sentry_span.set_data(field, SENSITIVE_DATA_SUBSTITUTE)
211223

212224
scope.span = sentry_span
213225
return (parent_sentry_span, sentry_span)
@@ -225,15 +237,9 @@ def on_record(self, span_id: str, values: str, span_state: TraceState) -> None:
225237
return
226238
_parent_sentry_span, sentry_span = span_state
227239

228-
send_sensitive_data = (
229-
should_send_default_pii()
230-
if self.send_sensitive_data is None
231-
else self.send_sensitive_data
232-
)
233-
234240
deserialized_values = json.loads(values)
235241
for key, value in deserialized_values.items():
236-
if send_sensitive_data:
242+
if self._include_tracing_fields():
237243
sentry_span.set_data(key, value)
238244
else:
239245
sentry_span.set_data(key, SENSITIVE_DATA_SUBSTITUTE)
@@ -259,12 +265,12 @@ def __init__(
259265
[Dict[str, Any]], EventTypeMapping
260266
] = default_event_type_mapping,
261267
span_filter: Callable[[Dict[str, Any]], bool] = default_span_filter,
262-
send_sensitive_data: Optional[bool] = None,
268+
include_tracing_fields: Optional[bool] = None,
263269
):
264270
self.identifier = identifier
265271
origin = f"auto.function.rust_tracing.{identifier}"
266272
self.tracing_layer = RustTracingLayer(
267-
origin, event_type_mapping, span_filter, send_sensitive_data
273+
origin, event_type_mapping, span_filter, include_tracing_fields
268274
)
269275

270276
initializer(self.tracing_layer)

tests/integrations/rust_tracing/test_rust_tracing.py

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from unittest import mock
12
import pytest
23

34
from string import Template
@@ -66,7 +67,9 @@ def record(self, span_id: int):
6667
def test_on_new_span_on_close(sentry_init, capture_events):
6768
rust_tracing = FakeRustTracing()
6869
integration = RustTracingIntegration(
69-
"test_on_new_span_on_close", rust_tracing.set_layer_impl
70+
"test_on_new_span_on_close",
71+
initializer=rust_tracing.set_layer_impl,
72+
include_tracing_fields=True,
7073
)
7174
sentry_init(integrations=[integration], traces_sample_rate=1.0)
7275

@@ -105,7 +108,9 @@ def test_on_new_span_on_close(sentry_init, capture_events):
105108
def test_nested_on_new_span_on_close(sentry_init, capture_events):
106109
rust_tracing = FakeRustTracing()
107110
integration = RustTracingIntegration(
108-
"test_nested_on_new_span_on_close", rust_tracing.set_layer_impl
111+
"test_nested_on_new_span_on_close",
112+
initializer=rust_tracing.set_layer_impl,
113+
include_tracing_fields=True,
109114
)
110115
sentry_init(integrations=[integration], traces_sample_rate=1.0)
111116

@@ -331,7 +336,10 @@ def span_filter(metadata: Dict[str, object]) -> bool:
331336

332337
rust_tracing = FakeRustTracing()
333338
integration = RustTracingIntegration(
334-
"test_span_filter", rust_tracing.set_layer_impl, span_filter=span_filter
339+
"test_span_filter",
340+
initializer=rust_tracing.set_layer_impl,
341+
span_filter=span_filter,
342+
include_tracing_fields=True,
335343
)
336344
sentry_init(integrations=[integration], traces_sample_rate=1.0)
337345

@@ -365,7 +373,7 @@ def test_record(sentry_init):
365373
integration = RustTracingIntegration(
366374
"test_record",
367375
initializer=rust_tracing.set_layer_impl,
368-
send_sensitive_data=True,
376+
include_tracing_fields=True,
369377
)
370378
sentry_init(integrations=[integration], traces_sample_rate=1.0)
371379

@@ -391,6 +399,7 @@ def span_filter(metadata: Dict[str, object]) -> bool:
391399
"test_record_in_ignored_span",
392400
rust_tracing.set_layer_impl,
393401
span_filter=span_filter,
402+
include_tracing_fields=True,
394403
)
395404
sentry_init(integrations=[integration], traces_sample_rate=1.0)
396405

@@ -409,7 +418,7 @@ def span_filter(metadata: Dict[str, object]) -> bool:
409418

410419

411420
@pytest.mark.parametrize(
412-
"send_default_pii, send_sensitive_data, sensitive_data_expected",
421+
"send_default_pii, include_tracing_fields, tracing_fields_expected",
413422
[
414423
(True, True, True),
415424
(True, False, False),
@@ -419,14 +428,14 @@ def span_filter(metadata: Dict[str, object]) -> bool:
419428
(False, None, False),
420429
],
421430
)
422-
def test_sensitive_data(
423-
sentry_init, send_default_pii, send_sensitive_data, sensitive_data_expected
431+
def test_include_tracing_fields(
432+
sentry_init, send_default_pii, include_tracing_fields, tracing_fields_expected
424433
):
425434
rust_tracing = FakeRustTracing()
426435
integration = RustTracingIntegration(
427436
"test_record",
428437
initializer=rust_tracing.set_layer_impl,
429-
send_sensitive_data=send_sensitive_data,
438+
include_tracing_fields=include_tracing_fields,
430439
)
431440

432441
sentry_init(
@@ -438,13 +447,29 @@ def test_sensitive_data(
438447
rust_tracing.new_span(RustTracingLevel.Info, 3)
439448

440449
span_before_record = sentry_sdk.get_current_span().to_json()
441-
assert span_before_record["data"]["version"] is None
450+
if tracing_fields_expected:
451+
assert span_before_record["data"]["version"] is None
452+
else:
453+
assert span_before_record["data"]["version"] == "[Filtered]"
442454

443455
rust_tracing.record(3)
444456

445457
span_after_record = sentry_sdk.get_current_span().to_json()
446458

447-
if sensitive_data_expected:
448-
assert span_after_record["data"]["version"] == "memoized"
459+
if tracing_fields_expected:
460+
assert span_after_record["data"] == {
461+
"thread.id": mock.ANY,
462+
"thread.name": mock.ANY,
463+
"use_memoized": True,
464+
"version": "memoized",
465+
"index": 10,
466+
}
467+
449468
else:
450-
assert span_after_record["data"]["version"] == "[Filtered]"
469+
assert span_after_record["data"] == {
470+
"thread.id": mock.ANY,
471+
"thread.name": mock.ANY,
472+
"use_memoized": "[Filtered]",
473+
"version": "[Filtered]",
474+
"index": "[Filtered]",
475+
}

0 commit comments

Comments
 (0)