Skip to content

Commit 8de2352

Browse files
billyvggggritso
authored andcommitted
ref(insights): Refactor PerformanceScoreBreakdownChart (#89632)
Move into its own component and parse location query itself Part of #88560 --------- Co-authored-by: George Gritsouk <989898+gggritso@users.noreply.github.com>
1 parent c99174e commit 8de2352

File tree

8 files changed

+78
-86
lines changed

8 files changed

+78
-86
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import type {Series} from 'sentry/types/echarts';
2+
import {ORDER} from 'sentry/views/insights/browser/webVitals/components/charts/performanceScoreChart';
3+
import type {WebVitalsScoreBreakdown} from 'sentry/views/insights/browser/webVitals/queries/storedScoreQueries/useProjectWebVitalsScoresTimeseriesQuery';
4+
import type {WebVitals} from 'sentry/views/insights/browser/webVitals/types';
5+
6+
export function formatTimeSeriesResultsToChartData(
7+
data: WebVitalsScoreBreakdown,
8+
segmentColors: string[],
9+
order: WebVitals[] = ORDER
10+
): Series[] {
11+
return order.map((webVital, index) => {
12+
const series = data[webVital];
13+
const color = segmentColors[index];
14+
return {
15+
seriesName: webVital.toUpperCase(),
16+
data: series.map(({name, value}) => ({
17+
name,
18+
value: Math.round(value),
19+
})),
20+
color,
21+
};
22+
});
23+
}

static/app/views/insights/browser/webVitals/components/charts/performanceScoreBreakdownChart.spec.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@ import {render, screen, waitForElementToBeRemoved} from 'sentry-test/reactTestin
44

55
import {useLocation} from 'sentry/utils/useLocation';
66
import usePageFilters from 'sentry/utils/usePageFilters';
7-
import {
8-
formatTimeSeriesResultsToChartData,
9-
PerformanceScoreBreakdownChart,
10-
} from 'sentry/views/insights/browser/webVitals/components/charts/performanceScoreBreakdownChart';
7+
import {formatTimeSeriesResultsToChartData} from 'sentry/views/insights/browser/webVitals/components/charts/formatTimeSeriesResultsToChartData';
8+
import {PerformanceScoreBreakdownChartWidget} from 'sentry/views/insights/common/components/widgets/performanceScoreBreakdownChartWidget';
119

1210
jest.mock('sentry/utils/useLocation');
1311
jest.mock('sentry/utils/usePageFilters');
1412

15-
describe('PerformanceScoreBreakdownChart', function () {
13+
describe('PerformanceScoreBreakdownChartWidget', function () {
1614
const organization = OrganizationFixture();
1715
let eventsStatsMock: jest.Mock;
1816

@@ -75,7 +73,7 @@ describe('PerformanceScoreBreakdownChart', function () {
7573
action: 'PUSH',
7674
key: '',
7775
});
78-
render(<PerformanceScoreBreakdownChart />, {organization});
76+
render(<PerformanceScoreBreakdownChartWidget />, {organization});
7977
await waitForElementToBeRemoved(() => screen.queryByTestId('loading-indicator'));
8078

8179
expect(eventsStatsMock).toHaveBeenCalledWith(

static/app/views/insights/browser/webVitals/components/charts/performanceScoreChart.tsx

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,17 @@ import {DEFAULT_RELATIVE_PERIODS} from 'sentry/constants';
99
import {t} from 'sentry/locale';
1010
import {space} from 'sentry/styles/space';
1111
import usePageFilters from 'sentry/utils/usePageFilters';
12-
import {PerformanceScoreBreakdownChart} from 'sentry/views/insights/browser/webVitals/components/charts/performanceScoreBreakdownChart';
1312
import PerformanceScoreRingWithTooltips from 'sentry/views/insights/browser/webVitals/components/performanceScoreRingWithTooltips';
1413
import {MODULE_DOC_LINK} from 'sentry/views/insights/browser/webVitals/settings';
1514
import type {
1615
ProjectScore,
1716
WebVitals,
1817
} from 'sentry/views/insights/browser/webVitals/types';
19-
import type {BrowserType} from 'sentry/views/insights/browser/webVitals/utils/queryParameterDecoders/browserType';
20-
import type {SubregionCode} from 'sentry/views/insights/types';
18+
import {PerformanceScoreBreakdownChartWidget} from 'sentry/views/insights/common/components/widgets/performanceScoreBreakdownChartWidget';
2119

2220
type Props = {
23-
browserTypes?: BrowserType[];
2421
isProjectScoreLoading?: boolean;
2522
projectScore?: ProjectScore;
26-
subregions?: SubregionCode[];
27-
transaction?: string;
2823
webVital?: WebVitals | null;
2924
};
3025

@@ -33,10 +28,7 @@ export const ORDER: WebVitals[] = ['lcp', 'fcp', 'inp', 'cls', 'ttfb'];
3328
export function PerformanceScoreChart({
3429
projectScore,
3530
webVital,
36-
transaction,
3731
isProjectScoreLoading,
38-
browserTypes,
39-
subregions,
4032
}: Props) {
4133
const theme = useTheme();
4234
const pageFilters = usePageFilters();
@@ -101,15 +93,17 @@ export function PerformanceScoreChart({
10193
</EmptyStateWarning>
10294
)}
10395
</PerformanceScoreLabelContainer>
104-
<PerformanceScoreBreakdownChart
105-
transaction={transaction}
106-
browserTypes={browserTypes}
107-
subregions={subregions}
108-
/>
96+
<ChartContainer>
97+
<PerformanceScoreBreakdownChartWidget />
98+
</ChartContainer>
10999
</Flex>
110100
);
111101
}
112102

103+
const ChartContainer = styled('div')`
104+
flex: 1 1 0%;
105+
`;
106+
113107
const Flex = styled('div')`
114108
display: flex;
115109
flex-direction: row;

static/app/views/insights/browser/webVitals/views/pageOverview.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import useOrganization from 'sentry/utils/useOrganization';
1818
import useProjects from 'sentry/utils/useProjects';
1919
import useRouter from 'sentry/utils/useRouter';
2020
import BrowserTypeSelector from 'sentry/views/insights/browser/webVitals/components/browserTypeSelector';
21-
import {PerformanceScoreBreakdownChart} from 'sentry/views/insights/browser/webVitals/components/charts/performanceScoreBreakdownChart';
2221
import {PageOverviewSidebar} from 'sentry/views/insights/browser/webVitals/components/pageOverviewSidebar';
2322
import {PageOverviewWebVitalsDetailPanel} from 'sentry/views/insights/browser/webVitals/components/pageOverviewWebVitalsDetailPanel';
2423
import {PageSamplePerformanceTable} from 'sentry/views/insights/browser/webVitals/components/tables/pageSamplePerformanceTable';
@@ -32,6 +31,7 @@ import {WebVitalMetersPlaceholder} from 'sentry/views/insights/browser/webVitals
3231
import {ModulePageFilterBar} from 'sentry/views/insights/common/components/modulePageFilterBar';
3332
import {ModulePageProviders} from 'sentry/views/insights/common/components/modulePageProviders';
3433
import {ModuleBodyUpsellHook} from 'sentry/views/insights/common/components/moduleUpsellHookWrapper';
34+
import {PerformanceScoreBreakdownChartWidget} from 'sentry/views/insights/common/components/widgets/performanceScoreBreakdownChartWidget';
3535
import {useModuleURL} from 'sentry/views/insights/common/utils/useModuleURL';
3636
import {useWebVitalsDrawer} from 'sentry/views/insights/common/utils/useWebVitalsDrawer';
3737
import {FrontendHeader} from 'sentry/views/insights/pages/frontend/frontendPageHeader';
@@ -196,11 +196,9 @@ export function PageOverview() {
196196
<BrowserTypeSelector />
197197
</TopMenuContainer>
198198
<Flex>
199-
<PerformanceScoreBreakdownChart
200-
transaction={transaction}
201-
browserTypes={browserTypes}
202-
subregions={subregions}
203-
/>
199+
<ChartContainer>
200+
<PerformanceScoreBreakdownChartWidget />
201+
</ChartContainer>
204202
</Flex>
205203
<WebVitalMetersContainer>
206204
{(isPending || isProjectScoresLoading) && <WebVitalMetersPlaceholder />}
@@ -267,6 +265,10 @@ const Flex = styled('div')`
267265
gap: ${space(1)};
268266
`;
269267

268+
const ChartContainer = styled('div')`
269+
flex: 1 1 0%;
270+
`;
271+
270272
const PageSamplePerformanceTableContainer = styled('div')`
271273
margin-top: ${space(1)};
272274
`;

static/app/views/insights/browser/webVitals/views/webVitalsLandingPage.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,6 @@ export function WebVitalsLandingPage() {
9595
projectScore={projectScore}
9696
isProjectScoreLoading={isPending || isProjectScoresLoading}
9797
webVital={state.webVital}
98-
browserTypes={browserTypes}
99-
subregions={subregions}
10098
/>
10199
</PerformanceScoreChartContainer>
102100
<WebVitalMetersContainer>
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,42 @@
11
import {useTheme} from '@emotion/react';
2-
import styled from '@emotion/styled';
32

43
import {t} from 'sentry/locale';
5-
import type {Series} from 'sentry/types/echarts';
4+
import {decodeList} from 'sentry/utils/queryString';
65
import {MutableSearch} from 'sentry/utils/tokenizeSearch';
6+
import useLocationQuery from 'sentry/utils/url/useLocationQuery';
77
import {ORDER} from 'sentry/views/insights/browser/webVitals/components/charts/performanceScoreChart';
8-
import type {WebVitalsScoreBreakdown} from 'sentry/views/insights/browser/webVitals/queries/storedScoreQueries/useProjectWebVitalsScoresTimeseriesQuery';
8+
import {WebVitalsWeightList} from 'sentry/views/insights/browser/webVitals/components/charts/webVitalWeightList';
99
import type {WebVitals} from 'sentry/views/insights/browser/webVitals/types';
1010
import {getWeights} from 'sentry/views/insights/browser/webVitals/utils/getWeights';
11-
import type {BrowserType} from 'sentry/views/insights/browser/webVitals/utils/queryParameterDecoders/browserType';
11+
import decodeBrowserTypes from 'sentry/views/insights/browser/webVitals/utils/queryParameterDecoders/browserType';
1212
import {useDefaultWebVitalsQuery} from 'sentry/views/insights/browser/webVitals/utils/useDefaultQuery';
1313
import {InsightsTimeSeriesWidget} from 'sentry/views/insights/common/components/insightsTimeSeriesWidget';
14+
import type {LoadableChartWidgetProps} from 'sentry/views/insights/common/components/widgets/types';
1415
import {
1516
type DiscoverSeries,
1617
useMetricsSeries,
1718
} from 'sentry/views/insights/common/queries/useDiscoverSeries';
18-
import {SpanMetricsField, type SubregionCode} from 'sentry/views/insights/types';
19+
import {SpanIndexedField, SpanMetricsField} from 'sentry/views/insights/types';
1920

20-
import {WebVitalsWeightList} from './webVitalWeightList';
21-
22-
type Props = {
23-
browserTypes?: BrowserType[];
24-
subregions?: SubregionCode[];
25-
transaction?: string;
26-
};
27-
28-
export function formatTimeSeriesResultsToChartData(
29-
data: WebVitalsScoreBreakdown,
30-
segmentColors: string[],
31-
order: WebVitals[] = ORDER
32-
): Series[] {
33-
return order.map((webVital, index) => {
34-
const series = data[webVital];
35-
const color = segmentColors[index];
36-
return {
37-
seriesName: webVital.toUpperCase(),
38-
data: series.map(({name, value}) => ({
39-
name,
40-
value: Math.round(value),
41-
})),
42-
color,
43-
};
21+
export function PerformanceScoreBreakdownChartWidget(props: LoadableChartWidgetProps) {
22+
const {
23+
transaction,
24+
[SpanIndexedField.BROWSER_NAME]: browserTypes,
25+
[SpanIndexedField.USER_GEO_SUBREGION]: subregions,
26+
} = useLocationQuery({
27+
fields: {
28+
[SpanIndexedField.BROWSER_NAME]: decodeBrowserTypes,
29+
[SpanIndexedField.USER_GEO_SUBREGION]: decodeList,
30+
transaction: decodeList,
31+
},
4432
});
45-
}
46-
47-
export function PerformanceScoreBreakdownChart({
48-
transaction,
49-
browserTypes,
50-
subregions,
51-
}: Props) {
5233
const theme = useTheme();
5334
const segmentColors = theme.chart.getColorPalette(3).slice(0, 5);
5435
const defaultQuery = useDefaultWebVitalsQuery();
55-
5636
const search = new MutableSearch(`${defaultQuery} has:measurements.score.total`);
5737

58-
if (transaction) {
59-
search.addFilterValue('transaction', transaction);
38+
if (transaction.length && transaction[0]) {
39+
search.addFilterValue('transaction', transaction[0]);
6040
}
6141

6242
if (subregions) {
@@ -84,7 +64,8 @@ export function PerformanceScoreBreakdownChart({
8464
],
8565
transformAliasToInputFormat: true,
8666
},
87-
'api.performance.browser.web-vitals.timeseries-scores2'
67+
'api.performance.browser.web-vitals.timeseries-scores2',
68+
props.pageFilters
8869
);
8970

9071
const webVitalsThatHaveData: WebVitals[] = vitalScoresData
@@ -127,20 +108,14 @@ export function PerformanceScoreBreakdownChart({
127108
: [];
128109

129110
return (
130-
<ChartContainer>
131-
<InsightsTimeSeriesWidget
132-
title={t('Score Breakdown')}
133-
height="100%"
134-
visualizationType="area"
135-
isLoading={areVitalScoresLoading}
136-
error={vitalScoresError}
137-
series={allSeries}
138-
description={<WebVitalsWeightList weights={weights} />}
139-
/>
140-
</ChartContainer>
111+
<InsightsTimeSeriesWidget
112+
title={t('Score Breakdown')}
113+
height="100%"
114+
visualizationType="area"
115+
isLoading={areVitalScoresLoading}
116+
error={vitalScoresError}
117+
series={allSeries}
118+
description={<WebVitalsWeightList weights={weights} />}
119+
/>
141120
);
142121
}
143-
144-
const ChartContainer = styled('div')`
145-
flex: 1 1 0%;
146-
`;

static/app/views/insights/common/queries/useDiscoverSeries.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,15 @@ export const useEAPSeries = <
7878

7979
export const useMetricsSeries = <Fields extends MetricsProperty[]>(
8080
options: UseMetricsSeriesOptions<Fields> = {},
81-
referrer: string
81+
referrer: string,
82+
pageFilters?: PageFilters
8283
) => {
8384
const useEap = useInsightsEap();
8485
return useDiscoverSeries<Fields>(
8586
options,
8687
useEap ? DiscoverDatasets.SPANS_EAP_RPC : DiscoverDatasets.METRICS,
87-
referrer
88+
referrer,
89+
pageFilters
8890
);
8991
};
9092

static/app/views/performance/landing/widgets/widgets/performanceScoreListWidget.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import LoadingIndicator from 'sentry/components/loadingIndicator';
1111
import Truncate from 'sentry/components/truncate';
1212
import {t} from 'sentry/locale';
1313
import {useLocation} from 'sentry/utils/useLocation';
14-
import {formatTimeSeriesResultsToChartData} from 'sentry/views/insights/browser/webVitals/components/charts/performanceScoreBreakdownChart';
14+
import {formatTimeSeriesResultsToChartData} from 'sentry/views/insights/browser/webVitals/components/charts/formatTimeSeriesResultsToChartData';
1515
import {ORDER} from 'sentry/views/insights/browser/webVitals/components/charts/performanceScoreChart';
1616
import {PerformanceBadge} from 'sentry/views/insights/browser/webVitals/components/performanceBadge';
1717
import {useProjectWebVitalsScoresQuery} from 'sentry/views/insights/browser/webVitals/queries/storedScoreQueries/useProjectWebVitalsScoresQuery';

0 commit comments

Comments
 (0)