span.tsx 3.3 KB

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