Skip to content

Commit 3584163

Browse files
wedamijaclaude
andcommitted
chore(flags): Remove unused organizations:performance-use-metrics feature flag
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> fix: Remove dead MEPTag function and its usage in widgetHeader Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> fix: Fix mypy errors from flag removal - add type annotations and fix query param type Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 1dddcda commit 3584163

22 files changed

+16
-260
lines changed

src/sentry/api/endpoints/organization_events.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ class OrganizationEventsEndpoint(OrganizationEventsEndpointBase):
107107

108108
def get_features(self, organization: Organization, request: Request) -> Mapping[str, bool]:
109109
feature_names = [
110-
"organizations:performance-use-metrics",
111110
"organizations:profiling",
112111
"organizations:dynamic-sampling",
113112
"organizations:starfish-view",

src/sentry/api/endpoints/organization_events_histogram.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,21 +62,13 @@ def get(self, request: Request, organization: Organization) -> Response:
6262
except NoProjects:
6363
return Response({})
6464

65-
use_metrics = features.has(
66-
"organizations:performance-use-metrics", organization=organization, actor=request.user
67-
)
68-
dataset = self.get_dataset(request) if use_metrics else discover
69-
metrics_enhanced = dataset != discover
70-
71-
sentry_sdk.set_tag("performance.metrics_enhanced", metrics_enhanced)
72-
7365
with sentry_sdk.start_span(op="discover.endpoint", name="histogram"):
7466
serializer = HistogramSerializer(data=request.GET)
7567
if serializer.is_valid():
7668
data = serializer.validated_data
7769

7870
with handle_query_errors():
79-
results = dataset.histogram_query(
71+
results = discover.histogram_query(
8072
fields=data["field"],
8173
user_query=data.get("query"),
8274
snuba_params=snuba_params,

src/sentry/api/endpoints/organization_events_stats.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ def get_features(
6969
self, organization: Organization, request: Request
7070
) -> Mapping[str, bool | None]:
7171
feature_names = [
72-
"organizations:performance-use-metrics",
7372
"organizations:starfish-view",
7473
"organizations:on-demand-metrics-extraction",
7574
"organizations:on-demand-metrics-extraction-widgets",

src/sentry/api/endpoints/organization_events_vitals.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from rest_framework.request import Request
44
from rest_framework.response import Response
55

6-
from sentry import features
76
from sentry.api.api_publish_status import ApiPublishStatus
87
from sentry.api.base import cell_silo_endpoint
98
from sentry.api.bases import NoProjects, OrganizationEventsEndpointBase
@@ -40,14 +39,6 @@ def get(self, request: Request, organization: Organization) -> Response:
4039
if len(vitals) == 0:
4140
raise ParseError(detail="Need to pass at least one vital")
4241

43-
performance_use_metrics = features.has(
44-
"organizations:performance-use-metrics",
45-
organization=organization,
46-
actor=request.user,
47-
)
48-
dataset = self.get_dataset(request) if performance_use_metrics else discover
49-
metrics_enhanced = dataset != discover
50-
sentry_sdk.set_tag("performance.metrics_enhanced", metrics_enhanced)
5142
allow_metric_aggregates = request.GET.get("preventMetricAggregates") != "1"
5243

5344
selected_columns = []
@@ -65,9 +56,9 @@ def get(self, request: Request, organization: Organization) -> Response:
6556
)
6657

6758
with handle_query_errors():
68-
events_results = dataset.query(
59+
events_results = discover.query(
6960
selected_columns=selected_columns,
70-
query=request.GET.get("query"),
61+
query=request.GET.get("query", ""),
7162
snuba_params=snuba_params,
7263
# Results should only ever have 1 result
7364
limit=1,

src/sentry/features/temporary.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,6 @@ def register_temporary_features(manager: FeatureManager) -> None:
244244
manager.add("organizations:performance-transaction-name-only-search", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
245245
# Enable the EAP-powered transactions summary view
246246
manager.add("organizations:performance-transaction-summary-eap", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
247-
manager.add("organizations:performance-use-metrics", OrganizationFeature, FeatureHandlerStrategy.INTERNAL, api_expose=True)
248247
# Enable Seer Suggestions for Web Vitals Module
249248
manager.add("organizations:performance-web-vitals-seer-suggestions", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
250249
# Enable the warning banner to inform users of pending deprecation of the transactions dataset

src/sentry/options/defaults.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2323,22 +2323,13 @@
23232323
flags=FLAG_AUTOMATOR_MODIFIABLE,
23242324
)
23252325

2326-
# Used for enabling flags in ST. Should be removed once Flagpole works in all STs.
2327-
register(
2328-
"performance.use_metrics.orgs_allowlist",
2329-
type=Sequence,
2330-
default=[],
2331-
flags=FLAG_ALLOW_EMPTY | FLAG_AUTOMATOR_MODIFIABLE,
2332-
)
23332326
# Used for the z-score when calculating the margin of error in performance
23342327
register(
23352328
"performance.extrapolation.confidence.z-score",
23362329
type=Float,
23372330
default=1.96,
23382331
flags=FLAG_ALLOW_EMPTY | FLAG_AUTOMATOR_MODIFIABLE,
23392332
)
2340-
# Used for enabling flags in ST. Should be removed once Flagpole works in all STs.
2341-
register("performance.use_metrics.enabled", default=False, flags=FLAG_AUTOMATOR_MODIFIABLE)
23422333

23432334
# Dynamic Sampling system-wide options
23442335
# Size of the sliding window used for dynamic sampling. It is defaulted to 24 hours.

static/app/utils/performance/contexts/metricsEnhancedPerformanceDataContext.tsx

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import type {ReactNode} from 'react';
22
import {useCallback, useState} from 'react';
33

4-
import {Tag} from '@sentry/scraps/badge';
5-
64
import {useOrganization} from 'sentry/utils/useOrganization';
75
import type {Widget} from 'sentry/views/dashboards/types';
86
import {WIDGET_MAP_DENY_LIST} from 'sentry/views/performance/landing/widgets/utils';
@@ -112,28 +110,6 @@ export function getIsMetricsDataFromResults(
112110
return isMetricsData;
113111
}
114112

115-
export function MEPTag() {
116-
const {isMetricsData} = useMEPDataContext();
117-
const organization = useOrganization();
118-
119-
if (!organization.features.includes('performance-use-metrics')) {
120-
// Separate if for easier flag deletion
121-
return null;
122-
}
123-
124-
if (isMetricsData === undefined) {
125-
return <span data-test-id="no-metrics-data-tag" />;
126-
}
127-
128-
const tagText = isMetricsData ? 'processed' : 'indexed';
129-
130-
return (
131-
<Tag variant="muted" data-test-id="has-metrics-data-tag">
132-
{tagText}
133-
</Tag>
134-
);
135-
}
136-
137113
type ExtractionStatus = 'extracted' | 'not-extracted' | null;
138114

139115
export function useExtractionStatus(props: {

static/app/utils/performance/contexts/metricsEnhancedSetting.tsx

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,7 @@ export enum MEPState {
5050
const METRIC_SETTING_PARAM = 'metricSetting';
5151
export const METRIC_SEARCH_SETTING_PARAM = 'metricSearchSetting'; // TODO: Clean this up since we don't need multiple params in practice.
5252

53-
function canUseMetricsDevUI(organization: Organization) {
54-
return organization.features.includes('performance-use-metrics');
55-
}
56-
5753
export function canUseMetricsData(organization: Organization) {
58-
const isDevFlagOn = canUseMetricsDevUI(organization); // Forces metrics data on as well.
5954
const isInternalViewOn = organization.features.includes(
6055
'performance-transaction-name-only-search'
6156
);
@@ -68,7 +63,7 @@ export function canUseMetricsData(organization: Organization) {
6863
'dashboards-metrics-transition'
6964
);
7065

71-
return isDevFlagOn || isInternalViewOn || isRollingOut || isTransitioningPlan;
66+
return isInternalViewOn || isRollingOut || isTransitioningPlan;
7267
}
7368

7469
export function MEPSettingProvider({

static/app/views/performance/landing/widgets/components/widgetContainer.spec.tsx

Lines changed: 1 addition & 167 deletions
Original file line numberDiff line numberDiff line change
@@ -373,172 +373,6 @@ describe('Performance > Widgets > WidgetContainer', () => {
373373
);
374374
});
375375

376-
it('Widget with MEP enabled and metric meta set to true', async () => {
377-
const data = initializeData(
378-
{},
379-
{
380-
features: ['performance-use-metrics'],
381-
}
382-
);
383-
384-
eventStatsMock = MockApiClient.addMockResponse({
385-
method: 'GET',
386-
url: '/organizations/org-slug/events-stats/',
387-
body: {
388-
data: [],
389-
isMetricsData: true,
390-
},
391-
});
392-
MockApiClient.addMockResponse({
393-
method: 'GET',
394-
url: '/organizations/org-slug/events-timeseries/',
395-
body: {
396-
timeSeries: [],
397-
},
398-
});
399-
400-
eventsMock = MockApiClient.addMockResponse({
401-
method: 'GET',
402-
url: '/organizations/org-slug/events/',
403-
body: {
404-
data: [{}],
405-
meta: {isMetricsData: true},
406-
},
407-
});
408-
409-
wrapper = render(
410-
<WrappedComponent
411-
data={data}
412-
defaultChartSetting={PerformanceWidgetSetting.FAILURE_RATE_AREA}
413-
/>
414-
);
415-
416-
expect(eventStatsMock).toHaveBeenCalledTimes(1);
417-
expect(eventStatsMock).toHaveBeenNthCalledWith(
418-
1,
419-
expect.anything(),
420-
expect.objectContaining({
421-
query: expect.objectContaining({dataset: 'metrics'}),
422-
})
423-
);
424-
425-
expect(eventsMock).toHaveBeenCalledTimes(1);
426-
expect(eventsMock).toHaveBeenCalledWith(
427-
expect.anything(),
428-
expect.objectContaining({
429-
query: expect.objectContaining({dataset: 'metrics'}),
430-
})
431-
);
432-
433-
expect(await screen.findByTestId('has-metrics-data-tag')).toHaveTextContent(
434-
'processed'
435-
);
436-
});
437-
438-
it('Widget with MEP enabled and metric meta set to undefined', async () => {
439-
const data = initializeData(
440-
{},
441-
{
442-
features: ['performance-use-metrics'],
443-
}
444-
);
445-
446-
eventStatsMock = MockApiClient.addMockResponse({
447-
method: 'GET',
448-
url: '/organizations/org-slug/events-stats/',
449-
body: {
450-
data: [],
451-
isMetricsData: undefined,
452-
},
453-
});
454-
MockApiClient.addMockResponse({
455-
method: 'GET',
456-
url: '/organizations/org-slug/events-timeseries/',
457-
body: {
458-
timeSeries: [],
459-
},
460-
});
461-
462-
wrapper = render(
463-
<WrappedComponent
464-
data={data}
465-
defaultChartSetting={PerformanceWidgetSetting.FAILURE_RATE_AREA}
466-
/>
467-
);
468-
469-
expect(await screen.findByTestId('no-metrics-data-tag')).toBeInTheDocument();
470-
expect(eventStatsMock).toHaveBeenCalledTimes(1);
471-
expect(eventStatsMock).toHaveBeenNthCalledWith(
472-
1,
473-
expect.anything(),
474-
expect.objectContaining({
475-
query: expect.objectContaining({dataset: 'metrics'}),
476-
})
477-
);
478-
});
479-
480-
it('Widget with MEP enabled and metric meta set to false', async () => {
481-
const data = initializeData(
482-
{},
483-
{
484-
features: ['performance-use-metrics'],
485-
}
486-
);
487-
488-
eventStatsMock = MockApiClient.addMockResponse({
489-
method: 'GET',
490-
url: '/organizations/org-slug/events-stats/',
491-
body: {
492-
data: [],
493-
isMetricsData: false,
494-
},
495-
});
496-
MockApiClient.addMockResponse({
497-
method: 'GET',
498-
url: '/organizations/org-slug/events-timeseries/',
499-
body: {
500-
timeSeries: [],
501-
},
502-
});
503-
504-
eventsMock = MockApiClient.addMockResponse({
505-
method: 'GET',
506-
url: '/organizations/org-slug/events/',
507-
body: {
508-
data: [{}],
509-
meta: {isMetricsData: false},
510-
},
511-
});
512-
513-
wrapper = render(
514-
<WrappedComponent
515-
data={data}
516-
defaultChartSetting={PerformanceWidgetSetting.FAILURE_RATE_AREA}
517-
/>
518-
);
519-
520-
expect(eventStatsMock).toHaveBeenCalledTimes(1);
521-
expect(eventStatsMock).toHaveBeenNthCalledWith(
522-
1,
523-
expect.anything(),
524-
expect.objectContaining({
525-
query: expect.objectContaining({dataset: 'metrics'}),
526-
})
527-
);
528-
529-
expect(eventsMock).toHaveBeenCalledTimes(1);
530-
expect(eventsMock).toHaveBeenCalledWith(
531-
expect.anything(),
532-
expect.objectContaining({
533-
query: expect.objectContaining({dataset: 'metrics'}),
534-
})
535-
);
536-
537-
expect(await screen.findByTestId('has-metrics-data-tag')).toHaveTextContent(
538-
'indexed'
539-
);
540-
});
541-
542376
it('User misery Widget', async () => {
543377
const data = initializeData();
544378

@@ -1059,7 +893,7 @@ describe('Performance > Widgets > WidgetContainer', () => {
1059893
const data = initializeData(
1060894
{},
1061895
{
1062-
features: ['performance-use-metrics'],
896+
features: ['dynamic-sampling'],
1063897
}
1064898
);
1065899

static/app/views/performance/landing/widgets/components/widgetHeader.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {Flex, Stack} from '@sentry/scraps/layout';
55

66
import {HeaderTitleLegend} from 'sentry/components/charts/styles';
77
import {TextOverflow} from 'sentry/components/textOverflow';
8-
import {MEPTag} from 'sentry/utils/performance/contexts/metricsEnhancedPerformanceDataContext';
98
import type {
109
GenericPerformanceWidgetProps,
1110
WidgetDataConstraint,
@@ -26,7 +25,6 @@ export function WidgetHeader<T extends WidgetDataConstraint>(
2625
) : (
2726
<TextOverflow>{title}</TextOverflow>
2827
)}
29-
<MEPTag />
3028
</StyledHeaderTitleLegend>
3129
{Subtitle ? <Subtitle {...props} /> : null}
3230
</Stack>

0 commit comments

Comments
 (0)