Skip to content

Commit 34f4ff3

Browse files
Abdkhan14Abdullah Khan
and
Abdullah Khan
authored
feat(trace-eap-waterfall): Adding persistent toggle for trace format (#88390)
Initially it's set to `NON-EAP`. <img width="1259" alt="Screenshot 2025-03-31 at 5 18 42 PM" src="https://github.com/user-attachments/assets/4685518d-8aa0-4419-a527-74de5fef8a1c" /> --------- Co-authored-by: Abdullah Khan <abdullahkhan@PG9Y57YDXQ.local>
1 parent 2f0f04a commit 34f4ff3

File tree

4 files changed

+40
-31
lines changed

4 files changed

+40
-31
lines changed

static/app/components/events/interfaces/performance/eventTraceView.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {useIssuesTraceTree} from 'sentry/views/performance/newTraceDetails/trace
2020
import {useTrace} from 'sentry/views/performance/newTraceDetails/traceApi/useTrace';
2121
import {useTraceMeta} from 'sentry/views/performance/newTraceDetails/traceApi/useTraceMeta';
2222
import {useTraceRootEvent} from 'sentry/views/performance/newTraceDetails/traceApi/useTraceRootEvent';
23-
import {SwitchToNonEAPTraceButton} from 'sentry/views/performance/newTraceDetails/traceHeader';
23+
import {ToggleTraceFormatButton} from 'sentry/views/performance/newTraceDetails/traceHeader';
2424
import {TraceViewSources} from 'sentry/views/performance/newTraceDetails/traceHeader/breadcrumbs';
2525
import {
2626
loadTraceViewPreferences,
@@ -167,7 +167,7 @@ export function EventTraceView({group, event, organization}: EventTraceViewProps
167167
title={t('Trace Preview')}
168168
actions={
169169
<ButtonBar gap={1}>
170-
<SwitchToNonEAPTraceButton location={location} organization={organization} />
170+
<ToggleTraceFormatButton location={location} organization={organization} />
171171
<LinkButton
172172
size="xs"
173173
to={getTraceLinkForIssue(traceTarget)}

static/app/views/performance/newTraceDetails/traceApi/useTrace.tsx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import {decodeScalar} from 'sentry/utils/queryString';
1515
import type RequestError from 'sentry/utils/requestError/requestError';
1616
import useOrganization from 'sentry/utils/useOrganization';
1717
import usePageFilters from 'sentry/utils/usePageFilters';
18+
import {useSyncedLocalStorageState} from 'sentry/utils/useSyncedLocalStorageState';
19+
import {TRACE_FORMAT_PREFERENCE_KEY} from 'sentry/views/performance/newTraceDetails/traceHeader';
1820

1921
import type {TraceTree} from '../traceModels/traceTree';
2022

@@ -47,14 +49,12 @@ export function getTraceQueryParams(
4749
pageEnd?: string;
4850
pageStart?: string;
4951
statsPeriod?: string;
50-
trace_format?: string;
5152
} {
5253
const normalizedParams = normalizeDateTimeParams(query, {
5354
allowAbsolutePageDatetime: true,
5455
});
5556
const statsPeriod = decodeScalar(normalizedParams.statsPeriod);
5657
const demo = decodeScalar(normalizedParams.demo);
57-
const trace_format = decodeScalar(normalizedParams.trace_format);
5858
const timestamp = options.timestamp ?? decodeScalar(normalizedParams.timestamp);
5959
let limit = options.limit ?? decodeScalar(normalizedParams.limit);
6060
if (typeof limit === 'string') {
@@ -88,7 +88,6 @@ export function getTraceQueryParams(
8888
timestamp: timestamp?.toString(),
8989
targetId,
9090
useSpans: 1,
91-
trace_format,
9291
};
9392
for (const key in queryParams) {
9493
if (
@@ -212,19 +211,21 @@ export function useTrace(
212211
// eslint-disable-next-line react-hooks/exhaustive-deps
213212
}, [options.limit, options.timestamp, query.trace_format]);
214213

215-
const {trace_format, ...queryParamsWithoutTraceFormat} = queryParams;
216-
217214
const isDemoMode = Boolean(queryParams.demo);
215+
const [storedTraceFormat] = useSyncedLocalStorageState(
216+
TRACE_FORMAT_PREFERENCE_KEY,
217+
'non-eap'
218+
);
218219
const isEAPEnabled =
219-
organization.features.includes('trace-spans-format') && trace_format !== 'non-eap';
220+
organization.features.includes('trace-spans-format') && storedTraceFormat === 'eap';
220221
const hasValidTrace = Boolean(options.traceSlug && organization.slug);
221222

222223
const demoTrace = useDemoTrace(queryParams.demo, organization);
223224

224225
const traceQuery = useApiQuery<TraceSplitResults<TraceTree.Transaction>>(
225226
[
226227
`/organizations/${organization.slug}/events-trace/${options.traceSlug ?? ''}/`,
227-
{query: queryParamsWithoutTraceFormat},
228+
{query: queryParams},
228229
],
229230
{
230231
staleTime: Infinity,
@@ -235,7 +236,7 @@ export function useTrace(
235236
const eapTraceQuery = useApiQuery<TraceTree.EAPTrace>(
236237
[
237238
`/organizations/${organization.slug}/trace/${options.traceSlug ?? ''}/`,
238-
{query: {...queryParamsWithoutTraceFormat, project: -1}},
239+
{query: {...queryParams, project: -1}},
239240
],
240241
{
241242
staleTime: Infinity,

static/app/views/performance/newTraceDetails/traceApi/useTraceRootEvent.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import type {EventTransaction} from 'sentry/types/event';
22
import {isTraceSplitResult} from 'sentry/utils/performance/quickTrace/utils';
33
import {useApiQuery} from 'sentry/utils/queryClient';
44
import useOrganization from 'sentry/utils/useOrganization';
5+
import {useSyncedLocalStorageState} from 'sentry/utils/useSyncedLocalStorageState';
6+
import {TRACE_FORMAT_PREFERENCE_KEY} from 'sentry/views/performance/newTraceDetails/traceHeader';
57
import type {TraceTree} from 'sentry/views/performance/newTraceDetails/traceModels/traceTree';
68

79
export function useTraceRootEvent(trace: TraceTree.Trace | null) {
@@ -11,6 +13,10 @@ export function useTraceRootEvent(trace: TraceTree.Trace | null) {
1113
: trace[0]
1214
: null;
1315
const organization = useOrganization();
16+
const [storedTraceFormat] = useSyncedLocalStorageState(
17+
TRACE_FORMAT_PREFERENCE_KEY,
18+
'non-eap'
19+
);
1420

1521
return useApiQuery<EventTransaction>(
1622
[
@@ -23,7 +29,11 @@ export function useTraceRootEvent(trace: TraceTree.Trace | null) {
2329
],
2430
{
2531
staleTime: 0,
26-
enabled: !!trace && !!root?.project_slug && !!root?.event_id,
32+
enabled:
33+
!!trace &&
34+
!!root?.project_slug &&
35+
!!root?.event_id &&
36+
storedTraceFormat === 'non-eap',
2737
}
2838
);
2939
}

static/app/views/performance/newTraceDetails/traceHeader/index.tsx

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import type {UseApiQueryResult} from 'sentry/utils/queryClient';
2323
import type RequestError from 'sentry/utils/requestError/requestError';
2424
import {useFeedbackForm} from 'sentry/utils/useFeedbackForm';
2525
import {useLocation} from 'sentry/utils/useLocation';
26-
import {useNavigate} from 'sentry/utils/useNavigate';
26+
import {useSyncedLocalStorageState} from 'sentry/utils/useSyncedLocalStorageState';
2727
import {hasDatasetSelector} from 'sentry/views/dashboards/utils';
2828
import {ProjectsRenderer} from 'sentry/views/explore/tables/tracesTable/fieldRenderers';
2929
import {useModuleURLBuilder} from 'sentry/views/insights/common/utils/useModuleURL';
@@ -73,33 +73,31 @@ function FeedbackButton() {
7373
) : null;
7474
}
7575

76-
export function SwitchToNonEAPTraceButton({
77-
location,
76+
export const TRACE_FORMAT_PREFERENCE_KEY = 'trace_format_preference';
77+
78+
export function ToggleTraceFormatButton({
7879
organization,
7980
}: {
8081
location: Location;
8182
organization: Organization;
8283
}) {
83-
const navigate = useNavigate();
84-
const switchToNonEAPTrace = useCallback(() => {
85-
navigate({
86-
...location,
87-
query: {
88-
...location.query,
89-
trace_format: 'non-eap',
90-
},
91-
});
92-
}, [location, navigate]);
84+
const [storedTraceFormat, setStoredTraceFormat] = useSyncedLocalStorageState(
85+
TRACE_FORMAT_PREFERENCE_KEY,
86+
'non-eap'
87+
);
9388

9489
return (
95-
<Feature organization={organization} features="visibility-explore-admin">
90+
<Feature organization={organization} features="trace-spans-format">
9691
<Button
97-
disabled={location.query.trace_format === 'non-eap'}
9892
size="xs"
99-
aria-label="non-eap-trace-btn"
100-
onClick={switchToNonEAPTrace}
93+
aria-label="toggle-trace-format-btn"
94+
onClick={() => {
95+
setStoredTraceFormat(storedTraceFormat === 'eap' ? 'non-eap' : 'eap');
96+
}}
10197
>
102-
{t('Switch to Non-EAP Trace')}
98+
{storedTraceFormat === 'eap'
99+
? t('Switch to Non-EAP Trace')
100+
: t('Switch to EAP Trace')}
103101
</Button>
104102
</Feature>
105103
);
@@ -123,7 +121,7 @@ function PlaceHolder({organization}: {organization: Organization}) {
123121
)}
124122
/>
125123
<ButtonBar gap={1}>
126-
<SwitchToNonEAPTraceButton location={location} organization={organization} />
124+
<ToggleTraceFormatButton location={location} organization={organization} />
127125
<FeedbackButton />
128126
</ButtonBar>
129127
</HeaderRow>
@@ -308,7 +306,7 @@ export function TraceMetaDataHeader(props: TraceMetadataHeaderProps) {
308306
)}
309307
/>
310308
<ButtonBar gap={1}>
311-
<SwitchToNonEAPTraceButton
309+
<ToggleTraceFormatButton
312310
location={location}
313311
organization={props.organization}
314312
/>

0 commit comments

Comments
 (0)