eventEntry.tsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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 DebugMetaV2 from 'sentry/components/events/interfaces/debugMeta-v2';
  5. import Exception from 'sentry/components/events/interfaces/exception';
  6. import ExceptionV2 from 'sentry/components/events/interfaces/exceptionV2';
  7. import Generic from 'sentry/components/events/interfaces/generic';
  8. import Message from 'sentry/components/events/interfaces/message';
  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, EventTransaction} from 'sentry/types/event';
  18. import {FocusedSpanIDMap} from './interfaces/spans/types';
  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. const {data, type} = entry;
  45. return hasNativeStackTraceV2 ? (
  46. <ExceptionV2
  47. type={type}
  48. event={event}
  49. data={data}
  50. projectId={projectSlug}
  51. groupingCurrentLevel={groupingCurrentLevel}
  52. hasHierarchicalGrouping={hasHierarchicalGrouping}
  53. />
  54. ) : (
  55. <Exception
  56. type={type}
  57. event={event}
  58. data={data}
  59. projectId={projectSlug}
  60. groupingCurrentLevel={groupingCurrentLevel}
  61. hasHierarchicalGrouping={hasHierarchicalGrouping}
  62. />
  63. );
  64. }
  65. case EntryType.MESSAGE: {
  66. const {data} = entry;
  67. return <Message data={data} />;
  68. }
  69. case EntryType.REQUEST: {
  70. const {data, type} = entry;
  71. return <Request type={type} event={event} data={data} />;
  72. }
  73. case EntryType.STACKTRACE: {
  74. const {data, type} = entry;
  75. return hasNativeStackTraceV2 ? (
  76. <StackTraceV2
  77. type={type}
  78. event={event}
  79. data={data}
  80. projectId={projectSlug}
  81. groupingCurrentLevel={groupingCurrentLevel}
  82. hasHierarchicalGrouping={hasHierarchicalGrouping}
  83. />
  84. ) : (
  85. <StackTrace
  86. type={type}
  87. event={event}
  88. data={data}
  89. projectId={projectSlug}
  90. groupingCurrentLevel={groupingCurrentLevel}
  91. hasHierarchicalGrouping={hasHierarchicalGrouping}
  92. />
  93. );
  94. }
  95. case EntryType.TEMPLATE: {
  96. const {data, type} = entry;
  97. return <Template type={type} event={event} data={data} />;
  98. }
  99. case EntryType.CSP: {
  100. const {data} = entry;
  101. return <Csp event={event} data={data} />;
  102. }
  103. case EntryType.EXPECTCT:
  104. case EntryType.EXPECTSTAPLE:
  105. case EntryType.HPKP: {
  106. const {data, type} = entry;
  107. return <Generic type={type} data={data} />;
  108. }
  109. case EntryType.BREADCRUMBS: {
  110. const {data, type} = entry;
  111. return (
  112. <Breadcrumbs
  113. type={type}
  114. data={data}
  115. organization={organization as Organization}
  116. event={event}
  117. router={router}
  118. route={route}
  119. />
  120. );
  121. }
  122. case EntryType.THREADS: {
  123. const {data, type} = entry;
  124. return hasNativeStackTraceV2 ? (
  125. <ThreadsV2
  126. type={type}
  127. event={event}
  128. data={data}
  129. projectId={projectSlug}
  130. groupingCurrentLevel={groupingCurrentLevel}
  131. hasHierarchicalGrouping={hasHierarchicalGrouping}
  132. />
  133. ) : (
  134. <Threads
  135. type={type}
  136. event={event}
  137. data={data}
  138. projectId={projectSlug}
  139. groupingCurrentLevel={groupingCurrentLevel}
  140. hasHierarchicalGrouping={hasHierarchicalGrouping}
  141. />
  142. );
  143. }
  144. case EntryType.DEBUGMETA:
  145. const {data} = entry;
  146. const hasImagesLoadedV2Feature =
  147. !!organization.features?.includes('images-loaded-v2');
  148. if (hasImagesLoadedV2Feature) {
  149. return (
  150. <DebugMetaV2
  151. event={event}
  152. projectId={projectSlug}
  153. groupId={group?.id}
  154. organization={organization as Organization}
  155. data={data as React.ComponentProps<typeof DebugMetaV2>['data']}
  156. />
  157. );
  158. }
  159. return (
  160. <DebugMeta
  161. event={event}
  162. projectId={projectSlug}
  163. organization={organization as Organization}
  164. data={data}
  165. />
  166. );
  167. case EntryType.SPANS:
  168. return (
  169. <Spans
  170. event={event as EventTransaction}
  171. organization={organization as Organization}
  172. />
  173. );
  174. case EntryType.SPANTREE:
  175. if (!organization.features?.includes('performance-extraneous-spans-poc')) {
  176. return null;
  177. }
  178. const {focusedSpanIds: _focusedSpanIds} = entry;
  179. const focusedSpanIds: FocusedSpanIDMap = {};
  180. _focusedSpanIds.forEach(spanId => (focusedSpanIds[spanId] = new Set()));
  181. return (
  182. <Spans
  183. event={event as EventTransaction}
  184. organization={organization as Organization}
  185. focusedSpanIds={focusedSpanIds}
  186. />
  187. );
  188. default:
  189. // this should not happen
  190. /* eslint no-console:0 */
  191. window.console &&
  192. console.error &&
  193. console.error('Unregistered interface: ' + (entry as any).type);
  194. return null;
  195. }
  196. }
  197. export default EventEntry;