Skip to content

Commit 878e312

Browse files
authored
feat(platform-insights): Make remaining widgets loadable (#92184)
Make the job, cache hit and slow queries widget loadable in the releases drawer. For caches and queries, we hide the custom legend underneath as we do not have enough vertical space. -closes [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 be234e4 commit 878e312

File tree

8 files changed

+93
-35
lines changed

8 files changed

+93
-35
lines changed

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,29 @@ jest.mock(
152152
})),
153153
})
154154
);
155+
jest.mock('sentry/views/insights/common/queries/useDiscover', () => ({
156+
useEAPSpans: jest.fn(() => ({
157+
data: [
158+
{
159+
'avg(span.duration)': 123,
160+
'sum(span.duration)': 456,
161+
'span.group': 'abc123',
162+
'span.description': 'span1',
163+
'sentry.normalized_description': 'span1',
164+
transaction: 'transaction_a',
165+
},
166+
],
167+
isPending: false,
168+
error: null,
169+
})),
170+
}));
171+
jest.mock('sentry/views/insights/common/queries/useTopNDiscoverSeries', () => ({
172+
useTopNSpanEAPSeries: jest.fn(() => ({
173+
data: [mockDiscoverSeries('transaction_a,abc123')],
174+
isPending: false,
175+
error: null,
176+
})),
177+
}));
155178
jest.mock('sentry/views/insights/common/queries/useDiscoverSeries', () => ({
156179
useEAPSeries: jest.fn(() => ({
157180
data: {

static/app/components/charts/chartWidgetLoader.tsx

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,23 +155,33 @@ const CHART_MAP = {
155155
import(
156156
'sentry/views/insights/common/components/widgets/httpDomainSummaryDurationChartWidget'
157157
),
158+
overviewAgentsRunsChartWidget: () =>
159+
import(
160+
'sentry/views/insights/common/components/widgets/overviewAgentsRunsChartWidget'
161+
),
162+
overviewAgentsDurationChartWidget: () =>
163+
import(
164+
'sentry/views/insights/common/components/widgets/overviewAgentsDurationChartWidget'
165+
),
158166
overviewApiLatencyChartWidget: () =>
159167
import(
160168
'sentry/views/insights/common/components/widgets/overviewApiLatencyChartWidget'
161169
),
170+
overviewCacheMissChartWidget: () =>
171+
import(
172+
'sentry/views/insights/common/components/widgets/overviewCacheMissChartWidget'
173+
),
174+
overviewJobsChartWidget: () =>
175+
import('sentry/views/insights/common/components/widgets/overviewJobsChartWidget'),
162176
overviewPageloadsChartWidget: () =>
163177
import(
164178
'sentry/views/insights/common/components/widgets/overviewPageloadsChartWidget'
165179
),
166180
overviewRequestsChartWidget: () =>
167181
import('sentry/views/insights/common/components/widgets/overviewRequestsChartWidget'),
168-
overviewAgentsRunsChartWidget: () =>
169-
import(
170-
'sentry/views/insights/common/components/widgets/overviewAgentsRunsChartWidget'
171-
),
172-
overviewAgentsDurationChartWidget: () =>
182+
overviewSlowQueriesChartWidget: () =>
173183
import(
174-
'sentry/views/insights/common/components/widgets/overviewAgentsDurationChartWidget'
184+
'sentry/views/insights/common/components/widgets/overviewSlowQueriesChartWidget'
175185
),
176186
} satisfies Record<string, () => Promise<{default: React.FC<LoadableChartWidgetProps>}>>;
177187

static/app/views/insights/pages/platform/laravel/cachesWidget.tsx renamed to static/app/views/insights/common/components/widgets/overviewCacheMissChartWidget.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import useOrganization from 'sentry/utils/useOrganization';
1111
import {Line} from 'sentry/views/dashboards/widgets/timeSeriesWidget/plottables/line';
1212
import {TimeSeriesWidgetVisualization} from 'sentry/views/dashboards/widgets/timeSeriesWidget/timeSeriesWidgetVisualization';
1313
import {Widget} from 'sentry/views/dashboards/widgets/widget/widget';
14+
import type {LoadableChartWidgetProps} from 'sentry/views/insights/common/components/widgets/types';
1415
import {useEAPSpans} from 'sentry/views/insights/common/queries/useDiscover';
1516
import {useTopNSpanEAPSeries} from 'sentry/views/insights/common/queries/useTopNDiscoverSeries';
1617
import {convertSeriesToTimeseries} from 'sentry/views/insights/common/utils/convertSeriesToTimeseries';
@@ -31,19 +32,21 @@ import {HighestCacheMissRateTransactionsWidgetEmptyStateWarning} from 'sentry/vi
3132
function isColumnNotFoundError(error: QueryError | null) {
3233
return error?.message === 'Column cache.hit was not found in metrics indexer';
3334
}
34-
export function CachesWidget() {
35+
36+
export default function OverviewCacheMissChartWidget(props: LoadableChartWidgetProps) {
3537
const theme = useTheme();
3638
const organization = useOrganization();
3739
const {query} = useTransactionNameQuery();
38-
const releaseBubbleProps = useReleaseBubbleProps();
39-
const pageFilterChartParams = usePageFilterChartParams();
40+
const releaseBubbleProps = useReleaseBubbleProps(props);
41+
const pageFilterChartParams = usePageFilterChartParams(props);
4042

4143
const cachesRequest = useEAPSpans(
4244
{
4345
fields: ['transaction', 'project.id', 'cache_miss_rate()', 'count()'],
4446
sorts: [{field: 'cache_miss_rate()', kind: 'desc'}],
4547
search: `span.op:[cache.get_item,cache.get] has:span.group ${query}`,
4648
limit: 4,
49+
pageFilters: props.pageFilters,
4750
},
4851
Referrer.CACHE_CHART
4952
);
@@ -64,7 +67,8 @@ export function CachesWidget() {
6467
topN: 4,
6568
enabled: !!cachesRequest.data,
6669
},
67-
Referrer.CACHE_CHART
70+
Referrer.CACHE_CHART,
71+
props.pageFilters
6872
);
6973

7074
const timeSeries = timeSeriesRequest.data.filter(ts => ts.seriesName !== 'Other');
@@ -92,11 +96,13 @@ export function CachesWidget() {
9296
emptyMessage={<HighestCacheMissRateTransactionsWidgetEmptyStateWarning />}
9397
VisualizationType={TimeSeriesWidgetVisualization}
9498
visualizationProps={{
95-
showLegend: 'never',
99+
id: 'overviewCacheMissChartWidget',
100+
showLegend: props.loaderSource === 'releases-drawer' ? 'auto' : 'never',
96101
plottables: timeSeries.map(
97102
(ts, index) =>
98103
new Line(convertSeriesToTimeseries(ts), {color: colorPalette[index]})
99104
),
105+
...props,
100106
...releaseBubbleProps,
101107
}}
102108
/>
@@ -145,6 +151,7 @@ export function CachesWidget() {
145151
Actions={
146152
hasData && (
147153
<Toolbar
154+
loaderSource={props.loaderSource}
148155
onOpenFullScreen={() => {
149156
openInsightChartModal({
150157
title: t('Cache Miss Rates'),
@@ -160,7 +167,7 @@ export function CachesWidget() {
160167
)
161168
}
162169
noFooterPadding
163-
Footer={footer}
170+
Footer={props.loaderSource === 'releases-drawer' ? undefined : footer}
164171
/>
165172
);
166173
}

static/app/views/insights/pages/platform/laravel/jobsWidget.tsx renamed to static/app/views/insights/common/components/widgets/overviewJobsChartWidget.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {TimeSeriesWidgetVisualization} from 'sentry/views/dashboards/widgets/tim
1111
import {Widget} from 'sentry/views/dashboards/widgets/widget/widget';
1212
import {Mode} from 'sentry/views/explore/contexts/pageParamsContext/mode';
1313
import {ChartType} from 'sentry/views/insights/common/components/chart';
14+
import type {LoadableChartWidgetProps} from 'sentry/views/insights/common/components/widgets/types';
1415
import {useEAPSeries} from 'sentry/views/insights/common/queries/useDiscoverSeries';
1516
import {convertSeriesToTimeseries} from 'sentry/views/insights/common/utils/convertSeriesToTimeseries';
1617
import {Referrer} from 'sentry/views/insights/pages/platform/laravel/referrers';
@@ -27,12 +28,13 @@ import {Toolbar} from 'sentry/views/insights/pages/platform/shared/toolbar';
2728
import {useTransactionNameQuery} from 'sentry/views/insights/pages/platform/shared/useTransactionNameQuery';
2829
import {QueuesWidgetEmptyStateWarning} from 'sentry/views/performance/landing/widgets/components/selectableList';
2930

30-
export function JobsWidget() {
31+
export default function OverviewJobsChartWidget(props: LoadableChartWidgetProps) {
3132
const organization = useOrganization();
3233
const {query} = useTransactionNameQuery();
33-
const releaseBubbleProps = useReleaseBubbleProps();
34+
const releaseBubbleProps = useReleaseBubbleProps(props);
3435
const pageFilterChartParams = usePageFilterChartParams({
3536
granularity: 'spans-low',
37+
...props.pageFilters,
3638
});
3739
const theme = useTheme();
3840

@@ -45,7 +47,8 @@ export function JobsWidget() {
4547
yAxis: ['trace_status_rate(internal_error)', 'count(span.duration)'],
4648
referrer: Referrer.JOBS_CHART,
4749
},
48-
Referrer.JOBS_CHART
50+
Referrer.JOBS_CHART,
51+
props.pageFilters
4952
);
5053

5154
const plottables = useMemo(() => {
@@ -78,8 +81,10 @@ export function JobsWidget() {
7881
emptyMessage={<QueuesWidgetEmptyStateWarning />}
7982
VisualizationType={TimeSeriesWidgetVisualization}
8083
visualizationProps={{
84+
id: 'overviewJobsChartWidget',
8185
showLegend: 'never',
8286
plottables,
87+
...props,
8388
...releaseBubbleProps,
8489
}}
8590
/>
@@ -148,6 +153,7 @@ export function JobsWidget() {
148153
sort: '-count(span.duration)',
149154
interval: pageFilterChartParams.interval,
150155
}}
156+
loaderSource={props.loaderSource}
151157
onOpenFullScreen={() => {
152158
openInsightChartModal({
153159
title: t('Jobs'),

static/app/views/insights/pages/platform/laravel/queriesWidget.tsx renamed to static/app/views/insights/common/components/widgets/overviewSlowQueriesChartWidget.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {Widget} from 'sentry/views/dashboards/widgets/widget/widget';
1212
import {Mode} from 'sentry/views/explore/contexts/pageParamsContext/mode';
1313
import {ChartType} from 'sentry/views/insights/common/components/chart';
1414
import {SpanDescriptionCell} from 'sentry/views/insights/common/components/tableCells/spanDescriptionCell';
15+
import type {LoadableChartWidgetProps} from 'sentry/views/insights/common/components/widgets/types';
1516
import {useEAPSpans} from 'sentry/views/insights/common/queries/useDiscover';
1617
import {useTopNSpanEAPSeries} from 'sentry/views/insights/common/queries/useTopNDiscoverSeries';
1718
import {convertSeriesToTimeseries} from 'sentry/views/insights/common/utils/convertSeriesToTimeseries';
@@ -34,12 +35,12 @@ function getSeriesName(item: {'span.group': string; transaction: string}) {
3435
return `${item.transaction},${item['span.group']}`;
3536
}
3637

37-
export function QueriesWidget() {
38+
export default function OverviewSlowQueriesChartWidget(props: LoadableChartWidgetProps) {
3839
const theme = useTheme();
3940
const organization = useOrganization();
4041
const {query} = useTransactionNameQuery();
41-
const releaseBubbleProps = useReleaseBubbleProps();
42-
const pageFilterChartParams = usePageFilterChartParams();
42+
const releaseBubbleProps = useReleaseBubbleProps(props);
43+
const pageFilterChartParams = usePageFilterChartParams(props);
4344

4445
const fullQuery = `has:db.system has:span.group ${query}`;
4546

@@ -56,6 +57,7 @@ export function QueriesWidget() {
5657
sorts: [{field: 'avg(span.duration)', kind: 'desc'}],
5758
search: fullQuery,
5859
limit: 3,
60+
pageFilters: props.pageFilters,
5961
},
6062
Referrer.QUERIES_CHART
6163
);
@@ -70,7 +72,8 @@ export function QueriesWidget() {
7072
topN: 3,
7173
enabled: !!queriesRequest.data,
7274
},
73-
Referrer.QUERIES_CHART
75+
Referrer.QUERIES_CHART,
76+
props.pageFilters
7477
);
7578

7679
const timeSeries = timeSeriesRequest.data.filter(ts => ts.seriesName !== 'Other');
@@ -98,14 +101,16 @@ export function QueriesWidget() {
98101
emptyMessage={<TimeSpentInDatabaseWidgetEmptyStateWarning />}
99102
VisualizationType={TimeSeriesWidgetVisualization}
100103
visualizationProps={{
101-
showLegend: 'never',
104+
id: 'overviewSlowQueriesChartWidget',
105+
showLegend: props.loaderSource === 'releases-drawer' ? 'auto' : 'never',
102106
plottables: timeSeries.map(
103107
(ts, index) =>
104108
new Line(convertSeriesToTimeseries(ts), {
105109
color: colorPalette[index],
106110
alias: aliases[ts.seriesName],
107111
})
108112
),
113+
...props,
109114
...releaseBubbleProps,
110115
}}
111116
/>
@@ -157,6 +162,7 @@ export function QueriesWidget() {
157162
query: fullQuery,
158163
interval: pageFilterChartParams.interval,
159164
}}
165+
loaderSource={props.loaderSource}
160166
onOpenFullScreen={() => {
161167
openInsightChartModal({
162168
title: t('Slow Queries'),
@@ -172,7 +178,7 @@ export function QueriesWidget() {
172178
)
173179
}
174180
noFooterPadding
175-
Footer={footer}
181+
Footer={props.loaderSource === 'releases-drawer' ? undefined : footer}
176182
/>
177183
);
178184
}

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,15 @@ export const useTopNSpanEAPSeries = <
6767
| string[],
6868
>(
6969
options: UseMetricsSeriesOptions<Fields>,
70-
referrer: string
70+
referrer: string,
71+
pageFilters?: PageFilters
7172
) => {
72-
return useTopNDiscoverSeries<Fields>(options, DiscoverDatasets.SPANS_EAP_RPC, referrer);
73+
return useTopNDiscoverSeries<Fields>(
74+
options,
75+
DiscoverDatasets.SPANS_EAP_RPC,
76+
referrer,
77+
pageFilters
78+
);
7379
};
7480

7581
const useTopNDiscoverSeries = <T extends string[]>(

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLay
2525
import {ToolRibbon} from 'sentry/views/insights/common/components/ribbon';
2626
import {STARRED_SEGMENT_TABLE_QUERY_KEY} from 'sentry/views/insights/common/components/tableCells/starredSegmentCell';
2727
import OverviewApiLatencyChartWidget from 'sentry/views/insights/common/components/widgets/overviewApiLatencyChartWidget';
28+
import OverviewCacheMissChartWidget from 'sentry/views/insights/common/components/widgets/overviewCacheMissChartWidget';
29+
import OverviewJobsChartWidget from 'sentry/views/insights/common/components/widgets/overviewJobsChartWidget';
2830
import OverviewRequestsChartWidget from 'sentry/views/insights/common/components/widgets/overviewRequestsChartWidget';
31+
import OverviewSlowQueriesChartWidget from 'sentry/views/insights/common/components/widgets/overviewSlowQueriesChartWidget';
2932
import {useEAPSpans} from 'sentry/views/insights/common/queries/useDiscover';
3033
import {useOnboardingProject} from 'sentry/views/insights/common/queries/useOnboardingProject';
3134
import {useInsightsEap} from 'sentry/views/insights/common/utils/useEap';
@@ -47,10 +50,7 @@ import {DomainOverviewPageProviders} from 'sentry/views/insights/pages/domainOve
4750
import {OVERVIEW_PAGE_ALLOWED_OPS as FRONTEND_OVERVIEW_PAGE_OPS} from 'sentry/views/insights/pages/frontend/settings';
4851
import {OVERVIEW_PAGE_ALLOWED_OPS as BACKEND_OVERVIEW_PAGE_OPS} from 'sentry/views/insights/pages/mobile/settings';
4952
import {LaravelOverviewPage} from 'sentry/views/insights/pages/platform/laravel';
50-
import {CachesWidget} from 'sentry/views/insights/pages/platform/laravel/cachesWidget';
5153
import {useIsLaravelInsightsAvailable} from 'sentry/views/insights/pages/platform/laravel/features';
52-
import {JobsWidget} from 'sentry/views/insights/pages/platform/laravel/jobsWidget';
53-
import {QueriesWidget} from 'sentry/views/insights/pages/platform/laravel/queriesWidget';
5454
import {NextJsOverviewPage} from 'sentry/views/insights/pages/platform/nextjs';
5555
import {
5656
useIsNextJsInsightsAvailable,
@@ -247,13 +247,13 @@ function EAPBackendOverviewPage() {
247247
<ModuleLayout.Full>
248248
<TripleRowWidgetWrapper>
249249
<ModuleLayout.Third>
250-
<JobsWidget />
250+
<OverviewJobsChartWidget />
251251
</ModuleLayout.Third>
252252
<ModuleLayout.Third>
253-
<QueriesWidget />
253+
<OverviewSlowQueriesChartWidget />
254254
</ModuleLayout.Third>
255255
<ModuleLayout.Third>
256-
<CachesWidget />
256+
<OverviewCacheMissChartWidget />
257257
</ModuleLayout.Third>
258258
</TripleRowWidgetWrapper>
259259
</ModuleLayout.Full>

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import {useEffect} from 'react';
33
import {trackAnalytics} from 'sentry/utils/analytics';
44
import useOrganization from 'sentry/utils/useOrganization';
55
import OverviewApiLatencyChartWidget from 'sentry/views/insights/common/components/widgets/overviewApiLatencyChartWidget';
6+
import OverviewCacheMissChartWidget from 'sentry/views/insights/common/components/widgets/overviewCacheMissChartWidget';
7+
import OverviewJobsChartWidget from 'sentry/views/insights/common/components/widgets/overviewJobsChartWidget';
68
import OverviewRequestsChartWidget from 'sentry/views/insights/common/components/widgets/overviewRequestsChartWidget';
7-
import {CachesWidget} from 'sentry/views/insights/pages/platform/laravel/cachesWidget';
8-
import {JobsWidget} from 'sentry/views/insights/pages/platform/laravel/jobsWidget';
9-
import {QueriesWidget} from 'sentry/views/insights/pages/platform/laravel/queriesWidget';
9+
import OverviewSlowQueriesChartWidget from 'sentry/views/insights/common/components/widgets/overviewSlowQueriesChartWidget';
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';
@@ -35,13 +35,13 @@ export function LaravelOverviewPage() {
3535
<IssuesWidget />
3636
</WidgetGrid.Position3>
3737
<WidgetGrid.Position4>
38-
<JobsWidget />
38+
<OverviewJobsChartWidget />
3939
</WidgetGrid.Position4>
4040
<WidgetGrid.Position5>
41-
<QueriesWidget />
41+
<OverviewSlowQueriesChartWidget />
4242
</WidgetGrid.Position5>
4343
<WidgetGrid.Position6>
44-
<CachesWidget />
44+
<OverviewCacheMissChartWidget />
4545
</WidgetGrid.Position6>
4646
</WidgetGrid>
4747
<PathsTable />

0 commit comments

Comments
 (0)