index.tsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import {useMemo} from 'react';
  2. import {EventContexts} from 'sentry/components/events/contexts';
  3. import {EventAttachments} from 'sentry/components/events/eventAttachments';
  4. import {EventEvidence} from 'sentry/components/events/eventEvidence';
  5. import {EventViewHierarchy} from 'sentry/components/events/eventViewHierarchy';
  6. import {EventRRWebIntegration} from 'sentry/components/events/rrwebIntegration';
  7. import ProjectBadge from 'sentry/components/idBadge/projectBadge';
  8. import type {LazyRenderProps} from 'sentry/components/lazyRender';
  9. import LoadingError from 'sentry/components/loadingError';
  10. import LoadingIndicator from 'sentry/components/loadingIndicator';
  11. import {Tooltip} from 'sentry/components/tooltip';
  12. import {t} from 'sentry/locale';
  13. import type {EventTransaction, Organization, Project} from 'sentry/types';
  14. import {useLocation} from 'sentry/utils/useLocation';
  15. import useProjects from 'sentry/utils/useProjects';
  16. import {CustomMetricsEventData} from 'sentry/views/metrics/customMetricsEventData';
  17. import {useTransaction} from 'sentry/views/performance/newTraceDetails/traceApi/useTransaction';
  18. import type {TraceTreeNodeDetailsProps} from 'sentry/views/performance/newTraceDetails/traceDrawer/tabs/traceTreeNodeDetails';
  19. import type {
  20. TraceTree,
  21. TraceTreeNode,
  22. } from 'sentry/views/performance/newTraceDetails/traceModels/traceTree';
  23. import {IssueList} from '../issues/issues';
  24. import {TraceDrawerComponents} from '../styles';
  25. import {AdditionalData} from './sections/additionalData';
  26. import {BreadCrumbs} from './sections/breadCrumbs';
  27. import {Entries} from './sections/entries';
  28. import GeneralInfo from './sections/generalInfo';
  29. import {Measurements} from './sections/measurements';
  30. import ReplayPreview from './sections/replayPreview';
  31. import {Request} from './sections/request';
  32. import {Sdk} from './sections/sdk';
  33. import {EventTags} from './sections/tags';
  34. export const LAZY_RENDER_PROPS: Partial<LazyRenderProps> = {
  35. observerOptions: {rootMargin: '50px'},
  36. };
  37. type TransactionNodeDetailHeaderProps = {
  38. event: EventTransaction;
  39. node: TraceTreeNode<TraceTree.Transaction>;
  40. onTabScrollToNode: (node: TraceTreeNode<any>) => void;
  41. organization: Organization;
  42. project: Project | undefined;
  43. };
  44. function TransactionNodeDetailHeader({
  45. node,
  46. organization,
  47. project,
  48. onTabScrollToNode,
  49. event,
  50. }: TransactionNodeDetailHeaderProps) {
  51. return (
  52. <TraceDrawerComponents.HeaderContainer>
  53. <TraceDrawerComponents.Title>
  54. <Tooltip title={node.value.project_slug}>
  55. <ProjectBadge
  56. project={project ? project : {slug: node.value.project_slug}}
  57. avatarSize={30}
  58. hideName
  59. />
  60. </Tooltip>
  61. <TraceDrawerComponents.TitleText>
  62. <div>{t('transaction')}</div>
  63. <TraceDrawerComponents.TitleOp>
  64. {' '}
  65. {node.value['transaction.op'] + ' - ' + node.value.transaction}
  66. </TraceDrawerComponents.TitleOp>
  67. </TraceDrawerComponents.TitleText>
  68. </TraceDrawerComponents.Title>
  69. <TraceDrawerComponents.NodeActions
  70. node={node}
  71. organization={organization}
  72. onTabScrollToNode={onTabScrollToNode}
  73. eventSize={event?.size}
  74. />
  75. </TraceDrawerComponents.HeaderContainer>
  76. );
  77. }
  78. export function TransactionNodeDetails({
  79. node,
  80. organization,
  81. onTabScrollToNode,
  82. onParentClick,
  83. }: TraceTreeNodeDetailsProps<TraceTreeNode<TraceTree.Transaction>>) {
  84. const location = useLocation();
  85. const {projects} = useProjects();
  86. const issues = useMemo(() => {
  87. return [...node.errors, ...node.performance_issues];
  88. }, [node.errors, node.performance_issues]);
  89. const {
  90. data: event,
  91. isError,
  92. isLoading,
  93. } = useTransaction({
  94. node,
  95. organization,
  96. });
  97. if (isLoading) {
  98. return <LoadingIndicator />;
  99. }
  100. if (isError) {
  101. return <LoadingError message={t('Failed to fetch transaction details')} />;
  102. }
  103. const project = projects.find(proj => proj.slug === event?.projectSlug);
  104. return (
  105. <TraceDrawerComponents.DetailContainer>
  106. <TransactionNodeDetailHeader
  107. node={node}
  108. organization={organization}
  109. project={project}
  110. event={event}
  111. onTabScrollToNode={onTabScrollToNode}
  112. />
  113. <IssueList node={node} organization={organization} issues={issues} />
  114. <TraceDrawerComponents.SectionCardGroup>
  115. <GeneralInfo
  116. node={node}
  117. onParentClick={onParentClick}
  118. organization={organization}
  119. event={event}
  120. location={location}
  121. />
  122. <AdditionalData event={event} />
  123. <Measurements event={event} location={location} organization={organization} />
  124. <Sdk event={event} />
  125. </TraceDrawerComponents.SectionCardGroup>
  126. <Request event={event} />
  127. {event.projectSlug ? (
  128. <Entries
  129. definedEvent={event}
  130. projectSlug={event.projectSlug}
  131. group={undefined}
  132. organization={organization}
  133. />
  134. ) : null}
  135. <EventTags
  136. node={node}
  137. organization={organization}
  138. event={event}
  139. location={location}
  140. />
  141. <EventContexts event={event} />
  142. {project ? <EventEvidence event={event} project={project} /> : null}
  143. {event._metrics_summary ? (
  144. <CustomMetricsEventData
  145. metricsSummary={event._metrics_summary}
  146. startTimestamp={event.startTimestamp}
  147. projectId={event.projectID}
  148. />
  149. ) : null}
  150. <ReplayPreview event={event} organization={organization} />
  151. <BreadCrumbs event={event} organization={organization} />
  152. {event.projectSlug ? (
  153. <EventAttachments event={event} projectSlug={event.projectSlug} />
  154. ) : null}
  155. {project ? <EventViewHierarchy event={event} project={project} /> : null}
  156. {event.projectSlug ? (
  157. <EventRRWebIntegration
  158. event={event}
  159. orgId={organization.slug}
  160. projectSlug={event.projectSlug}
  161. />
  162. ) : null}
  163. </TraceDrawerComponents.DetailContainer>
  164. );
  165. }