result_transformer.test.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import { LogLevel, LogsStream } from 'app/core/logs_model';
  2. import {
  3. findCommonLabels,
  4. findUniqueLabels,
  5. formatLabels,
  6. getLogLevel,
  7. mergeStreamsToLogs,
  8. parseLabels,
  9. } from './result_transformer';
  10. describe('getLoglevel()', () => {
  11. it('returns no log level on empty line', () => {
  12. expect(getLogLevel('')).toBe(LogLevel.unkown);
  13. });
  14. it('returns no log level on when level is part of a word', () => {
  15. expect(getLogLevel('this is information')).toBe(LogLevel.unkown);
  16. });
  17. it('returns same log level for long and short version', () => {
  18. expect(getLogLevel('[Warn]')).toBe(LogLevel.warning);
  19. expect(getLogLevel('[Warning]')).toBe(LogLevel.warning);
  20. expect(getLogLevel('[Warn]')).toBe('warning');
  21. });
  22. it('returns log level on line contains a log level', () => {
  23. expect(getLogLevel('warn: it is looking bad')).toBe(LogLevel.warn);
  24. expect(getLogLevel('2007-12-12 12:12:12 [WARN]: it is looking bad')).toBe(LogLevel.warn);
  25. });
  26. it('returns first log level found', () => {
  27. expect(getLogLevel('WARN this could be a debug message')).toBe(LogLevel.warn);
  28. });
  29. });
  30. describe('parseLabels()', () => {
  31. it('returns no labels on emtpy labels string', () => {
  32. expect(parseLabels('')).toEqual({});
  33. expect(parseLabels('{}')).toEqual({});
  34. });
  35. it('returns labels on labels string', () => {
  36. expect(parseLabels('{foo="bar", baz="42"}')).toEqual({ foo: '"bar"', baz: '"42"' });
  37. });
  38. });
  39. describe('formatLabels()', () => {
  40. it('returns no labels on emtpy label set', () => {
  41. expect(formatLabels({})).toEqual('');
  42. expect(formatLabels({}, 'foo')).toEqual('foo');
  43. });
  44. it('returns label string on label set', () => {
  45. expect(formatLabels({ foo: '"bar"', baz: '"42"' })).toEqual('{baz="42", foo="bar"}');
  46. });
  47. });
  48. describe('findCommonLabels()', () => {
  49. it('returns no common labels on empty sets', () => {
  50. expect(findCommonLabels([{}])).toEqual({});
  51. expect(findCommonLabels([{}, {}])).toEqual({});
  52. });
  53. it('returns no common labels on differing sets', () => {
  54. expect(findCommonLabels([{ foo: '"bar"' }, {}])).toEqual({});
  55. expect(findCommonLabels([{}, { foo: '"bar"' }])).toEqual({});
  56. expect(findCommonLabels([{ baz: '42' }, { foo: '"bar"' }])).toEqual({});
  57. expect(findCommonLabels([{ foo: '42', baz: '"bar"' }, { foo: '"bar"' }])).toEqual({});
  58. });
  59. it('returns the single labels set as common labels', () => {
  60. expect(findCommonLabels([{ foo: '"bar"' }])).toEqual({ foo: '"bar"' });
  61. });
  62. });
  63. describe('findUniqueLabels()', () => {
  64. it('returns no uncommon labels on empty sets', () => {
  65. expect(findUniqueLabels({}, {})).toEqual({});
  66. });
  67. it('returns all labels given no common labels', () => {
  68. expect(findUniqueLabels({ foo: '"bar"' }, {})).toEqual({ foo: '"bar"' });
  69. });
  70. it('returns all labels except the common labels', () => {
  71. expect(findUniqueLabels({ foo: '"bar"', baz: '"42"' }, { foo: '"bar"' })).toEqual({ baz: '"42"' });
  72. });
  73. });
  74. describe('mergeStreamsToLogs()', () => {
  75. it('returns empty logs given no streams', () => {
  76. expect(mergeStreamsToLogs([]).rows).toEqual([]);
  77. });
  78. it('returns processed logs from single stream', () => {
  79. const stream1: LogsStream = {
  80. labels: '{foo="bar"}',
  81. entries: [
  82. {
  83. line: 'WARN boooo',
  84. timestamp: '1970-01-01T00:00:00Z',
  85. },
  86. ],
  87. };
  88. expect(mergeStreamsToLogs([stream1]).rows).toMatchObject([
  89. {
  90. entry: 'WARN boooo',
  91. labels: '{foo="bar"}',
  92. key: 'EK1970-01-01T00:00:00Z{foo="bar"}',
  93. logLevel: 'warning',
  94. uniqueLabels: '',
  95. },
  96. ]);
  97. });
  98. it('returns merged logs from multiple streams sorted by time and with unique labels', () => {
  99. const stream1: LogsStream = {
  100. labels: '{foo="bar", baz="1"}',
  101. entries: [
  102. {
  103. line: 'WARN boooo',
  104. timestamp: '1970-01-01T00:00:01Z',
  105. },
  106. ],
  107. };
  108. const stream2: LogsStream = {
  109. labels: '{foo="bar", baz="2"}',
  110. entries: [
  111. {
  112. line: 'INFO 1',
  113. timestamp: '1970-01-01T00:00:00Z',
  114. },
  115. {
  116. line: 'INFO 2',
  117. timestamp: '1970-01-01T00:00:02Z',
  118. },
  119. ],
  120. };
  121. expect(mergeStreamsToLogs([stream1, stream2]).rows).toMatchObject([
  122. {
  123. entry: 'INFO 2',
  124. labels: '{foo="bar", baz="2"}',
  125. logLevel: 'info',
  126. uniqueLabels: '{baz="2"}',
  127. },
  128. {
  129. entry: 'WARN boooo',
  130. labels: '{foo="bar", baz="1"}',
  131. logLevel: 'warning',
  132. uniqueLabels: '{baz="1"}',
  133. },
  134. {
  135. entry: 'INFO 1',
  136. labels: '{foo="bar", baz="2"}',
  137. logLevel: 'info',
  138. uniqueLabels: '{baz="2"}',
  139. },
  140. ]);
  141. });
  142. });