message.tsx 1.9 KB

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