result_transformer.jest.ts 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. import { ResultTransformer } from '../result_transformer';
  2. describe('Prometheus Result Transformer', () => {
  3. let ctx: any = {};
  4. beforeEach(() => {
  5. ctx.templateSrv = {
  6. replace: str => str,
  7. };
  8. ctx.resultTransformer = new ResultTransformer(ctx.templateSrv);
  9. });
  10. describe('When resultFormat is table', () => {
  11. var response = {
  12. status: 'success',
  13. data: {
  14. resultType: 'matrix',
  15. result: [
  16. {
  17. metric: { __name__: 'test', job: 'testjob' },
  18. values: [[1443454528, '3846']],
  19. },
  20. {
  21. metric: {
  22. __name__: 'test',
  23. instance: 'localhost:8080',
  24. job: 'otherjob',
  25. },
  26. values: [[1443454529, '3847']],
  27. },
  28. ],
  29. },
  30. };
  31. it('should return table model', () => {
  32. var table = ctx.resultTransformer.transformMetricDataToTable(response.data.result);
  33. expect(table.type).toBe('table');
  34. expect(table.rows).toEqual([
  35. [1443454528000, 'test', '', 'testjob', 3846],
  36. [1443454529000, 'test', 'localhost:8080', 'otherjob', 3847],
  37. ]);
  38. expect(table.columns).toEqual([
  39. { text: 'Time', type: 'time' },
  40. { text: '__name__' },
  41. { text: 'instance' },
  42. { text: 'job' },
  43. { text: 'Value' },
  44. ]);
  45. });
  46. it('should column title include refId if response count is more than 2', () => {
  47. var table = ctx.resultTransformer.transformMetricDataToTable(response.data.result, 2, 'B');
  48. expect(table.type).toBe('table');
  49. expect(table.columns).toEqual([
  50. { text: 'Time', type: 'time' },
  51. { text: '__name__' },
  52. { text: 'instance' },
  53. { text: 'job' },
  54. { text: 'Value #B' },
  55. ]);
  56. });
  57. });
  58. describe('When resultFormat is table and instant = true', () => {
  59. var response = {
  60. status: 'success',
  61. data: {
  62. resultType: 'vector',
  63. result: [
  64. {
  65. metric: { __name__: 'test', job: 'testjob' },
  66. value: [1443454528, '3846'],
  67. },
  68. ],
  69. },
  70. };
  71. it('should return table model', () => {
  72. var table = ctx.resultTransformer.transformMetricDataToTable(response.data.result);
  73. expect(table.type).toBe('table');
  74. expect(table.rows).toEqual([[1443454528000, 'test', 'testjob', 3846]]);
  75. expect(table.columns).toEqual([
  76. { text: 'Time', type: 'time' },
  77. { text: '__name__' },
  78. { text: 'job' },
  79. { text: 'Value' },
  80. ]);
  81. });
  82. });
  83. describe('When resultFormat is heatmap', () => {
  84. var response = {
  85. status: 'success',
  86. data: {
  87. resultType: 'matrix',
  88. result: [
  89. {
  90. metric: { __name__: 'test', job: 'testjob', le: '1' },
  91. values: [[1445000010, '10'], [1445000020, '10'], [1445000030, '0']],
  92. },
  93. {
  94. metric: { __name__: 'test', job: 'testjob', le: '2' },
  95. values: [[1445000010, '20'], [1445000020, '10'], [1445000030, '30']],
  96. },
  97. {
  98. metric: { __name__: 'test', job: 'testjob', le: '3' },
  99. values: [[1445000010, '30'], [1445000020, '10'], [1445000030, '40']],
  100. },
  101. ],
  102. },
  103. };
  104. it('should convert cumulative histogram to regular', () => {
  105. let result = [];
  106. let options = {
  107. format: 'heatmap',
  108. start: 1445000010,
  109. end: 1445000030,
  110. legendFormat: '{{le}}',
  111. };
  112. ctx.resultTransformer.transform(result, { data: response }, options);
  113. expect(result).toEqual([
  114. { target: '1', datapoints: [[10, 1445000010000], [10, 1445000020000], [0, 1445000030000]] },
  115. { target: '2', datapoints: [[10, 1445000010000], [0, 1445000020000], [30, 1445000030000]] },
  116. { target: '3', datapoints: [[10, 1445000010000], [0, 1445000020000], [10, 1445000030000]] },
  117. ]);
  118. });
  119. it('should handle missing datapoints', () => {
  120. const seriesList = [
  121. { datapoints: [[1, 1000], [2, 2000]] },
  122. { datapoints: [[2, 1000], [5, 2000], [1, 3000]] },
  123. { datapoints: [[3, 1000], [7, 2000]] },
  124. ];
  125. const expected = [
  126. { datapoints: [[1, 1000], [2, 2000]] },
  127. { datapoints: [[1, 1000], [3, 2000], [1, 3000]] },
  128. { datapoints: [[1, 1000], [2, 2000]] },
  129. ];
  130. const result = ctx.resultTransformer.transformToHistogramOverTime(seriesList);
  131. expect(result).toEqual(expected);
  132. });
  133. it('should throw error when data in wrong format', () => {
  134. const seriesList = [{ rows: [] }, { datapoints: [] }];
  135. expect(() => {
  136. ctx.resultTransformer.transformToHistogramOverTime(seriesList);
  137. }).toThrow();
  138. });
  139. it('should throw error when prometheus returned non-timeseries', () => {
  140. // should be { metric: {}, values: [] } for timeseries
  141. const metricData = { metric: {}, value: [] };
  142. expect(() => {
  143. ctx.resultTransformer.transformMetricData(metricData, { step: 1 }, 1000, 2000);
  144. }).toThrow();
  145. });
  146. });
  147. describe('When resultFormat is time series', () => {
  148. it('should transform matrix into timeseries', () => {
  149. const response = {
  150. status: 'success',
  151. data: {
  152. resultType: 'matrix',
  153. result: [
  154. {
  155. metric: { __name__: 'test', job: 'testjob' },
  156. values: [[0, '10'], [1, '10'], [2, '0']],
  157. },
  158. ],
  159. },
  160. };
  161. let result = [];
  162. let options = {
  163. format: 'timeseries',
  164. start: 0,
  165. end: 2,
  166. };
  167. ctx.resultTransformer.transform(result, { data: response }, options);
  168. expect(result).toEqual([{ target: 'test{job="testjob"}', datapoints: [[10, 0], [10, 1000], [0, 2000]] }]);
  169. });
  170. it('should fill timeseries with null values', () => {
  171. const response = {
  172. status: 'success',
  173. data: {
  174. resultType: 'matrix',
  175. result: [
  176. {
  177. metric: { __name__: 'test', job: 'testjob' },
  178. values: [[1, '10'], [2, '0']],
  179. },
  180. ],
  181. },
  182. };
  183. let result = [];
  184. let options = {
  185. format: 'timeseries',
  186. step: 1,
  187. start: 0,
  188. end: 2,
  189. };
  190. ctx.resultTransformer.transform(result, { data: response }, options);
  191. expect(result).toEqual([{ target: 'test{job="testjob"}', datapoints: [[null, 0], [10, 1000], [0, 2000]] }]);
  192. });
  193. it('should align null values with step', () => {
  194. const response = {
  195. status: 'success',
  196. data: {
  197. resultType: 'matrix',
  198. result: [
  199. {
  200. metric: { __name__: 'test', job: 'testjob' },
  201. values: [[4, '10'], [8, '10']],
  202. },
  203. ],
  204. },
  205. };
  206. let result = [];
  207. let options = {
  208. format: 'timeseries',
  209. step: 2,
  210. start: 0,
  211. end: 8,
  212. };
  213. ctx.resultTransformer.transform(result, { data: response }, options);
  214. expect(result).toEqual([
  215. { target: 'test{job="testjob"}', datapoints: [[null, 0], [null, 2000], [10, 4000], [null, 6000], [10, 8000]] },
  216. ]);
  217. });
  218. });
  219. });