eventEntry.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import ErrorBoundary from 'sentry/components/errorBoundary';
  2. import {t} from 'sentry/locale';
  3. import type {Entry, Event, EventTransaction} from 'sentry/types/event';
  4. import {EntryType} from 'sentry/types/event';
  5. import type {Group} from 'sentry/types/group';
  6. import {IssueCategory} from 'sentry/types/group';
  7. import type {Organization, SharedViewOrganization} from 'sentry/types/organization';
  8. import type {Project} from 'sentry/types/project';
  9. import type {SectionKey} from 'sentry/views/issueDetails/streamline/context';
  10. import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
  11. import {Breadcrumbs} from './interfaces/breadcrumbs';
  12. import {Csp} from './interfaces/csp';
  13. import {DebugMeta} from './interfaces/debugMeta';
  14. import {Exception} from './interfaces/exception';
  15. import {Generic} from './interfaces/generic';
  16. import {Message} from './interfaces/message';
  17. import {SpanEvidenceSection} from './interfaces/performance/spanEvidence';
  18. import {Request} from './interfaces/request';
  19. import {Spans} from './interfaces/spans';
  20. import {StackTrace} from './interfaces/stackTrace';
  21. import {Template} from './interfaces/template';
  22. import {Threads} from './interfaces/threads';
  23. type Props = {
  24. entry: Entry;
  25. event: Event;
  26. organization: SharedViewOrganization | Organization;
  27. projectSlug: Project['slug'];
  28. group?: Group;
  29. isShare?: boolean;
  30. sectionKey?: SectionKey;
  31. };
  32. function EventEntryContent({
  33. entry,
  34. projectSlug,
  35. event,
  36. organization,
  37. group,
  38. isShare,
  39. }: Props) {
  40. const groupingCurrentLevel = group?.metadata?.current_level;
  41. switch (entry.type) {
  42. case EntryType.EXCEPTION:
  43. return (
  44. <Exception
  45. event={event}
  46. group={group}
  47. data={entry.data}
  48. projectSlug={projectSlug}
  49. groupingCurrentLevel={groupingCurrentLevel}
  50. />
  51. );
  52. case EntryType.MESSAGE:
  53. return <Message event={event} data={entry.data} />;
  54. case EntryType.REQUEST:
  55. return <Request event={event} data={entry.data} />;
  56. case EntryType.STACKTRACE:
  57. return (
  58. <StackTrace
  59. event={event}
  60. data={entry.data}
  61. projectSlug={projectSlug}
  62. groupingCurrentLevel={groupingCurrentLevel}
  63. />
  64. );
  65. case EntryType.TEMPLATE:
  66. return <Template event={event} data={entry.data} />;
  67. case EntryType.CSP:
  68. return <Csp event={event} data={entry.data} />;
  69. case EntryType.EXPECTCT:
  70. case EntryType.EXPECTSTAPLE:
  71. const {data, type} = entry;
  72. return <Generic type={type} data={data} />;
  73. case EntryType.HPKP:
  74. return (
  75. <Generic type={entry.type} data={entry.data} meta={event._meta?.hpkp ?? {}} />
  76. );
  77. case EntryType.BREADCRUMBS:
  78. return (
  79. <Breadcrumbs
  80. data={entry.data}
  81. organization={organization as Organization}
  82. event={event}
  83. />
  84. );
  85. case EntryType.THREADS:
  86. return (
  87. <Threads
  88. event={event}
  89. group={group}
  90. data={entry.data}
  91. projectSlug={projectSlug}
  92. groupingCurrentLevel={groupingCurrentLevel}
  93. />
  94. );
  95. case EntryType.DEBUGMETA:
  96. if (isShare) {
  97. return null;
  98. }
  99. return (
  100. <DebugMeta
  101. event={event}
  102. projectSlug={projectSlug}
  103. groupId={group?.id}
  104. data={entry.data}
  105. />
  106. );
  107. case EntryType.SPANS:
  108. // XXX: We currently do not show spans in the share view,
  109. if (isShare) {
  110. return null;
  111. }
  112. if (group?.issueCategory === IssueCategory.PERFORMANCE) {
  113. return (
  114. <SpanEvidenceSection
  115. event={event as EventTransaction}
  116. organization={organization as Organization}
  117. projectSlug={projectSlug}
  118. />
  119. );
  120. }
  121. return (
  122. <Spans
  123. event={event as EventTransaction}
  124. organization={organization as Organization}
  125. />
  126. );
  127. // this should not happen
  128. default:
  129. if (window.console) {
  130. // eslint-disable-next-line no-console
  131. console.error?.('Unregistered interface: ' + (entry as any).type);
  132. }
  133. return null;
  134. }
  135. }
  136. export function EventEntry(props: Props) {
  137. return (
  138. <ErrorBoundary
  139. customComponent={
  140. <InterimSection type={props.entry.type} title={props.entry.type}>
  141. <p>{t('There was an error rendering this data.')}</p>
  142. </InterimSection>
  143. }
  144. >
  145. <EventEntryContent {...props} />
  146. </ErrorBoundary>
  147. );
  148. }