profileEventEvidence.tsx 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import {LinkButton} from 'sentry/components/button';
  2. import KeyValueList from 'sentry/components/events/interfaces/keyValueList';
  3. import {IconProfiling} from 'sentry/icons';
  4. import {t} from 'sentry/locale';
  5. import type {Event} from 'sentry/types/event';
  6. import {generateLinkToEventInTraceView} from 'sentry/utils/discover/urls';
  7. import {generateProfileFlamechartRouteWithHighlightFrame} from 'sentry/utils/profiling/routes';
  8. import {useLocation} from 'sentry/utils/useLocation';
  9. import useOrganization from 'sentry/utils/useOrganization';
  10. import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
  11. import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
  12. type ProfileEvidenceProps = {event: Event; projectSlug: string};
  13. export function ProfileEventEvidence({event, projectSlug}: ProfileEvidenceProps) {
  14. const organization = useOrganization();
  15. const location = useLocation();
  16. const evidenceData = event.occurrence?.evidenceData ?? {};
  17. const evidenceDisplay = event.occurrence?.evidenceDisplay ?? [];
  18. const traceSlug = event.contexts?.trace?.trace_id ?? '';
  19. const keyValueListData = [
  20. ...(evidenceData.transactionId && evidenceData.transactionName
  21. ? [
  22. {
  23. subject: 'Transaction Name',
  24. key: 'Transaction Name',
  25. value: evidenceData.transactionName,
  26. actionButton: traceSlug ? (
  27. <LinkButton
  28. size="xs"
  29. to={generateLinkToEventInTraceView({
  30. traceSlug,
  31. timestamp: evidenceData.timestamp,
  32. eventId: evidenceData.transactionId,
  33. projectSlug,
  34. location: {...location, query: {...location.query, referrer: 'issue'}},
  35. organization,
  36. })}
  37. >
  38. {t('View Transaction')}
  39. </LinkButton>
  40. ) : null,
  41. },
  42. ]
  43. : []),
  44. ...(evidenceData.profileId
  45. ? [
  46. {
  47. subject: 'Profile ID',
  48. key: 'Profile ID',
  49. value: evidenceData.profileId,
  50. actionButton: (
  51. <LinkButton
  52. size="xs"
  53. to={generateProfileFlamechartRouteWithHighlightFrame({
  54. profileId: evidenceData.profileId,
  55. projectSlug,
  56. orgSlug: organization.slug,
  57. frameName: evidenceData.frameName,
  58. framePackage: evidenceData.framePackage,
  59. query: {
  60. referrer: 'issue',
  61. },
  62. })}
  63. icon={<IconProfiling />}
  64. >
  65. {t('View Profile')}
  66. </LinkButton>
  67. ),
  68. },
  69. ]
  70. : []),
  71. ...evidenceDisplay.map(item => ({
  72. subject: item.name,
  73. key: item.name,
  74. value: item.value,
  75. })),
  76. ];
  77. return (
  78. <InterimSection title={t('Function Evidence')} type={SectionKey.EVIDENCE}>
  79. <KeyValueList data={keyValueListData} shouldSort={false} />
  80. </InterimSection>
  81. );
  82. }