Skip to content

Commit ed27584

Browse files
authored
ref(spans): Enable span extraction unconditionally (#5308)
1 parent d46d548 commit ed27584

File tree

15 files changed

+120
-120
lines changed

15 files changed

+120
-120
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
- Switch default allocator from jemalloc to mimalloc. ([#5239](https://github.com/getsentry/relay/pull/5239))
2727
- Add internal attributes to aid searching trace metrics. ([#5260](https://github.com/getsentry/relay/pull/5260))
2828
- Remove sentry.timestamp_nanos for log items. ([#5295](https://github.com/getsentry/relay/pull/5295))
29+
- Unconditionally enable span extraction. ([#5308](https://github.com/getsentry/relay/pull/5308))
2930

3031
## 25.10.0
3132

relay-dynamic-config/src/defaults.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ pub fn add_span_metrics(project_config: &mut ProjectConfig) {
1212
.metric_extraction
1313
.get_or_insert_with(MetricExtractionConfig::empty);
1414

15-
let features = &project_config.features;
16-
1715
if !config.is_supported() || config._span_metrics_extended {
1816
return;
1917
}
@@ -28,10 +26,6 @@ pub fn add_span_metrics(project_config: &mut ProjectConfig) {
2826
tags: vec![],
2927
});
3028

31-
if !features.produces_spans() {
32-
return;
33-
}
34-
3529
config
3630
.global_groups
3731
.entry(GroupKey::SpanMetricsCommon)

relay-dynamic-config/src/feature.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ pub const GRADUATED_FEATURE_FLAGS: &[Feature] = &[
88
Feature::UserReportV2Ingest,
99
Feature::IngestUnsampledProfiles,
1010
Feature::ScrubMongoDbDescriptions,
11+
Feature::DeprecatedExtractSpansFromEvent,
1112
];
1213

1314
/// Features exposed by project config.
@@ -90,11 +91,6 @@ pub enum Feature {
9091
/// Serialized as `organizations:continuous-profiling-beta-ingest`.
9192
#[serde(rename = "organizations:continuous-profiling-beta-ingest")]
9293
ContinuousProfilingBetaIngest,
93-
/// When enabled, spans will be extracted from a transaction.
94-
///
95-
/// Serialized as `organizations:indexed-spans-extraction`.
96-
#[serde(rename = "organizations:indexed-spans-extraction")]
97-
ExtractSpansFromEvent,
9894
/// Enable log ingestion for our log product (this is not internal logging).
9995
///
10096
/// Serialized as `organizations:ourlogs-ingestion`.
@@ -134,6 +130,10 @@ pub enum Feature {
134130
#[doc(hidden)]
135131
#[serde(rename = "projects:span-metrics-extraction-addons")]
136132
DeprecatedExtractAddonsSpanMetricsFromEvent,
133+
/// This feature has graduated and is hard-coded for external Relays.
134+
#[doc(hidden)]
135+
#[serde(rename = "organizations:indexed-spans-extraction")]
136+
DeprecatedExtractSpansFromEvent,
137137
/// Forward compatibility.
138138
#[doc(hidden)]
139139
#[serde(other)]
@@ -154,11 +154,6 @@ impl FeatureSet {
154154
pub fn has(&self, feature: Feature) -> bool {
155155
self.0.contains(&feature)
156156
}
157-
158-
/// Returns `true` if any spans are produced for this project.
159-
pub fn produces_spans(&self) -> bool {
160-
self.has(Feature::ExtractSpansFromEvent) || self.has(Feature::StandaloneSpanIngestion)
161-
}
162157
}
163158

164159
impl FromIterator<Feature> for FeatureSet {

relay-server/src/metrics_extraction/event.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,11 +1289,4 @@ mod tests {
12891289
"c:spans/count_per_root_project@none"
12901290
);
12911291
}
1292-
1293-
#[test]
1294-
fn only_indexed_spans_enabled() {
1295-
let metrics = extract_span_metrics([Feature::ExtractSpansFromEvent]).project_metrics;
1296-
assert_eq!(metrics.len(), 75);
1297-
assert!(metrics.iter().all(|b| &b.name == "c:spans/usage@none"));
1298-
}
12991292
}

relay-server/src/services/processor.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1578,7 +1578,7 @@ impl EnvelopeProcessorService {
15781578
},
15791579
device_class_synthesis_config: project_info
15801580
.has_feature(Feature::DeviceClassSynthesis),
1581-
enrich_spans: project_info.has_feature(Feature::ExtractSpansFromEvent),
1581+
enrich_spans: true,
15821582
max_tag_value_length: self
15831583
.inner
15841584
.config
@@ -1922,17 +1922,15 @@ impl EnvelopeProcessorService {
19221922
spans_extracted,
19231923
)?;
19241924

1925-
if ctx.project_info.has_feature(Feature::ExtractSpansFromEvent) {
1926-
spans_extracted = span::extract_from_event(
1927-
managed_envelope,
1928-
&event,
1929-
ctx.global_config,
1930-
ctx.config,
1931-
server_sample_rate,
1932-
event_metrics_extracted,
1933-
spans_extracted,
1934-
);
1935-
}
1925+
spans_extracted = span::extract_from_event(
1926+
managed_envelope,
1927+
&event,
1928+
ctx.global_config,
1929+
ctx.config,
1930+
server_sample_rate,
1931+
event_metrics_extracted,
1932+
spans_extracted,
1933+
);
19361934
});
19371935

19381936
event = self

relay-server/src/services/processor/span/processing.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -173,16 +173,14 @@ pub async fn process(
173173

174174
extracted_metrics.extend_project_metrics(metrics, Some(sampling_decision));
175175

176-
if ctx.project_info.config.features.produces_spans() {
177-
let bucket = event::create_span_root_counter(
178-
span,
179-
transaction_from_dsc.clone(),
180-
1,
181-
sampling_decision,
182-
project_id,
183-
);
184-
extracted_metrics.extend_sampling_metrics(bucket, Some(sampling_decision));
185-
}
176+
let bucket = event::create_span_root_counter(
177+
span,
178+
transaction_from_dsc.clone(),
179+
1,
180+
sampling_decision,
181+
project_id,
182+
);
183+
extracted_metrics.extend_sampling_metrics(bucket, Some(sampling_decision));
186184

187185
item.set_metrics_extracted(true);
188186
}

relay-server/src/services/projects/cache/project.rs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::sync::Arc;
22

33
use relay_config::Config;
4-
use relay_dynamic_config::Feature;
54
use relay_quotas::{CachedRateLimits, DataCategory, MetricNamespaceScoping, RateLimits};
65
use relay_sampling::evaluation::ReservoirCounters;
76

@@ -87,17 +86,11 @@ impl<'a> Project<'a> {
8786
.compute(envelope.envelope_mut(), &scoping)
8887
.await?;
8988

90-
let check_nested_spans = state
91-
.as_ref()
92-
.is_some_and(|s| s.has_feature(Feature::ExtractSpansFromEvent));
93-
9489
// If we can extract spans from the event, we want to try and count the number of nested
9590
// spans to correctly emit negative outcomes in case the transaction itself is dropped.
96-
if check_nested_spans {
97-
relay_statsd::metric!(timer(RelayTimers::CheckNestedSpans), {
98-
sync_spans_to_enforcement(&envelope, &mut enforcement);
99-
});
100-
}
91+
relay_statsd::metric!(timer(RelayTimers::CheckNestedSpans), {
92+
sync_spans_to_enforcement(&envelope, &mut enforcement);
93+
});
10194

10295
enforcement.apply_with_outcomes(&mut envelope);
10396

@@ -226,9 +219,6 @@ mod tests {
226219
let project = create_project(
227220
&config,
228221
Some(json!({
229-
"features": [
230-
"organizations:indexed-spans-extraction"
231-
],
232222
"quotas": [{
233223
"id": "foo",
234224
"categories": ["transaction"],

tests/integration/fixtures/processing.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,19 +305,25 @@ def assert_rate_limited(
305305
timeout=1,
306306
ignore_other=False,
307307
):
308+
expected_categories = (
309+
{category_value(category) for category in categories}
310+
if categories
311+
else set()
312+
)
308313
if categories is None:
309314
outcome = self.get_outcome(timeout=timeout)
310315
assert isinstance(outcome["category"], int)
311316
outcomes = [outcome]
312317
else:
313318
outcomes = self.get_outcomes(timeout=timeout)
314-
expected = {category_value(category) for category in categories}
315319
actual = {outcome["category"] for outcome in outcomes}
316320
if ignore_other:
317321
actual = actual & set(categories)
318-
assert actual == expected, (actual, expected)
322+
assert actual == expected_categories, (actual, expected_categories)
319323

320324
for outcome in outcomes:
325+
if ignore_other and outcome["category"] not in expected_categories:
326+
continue
321327
assert outcome["outcome"] == 2, outcome
322328
assert outcome["reason"] == reason, outcome["reason"]
323329
if key_id is not None:

tests/integration/test_attachments.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,6 @@ def test_event_with_attachment(
504504
relay_with_processing,
505505
attachments_consumer,
506506
transactions_consumer,
507-
outcomes_consumer,
508507
):
509508
project_id = 42
510509
event_id = "515539018c9b4260a6f999572f1661ee"
@@ -513,7 +512,6 @@ def test_event_with_attachment(
513512
relay = relay_with_processing()
514513
attachments_consumer = attachments_consumer()
515514
transactions_consumer = transactions_consumer()
516-
outcomes_consumer = outcomes_consumer()
517515

518516
# event attachments are always sent as chunks, and added to events
519517
envelope = Envelope(headers=[["event_id", event_id]])

tests/integration/test_filters.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,4 +629,8 @@ def test_filters_are_applied_to_profiles(
629629
profile, _ = profiles_consumer.get_profile()
630630
profile = json.loads(profile["payload"])
631631
assert profile["release"] == "[email protected]"
632-
outcomes_consumer.assert_empty()
632+
assert [
633+
outcome
634+
for outcome in outcomes_consumer.get_outcomes()
635+
if outcome["category"] == data_category
636+
] == []

0 commit comments

Comments
 (0)