Skip to content

Commit d483d3e

Browse files
authored
ref(tsc): traces endpoint to apiOptions (#112574)
1 parent 6b52064 commit d483d3e

File tree

8 files changed

+108
-112
lines changed

8 files changed

+108
-112
lines changed

static/app/views/explore/hooks/useAnalytics.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ function useTrackAnalytics({
102102
queryType === 'aggregate'
103103
? (aggregatesTableResult.result.error?.message ?? '')
104104
: queryType === 'traces'
105-
? (tracesTableResult?.result.error?.message ?? '')
105+
? (tracesTableResult?.error?.message ?? '')
106106
: (spansTableResult.result.error?.message ?? '');
107107
const chartError = timeseriesResult.error?.message ?? '';
108108
const query_status = tableError || chartError ? 'error' : 'success';
@@ -405,7 +405,7 @@ function useTrackAnalytics({
405405
'timestamp',
406406
];
407407
const resultMissingRoot =
408-
tracesTableResult?.result?.data?.data?.filter(trace => !defined(trace.name))
408+
tracesTableResult?.result?.data?.json?.data?.filter(trace => !defined(trace.name))
409409
.length ?? 0;
410410
const gaveSeerConsent = organization.hideAiFeatures
411411
? 'gen_ai_features_disabled'
@@ -421,7 +421,7 @@ function useTrackAnalytics({
421421
columns,
422422
columns_count: columns.length,
423423
query_status,
424-
result_length: tracesTableResult.result.data?.data?.length || 0,
424+
result_length: tracesTableResult.result.data?.json?.data?.length || 0,
425425
result_missing_root: resultMissingRoot,
426426
user_queries: search.formatString(),
427427
user_queries_count: search.tokens.length,
@@ -456,7 +456,7 @@ function useTrackAnalytics({
456456
timeseriesResult.data,
457457
timeseriesResult.isPending,
458458
title,
459-
tracesTableResult?.result.data?.data,
459+
tracesTableResult?.result.data?.json?.data,
460460
tracesTableResult?.result?.isPending,
461461
tracesTableResultDefined,
462462
visualizes,
Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
1-
import {useMemo} from 'react';
1+
import type {UseQueryResult} from '@tanstack/react-query';
22

33
import type {CaseInsensitive} from 'sentry/components/searchQueryBuilder/hooks';
4+
import type {ApiResponse} from 'sentry/utils/api/apiFetch';
5+
import type {QueryError} from 'sentry/utils/discover/genericDiscoverQuery';
46
import {decodeScalar} from 'sentry/utils/queryString';
57
import {useLocation} from 'sentry/utils/useLocation';
6-
import {useTraces} from 'sentry/views/explore/hooks/useTraces';
8+
import {
9+
type TraceResults,
10+
useTracesApiOptions,
11+
} from 'sentry/views/explore/hooks/useTraces';
712

813
interface UseExploreTracesTableOptions {
9-
enabled: boolean;
1014
limit: number;
1115
query: string;
1216
queryExtras?: {
@@ -17,21 +21,20 @@ interface UseExploreTracesTableOptions {
1721
};
1822
}
1923

20-
export interface TracesTableResult {
21-
result: ReturnType<typeof useTraces>;
22-
}
24+
export type TracesTableResult = {
25+
error: QueryError | null;
26+
result: UseQueryResult<ApiResponse<TraceResults>, Error>;
27+
};
2328

24-
export function useExploreTracesTable({
25-
enabled,
29+
export function useExploreTracesTableApiOptions({
2630
limit,
2731
query,
2832
queryExtras,
29-
}: UseExploreTracesTableOptions): TracesTableResult {
33+
}: UseExploreTracesTableOptions) {
3034
const location = useLocation();
3135
const cursor = decodeScalar(location.query.cursor);
3236

33-
const result = useTraces({
34-
enabled,
37+
return useTracesApiOptions({
3538
query,
3639
limit,
3740
sort: '-timestamp',
@@ -41,8 +44,4 @@ export function useExploreTracesTable({
4144
metricQuery: queryExtras?.metricQuery,
4245
spanQuery: queryExtras?.spanQuery,
4346
});
44-
45-
return useMemo(() => {
46-
return {result};
47-
}, [result]);
4847
}

static/app/views/explore/hooks/useTraces.spec.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import {useQuery} from '@tanstack/react-query';
12
import {OrganizationFixture} from 'sentry-fixture/organization';
23
import {ProjectFixture} from 'sentry-fixture/project';
34

@@ -7,7 +8,7 @@ import {act, renderHookWithProviders, waitFor} from 'sentry-test/reactTestingLib
78
import {PageFiltersStore} from 'sentry/components/pageFilters/store';
89
import {ProjectsStore} from 'sentry/stores/projectsStore';
910

10-
import {useTraces, type TraceResult} from './useTraces';
11+
import {useTracesApiOptions, type TraceResult} from './useTraces';
1112

1213
function createTraceResult(trace?: Partial<TraceResult>): TraceResult {
1314
return {
@@ -83,7 +84,10 @@ describe('useTraces', () => {
8384
],
8485
});
8586

86-
const {result} = renderHookWithProviders(useTraces, {
87+
const useTracesQuery = (...params: Parameters<typeof useTracesApiOptions>) =>
88+
useQuery(useTracesApiOptions(...params));
89+
90+
const {result} = renderHookWithProviders(useTracesQuery, {
8791
...context,
8892
initialProps: {
8993
datetime: {
Lines changed: 26 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
1-
import {keepPreviousData as keepPreviousDataFn} from '@tanstack/react-query';
1+
import {queryOptions} from '@tanstack/react-query';
22

33
import {normalizeDateTimeParams} from 'sentry/components/pageFilters/parse';
44
import {usePageFilters} from 'sentry/components/pageFilters/usePageFilters';
55
import type {CaseInsensitive} from 'sentry/components/searchQueryBuilder/hooks';
66
import type {PageFilters} from 'sentry/types/core';
7-
import {getApiUrl} from 'sentry/utils/api/getApiUrl';
8-
import type {QueryError} from 'sentry/utils/discover/genericDiscoverQuery';
9-
import {parseError} from 'sentry/utils/discover/genericDiscoverQuery';
7+
import {apiOptions} from 'sentry/utils/api/apiOptions';
108
import {DiscoverDatasets} from 'sentry/utils/discover/types';
11-
import type {UseApiQueryOptions, UseApiQueryResult} from 'sentry/utils/queryClient';
12-
import {useApiQuery} from 'sentry/utils/queryClient';
13-
import type {RequestError} from 'sentry/utils/requestError/requestError';
149
import {useOrganization} from 'sentry/utils/useOrganization';
1510

1611
export const BREAKDOWN_SLICES = 40;
@@ -54,20 +49,15 @@ export interface TraceResult {
5449

5550
type TraceBreakdownResult = TraceBreakdownProject | TraceBreakdownMissing;
5651

57-
interface TraceResults {
52+
export interface TraceResults {
5853
data: TraceResult[];
5954
meta: any;
6055
}
6156

62-
interface UseTracesOptions extends Pick<
63-
UseApiQueryOptions<TraceResults>,
64-
'refetchInterval'
65-
> {
57+
interface UseTracesOptions {
6658
caseInsensitive?: CaseInsensitive;
6759
cursor?: string;
6860
datetime?: PageFilters['datetime'];
69-
enabled?: boolean;
70-
keepPreviousData?: boolean;
7161
limit?: number;
7262
logQuery?: string[];
7363
metricQuery?: string[];
@@ -76,61 +66,42 @@ interface UseTracesOptions extends Pick<
7666
spanQuery?: string[];
7767
}
7868

79-
type UseTracesResult = Omit<UseApiQueryResult<TraceResults, RequestError>, 'error'> & {
80-
error: QueryError | null;
81-
};
82-
83-
export function useTraces({
69+
export function useTracesApiOptions({
8470
caseInsensitive,
8571
cursor,
8672
datetime,
87-
enabled,
8873
limit,
8974
query,
9075
sort,
91-
keepPreviousData,
92-
refetchInterval,
9376
logQuery,
9477
metricQuery,
9578
spanQuery,
96-
}: UseTracesOptions): UseTracesResult {
79+
}: UseTracesOptions) {
9780
const organization = useOrganization();
9881
const {selection} = usePageFilters();
9982

100-
const path = getApiUrl('/organizations/$organizationIdOrSlug/traces/', {
101-
path: {organizationIdOrSlug: organization.slug},
102-
});
103-
104-
const endpointOptions = {
105-
query: {
106-
project: selection.projects,
107-
environment: selection.environments,
108-
...normalizeDateTimeParams(datetime ?? selection.datetime),
109-
dataset: DiscoverDatasets.SPANS,
110-
query,
111-
sort,
112-
per_page: limit,
113-
cursor,
114-
breakdownSlices: BREAKDOWN_SLICES,
115-
caseInsensitive: caseInsensitive ? '1' : undefined,
116-
...(Array.isArray(logQuery) && logQuery.length > 0 ? {logQuery} : {}),
117-
...(Array.isArray(metricQuery) && metricQuery.length > 0 ? {metricQuery} : {}),
118-
...(Array.isArray(spanQuery) && spanQuery.length > 0 ? {spanQuery} : {}),
119-
},
120-
};
121-
122-
const {error, ...rest} = useApiQuery<TraceResults>([path, endpointOptions], {
123-
staleTime: 0,
83+
return queryOptions({
84+
...apiOptions.as<TraceResults>()('/organizations/$organizationIdOrSlug/traces/', {
85+
path: {organizationIdOrSlug: organization.slug},
86+
query: {
87+
project: selection.projects,
88+
environment: selection.environments,
89+
...normalizeDateTimeParams(datetime ?? selection.datetime),
90+
dataset: DiscoverDatasets.SPANS,
91+
query,
92+
sort,
93+
per_page: limit,
94+
cursor,
95+
breakdownSlices: BREAKDOWN_SLICES,
96+
caseInsensitive: caseInsensitive ? '1' : undefined,
97+
...(Array.isArray(logQuery) && logQuery.length > 0 ? {logQuery} : {}),
98+
...(Array.isArray(metricQuery) && metricQuery.length > 0 ? {metricQuery} : {}),
99+
...(Array.isArray(spanQuery) && spanQuery.length > 0 ? {spanQuery} : {}),
100+
},
101+
staleTime: 0,
102+
}),
124103
refetchOnWindowFocus: false,
125104
refetchOnMount: false,
126105
retry: false,
127-
placeholderData: keepPreviousData ? keepPreviousDataFn : undefined,
128-
enabled,
129-
refetchInterval,
130106
});
131-
132-
return {
133-
...rest,
134-
error: parseError(error),
135-
};
136107
}

static/app/views/explore/spans/spansTab.tsx

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {Fragment, useEffect, useMemo} from 'react';
22
import {css} from '@emotion/react';
33
import styled from '@emotion/styled';
4+
import {useQuery} from '@tanstack/react-query';
45

56
import {Alert} from '@sentry/scraps/alert';
67
import {Button} from '@sentry/scraps/button';
@@ -20,6 +21,8 @@ import {t} from 'sentry/locale';
2021
import type {Organization} from 'sentry/types/organization';
2122
import type {Project} from 'sentry/types/project';
2223
import {defined} from 'sentry/utils';
24+
import {selectJsonWithHeaders} from 'sentry/utils/api/apiOptions';
25+
import {parseError} from 'sentry/utils/discover/genericDiscoverQuery';
2326
import {DiscoverDatasets} from 'sentry/utils/discover/types';
2427
import {useChartInterval} from 'sentry/utils/useChartInterval';
2528
import {useOrganization} from 'sentry/utils/useOrganization';
@@ -38,7 +41,10 @@ import {useCrossEventQueries} from 'sentry/views/explore/hooks/useCrossEventQuer
3841
import {useExploreAggregatesTable} from 'sentry/views/explore/hooks/useExploreAggregatesTable';
3942
import {useExploreSpansTable} from 'sentry/views/explore/hooks/useExploreSpansTable';
4043
import {useExploreTimeseries} from 'sentry/views/explore/hooks/useExploreTimeseries';
41-
import {useExploreTracesTable} from 'sentry/views/explore/hooks/useExploreTracesTable';
44+
import {
45+
type TracesTableResult,
46+
useExploreTracesTableApiOptions,
47+
} from 'sentry/views/explore/hooks/useExploreTracesTable';
4248
import {Tab, useTab} from 'sentry/views/explore/hooks/useTab';
4349
import {useVisitQuery} from 'sentry/views/explore/hooks/useVisitQuery';
4450
import {
@@ -217,15 +223,22 @@ function SpanTabContentSection({
217223
...(hasCrossEventQueries && defined(crossEventQueries) ? crossEventQueries : {}),
218224
},
219225
});
220-
const tracesTableResult = useExploreTracesTable({
221-
query,
222-
limit,
226+
const tracesTableQuery = useQuery({
227+
...useExploreTracesTableApiOptions({
228+
query,
229+
limit,
230+
queryExtras: {
231+
caseInsensitive,
232+
...(hasCrossEventQueries && defined(crossEventQueries) ? crossEventQueries : {}),
233+
},
234+
}),
235+
select: selectJsonWithHeaders,
223236
enabled: isReady && queryType === 'traces',
224-
queryExtras: {
225-
caseInsensitive,
226-
...(hasCrossEventQueries && defined(crossEventQueries) ? crossEventQueries : {}),
227-
},
228237
});
238+
const tracesTableResult = {
239+
result: tracesTableQuery,
240+
error: parseError(tracesTableQuery.error),
241+
} satisfies TracesTableResult;
229242

230243
const {result: timeseriesResult, samplingMode: timeseriesSamplingMode} =
231244
useExploreTimeseries({
@@ -265,7 +278,7 @@ function SpanTabContentSection({
265278
: queryType === 'samples'
266279
? spansTableResult.result.error
267280
: queryType === 'traces'
268-
? tracesTableResult.result.error
281+
? tracesTableResult.error
269282
: queryType === 'aggregate'
270283
? aggregatesTableResult.result.error
271284
: null;

static/app/views/explore/tables/tracesTable/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ export function TracesTable({tracesTableResult}: TracesTableProps) {
5454
const query = useQueryParamsQuery();
5555

5656
const {result} = tracesTableResult;
57-
58-
const {data, isPending, isError, getResponseHeader} = result;
57+
const {isPending, isError} = result;
58+
const data = result.data?.json;
5959

6060
const showErrorState = !isPending && isError;
6161
const showEmptyState = !isPending && !showErrorState && (data?.data?.length ?? 0) === 0;
@@ -137,7 +137,7 @@ export function TracesTable({tracesTableResult}: TracesTableProps) {
137137
</Container>
138138
</StyledPanel>
139139
<Pagination
140-
pageLinks={getResponseHeader?.('Link')}
140+
pageLinks={result.data?.headers.Link}
141141
paginationAnalyticsEvent={paginationAnalyticsEvent}
142142
/>
143143
</Fragment>

0 commit comments

Comments
 (0)