Skip to content

Commit 37dc147

Browse files
ArthurKnausroaga
authored andcommitted
ref(platform-insights): Make duration chart loadable (#92094)
Make the duration chart loadable in the releases drawer. - part of [TET-379: Make widgets re-usable in releases drawer](https://linear.app/getsentry/issue/TET-379/make-widgets-re-usable-in-releases-drawer)
1 parent a3f24f5 commit 37dc147

File tree

10 files changed

+82
-15
lines changed

10 files changed

+82
-15
lines changed

static/app/components/charts/chartWidgetLoader-unmocked-imports.spec.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import fs from 'node:fs';
33
// eslint-disable-next-line import/no-nodejs-modules
44
import path from 'node:path';
5+
import {TimeSeriesFixture} from 'sentry-fixture/discoverSeries';
56

67
import {render, screen, waitFor} from 'sentry-test/reactTestingLibrary';
78

@@ -10,6 +11,12 @@ import {TimeSeriesWidgetVisualization} from 'sentry/views/dashboards/widgets/tim
1011
import type {ChartId} from './chartWidgetLoader';
1112
import {ChartWidgetLoader} from './chartWidgetLoader';
1213

14+
function mockDiscoverSeries(seriesName: string) {
15+
return TimeSeriesFixture({
16+
seriesName,
17+
});
18+
}
19+
1320
// Mock this component so it doesn't yell at us for no plottables
1421
jest.mock(
1522
'sentry/views/dashboards/widgets/timeSeriesWidget/timeSeriesWidgetVisualization',
@@ -146,6 +153,14 @@ jest.mock(
146153
})
147154
);
148155
jest.mock('sentry/views/insights/common/queries/useDiscoverSeries', () => ({
156+
useEAPSeries: jest.fn(() => ({
157+
data: {
158+
'avg(span.duration)': mockDiscoverSeries('avg(span.duration)'),
159+
'p95(span.duration)': mockDiscoverSeries('p95(span.duration)'),
160+
},
161+
isPending: false,
162+
error: null,
163+
})),
149164
useMetricsSeries: jest.fn(() => ({
150165
data: {
151166
'performance_score(measurements.score.lcp)': {

static/app/components/charts/chartWidgetLoader.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ const CHART_MAP = {
155155
import(
156156
'sentry/views/insights/common/components/widgets/httpDomainSummaryDurationChartWidget'
157157
),
158+
overviewApiLatencyChartWidget: () =>
159+
import(
160+
'sentry/views/insights/common/components/widgets/overviewApiLatencyChartWidget'
161+
),
158162
} satisfies Record<string, () => Promise<{default: React.FC<LoadableChartWidgetProps>}>>;
159163

160164
/**

static/app/views/insights/pages/platform/shared/durationWidget.tsx renamed to static/app/views/insights/common/components/widgets/overviewApiLatencyChartWidget.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {TimeSeriesWidgetVisualization} from 'sentry/views/dashboards/widgets/tim
88
import {Widget} from 'sentry/views/dashboards/widgets/widget/widget';
99
import {Mode} from 'sentry/views/explore/contexts/pageParamsContext/mode';
1010
import {ChartType} from 'sentry/views/insights/common/components/chart';
11+
import type {LoadableChartWidgetProps} from 'sentry/views/insights/common/components/widgets/types';
1112
import {useEAPSeries} from 'sentry/views/insights/common/queries/useDiscoverSeries';
1213
import {convertSeriesToTimeseries} from 'sentry/views/insights/common/utils/convertSeriesToTimeseries';
1314
import {Referrer} from 'sentry/views/insights/pages/platform/laravel/referrers';
@@ -18,11 +19,13 @@ import {ModalChartContainer} from 'sentry/views/insights/pages/platform/shared/s
1819
import {Toolbar} from 'sentry/views/insights/pages/platform/shared/toolbar';
1920
import {useTransactionNameQuery} from 'sentry/views/insights/pages/platform/shared/useTransactionNameQuery';
2021

21-
export function DurationWidget() {
22+
export default function OverviewApiLatencyChartWidget(props: LoadableChartWidgetProps) {
2223
const organization = useOrganization();
2324
const {query} = useTransactionNameQuery();
24-
const pageFilterChartParams = usePageFilterChartParams();
25-
const releaseBubbleProps = useReleaseBubbleProps();
25+
const pageFilterChartParams = usePageFilterChartParams({
26+
pageFilters: props.pageFilters,
27+
});
28+
const releaseBubbleProps = useReleaseBubbleProps(props);
2629

2730
const fullQuery = `span.op:http.server ${query}`.trim();
2831

@@ -33,7 +36,8 @@ export function DurationWidget() {
3336
yAxis: ['avg(span.duration)', 'p95(span.duration)'],
3437
referrer: Referrer.DURATION_CHART,
3538
},
36-
Referrer.DURATION_CHART
39+
Referrer.DURATION_CHART,
40+
props.pageFilters
3741
);
3842

3943
const plottables = useMemo(() => {
@@ -52,6 +56,7 @@ export function DurationWidget() {
5256
isEmpty={isEmpty}
5357
VisualizationType={TimeSeriesWidgetVisualization}
5458
visualizationProps={{
59+
id: 'overviewApiLatencyChartWidget',
5560
plottables,
5661
...releaseBubbleProps,
5762
}}

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,15 @@ export const useEAPSeries = <
6666
| string[],
6767
>(
6868
options: UseMetricsSeriesOptions<Fields> = {},
69-
referrer: string
69+
referrer: string,
70+
pageFilters?: PageFilters
7071
) => {
71-
return useDiscoverSeries<Fields>(options, DiscoverDatasets.SPANS_EAP_RPC, referrer);
72+
return useDiscoverSeries<Fields>(
73+
options,
74+
DiscoverDatasets.SPANS_EAP_RPC,
75+
referrer,
76+
pageFilters
77+
);
7278
};
7379

7480
export const useMetricsSeries = <Fields extends MetricsProperty[]>(

static/app/views/insights/pages/backend/backendOverviewPage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {limitMaxPickableDays} from 'sentry/views/explore/utils';
2525
import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLayout';
2626
import {ToolRibbon} from 'sentry/views/insights/common/components/ribbon';
2727
import {STARRED_SEGMENT_TABLE_QUERY_KEY} from 'sentry/views/insights/common/components/tableCells/starredSegmentCell';
28+
import OverviewApiLatencyChartWidget from 'sentry/views/insights/common/components/widgets/overviewApiLatencyChartWidget';
2829
import {useEAPSpans} from 'sentry/views/insights/common/queries/useDiscover';
2930
import {useOnboardingProject} from 'sentry/views/insights/common/queries/useOnboardingProject';
3031
import {useInsightsEap} from 'sentry/views/insights/common/utils/useEap';
@@ -56,7 +57,6 @@ import {
5657
useIsNextJsInsightsEnabled,
5758
} from 'sentry/views/insights/pages/platform/nextjs/features';
5859
import {NewNextJsExperienceButton} from 'sentry/views/insights/pages/platform/nextjs/newNextjsExperienceToggle';
59-
import {DurationWidget} from 'sentry/views/insights/pages/platform/shared/durationWidget';
6060
import {IssuesWidget} from 'sentry/views/insights/pages/platform/shared/issuesWidget';
6161
import {TrafficWidget} from 'sentry/views/insights/pages/platform/shared/trafficWidget';
6262
import {TransactionNameSearchBar} from 'sentry/views/insights/pages/transactionNameSearchBar';
@@ -243,7 +243,7 @@ function EAPBackendOverviewPage() {
243243
trafficSeriesName={t('Requests')}
244244
baseQuery={'span.op:http.server'}
245245
/>
246-
<DurationWidget />
246+
<OverviewApiLatencyChartWidget />
247247
</StackedWidgetWrapper>
248248
</ModuleLayout.Third>
249249
<ModuleLayout.TwoThirds>

static/app/views/insights/pages/platform/laravel/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import {useEffect} from 'react';
33
import {t} from 'sentry/locale';
44
import {trackAnalytics} from 'sentry/utils/analytics';
55
import useOrganization from 'sentry/utils/useOrganization';
6+
import OverviewApiLatencyChartWidget from 'sentry/views/insights/common/components/widgets/overviewApiLatencyChartWidget';
67
import {CachesWidget} from 'sentry/views/insights/pages/platform/laravel/cachesWidget';
78
import {JobsWidget} from 'sentry/views/insights/pages/platform/laravel/jobsWidget';
89
import {QueriesWidget} from 'sentry/views/insights/pages/platform/laravel/queriesWidget';
9-
import {DurationWidget} from 'sentry/views/insights/pages/platform/shared/durationWidget';
1010
import {IssuesWidget} from 'sentry/views/insights/pages/platform/shared/issuesWidget';
1111
import {PlatformLandingPageLayout} from 'sentry/views/insights/pages/platform/shared/layout';
1212
import {PathsTable} from 'sentry/views/insights/pages/platform/shared/pathsTable';
@@ -34,7 +34,7 @@ export function LaravelOverviewPage() {
3434
/>
3535
</WidgetGrid.Position1>
3636
<WidgetGrid.Position2>
37-
<DurationWidget />
37+
<OverviewApiLatencyChartWidget />
3838
</WidgetGrid.Position2>
3939
<WidgetGrid.Position3>
4040
<IssuesWidget />

static/app/views/insights/pages/platform/laravel/utils.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@ import {useMemo} from 'react';
22

33
import {type Fidelity, getInterval} from 'sentry/components/charts/utils';
44
import {normalizeDateTimeParams} from 'sentry/components/organizations/pageFilters/parse';
5+
import type {PageFilters} from 'sentry/types/core';
56
import usePageFilters from 'sentry/utils/usePageFilters';
67

78
export function usePageFilterChartParams({
89
granularity = 'spans',
10+
pageFilters,
911
}: {
1012
granularity?: Fidelity;
13+
pageFilters?: PageFilters;
1114
} = {}) {
12-
const {selection} = usePageFilters();
15+
const pageFilterContext = usePageFilters();
16+
const selection = pageFilters || pageFilterContext.selection;
1317

1418
const normalizedDateTime = useMemo(
1519
() => normalizeDateTimeParams(selection.datetime),

static/app/views/insights/pages/platform/nextjs/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ import {trackAnalytics} from 'sentry/utils/analytics';
88
import {useLocation} from 'sentry/utils/useLocation';
99
import {useNavigate} from 'sentry/utils/useNavigate';
1010
import useOrganization from 'sentry/utils/useOrganization';
11+
import OverviewApiLatencyChartWidget from 'sentry/views/insights/common/components/widgets/overviewApiLatencyChartWidget';
1112
import {DeadRageClicksWidget} from 'sentry/views/insights/pages/platform/nextjs/deadRageClickWidget';
1213
import SSRTreeWidget from 'sentry/views/insights/pages/platform/nextjs/ssrTreeWidget';
1314
import {WebVitalsWidget} from 'sentry/views/insights/pages/platform/nextjs/webVitalsWidget';
14-
import {DurationWidget} from 'sentry/views/insights/pages/platform/shared/durationWidget';
1515
import {IssuesWidget} from 'sentry/views/insights/pages/platform/shared/issuesWidget';
1616
import {PlatformLandingPageLayout} from 'sentry/views/insights/pages/platform/shared/layout';
1717
import {PagesTable} from 'sentry/views/insights/pages/platform/shared/pagesTable';
@@ -97,7 +97,7 @@ export function NextJsOverviewPage({
9797
/>
9898
</WidgetGrid.Position1>
9999
<WidgetGrid.Position2>
100-
<DurationWidget />
100+
<OverviewApiLatencyChartWidget />
101101
</WidgetGrid.Position2>
102102
<WidgetGrid.Position3>
103103
<IssuesWidget />

static/app/views/insights/pages/platform/shared/getReleaseBubbleProps.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import useOrganization from 'sentry/utils/useOrganization';
22
import usePageFilters from 'sentry/utils/usePageFilters';
33
import {useReleaseStats} from 'sentry/utils/useReleaseStats';
4+
import type {LoadableChartWidgetProps} from 'sentry/views/insights/common/components/widgets/types';
45

5-
export function useReleaseBubbleProps() {
6+
type Params = Pick<LoadableChartWidgetProps, 'showReleaseAs'>;
7+
8+
export function useReleaseBubbleProps(params?: Params) {
69
const organization = useOrganization();
710
const pageFilters = usePageFilters();
811

@@ -14,6 +17,6 @@ export function useReleaseBubbleProps() {
1417
})) ?? [];
1518

1619
return organization.features.includes('release-bubbles-ui')
17-
? ({releases, showReleaseAs: 'bubble'} as const)
20+
? ({releases, showReleaseAs: params?.showReleaseAs ?? 'bubble'} as const)
1821
: {};
1922
}

tests/js/fixtures/discoverSeries.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import type {DiscoverSeries} from 'sentry/views/insights/common/queries/useDiscoverSeries';
2+
3+
export function TimeSeriesFixture(params: Partial<DiscoverSeries> = {}): DiscoverSeries {
4+
return {
5+
seriesName: 'avg(span.duration)',
6+
data: [
7+
{
8+
name: '2025-03-24T15:00:00-04:00',
9+
value: 100,
10+
},
11+
{
12+
name: '2025-03-24T15:30:00-04:00',
13+
value: 161,
14+
},
15+
{
16+
name: '2025-03-24T16:00:00-04:00',
17+
value: 474,
18+
},
19+
],
20+
meta: {
21+
fields: {
22+
'avg(span.duration)': 'duration',
23+
},
24+
units: {
25+
'avg(span.duration)': 'ms',
26+
},
27+
},
28+
...params,
29+
};
30+
}

0 commit comments

Comments
 (0)