message.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import {EventDataSection} from 'sentry/components/events/eventDataSection';
  2. import {renderLinksInText} from 'sentry/components/events/interfaces/crashContent/exception/utils';
  3. import KeyValueList from 'sentry/components/events/interfaces/keyValueList';
  4. import {AnnotatedText} from 'sentry/components/events/meta/annotatedText';
  5. import {t} from 'sentry/locale';
  6. import type {Event} from 'sentry/types/event';
  7. import {EntryType} from 'sentry/types/event';
  8. import {isEmptyObject} from 'sentry/utils/object/isEmptyObject';
  9. type Props = {
  10. data: {
  11. formatted: string | null;
  12. params?: Record<string, any> | any[] | null;
  13. };
  14. event: Event;
  15. };
  16. function renderParams(params: Props['data']['params'], meta: any) {
  17. if (!params || isEmptyObject(params)) {
  18. return null;
  19. }
  20. // NB: Always render params, regardless of whether they appear in the
  21. // formatted string due to structured logging frameworks, like Serilog. They
  22. // only format some parameters into the formatted string, but we want to
  23. // display all of them.
  24. if (Array.isArray(params)) {
  25. const arrayData = params.map((value, i) => {
  26. const key = `#${i}`;
  27. return {
  28. key,
  29. value,
  30. subject: key,
  31. meta: meta?.data?.params?.[i]?.[''],
  32. };
  33. });
  34. return <KeyValueList data={arrayData} shouldSort={false} isContextData />;
  35. }
  36. const objectData = Object.entries(params).map(([key, value]) => ({
  37. key,
  38. value,
  39. subject: key,
  40. meta: meta?.data?.params?.[key]?.[''],
  41. }));
  42. return <KeyValueList data={objectData} shouldSort={false} isContextData />;
  43. }
  44. export function Message({data, event}: Props) {
  45. const entryIndex = event.entries.findIndex(entry => entry.type === EntryType.MESSAGE);
  46. const meta = event?._meta?.entries?.[entryIndex] ?? {};
  47. const messageData = data.formatted
  48. ? renderLinksInText({exceptionText: data.formatted})
  49. : null;
  50. return (
  51. <EventDataSection type="message" title={t('Message')}>
  52. {meta?.data?.formatted?.[''] ? (
  53. <AnnotatedText value={messageData} meta={meta?.data?.formatted?.['']} />
  54. ) : (
  55. <pre className="plain">{messageData}</pre>
  56. )}
  57. {renderParams(data.params, meta)}
  58. </EventDataSection>
  59. );
  60. }