exception.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import {t} from 'sentry/locale';
  2. import type {ExceptionType, Group, Project} from 'sentry/types';
  3. import type {Event} from 'sentry/types/event';
  4. import {EntryType} from 'sentry/types/event';
  5. import {StackType, StackView} from 'sentry/types/stacktrace';
  6. import {PermalinkTitle, TraceEventDataSection} from '../traceEventDataSection';
  7. import {ExceptionContent} from './crashContent/exception';
  8. import NoStackTraceMessage from './noStackTraceMessage';
  9. import {isStacktraceNewestFirst} from './utils';
  10. type Props = {
  11. data: ExceptionType;
  12. event: Event;
  13. hasHierarchicalGrouping: boolean;
  14. projectSlug: Project['slug'];
  15. groupingCurrentLevel?: Group['metadata']['current_level'];
  16. hideGuide?: boolean;
  17. };
  18. export function Exception({
  19. event,
  20. data,
  21. projectSlug,
  22. hasHierarchicalGrouping,
  23. groupingCurrentLevel,
  24. }: Props) {
  25. const eventHasThreads = !!event.entries.some(entry => entry.type === EntryType.THREADS);
  26. // in case there are threads in the event data, we don't render the
  27. // exception block. Instead the exception is contained within the
  28. // thread interface.
  29. if (eventHasThreads) {
  30. return null;
  31. }
  32. const entryIndex = event.entries.findIndex(
  33. eventEntry => eventEntry.type === EntryType.EXCEPTION
  34. );
  35. const meta = event._meta?.entries?.[entryIndex]?.data?.values;
  36. const stackTraceNotFound = !(data.values ?? []).length;
  37. return (
  38. <TraceEventDataSection
  39. title={<PermalinkTitle>{t('Stack Trace')}</PermalinkTitle>}
  40. type={EntryType.EXCEPTION}
  41. projectSlug={projectSlug}
  42. eventId={event.id}
  43. recentFirst={isStacktraceNewestFirst()}
  44. fullStackTrace={!data.hasSystemFrames}
  45. platform={event.platform ?? 'other'}
  46. hasMinified={!!data.values?.some(value => value.rawStacktrace)}
  47. hasVerboseFunctionNames={
  48. !!data.values?.some(
  49. value =>
  50. !!value.stacktrace?.frames?.some(
  51. frame =>
  52. !!frame.rawFunction &&
  53. !!frame.function &&
  54. frame.rawFunction !== frame.function
  55. )
  56. )
  57. }
  58. hasAbsoluteFilePaths={
  59. !!data.values?.some(
  60. value => !!value.stacktrace?.frames?.some(frame => !!frame.filename)
  61. )
  62. }
  63. hasAbsoluteAddresses={
  64. !!data.values?.some(
  65. value => !!value.stacktrace?.frames?.some(frame => !!frame.instructionAddr)
  66. )
  67. }
  68. hasAppOnlyFrames={
  69. !!data.values?.some(
  70. value => !!value.stacktrace?.frames?.some(frame => frame.inApp !== true)
  71. )
  72. }
  73. hasNewestFirst={
  74. !!data.values?.some(value => (value.stacktrace?.frames ?? []).length > 1)
  75. }
  76. stackTraceNotFound={stackTraceNotFound}
  77. wrapTitle={false}
  78. >
  79. {({recentFirst, display, fullStackTrace}) =>
  80. stackTraceNotFound ? (
  81. <NoStackTraceMessage />
  82. ) : (
  83. <ExceptionContent
  84. stackType={
  85. display.includes('minified') ? StackType.MINIFIED : StackType.ORIGINAL
  86. }
  87. stackView={
  88. display.includes('raw-stack-trace')
  89. ? StackView.RAW
  90. : fullStackTrace
  91. ? StackView.FULL
  92. : StackView.APP
  93. }
  94. projectSlug={projectSlug}
  95. newestFirst={recentFirst}
  96. event={event}
  97. values={data.values}
  98. groupingCurrentLevel={groupingCurrentLevel}
  99. hasHierarchicalGrouping={hasHierarchicalGrouping}
  100. meta={meta}
  101. />
  102. )
  103. }
  104. </TraceEventDataSection>
  105. );
  106. }