utils.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import {t} from 'sentry/locale';
  2. import type {MutableSearch} from 'sentry/utils/tokenizeSearch';
  3. export function getLogSeverityLevel(
  4. severityNumber: number | null,
  5. severityText: string | null
  6. ): SeverityLevel {
  7. // Defer to the severity number if it is provided
  8. // Currently follows https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-severitynumber
  9. if (severityNumber) {
  10. if (severityNumber >= 1 && severityNumber <= 4) {
  11. return SeverityLevel.TRACE;
  12. }
  13. if (severityNumber >= 5 && severityNumber <= 8) {
  14. return SeverityLevel.DEBUG;
  15. }
  16. if (severityNumber >= 9 && severityNumber <= 12) {
  17. return SeverityLevel.INFO;
  18. }
  19. if (severityNumber >= 13 && severityNumber <= 16) {
  20. return SeverityLevel.WARN;
  21. }
  22. if (severityNumber >= 17 && severityNumber <= 20) {
  23. return SeverityLevel.ERROR;
  24. }
  25. if (severityNumber >= 21 && severityNumber <= 24) {
  26. return SeverityLevel.FATAL;
  27. }
  28. }
  29. // Otherwise use severity text if it's a case insensitive match for one of the severity levels
  30. if (severityText) {
  31. const upperText = severityText.toUpperCase();
  32. const validLevels = [
  33. SeverityLevel.TRACE,
  34. SeverityLevel.DEBUG,
  35. SeverityLevel.INFO,
  36. SeverityLevel.WARN,
  37. SeverityLevel.ERROR,
  38. SeverityLevel.FATAL,
  39. SeverityLevel.DEFAULT,
  40. SeverityLevel.UNKNOWN,
  41. ];
  42. if (validLevels.includes(upperText as SeverityLevel)) {
  43. return upperText as SeverityLevel;
  44. }
  45. }
  46. // If the severity number isn't in range or the severity text can't map to a level, the severity level is unknown.
  47. return SeverityLevel.UNKNOWN;
  48. }
  49. /**
  50. * This level is the source of truth for the severity level.
  51. * Currently overlaps with the OpenTelemetry log severity level, with the addition of DEFAULT and UNKNOWN.
  52. */
  53. export enum SeverityLevel {
  54. // A fine-grained debugging event. Typically disabled in default configurations.
  55. TRACE = 'TRACE',
  56. // A debugging event.
  57. DEBUG = 'DEBUG',
  58. // An informational event. Indicates that an event happened.
  59. INFO = 'INFO',
  60. // A warning event. Not an error but is likely more important than an informational event.
  61. WARN = 'WARN',
  62. // An error event. Something went wrong.
  63. ERROR = 'ERROR',
  64. // A fatal error such as application or system crash.
  65. FATAL = 'FATAL',
  66. // The log entry has no assigned severity level.
  67. DEFAULT = 'DEFAULT',
  68. // Unknown severity level, no severity text or number provided.
  69. UNKNOWN = 'UNKNOWN',
  70. }
  71. /**
  72. * Maps all internal severity levels to the appropriate text level. Should all be 4 characters for display purposes.
  73. */
  74. export function severityLevelToText(level: SeverityLevel) {
  75. return {
  76. [SeverityLevel.TRACE]: t('TRACE'),
  77. [SeverityLevel.DEBUG]: t('DEBUG'),
  78. [SeverityLevel.INFO]: t('INFO'),
  79. [SeverityLevel.WARN]: t('WARN'),
  80. [SeverityLevel.ERROR]: t('ERROR'),
  81. [SeverityLevel.FATAL]: t('FATAL'),
  82. [SeverityLevel.DEFAULT]: t('DEFAULT'),
  83. [SeverityLevel.UNKNOWN]: t('UNKNOWN'), // Maps to info for now.
  84. }[level];
  85. }
  86. export function getLogBodySearchTerms(search: MutableSearch): string[] {
  87. const searchTerms: string[] = search.freeText.map(text => text.replaceAll('*', ''));
  88. const bodyFilters = search.getFilterValues('log.body');
  89. for (const filter of bodyFilters) {
  90. if (!filter.startsWith('!') && !filter.startsWith('[')) {
  91. searchTerms.push(filter);
  92. }
  93. }
  94. return searchTerms;
  95. }