fieldRenderers.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import ProjectBadge from 'sentry/components/idBadge/projectBadge';
  2. import Link from 'sentry/components/links/link';
  3. import type {DateString} from 'sentry/types';
  4. import EventView from 'sentry/utils/discover/eventView';
  5. import {
  6. generateEventSlug,
  7. generateLinkToEventInTraceView,
  8. } from 'sentry/utils/discover/urls';
  9. import {getShortEventId} from 'sentry/utils/events';
  10. import Projects from 'sentry/utils/projects';
  11. import {useLocation} from 'sentry/utils/useLocation';
  12. import useOrganization from 'sentry/utils/useOrganization';
  13. import usePageFilters from 'sentry/utils/usePageFilters';
  14. import useProjects from 'sentry/utils/useProjects';
  15. import {getTraceDetailsUrl} from 'sentry/views/performance/traceDetails/utils';
  16. import {transactionSummaryRouteWithQuery} from 'sentry/views/performance/transactionSummary/utils';
  17. interface ProjectRendererProps {
  18. projectSlug: string;
  19. hideName?: boolean;
  20. }
  21. export function ProjectRenderer({projectSlug, hideName}: ProjectRendererProps) {
  22. const organization = useOrganization();
  23. return (
  24. <Projects orgId={organization.slug} slugs={[projectSlug]}>
  25. {({projects}) => {
  26. const project = projects.find(p => p.slug === projectSlug);
  27. return (
  28. <ProjectBadge
  29. hideName={hideName}
  30. project={project ? project : {slug: projectSlug}}
  31. avatarSize={16}
  32. />
  33. );
  34. }}
  35. </Projects>
  36. );
  37. }
  38. interface SpanIdRendererProps {
  39. projectSlug: string;
  40. spanId: string;
  41. timestamp: string;
  42. trace: string;
  43. transactionId: string;
  44. }
  45. export function SpanIdRenderer({
  46. projectSlug,
  47. spanId,
  48. timestamp,
  49. trace,
  50. transactionId,
  51. }: SpanIdRendererProps) {
  52. const location = useLocation();
  53. const organization = useOrganization();
  54. const target = generateLinkToEventInTraceView({
  55. eventSlug: generateEventSlug({
  56. id: transactionId,
  57. project: projectSlug,
  58. }),
  59. organization,
  60. location,
  61. eventView: EventView.fromLocation(location),
  62. dataRow: {
  63. id: transactionId,
  64. trace,
  65. timestamp,
  66. },
  67. spanId,
  68. });
  69. return <Link to={target}>{getShortEventId(spanId)}</Link>;
  70. }
  71. interface TraceIdRendererProps {
  72. traceId: string;
  73. timestamp?: DateString;
  74. transactionId?: string;
  75. }
  76. export function TraceIdRenderer({
  77. traceId,
  78. timestamp,
  79. transactionId,
  80. }: TraceIdRendererProps) {
  81. const organization = useOrganization();
  82. const {selection} = usePageFilters();
  83. const stringOrNumberTimestamp =
  84. timestamp instanceof Date ? timestamp.toISOString() : timestamp ?? '';
  85. const target = getTraceDetailsUrl(
  86. organization,
  87. traceId,
  88. {
  89. start: selection.datetime.start,
  90. end: selection.datetime.end,
  91. statsPeriod: selection.datetime.period,
  92. },
  93. {},
  94. stringOrNumberTimestamp,
  95. transactionId
  96. );
  97. return <Link to={target}>{getShortEventId(traceId)}</Link>;
  98. }
  99. interface TransactionRendererProps {
  100. projectSlug: string;
  101. transaction: string;
  102. }
  103. export function TransactionRenderer({
  104. projectSlug,
  105. transaction,
  106. }: TransactionRendererProps) {
  107. const location = useLocation();
  108. const organization = useOrganization();
  109. const {projects} = useProjects({slugs: [projectSlug]});
  110. const target = transactionSummaryRouteWithQuery({
  111. orgSlug: organization.slug,
  112. transaction,
  113. query: {
  114. ...location.query,
  115. query: undefined,
  116. },
  117. projectID: String(projects[0]?.id ?? ''),
  118. });
  119. return <Link to={target}>{transaction}</Link>;
  120. }