Skip to content

Commit 138abac

Browse files
authored
feat(profiling): Make transactions table continuous profiling compatible (#75178)
This allows the transactions table to be populated with transasactions that have continuous profiles.
1 parent 1538557 commit 138abac

File tree

4 files changed

+63
-29
lines changed

4 files changed

+63
-29
lines changed

static/app/components/profiling/profilingTransactionHovercard.tsx

Lines changed: 52 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
generateProfileSummaryRouteWithQuery,
2222
} from 'sentry/utils/profiling/routes';
2323
import {useLocation} from 'sentry/utils/useLocation';
24+
import {profilesRouteWithQuery} from 'sentry/views/performance/transactionSummary/transactionProfiles/utils';
2425

2526
import {Button} from '../button';
2627
import Link from '../links/link';
@@ -37,50 +38,73 @@ export function ProfilingTransactionHovercard(props: ProfilingTransactionHoverca
3738
const {project, transaction, organization} = props;
3839
const {query} = useLocation();
3940

40-
const linkToSummary = generateProfileSummaryRouteWithQuery({
41+
if (!organization.features.includes('continuous-profiling-compat')) {
42+
const linkToSummary = generateProfileSummaryRouteWithQuery({
43+
query,
44+
orgSlug: organization.slug,
45+
projectSlug: project.slug,
46+
transaction,
47+
});
48+
49+
const triggerLink = (
50+
<Link
51+
to={linkToSummary}
52+
onClick={() =>
53+
trackAnalytics('profiling_views.go_to_transaction', {
54+
organization,
55+
source: 'transaction_hovercard.trigger',
56+
})
57+
}
58+
>
59+
{transaction}
60+
</Link>
61+
);
62+
63+
return (
64+
<StyledHovercard
65+
delay={250}
66+
header={
67+
<Flex justify="space-between" align="center">
68+
<TextTruncateOverflow>{transaction}</TextTruncateOverflow>
69+
<Button to={linkToSummary} size="xs">
70+
{t('View Profiles')}
71+
</Button>
72+
</Flex>
73+
}
74+
body={
75+
<ProfilingTransactionHovercardBody
76+
transaction={transaction}
77+
project={project}
78+
organization={organization}
79+
/>
80+
}
81+
showUnderline
82+
>
83+
{triggerLink}
84+
</StyledHovercard>
85+
);
86+
}
87+
88+
const linkToSummary = profilesRouteWithQuery({
4189
query,
4290
orgSlug: organization.slug,
43-
projectSlug: project.slug,
91+
projectID: project.id,
4492
transaction,
4593
});
4694

47-
const triggerLink = (
95+
return (
4896
<Link
4997
to={linkToSummary}
5098
onClick={() =>
5199
trackAnalytics('profiling_views.go_to_transaction', {
52100
organization,
53-
source: 'transaction_hovercard.trigger',
101+
source: 'profiling.landing.transaction_table',
54102
})
55103
}
56104
>
57105
{transaction}
58106
</Link>
59107
);
60-
61-
return (
62-
<StyledHovercard
63-
delay={250}
64-
header={
65-
<Flex justify="space-between" align="center">
66-
<TextTruncateOverflow>{transaction}</TextTruncateOverflow>
67-
<Button to={linkToSummary} size="xs">
68-
{t('View Profiles')}
69-
</Button>
70-
</Flex>
71-
}
72-
body={
73-
<ProfilingTransactionHovercardBody
74-
transaction={transaction}
75-
project={project}
76-
organization={organization}
77-
/>
78-
}
79-
showUnderline
80-
>
81-
{triggerLink}
82-
</StyledHovercard>
83-
);
84108
}
85109

86110
export function ProfilingTransactionHovercardBody({

static/app/utils/analytics/profilingAnalyticsEvents.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ type ProfilingEventSource =
1313
| 'profiling.global_suspect_functions'
1414
| 'profiling.issue.function_regression.list'
1515
| 'profiling.issue.function_regression.transactions'
16+
| 'profiling.landing.transaction_table'
1617
| 'profiling_transaction.suspect_functions_table'
1718
| 'profiling_transaction.slowest_functions_table'
1819
| 'profiling_transaction.regressed_functions_table'

static/app/utils/profiling/hooks/useProfileEvents.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export interface UseProfileEventsOptions<F extends string = ProfilingFieldType>
1414
fields: readonly F[];
1515
referrer: string;
1616
sort: Sort<F>;
17+
continuousProfilingCompat?: boolean;
1718
cursor?: string;
1819
datetime?: PageFilters['datetime'];
1920
enabled?: boolean;
@@ -29,6 +30,7 @@ export function useProfileEvents<F extends string>({
2930
referrer,
3031
query,
3132
sort,
33+
continuousProfilingCompat,
3234
cursor,
3335
enabled = true,
3436
refetchOnMount = true,
@@ -38,7 +40,11 @@ export function useProfileEvents<F extends string>({
3840
const organization = useOrganization();
3941
const {selection} = usePageFilters();
4042

41-
query = `has:profile.id ${query ? `(${query})` : ''}`;
43+
if (continuousProfilingCompat) {
44+
query = `(has:profile.id OR (has:profiler.id has:thread.id)) ${query ? `(${query})` : ''}`;
45+
} else {
46+
query = `has:profile.id ${query ? `(${query})` : ''}`;
47+
}
4248

4349
const path = `/organizations/${organization.slug}/events/`;
4450
const endpointOptions = {

static/app/views/profiling/content.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,9 @@ function ProfilingContent({location}: ProfilingContentProps) {
297297
query,
298298
sort,
299299
referrer: 'api.profiling.landing-table',
300+
continuousProfilingCompat: organization.features.includes(
301+
'continuous-profiling-compat'
302+
),
300303
});
301304

302305
const transactionsError =

0 commit comments

Comments
 (0)