message.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import EventDataSection from 'sentry/components/events/eventDataSection';
  2. import KeyValueList from 'sentry/components/events/interfaces/keyValueList';
  3. import Annotated from 'sentry/components/events/meta/annotated';
  4. import {getMeta} from 'sentry/components/events/meta/metaProxy';
  5. import {t} from 'sentry/locale';
  6. import {objectIsEmpty} from 'sentry/utils';
  7. type Props = {
  8. data: {
  9. formatted: string;
  10. params?: Record<string, any> | any[];
  11. };
  12. };
  13. const Message = ({data}: Props) => {
  14. const renderParams = () => {
  15. const params = data?.params;
  16. if (!params || objectIsEmpty(params)) {
  17. return null;
  18. }
  19. // NB: Always render params, regardless of whether they appear in the
  20. // formatted string due to structured logging frameworks, like Serilog. They
  21. // only format some parameters into the formatted string, but we want to
  22. // display all of them.
  23. if (Array.isArray(params)) {
  24. const arrayData = params.map((value, i) => {
  25. const key = `#${i}`;
  26. return {
  27. key,
  28. value,
  29. subject: key,
  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: getMeta(params, key),
  39. }));
  40. return <KeyValueList data={objectData} isSorted={false} isContextData />;
  41. };
  42. return (
  43. <EventDataSection type="message" title={t('Message')}>
  44. <Annotated object={data} objectKey="formatted">
  45. {value => <pre className="plain">{value}</pre>}
  46. </Annotated>
  47. {renderParams()}
  48. </EventDataSection>
  49. );
  50. };
  51. export default Message;