Skip to content

Commit ae11c94

Browse files
Abdkhan14Abdullah Khan
andauthored
analytics(trace-eap-waterfall): Adding analytics for having profile and log details (#97423)
- Only triggered if either exists - Had to push providers a level higher to collect props for the analytics event - No change in functionality --------- Co-authored-by: Abdullah Khan <[email protected]>
1 parent e68b618 commit ae11c94

File tree

5 files changed

+388
-288
lines changed

5 files changed

+388
-288
lines changed

static/app/utils/analytics/tracingEventMap.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ export type TracingEventParameters = {
100100
'trace.quality.quota_exceeded.learn_more_clicked': {
101101
traceType: string;
102102
};
103+
'trace.trace_drawer_details.eap_span_has_details': {
104+
has_logs_details: boolean;
105+
has_profile_details: boolean;
106+
};
103107
'trace.trace_drawer_explore_search': {
104108
key: string;
105109
kind: TraceDrawerActionKind;
@@ -222,6 +226,7 @@ export const tracingEventMap: Record<TracingEventKey, string | null> = {
222226
'trace.trace_layout.change': 'Changed Trace Layout',
223227
'trace.trace_layout.drawer_minimize': 'Minimized Trace Drawer',
224228
'trace.trace_drawer_explore_search': 'Searched Trace Explorer',
229+
'trace.trace_drawer_details.eap_span_has_details': 'EAP Span has Details',
225230
'trace.tracing_onboarding': 'Tracing Onboarding UI',
226231
'trace.tracing_onboarding_platform_docs_viewed':
227232
'Viewed Platform Docs for Onboarding UI',

static/app/views/performance/newTraceDetails/traceAnalytics.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,17 @@ const trackSearchFocus = (organization: Organization) =>
148148
organization,
149149
});
150150

151+
const trackEAPSpanHasDetails = (
152+
organization: Organization,
153+
hasProfileDetails: boolean,
154+
hasLogsDetails: boolean
155+
) =>
156+
trackAnalytics('trace.trace_drawer_details.eap_span_has_details', {
157+
organization,
158+
has_profile_details: hasProfileDetails,
159+
has_logs_details: hasLogsDetails,
160+
});
161+
151162
const trackResetZoom = (organization: Organization) =>
152163
trackAnalytics('trace.trace_layout.reset_zoom', {
153164
organization,
@@ -318,6 +329,8 @@ const traceAnalytics = {
318329
// Trace Preferences
319330
trackAutogroupingPreferenceChange,
320331
trackMissingInstrumentationPreferenceChange,
332+
// Trace Drawer Details
333+
trackEAPSpanHasDetails,
321334
};
322335

323336
export {traceAnalytics};
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import {useRef} from 'react';
2+
3+
import {t} from 'sentry/locale';
4+
import useOrganization from 'sentry/utils/useOrganization';
5+
import {useLogsPageDataQueryResult} from 'sentry/views/explore/contexts/logs/logsPageData';
6+
import {LogsInfiniteTable} from 'sentry/views/explore/logs/tables/logsInfiniteTable';
7+
import {LogsTable} from 'sentry/views/explore/logs/tables/logsTable';
8+
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
9+
import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
10+
11+
export function LogDetails() {
12+
const logsQueryResult = useLogsPageDataQueryResult();
13+
const hasInfiniteFeature = useOrganization().features.includes(
14+
'ourlogs-infinite-scroll'
15+
);
16+
const scrollContainer = useRef<HTMLDivElement>(null);
17+
if (!logsQueryResult?.data?.length) {
18+
return null;
19+
}
20+
return (
21+
<FoldSection
22+
ref={scrollContainer}
23+
sectionKey={SectionKey.LOGS}
24+
title={t('Logs')}
25+
disableCollapsePersistence
26+
>
27+
{hasInfiniteFeature ? (
28+
<LogsInfiniteTable embedded scrollContainer={scrollContainer} />
29+
) : (
30+
<LogsTable embedded />
31+
)}
32+
</FoldSection>
33+
);
34+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import styled from '@emotion/styled';
2+
3+
import {
4+
SpanProfileDetails,
5+
type SpanProfileDetailsProps,
6+
useSpanProfileDetails,
7+
} from 'sentry/components/events/interfaces/spans/spanProfileDetails';
8+
import {t} from 'sentry/locale';
9+
import {space} from 'sentry/styles/space';
10+
import type {EventTransaction} from 'sentry/types/event';
11+
import type {Organization} from 'sentry/types/organization';
12+
import type {Project} from 'sentry/types/project';
13+
import {defined} from 'sentry/utils';
14+
import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
15+
16+
export function ProfileDetails({
17+
organization,
18+
project,
19+
event,
20+
span,
21+
}: {
22+
event: Readonly<EventTransaction>;
23+
organization: Organization;
24+
project: Project | undefined;
25+
span: Readonly<SpanProfileDetailsProps['span']>;
26+
}) {
27+
const {profile, frames} = useSpanProfileDetails(organization, project, event, span);
28+
29+
if (!defined(profile) || frames.length === 0) {
30+
return null;
31+
}
32+
33+
return (
34+
<InterimSection
35+
title={t('Profile')}
36+
type="span_profile_details"
37+
disableCollapsePersistence
38+
>
39+
<EmbededContentWrapper>
40+
<SpanProfileDetails span={span} event={event} />
41+
</EmbededContentWrapper>
42+
</InterimSection>
43+
);
44+
}
45+
46+
const EmbededContentWrapper = styled('div')`
47+
margin-top: ${space(0.5)};
48+
`;

0 commit comments

Comments
 (0)