message.tsx 1.9 KB

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