Skip to content

Commit f785bb6

Browse files
authored
chore: Remove outdated experimental options (#7257)
### Description Removed a handful of experimental options. Most of them now have a top-level counterpart. I left some still in: - `record_sql_queries`: This should probably be removed once data collection is out out. - `trace_lifecycle`: I'd remove this when we remove the top-level `trace_lifecycle` at a later point. - transport options: keeping these for now - continuous profiler start: no top-level counterpart #### Issues Closes https://linear.app/getsentry/issue/PY-1924/remove-experimental-options
1 parent 2fa686b commit f785bb6

7 files changed

Lines changed: 9 additions & 231 deletions

File tree

MIGRATION_GUIDE.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,11 @@ Looking to upgrade from Sentry SDK 2.x to 3.x? Here's a comprehensive list of wh
133133
- The deprecated `propagate_traces` option has been removed. Use `trace_propagation_targets` instead, which gives you more power over trace propagation. Note that only the top-level `init` option was removed; the `propagate_traces` option of the Celery integration remains available.
134134
- Removed Spotlight integration for Django. See [Spotlight 2.0](https://github.com/getsentry/spotlight/issues/891) for more context.
135135
- The deprecated parameter `propagate_hub` in `ThreadingIntegration()` was removed.
136+
- The experimental `max_spans` option was removed.
137+
- The experimental `before_send_log` option was removed. Use the top-level `before_send_log` instead.
138+
- The experimental `before_send_metric` option was removed. Use the top-level `before_send_metric` instead.
139+
- The experimental `ignore_spans` option was removed. Use the top-level `ignore_spans` instead.
140+
- The experimental `before_send_span` option was removed. Use the top-level `before_send_span` instead.
136141
- `configure_debug_hub` was removed.
137142
- The `max_spans` option of the `LangchainIntegration` was removed.
138143
- `Baggage.from_options` was removed.

sentry_sdk/consts.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ class CompressionAlgo(Enum):
6464
Experiments = TypedDict(
6565
"Experiments",
6666
{
67-
"max_spans": Optional[int],
6867
"max_flags": Optional[int],
6968
"record_sql_params": Optional[bool],
7069
"continuous_profiling_auto_start": Optional[bool],
@@ -74,13 +73,7 @@ class CompressionAlgo(Enum):
7473
"transport_num_pools": Optional[int],
7574
"transport_http2": Optional[bool],
7675
"transport_async": Optional[bool],
77-
"before_send_log": Optional[Callable[[Log, Hint], Optional[Log]]],
78-
"before_send_metric": Optional[Callable[[Metric, Hint], Optional[Metric]]],
7976
"trace_lifecycle": Optional[Literal["static", "stream"]],
80-
"ignore_spans": Optional[IgnoreSpansConfig],
81-
"before_send_span": Optional[
82-
Callable[[SpanJSON, Hint], Optional[SpanJSON]]
83-
],
8477
"data_collection": Optional[DataCollectionUserOptions],
8578
},
8679
total=False,

sentry_sdk/tracing_utils.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1676,16 +1676,7 @@ def _make_sampling_decision(
16761676
def is_ignored_span(name: str, attributes: "Optional[Attributes]") -> bool:
16771677
"""Determine if a span fits one of the rules in ignore_spans."""
16781678
client = sentry_sdk.get_client()
1679-
is_ignored_at_top_level = client.options.get("ignore_spans", None)
1680-
is_ignored_in_experiment_config = (client.options.get("_experiments") or {}).get(
1681-
"ignore_spans"
1682-
)
1683-
1684-
ignore_spans = (
1685-
is_ignored_at_top_level
1686-
if is_ignored_at_top_level is not None
1687-
else is_ignored_in_experiment_config
1688-
)
1679+
ignore_spans = client.options.get("ignore_spans", None)
16891680

16901681
if not ignore_spans:
16911682
return False

sentry_sdk/utils.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2021,9 +2021,7 @@ def get_before_send_log(
20212021
if options is None:
20222022
return None
20232023

2024-
return options.get("before_send_log") or options["_experiments"].get(
2025-
"before_send_log"
2026-
)
2024+
return options.get("before_send_log")
20272025

20282026

20292027
def get_before_send_metric(
@@ -2032,9 +2030,7 @@ def get_before_send_metric(
20322030
if options is None:
20332031
return None
20342032

2035-
return options.get("before_send_metric") or options["_experiments"].get(
2036-
"before_send_metric"
2037-
)
2033+
return options.get("before_send_metric")
20382034

20392035

20402036
def get_before_send_span(
@@ -2043,9 +2039,7 @@ def get_before_send_span(
20432039
if options is None:
20442040
return None
20452041

2046-
return options.get("before_send_span") or options["_experiments"].get(
2047-
"before_send_span"
2048-
)
2042+
return options.get("before_send_span")
20492043

20502044

20512045
def format_attribute(val: "Any") -> "AttributeValue":

tests/test_logs.py

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -106,34 +106,6 @@ def _before_log(record, hint):
106106
assert before_log_called is True
107107

108108

109-
def test_logs_before_send_log_experimental_option_still_works(
110-
sentry_init, capture_items
111-
):
112-
before_log_called = False
113-
114-
def _before_log(record, hint):
115-
nonlocal before_log_called
116-
before_log_called = True
117-
118-
return record
119-
120-
sentry_init(
121-
_experiments={
122-
"before_send_log": _before_log,
123-
},
124-
)
125-
items = capture_items("log")
126-
127-
sentry_sdk.logger.error("This is an error log...")
128-
129-
get_client().flush()
130-
logs = [item.payload for item in items]
131-
assert len(logs) == 1
132-
133-
assert logs[0]["attributes"]["sentry.severity_text"] == "error"
134-
assert before_log_called is True
135-
136-
137109
@pytest.mark.tests_internal_exceptions
138110
def test_logs_before_send_log_raises_does_not_crash_application(
139111
sentry_init, capture_items

tests/test_metrics.py

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,6 @@ def test_metrics_basics(sentry_init, capture_items):
4040
assert metrics[2]["unit"] == "second"
4141

4242

43-
def test_metrics_experimental_option(sentry_init, capture_items):
44-
sentry_init()
45-
items = capture_items("trace_metric")
46-
47-
sentry_sdk.metrics.count("test.counter", 5)
48-
49-
get_client().flush()
50-
51-
metrics = [item.payload for item in items]
52-
assert len(metrics) == 1
53-
54-
assert metrics[0]["name"] == "test.counter"
55-
assert metrics[0]["type"] == "counter"
56-
assert metrics[0]["value"] == 5.0
57-
58-
5943
def test_metrics_with_attributes(sentry_init, capture_items):
6044
sentry_init(release="1.0.0", environment="test", server_name="test-server")
6145
items = capture_items("trace_metric")
@@ -211,47 +195,6 @@ def _before_metric(record, hint):
211195
assert before_metric_called
212196

213197

214-
def test_metrics_experimental_before_send(sentry_init, capture_items):
215-
before_metric_called = False
216-
217-
def _before_metric(record, hint):
218-
nonlocal before_metric_called
219-
220-
assert set(record.keys()) == {
221-
"timestamp",
222-
"trace_id",
223-
"span_id",
224-
"name",
225-
"type",
226-
"value",
227-
"unit",
228-
"attributes",
229-
}
230-
231-
if record["name"] == "test.skip":
232-
return None
233-
234-
before_metric_called = True
235-
return record
236-
237-
sentry_init(
238-
_experiments={
239-
"before_send_metric": _before_metric,
240-
},
241-
)
242-
items = capture_items("trace_metric")
243-
244-
sentry_sdk.metrics.count("test.skip", 1)
245-
sentry_sdk.metrics.count("test.keep", 1)
246-
247-
get_client().flush()
248-
249-
metrics = [item.payload for item in items]
250-
assert len(metrics) == 1
251-
assert metrics[0]["name"] == "test.keep"
252-
assert before_metric_called
253-
254-
255198
@pytest.mark.tests_internal_exceptions
256199
def test_metrics_before_send_raises_does_not_crash_application(
257200
sentry_init, capture_items

tests/tracing/test_span_streaming.py

Lines changed: 0 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -383,67 +383,6 @@ def before_send_span(span, hint):
383383
assert "mutated" not in span["attributes"]
384384

385385

386-
def test_before_send_span_set_in_experiments(sentry_init, capture_items):
387-
def before_send_span(span, hint):
388-
span["name"] = "from experiments"
389-
return span
390-
391-
sentry_init(
392-
traces_sample_rate=1.0,
393-
trace_lifecycle="stream",
394-
_experiments={
395-
"before_send_span": before_send_span,
396-
},
397-
)
398-
399-
items = capture_items("span")
400-
401-
with sentry_sdk.traces.start_span(name="span"):
402-
...
403-
404-
sentry_sdk.get_client().flush()
405-
spans = [item.payload for item in items]
406-
407-
assert len(spans) == 1
408-
(span,) = spans
409-
410-
assert span["name"] == "from experiments"
411-
412-
413-
def test_before_send_span_top_level_takes_precedence_over_experiments(
414-
sentry_init, capture_items
415-
):
416-
def top_level(span, hint):
417-
span["name"] = "top-level"
418-
return span
419-
420-
def experimental(span, hint):
421-
span["name"] = "experimental"
422-
return span
423-
424-
sentry_init(
425-
traces_sample_rate=1.0,
426-
trace_lifecycle="stream",
427-
before_send_span=top_level,
428-
_experiments={
429-
"before_send_span": experimental,
430-
},
431-
)
432-
433-
items = capture_items("span")
434-
435-
with sentry_sdk.traces.start_span(name="span"):
436-
...
437-
438-
sentry_sdk.get_client().flush()
439-
spans = [item.payload for item in items]
440-
441-
assert len(spans) == 1
442-
(span,) = spans
443-
444-
assert span["name"] == "top-level"
445-
446-
447386
def test_before_send_span_warns_without_span_streaming(sentry_init):
448387
from unittest import mock
449388

@@ -1414,41 +1353,6 @@ def test_set_span_status_on_ignored_span(sentry_init, capture_items):
14141353
]
14151354

14161355

1417-
@pytest.mark.parametrize(
1418-
("ignore_spans", "name", "attributes", "ignored"), IGNORE_SPANS_CASES
1419-
)
1420-
def test_ignore_spans_set_in_experiments(
1421-
sentry_init, capture_items, ignore_spans, name, attributes, ignored
1422-
):
1423-
sentry_init(
1424-
traces_sample_rate=1.0,
1425-
_experiments={
1426-
"trace_lifecycle": "stream",
1427-
"ignore_spans": ignore_spans,
1428-
},
1429-
)
1430-
1431-
items = capture_items("span")
1432-
1433-
with sentry_sdk.traces.start_span(name=name, attributes=attributes) as span:
1434-
if ignored:
1435-
assert span.sampled is False
1436-
assert isinstance(span, NoOpStreamedSpan)
1437-
else:
1438-
assert span.sampled is True
1439-
assert isinstance(span, StreamedSpan)
1440-
1441-
sentry_sdk.get_client().flush()
1442-
spans = [item.payload for item in items]
1443-
1444-
if ignored:
1445-
assert len(spans) == 0
1446-
else:
1447-
assert len(spans) == 1
1448-
(span,) = spans
1449-
assert span["name"] == name
1450-
1451-
14521356
def test_ignore_spans_basic(
14531357
sentry_init, capture_items, capture_record_lost_event_calls
14541358
):
@@ -1974,30 +1878,6 @@ def test_ignore_spans_top_level_with_trace_lifecycle_in_experiments(
19741878
assert span["name"] == "not ignored"
19751879

19761880

1977-
def test_ignore_spans_empty_top_level_overrides_experiments(sentry_init, capture_items):
1978-
# An explicit empty top-level ignore_spans should disable ignoring,
1979-
# taking precedence over any rules set in _experiments.
1980-
sentry_init(
1981-
traces_sample_rate=1.0,
1982-
trace_lifecycle="stream",
1983-
ignore_spans=[],
1984-
_experiments={"ignore_spans": ["ignored"]},
1985-
)
1986-
1987-
items = capture_items("span")
1988-
1989-
with sentry_sdk.traces.start_span(name="ignored") as span:
1990-
assert span.sampled is True
1991-
assert isinstance(span, StreamedSpan)
1992-
1993-
sentry_sdk.get_client().flush()
1994-
spans = [item.payload for item in items]
1995-
1996-
assert len(spans) == 1
1997-
(span,) = spans
1998-
assert span["name"] == "ignored"
1999-
2000-
20011881
@pytest.mark.parametrize(
20021882
("options", "streaming_enabled"),
20031883
[

0 commit comments

Comments
 (0)