datasource.jest.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import _ from 'lodash';
  2. import moment from 'moment';
  3. import q from 'q';
  4. import { PrometheusDatasource, prometheusSpecialRegexEscape, prometheusRegularEscape } from '../datasource';
  5. describe('PrometheusDatasource', () => {
  6. let ctx: any = {};
  7. let instanceSettings = {
  8. url: 'proxied',
  9. directUrl: 'direct',
  10. user: 'test',
  11. password: 'mupp',
  12. jsonData: {},
  13. };
  14. ctx.backendSrvMock = {};
  15. ctx.templateSrvMock = {
  16. replace: a => a,
  17. };
  18. ctx.timeSrvMock = {};
  19. beforeEach(() => {
  20. ctx.ds = new PrometheusDatasource(instanceSettings, q, ctx.backendSrvMock, ctx.templateSrvMock, ctx.timeSrvMock);
  21. });
  22. describe('When converting prometheus histogram to heatmap format', () => {
  23. beforeEach(() => {
  24. ctx.query = {
  25. range: { from: moment(1443454528000), to: moment(1443454528000) },
  26. targets: [{ expr: 'test{job="testjob"}', format: 'heatmap', legendFormat: '{{le}}' }],
  27. interval: '60s',
  28. };
  29. });
  30. it('should convert cumullative histogram to ordinary', () => {
  31. const resultMock = [
  32. {
  33. metric: { __name__: 'metric', job: 'testjob', le: '10' },
  34. values: [[1443454528.0, '10'], [1443454528.0, '10']],
  35. },
  36. {
  37. metric: { __name__: 'metric', job: 'testjob', le: '20' },
  38. values: [[1443454528.0, '20'], [1443454528.0, '10']],
  39. },
  40. {
  41. metric: { __name__: 'metric', job: 'testjob', le: '30' },
  42. values: [[1443454528.0, '25'], [1443454528.0, '10']],
  43. },
  44. ];
  45. const responseMock = { data: { data: { result: resultMock } } };
  46. const expected = [
  47. {
  48. target: '10',
  49. datapoints: [[10, 1443454528000], [10, 1443454528000]],
  50. },
  51. {
  52. target: '20',
  53. datapoints: [[10, 1443454528000], [0, 1443454528000]],
  54. },
  55. {
  56. target: '30',
  57. datapoints: [[5, 1443454528000], [0, 1443454528000]],
  58. },
  59. ];
  60. ctx.ds.performTimeSeriesQuery = jest.fn().mockReturnValue(responseMock);
  61. return ctx.ds.query(ctx.query).then(result => {
  62. let results = result.data;
  63. return expect(results).toEqual(expected);
  64. });
  65. });
  66. it('should sort series by label value', () => {
  67. const resultMock = [
  68. {
  69. metric: { __name__: 'metric', job: 'testjob', le: '2' },
  70. values: [[1443454528.0, '10'], [1443454528.0, '10']],
  71. },
  72. {
  73. metric: { __name__: 'metric', job: 'testjob', le: '4' },
  74. values: [[1443454528.0, '20'], [1443454528.0, '10']],
  75. },
  76. {
  77. metric: { __name__: 'metric', job: 'testjob', le: '+Inf' },
  78. values: [[1443454528.0, '25'], [1443454528.0, '10']],
  79. },
  80. {
  81. metric: { __name__: 'metric', job: 'testjob', le: '1' },
  82. values: [[1443454528.0, '25'], [1443454528.0, '10']],
  83. },
  84. ];
  85. const responseMock = { data: { data: { result: resultMock } } };
  86. const expected = ['1', '2', '4', '+Inf'];
  87. ctx.ds.performTimeSeriesQuery = jest.fn().mockReturnValue(responseMock);
  88. return ctx.ds.query(ctx.query).then(result => {
  89. let seriesLabels = _.map(result.data, 'target');
  90. return expect(seriesLabels).toEqual(expected);
  91. });
  92. });
  93. });
  94. describe('Prometheus regular escaping', function() {
  95. it('should not escape simple string', function() {
  96. expect(prometheusRegularEscape('cryptodepression')).toEqual('cryptodepression');
  97. });
  98. it("should escape '", function() {
  99. expect(prometheusRegularEscape("looking'glass")).toEqual("looking\\\\'glass");
  100. });
  101. it('should escape multiple characters', function() {
  102. expect(prometheusRegularEscape("'looking'glass'")).toEqual("\\\\'looking\\\\'glass\\\\'");
  103. });
  104. });
  105. describe('Prometheus regexes escaping', function() {
  106. it('should not escape simple string', function() {
  107. expect(prometheusSpecialRegexEscape('cryptodepression')).toEqual('cryptodepression');
  108. });
  109. it('should escape $^*+?.()\\', function() {
  110. expect(prometheusSpecialRegexEscape("looking'glass")).toEqual("looking\\\\'glass");
  111. expect(prometheusSpecialRegexEscape('looking{glass')).toEqual('looking\\\\{glass');
  112. expect(prometheusSpecialRegexEscape('looking}glass')).toEqual('looking\\\\}glass');
  113. expect(prometheusSpecialRegexEscape('looking[glass')).toEqual('looking\\\\[glass');
  114. expect(prometheusSpecialRegexEscape('looking]glass')).toEqual('looking\\\\]glass');
  115. expect(prometheusSpecialRegexEscape('looking$glass')).toEqual('looking\\\\$glass');
  116. expect(prometheusSpecialRegexEscape('looking^glass')).toEqual('looking\\\\^glass');
  117. expect(prometheusSpecialRegexEscape('looking*glass')).toEqual('looking\\\\*glass');
  118. expect(prometheusSpecialRegexEscape('looking+glass')).toEqual('looking\\\\+glass');
  119. expect(prometheusSpecialRegexEscape('looking?glass')).toEqual('looking\\\\?glass');
  120. expect(prometheusSpecialRegexEscape('looking.glass')).toEqual('looking\\\\.glass');
  121. expect(prometheusSpecialRegexEscape('looking(glass')).toEqual('looking\\\\(glass');
  122. expect(prometheusSpecialRegexEscape('looking)glass')).toEqual('looking\\\\)glass');
  123. expect(prometheusSpecialRegexEscape('looking\\glass')).toEqual('looking\\\\\\\\glass');
  124. });
  125. it('should escape multiple special characters', function() {
  126. expect(prometheusSpecialRegexEscape('+looking$glass?')).toEqual('\\\\+looking\\\\$glass\\\\?');
  127. });
  128. });
  129. });