eventEntry.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import Breadcrumbs from 'sentry/components/events/interfaces/breadcrumbs';
  2. import {Csp} from 'sentry/components/events/interfaces/csp';
  3. import {DebugMeta} from 'sentry/components/events/interfaces/debugMeta';
  4. import Exception from 'sentry/components/events/interfaces/exception';
  5. import ExceptionV2 from 'sentry/components/events/interfaces/exceptionV2';
  6. import {Generic} from 'sentry/components/events/interfaces/generic';
  7. import {Message} from 'sentry/components/events/interfaces/message';
  8. import {PerformanceIssueSection} from 'sentry/components/events/interfaces/performance';
  9. import {Request} from 'sentry/components/events/interfaces/request';
  10. import Spans from 'sentry/components/events/interfaces/spans';
  11. import StackTrace from 'sentry/components/events/interfaces/stackTrace';
  12. import StackTraceV2 from 'sentry/components/events/interfaces/stackTraceV2';
  13. import {Template} from 'sentry/components/events/interfaces/template';
  14. import Threads from 'sentry/components/events/interfaces/threads';
  15. import ThreadsV2 from 'sentry/components/events/interfaces/threadsV2';
  16. import {Group, Organization, Project, SharedViewOrganization} from 'sentry/types';
  17. import {Entry, EntryType, Event, EventError, EventTransaction} from 'sentry/types/event';
  18. import {EmbeddedSpanTree} from './interfaces/spans/embeddedSpanTree';
  19. type Props = Pick<React.ComponentProps<typeof Breadcrumbs>, 'route' | 'router'> & {
  20. entry: Entry;
  21. event: Event;
  22. organization: SharedViewOrganization | Organization;
  23. projectSlug: Project['slug'];
  24. group?: Group;
  25. };
  26. function EventEntry({
  27. entry,
  28. projectSlug,
  29. event,
  30. organization,
  31. group,
  32. route,
  33. router,
  34. }: Props) {
  35. const hasHierarchicalGrouping =
  36. !!organization.features?.includes('grouping-stacktrace-ui') &&
  37. !!(event.metadata.current_tree_label || event.metadata.finest_tree_label);
  38. const hasNativeStackTraceV2 = !!organization.features?.includes(
  39. 'native-stack-trace-v2'
  40. );
  41. const groupingCurrentLevel = group?.metadata?.current_level;
  42. switch (entry.type) {
  43. case EntryType.EXCEPTION: {
  44. return hasNativeStackTraceV2 ? (
  45. <ExceptionV2
  46. event={event}
  47. data={entry.data}
  48. projectId={projectSlug}
  49. groupingCurrentLevel={groupingCurrentLevel}
  50. hasHierarchicalGrouping={hasHierarchicalGrouping}
  51. />
  52. ) : (
  53. <Exception
  54. event={event}
  55. data={entry.data}
  56. projectId={projectSlug}
  57. groupingCurrentLevel={groupingCurrentLevel}
  58. hasHierarchicalGrouping={hasHierarchicalGrouping}
  59. />
  60. );
  61. }
  62. case EntryType.MESSAGE: {
  63. return <Message event={event} data={entry.data} />;
  64. }
  65. case EntryType.REQUEST: {
  66. return <Request event={event} data={entry.data} />;
  67. }
  68. case EntryType.STACKTRACE: {
  69. return hasNativeStackTraceV2 ? (
  70. <StackTraceV2
  71. event={event}
  72. data={entry.data}
  73. projectId={projectSlug}
  74. groupingCurrentLevel={groupingCurrentLevel}
  75. hasHierarchicalGrouping={hasHierarchicalGrouping}
  76. />
  77. ) : (
  78. <StackTrace
  79. event={event}
  80. data={entry.data}
  81. projectId={projectSlug}
  82. groupingCurrentLevel={groupingCurrentLevel}
  83. hasHierarchicalGrouping={hasHierarchicalGrouping}
  84. />
  85. );
  86. }
  87. case EntryType.TEMPLATE: {
  88. return <Template event={event} data={entry.data} />;
  89. }
  90. case EntryType.CSP: {
  91. return <Csp event={event} data={entry.data} />;
  92. }
  93. case EntryType.EXPECTCT:
  94. case EntryType.EXPECTSTAPLE: {
  95. const {data, type} = entry;
  96. return <Generic type={type} data={data} />;
  97. }
  98. case EntryType.HPKP:
  99. return (
  100. <Generic type={entry.type} data={entry.data} meta={event._meta?.hpkp ?? {}} />
  101. );
  102. case EntryType.BREADCRUMBS: {
  103. return (
  104. <Breadcrumbs
  105. data={entry.data}
  106. organization={organization as Organization}
  107. event={event}
  108. router={router}
  109. route={route}
  110. />
  111. );
  112. }
  113. case EntryType.THREADS: {
  114. return hasNativeStackTraceV2 ? (
  115. <ThreadsV2
  116. event={event}
  117. data={entry.data}
  118. projectId={projectSlug}
  119. groupingCurrentLevel={groupingCurrentLevel}
  120. hasHierarchicalGrouping={hasHierarchicalGrouping}
  121. />
  122. ) : (
  123. <Threads
  124. event={event}
  125. data={entry.data}
  126. projectId={projectSlug}
  127. groupingCurrentLevel={groupingCurrentLevel}
  128. hasHierarchicalGrouping={hasHierarchicalGrouping}
  129. />
  130. );
  131. }
  132. case EntryType.DEBUGMETA:
  133. return (
  134. <DebugMeta
  135. event={event}
  136. projectId={projectSlug}
  137. groupId={group?.id}
  138. organization={organization as Organization}
  139. data={entry.data}
  140. />
  141. );
  142. case EntryType.SPANS:
  143. return (
  144. <Spans
  145. event={event as EventTransaction}
  146. organization={organization as Organization}
  147. />
  148. );
  149. case EntryType.SPANTREE:
  150. if (!organization.features?.includes('performance-issues')) {
  151. return null;
  152. }
  153. const {affectedSpanIds} = entry.data;
  154. // TODO: Need to dynamically determine the project slug for this issue
  155. const INTERNAL_PROJECT = 'sentry';
  156. return (
  157. <EmbeddedSpanTree
  158. event={event}
  159. organization={organization as Organization}
  160. projectSlug={INTERNAL_PROJECT}
  161. affectedSpanIds={affectedSpanIds}
  162. />
  163. );
  164. case EntryType.PERFORMANCE:
  165. if (!organization.features?.includes('performance-issues')) {
  166. return null;
  167. }
  168. return (
  169. <PerformanceIssueSection
  170. issue={group as Group}
  171. event={event as EventError}
  172. organization={organization as Organization}
  173. />
  174. );
  175. default:
  176. // this should not happen
  177. /* eslint no-console:0 */
  178. window.console &&
  179. console.error &&
  180. console.error('Unregistered interface: ' + (entry as any).type);
  181. return null;
  182. }
  183. }
  184. export default EventEntry;