profileEventEvidence.tsx 2.9 KB

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