span.tsx 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import {useMemo} from 'react';
  2. import {Button} from 'sentry/components/button';
  3. import NewTraceDetailsSpanDetail from 'sentry/components/events/interfaces/spans/newTraceDetailsSpanDetails';
  4. import {
  5. getSpanOperation,
  6. parseTrace,
  7. } from 'sentry/components/events/interfaces/spans/utils';
  8. import ProjectBadge from 'sentry/components/idBadge/projectBadge';
  9. import {Tooltip} from 'sentry/components/tooltip';
  10. import {t} from 'sentry/locale';
  11. import useProjects from 'sentry/utils/useProjects';
  12. import type {TraceTreeNodeDetailsProps} from 'sentry/views/performance/newTraceDetails/traceDrawer/tabs/traceTreeNodeDetails';
  13. import type {
  14. TraceTree,
  15. TraceTreeNode,
  16. } from 'sentry/views/performance/newTraceDetails/traceModels/traceTree';
  17. import {ProfileGroupProvider} from 'sentry/views/profiling/profileGroupProvider';
  18. import {ProfileContext, ProfilesProvider} from 'sentry/views/profiling/profilesProvider';
  19. import {TraceDrawerComponents} from './styles';
  20. export function SpanNodeDetails({
  21. node,
  22. organization,
  23. onTabScrollToNode,
  24. onParentClick,
  25. }: TraceTreeNodeDetailsProps<TraceTreeNode<TraceTree.Span>>) {
  26. const {projects} = useProjects();
  27. const span = node.value;
  28. const {event} = node.value;
  29. const project = projects.find(proj => proj.slug === event?.projectSlug);
  30. const profileId = event?.contexts?.profile?.profile_id ?? null;
  31. const childTransactions = useMemo(() => {
  32. return node.value.childTransaction ? [node.value.childTransaction] : [];
  33. }, [node.value.childTransaction]);
  34. return (
  35. <TraceDrawerComponents.DetailContainer>
  36. <TraceDrawerComponents.HeaderContainer>
  37. <TraceDrawerComponents.Title>
  38. <Tooltip title={event.projectSlug}>
  39. <ProjectBadge
  40. project={project ? project : {slug: event.projectSlug || ''}}
  41. avatarSize={30}
  42. hideName
  43. />
  44. </Tooltip>
  45. <TraceDrawerComponents.TitleText>
  46. <div>{t('span')}</div>
  47. <TraceDrawerComponents.TitleOp>
  48. {' '}
  49. {getSpanOperation(span) + ' - ' + (span.description ?? span.span_id)}
  50. </TraceDrawerComponents.TitleOp>
  51. </TraceDrawerComponents.TitleText>
  52. </TraceDrawerComponents.Title>
  53. <TraceDrawerComponents.Actions>
  54. <Button size="xs" onClick={_e => onTabScrollToNode(node)}>
  55. {t('Show in view')}
  56. </Button>
  57. <TraceDrawerComponents.EventDetailsLink
  58. node={node}
  59. organization={organization}
  60. />
  61. </TraceDrawerComponents.Actions>
  62. </TraceDrawerComponents.HeaderContainer>
  63. {event.projectSlug ? (
  64. <ProfilesProvider
  65. orgSlug={organization.slug}
  66. projectSlug={event.projectSlug}
  67. profileId={profileId || ''}
  68. >
  69. <ProfileContext.Consumer>
  70. {profiles => (
  71. <ProfileGroupProvider
  72. type="flamechart"
  73. input={profiles?.type === 'resolved' ? profiles.data : null}
  74. traceID={profileId || ''}
  75. >
  76. <NewTraceDetailsSpanDetail
  77. span={span}
  78. node={node}
  79. event={event}
  80. openPanel="open"
  81. organization={organization}
  82. childTransactions={childTransactions}
  83. trace={parseTrace(event)}
  84. onParentClick={onParentClick}
  85. />
  86. </ProfileGroupProvider>
  87. )}
  88. </ProfileContext.Consumer>
  89. </ProfilesProvider>
  90. ) : null}
  91. </TraceDrawerComponents.DetailContainer>
  92. );
  93. }