eventEntry.tsx 4.5 KB

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