title.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import styled from '@emotion/styled';
  2. import {CopyToClipboardButton} from 'sentry/components/copyToClipboardButton';
  3. import ProjectBadge from 'sentry/components/idBadge/projectBadge';
  4. import ExternalLink from 'sentry/components/links/externalLink';
  5. import {Tooltip} from 'sentry/components/tooltip';
  6. import {t, tct} from 'sentry/locale';
  7. import {space} from 'sentry/styles/space';
  8. import useProjects from 'sentry/utils/useProjects';
  9. import {TraceShape, type TraceTree} from '../traceModels/traceTree';
  10. interface TitleProps {
  11. representativeTransaction: TraceTree.Transaction | null;
  12. traceSlug: string;
  13. tree: TraceTree;
  14. }
  15. export function Title({tree, traceSlug, representativeTransaction}: TitleProps) {
  16. const traceTitle = representativeTransaction
  17. ? {
  18. op: representativeTransaction['transaction.op'],
  19. transaction: representativeTransaction.transaction,
  20. }
  21. : null;
  22. const {projects} = useProjects();
  23. const project = projects.find(p => p.slug === representativeTransaction?.project_slug);
  24. return (
  25. <div>
  26. {traceTitle ? (
  27. traceTitle.transaction ? (
  28. <TitleWrapper>
  29. {project && (
  30. <ProjectBadge
  31. hideName
  32. project={project}
  33. avatarSize={20}
  34. avatarProps={{
  35. hasTooltip: true,
  36. tooltip: representativeTransaction?.project_slug,
  37. }}
  38. />
  39. )}
  40. <TitleText>
  41. <strong>{traceTitle.op} - </strong>
  42. {traceTitle.transaction}
  43. </TitleText>
  44. </TitleWrapper>
  45. ) : (
  46. '\u2014'
  47. )
  48. ) : (
  49. <TitleText>
  50. <Tooltip
  51. title={tct(
  52. 'Might be due to sampling, ad blockers, permissions or more.[break][link:Read the docs]',
  53. {
  54. break: <br />,
  55. link: (
  56. <ExternalLink href="https://docs.sentry.io/concepts/key-terms/tracing/trace-view/#troubleshooting" />
  57. ),
  58. }
  59. )}
  60. showUnderline
  61. position="right"
  62. isHoverable
  63. >
  64. <strong>
  65. {tree.shape === TraceShape.ONLY_ERRORS
  66. ? t('Missing Trace Spans')
  67. : t('Missing Trace Root')}
  68. </strong>
  69. </Tooltip>
  70. </TitleText>
  71. )}
  72. <SubtitleText>
  73. Trace ID: {traceSlug}
  74. <CopyToClipboardButton borderless size="zero" iconSize="xs" text={traceSlug} />
  75. </SubtitleText>
  76. </div>
  77. );
  78. }
  79. const TitleWrapper = styled('div')`
  80. display: flex;
  81. gap: ${space(0.5)};
  82. align-items: center;
  83. `;
  84. const TitleText = styled('div')`
  85. font-size: ${p => p.theme.fontSizeExtraLarge};
  86. ${p => p.theme.overflowEllipsis};
  87. `;
  88. const SubtitleText = styled('div')`
  89. font-size: ${p => p.theme.fontSizeMedium};
  90. color: ${p => p.theme.subText};
  91. `;