import styled from '@emotion/styled'; import {useAnalyticsArea} from 'sentry/components/analyticsArea'; import Link from 'sentry/components/links/link'; import QuestionTooltip from 'sentry/components/questionTooltip'; import {generateTraceTarget} from 'sentry/components/quickTrace/utils'; import {IconChevron} from 'sentry/icons'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import type {Event} from 'sentry/types/event'; import {trackAnalytics} from 'sentry/utils/analytics'; import {useLocation} from 'sentry/utils/useLocation'; import useOrganization from 'sentry/utils/useOrganization'; import {TraceViewSources} from 'sentry/views/performance/newTraceDetails/traceHeader/breadcrumbs'; interface TraceLinkProps { event: Event; } export function TraceLink({event}: TraceLinkProps) { const organization = useOrganization(); const location = useLocation(); const area = useAnalyticsArea(); const traceTarget = generateTraceTarget( event, organization, { ...location, query: { ...location.query, groupId: event.groupID, }, }, area.startsWith('feedback') ? TraceViewSources.FEEDBACK_DETAILS : TraceViewSources.ISSUE_DETAILS // area can be leveraged for other TraceViewSources, but right now these // are the only 2 that use a TraceLink. ); if (!event.contexts?.trace?.trace_id) { return ( {t('No Trace Available')} ); } return ( { // Source used to be hard-coded here, we keep the old value of issue details for backwards compatibility. trackAnalytics('quick_trace.trace_id.clicked', { organization, source: area.includes('issue_details') ? 'issues' : area, }); }} > {t('View Full Trace')} ); } const StyledLink = styled(Link)` display: flex; align-items: center; gap: ${space(0.25)}; line-height: 1.2; font-size: ${p => p.theme.fontSizeMedium}; svg { margin-top: 1px; } `; const NoTraceAvailable = styled('span')` display: flex; align-items: center; gap: ${space(0.25)}; line-height: 1.2; color: ${p => p.theme.subText}; font-size: ${p => p.theme.fontSizeMedium}; svg { margin-top: 1px; } `;