issueQuickTrace.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import {useEffect} from 'react';
  2. import styled from '@emotion/styled';
  3. import {Location} from 'history';
  4. import ErrorBoundary from 'sentry/components/errorBoundary';
  5. import ExternalLink from 'sentry/components/links/externalLink';
  6. import QuickTrace from 'sentry/components/quickTrace';
  7. import {
  8. ErrorNodeContent,
  9. EventNode,
  10. QuickTraceContainer,
  11. TraceConnector,
  12. } from 'sentry/components/quickTrace/styles';
  13. import {Tooltip} from 'sentry/components/tooltip';
  14. import {IconFire} from 'sentry/icons';
  15. import {t, tct} from 'sentry/locale';
  16. import {space} from 'sentry/styles/space';
  17. import {Group, IssueCategory, Organization} from 'sentry/types';
  18. import {Event} from 'sentry/types/event';
  19. import {defined} from 'sentry/utils';
  20. import trackAdvancedAnalyticsEvent from 'sentry/utils/analytics/trackAdvancedAnalyticsEvent';
  21. import {QuickTraceQueryChildrenProps} from 'sentry/utils/performance/quickTrace/types';
  22. import useOrganization from 'sentry/utils/useOrganization';
  23. type Props = {
  24. event: Event;
  25. group: Group;
  26. location: Location;
  27. organization: Organization;
  28. quickTrace: undefined | QuickTraceQueryChildrenProps;
  29. };
  30. function TransactionMissingPlaceholder({
  31. type,
  32. group,
  33. }: {
  34. group: Group;
  35. type?: QuickTraceQueryChildrenProps['type'];
  36. }) {
  37. const organization = useOrganization();
  38. useEffect(() => {
  39. trackAdvancedAnalyticsEvent('issue.quick_trace_status', {
  40. organization,
  41. status: type === 'missing' ? 'transaction missing' : 'trace missing',
  42. is_performance_issue: group.issueCategory === IssueCategory.PERFORMANCE,
  43. });
  44. });
  45. return (
  46. <QuickTraceWrapper>
  47. <Tooltip
  48. isHoverable
  49. position="bottom"
  50. title={tct(
  51. 'The [type] for this event cannot be found. [link:Read the docs] to understand why.',
  52. {
  53. type: type === 'missing' ? t('transaction') : t('trace'),
  54. link: (
  55. <ExternalLink href="https://docs.sentry.io/product/sentry-basics/tracing/trace-view/#troubleshooting" />
  56. ),
  57. }
  58. )}
  59. >
  60. <QuickTraceContainer data-test-id="missing-trace-placeholder">
  61. <EventNode type="white" icon={null}>
  62. ???
  63. </EventNode>
  64. <TraceConnector />
  65. <EventNode type="error" data-test-id="event-node">
  66. <ErrorNodeContent>
  67. <IconFire size="xs" />
  68. {t('This Event')}
  69. </ErrorNodeContent>
  70. </EventNode>
  71. </QuickTraceContainer>
  72. </Tooltip>
  73. </QuickTraceWrapper>
  74. );
  75. }
  76. function IssueQuickTrace({group, event, location, organization, quickTrace}: Props) {
  77. if (
  78. !quickTrace ||
  79. quickTrace.error ||
  80. !defined(quickTrace.trace) ||
  81. quickTrace.trace.length === 0
  82. ) {
  83. return <TransactionMissingPlaceholder group={group} type={quickTrace?.type} />;
  84. }
  85. trackAdvancedAnalyticsEvent('issue.quick_trace_status', {
  86. organization,
  87. status: 'success',
  88. is_performance_issue: group.issueCategory === IssueCategory.PERFORMANCE,
  89. });
  90. return (
  91. <ErrorBoundary mini>
  92. <QuickTraceWrapper>
  93. <QuickTrace
  94. event={event}
  95. quickTrace={quickTrace}
  96. location={location}
  97. organization={organization}
  98. anchor="left"
  99. errorDest="issue"
  100. transactionDest="performance"
  101. />
  102. </QuickTraceWrapper>
  103. </ErrorBoundary>
  104. );
  105. }
  106. const QuickTraceWrapper = styled('div')`
  107. margin-top: ${space(0.5)};
  108. `;
  109. export default IssueQuickTrace;