traceSpanRow.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import {SpanProjectIcon} from 'sentry/views/performance/newTraceDetails/traceRow/traceIcons';
  2. import {TraceIcons} from '../traceIcons';
  3. import type {TraceTree} from '../traceModels/traceTree';
  4. import type {TraceTreeNode} from '../traceModels/traceTreeNode';
  5. import {makeTraceNodeBarColor, TraceBar} from '../traceRow/traceBar';
  6. import {
  7. maybeFocusTraceRow,
  8. TRACE_COUNT_FORMATTER,
  9. TraceChildrenButton,
  10. TraceRowConnectors,
  11. type TraceRowProps,
  12. } from '../traceRow/traceRow';
  13. const NO_PROFILES: any = [];
  14. export function TraceSpanRow(props: TraceRowProps<TraceTreeNode<TraceTree.Span>>) {
  15. return (
  16. <div
  17. key={props.index}
  18. ref={r =>
  19. props.tabIndex === 0
  20. ? maybeFocusTraceRow(r, props.node, props.previouslyFocusedNodeRef)
  21. : null
  22. }
  23. tabIndex={props.tabIndex}
  24. className={`TraceRow ${props.rowSearchClassName} ${props.node.hasErrors ? props.node.maxIssueSeverity : ''}`}
  25. onPointerDown={props.onRowClick}
  26. onKeyDown={props.onRowKeyDown}
  27. style={props.style}
  28. >
  29. <div
  30. className="TraceLeftColumn"
  31. ref={props.registerListColumnRef}
  32. onDoubleClick={props.onRowDoubleClick}
  33. >
  34. <div className="TraceLeftColumnInner" style={props.listColumnStyle}>
  35. <div className={props.listColumnClassName}>
  36. <TraceRowConnectors node={props.node} manager={props.manager} />
  37. {props.node.children.length > 0 || props.node.canFetch ? (
  38. <TraceChildrenButton
  39. icon={
  40. props.node.canFetch ? (
  41. '+'
  42. ) : (
  43. <TraceIcons.Chevron direction={props.node.expanded ? 'up' : 'down'} />
  44. )
  45. }
  46. status={props.node.fetchStatus}
  47. expanded={props.node.expanded || props.node.zoomedIn}
  48. onDoubleClick={props.onExpandDoubleClick}
  49. onClick={e =>
  50. props.node.canFetch ? props.onZoomIn(e) : props.onExpand(e)
  51. }
  52. >
  53. {props.node.children.length > 0
  54. ? TRACE_COUNT_FORMATTER.format(props.node.children.length)
  55. : null}
  56. </TraceChildrenButton>
  57. ) : null}
  58. </div>
  59. <SpanProjectIcon
  60. platform={props.projects[props.node.metadata.project_slug ?? ''] ?? 'default'}
  61. />
  62. <span className="TraceOperation">{props.node.value.op ?? '<unknown>'}</span>
  63. <strong className="TraceEmDash"> — </strong>
  64. <span className="TraceDescription" title={props.node.value.description}>
  65. {!props.node.value.description
  66. ? props.node.value.span_id ?? 'unknown'
  67. : props.node.value.description.length > 100
  68. ? props.node.value.description.slice(0, 100).trim() + '\u2026'
  69. : props.node.value.description}
  70. </span>
  71. </div>
  72. </div>
  73. <div
  74. ref={props.registerSpanColumnRef}
  75. className={props.spanColumnClassName}
  76. onDoubleClick={props.onRowDoubleClick}
  77. >
  78. <TraceBar
  79. node={props.node}
  80. virtualized_index={props.virtualized_index}
  81. manager={props.manager}
  82. color={makeTraceNodeBarColor(props.theme, props.node)}
  83. node_space={props.node.space}
  84. errors={props.node.errors}
  85. performance_issues={props.node.performance_issues}
  86. profiles={NO_PROFILES}
  87. />
  88. <button
  89. ref={props.registerSpanArrowRef}
  90. className="TraceArrow"
  91. onClick={props.onSpanArrowClick}
  92. >
  93. <TraceIcons.Chevron direction="left" />
  94. </button>
  95. </div>
  96. </div>
  97. );
  98. }