|
@@ -1,89 +1,97 @@
|
|
|
+import {useEffect} from 'react';
|
|
|
import styled from '@emotion/styled';
|
|
|
import {Location} from 'history';
|
|
|
|
|
|
-import {Alert} from 'sentry/components/alert';
|
|
|
-import {Button} from 'sentry/components/button';
|
|
|
import ErrorBoundary from 'sentry/components/errorBoundary';
|
|
|
import ExternalLink from 'sentry/components/links/externalLink';
|
|
|
import QuickTrace from 'sentry/components/quickTrace';
|
|
|
-import {IconClose} from 'sentry/icons';
|
|
|
+import {
|
|
|
+ ErrorNodeContent,
|
|
|
+ EventNode,
|
|
|
+ QuickTraceContainer,
|
|
|
+ TraceConnector,
|
|
|
+} from 'sentry/components/quickTrace/styles';
|
|
|
+import {Tooltip} from 'sentry/components/tooltip';
|
|
|
+import {IconFire} from 'sentry/icons';
|
|
|
import {t, tct} from 'sentry/locale';
|
|
|
import {space} from 'sentry/styles/space';
|
|
|
-import {Organization} from 'sentry/types';
|
|
|
+import {Group, IssueCategory, Organization} from 'sentry/types';
|
|
|
import {Event} from 'sentry/types/event';
|
|
|
+import {defined} from 'sentry/utils';
|
|
|
import trackAdvancedAnalyticsEvent from 'sentry/utils/analytics/trackAdvancedAnalyticsEvent';
|
|
|
import {QuickTraceQueryChildrenProps} from 'sentry/utils/performance/quickTrace/types';
|
|
|
-import usePromptCheck from 'sentry/views/issueDetails/quickTrace/usePromptCheck';
|
|
|
+import useOrganization from 'sentry/utils/useOrganization';
|
|
|
|
|
|
type Props = {
|
|
|
event: Event;
|
|
|
+ group: Group;
|
|
|
location: Location;
|
|
|
organization: Organization;
|
|
|
quickTrace: undefined | QuickTraceQueryChildrenProps;
|
|
|
- isPerformanceIssue?: boolean;
|
|
|
};
|
|
|
|
|
|
-function IssueQuickTrace({
|
|
|
- event,
|
|
|
- location,
|
|
|
- organization,
|
|
|
- quickTrace,
|
|
|
- isPerformanceIssue,
|
|
|
-}: Props) {
|
|
|
- const {shouldShowPrompt, snoozePrompt} = usePromptCheck({
|
|
|
- projectId: event.projectID,
|
|
|
- feature: 'quick_trace_missing',
|
|
|
- organization,
|
|
|
- });
|
|
|
-
|
|
|
- if (
|
|
|
- !quickTrace ||
|
|
|
- quickTrace.error ||
|
|
|
- quickTrace.trace === null ||
|
|
|
- quickTrace.trace.length === 0
|
|
|
- ) {
|
|
|
- if (!shouldShowPrompt) {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
+function TransactionMissingPlaceholder({
|
|
|
+ type,
|
|
|
+ group,
|
|
|
+}: {
|
|
|
+ group: Group;
|
|
|
+ type?: QuickTraceQueryChildrenProps['type'];
|
|
|
+}) {
|
|
|
+ const organization = useOrganization();
|
|
|
+ useEffect(() => {
|
|
|
trackAdvancedAnalyticsEvent('issue.quick_trace_status', {
|
|
|
organization,
|
|
|
- status: quickTrace?.type === 'missing' ? 'transaction missing' : 'trace missing',
|
|
|
- is_performance_issue: isPerformanceIssue ?? false,
|
|
|
+ status: type === 'missing' ? 'transaction missing' : 'trace missing',
|
|
|
+ is_performance_issue: group.issueCategory === IssueCategory.PERFORMANCE,
|
|
|
});
|
|
|
+ });
|
|
|
|
|
|
- return (
|
|
|
- <StyledAlert
|
|
|
- type="info"
|
|
|
- showIcon
|
|
|
- trailingItems={
|
|
|
- <Button
|
|
|
- aria-label={t('Remind me later')}
|
|
|
- title={t('Dismiss for a month')}
|
|
|
- priority="link"
|
|
|
- size="xs"
|
|
|
- icon={<IconClose />}
|
|
|
- onClick={snoozePrompt}
|
|
|
- />
|
|
|
- }
|
|
|
- >
|
|
|
- {tct(
|
|
|
- 'The [type] for this event cannot be found. [link:Read the docs to understand why].',
|
|
|
+ return (
|
|
|
+ <QuickTraceWrapper>
|
|
|
+ <Tooltip
|
|
|
+ isHoverable
|
|
|
+ position="bottom"
|
|
|
+ title={tct(
|
|
|
+ 'The [type] for this event cannot be found. [link:Read the docs] to understand why.',
|
|
|
{
|
|
|
- type: quickTrace?.type === 'missing' ? t('transaction') : t('trace'),
|
|
|
+ type: type === 'missing' ? t('transaction') : t('trace'),
|
|
|
link: (
|
|
|
<ExternalLink href="https://docs.sentry.io/product/sentry-basics/tracing/trace-view/#troubleshooting" />
|
|
|
),
|
|
|
}
|
|
|
)}
|
|
|
- </StyledAlert>
|
|
|
- );
|
|
|
+ >
|
|
|
+ <QuickTraceContainer data-test-id="missing-trace-placeholder">
|
|
|
+ <EventNode type="white" icon={null}>
|
|
|
+ ???
|
|
|
+ </EventNode>
|
|
|
+ <TraceConnector />
|
|
|
+ <EventNode type="error" data-test-id="event-node">
|
|
|
+ <ErrorNodeContent>
|
|
|
+ <IconFire size="xs" />
|
|
|
+ {t('This Event')}
|
|
|
+ </ErrorNodeContent>
|
|
|
+ </EventNode>
|
|
|
+ </QuickTraceContainer>
|
|
|
+ </Tooltip>
|
|
|
+ </QuickTraceWrapper>
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+function IssueQuickTrace({group, event, location, organization, quickTrace}: Props) {
|
|
|
+ if (
|
|
|
+ !quickTrace ||
|
|
|
+ quickTrace.error ||
|
|
|
+ !defined(quickTrace.trace) ||
|
|
|
+ quickTrace.trace.length === 0
|
|
|
+ ) {
|
|
|
+ return <TransactionMissingPlaceholder group={group} type={quickTrace?.type} />;
|
|
|
}
|
|
|
|
|
|
trackAdvancedAnalyticsEvent('issue.quick_trace_status', {
|
|
|
organization,
|
|
|
status: 'success',
|
|
|
- is_performance_issue: isPerformanceIssue ?? false,
|
|
|
+ is_performance_issue: group.issueCategory === IssueCategory.PERFORMANCE,
|
|
|
});
|
|
|
|
|
|
return (
|
|
@@ -107,8 +115,4 @@ const QuickTraceWrapper = styled('div')`
|
|
|
margin-top: ${space(0.5)};
|
|
|
`;
|
|
|
|
|
|
-const StyledAlert = styled(Alert)`
|
|
|
- margin: ${space(1)} 0;
|
|
|
-`;
|
|
|
-
|
|
|
export default IssueQuickTrace;
|