datasource_specs.ts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import {describe, beforeEach, it, sinon, expect, angularMocks} from 'test/lib/common';
  2. import moment from 'moment';
  3. import helpers from 'test/specs/helpers';
  4. import {PrometheusDatasource} from '../datasource';
  5. describe('PrometheusDatasource', function() {
  6. var ctx = new helpers.ServiceTestContext();
  7. var instanceSettings = {url: 'proxied', directUrl: 'direct', user: 'test', password: 'mupp' };
  8. beforeEach(angularMocks.module('grafana.core'));
  9. beforeEach(angularMocks.module('grafana.services'));
  10. beforeEach(angularMocks.inject(function($q, $rootScope, $httpBackend, $injector) {
  11. ctx.$q = $q;
  12. ctx.$httpBackend = $httpBackend;
  13. ctx.$rootScope = $rootScope;
  14. ctx.ds = $injector.instantiate(PrometheusDatasource, {instanceSettings: instanceSettings});
  15. $httpBackend.when('GET', /\.html$/).respond('');
  16. }));
  17. describe('When querying prometheus with one target using query editor target spec', function() {
  18. var results;
  19. var urlExpected = 'proxied/api/v1/query_range?query=' +
  20. encodeURIComponent('test{job="testjob"}') +
  21. '&start=1443438675&end=1443460275&step=60';
  22. var query = {
  23. range: { from: moment(1443438674760), to: moment(1443460274760) },
  24. targets: [{ expr: 'test{job="testjob"}' }],
  25. interval: '60s'
  26. };
  27. var response = {
  28. status: "success",
  29. data: {
  30. resultType: "matrix",
  31. result: [{
  32. metric: {"__name__": "test", job: "testjob"},
  33. values: [[1443454528, "3846"]]
  34. }]
  35. }
  36. };
  37. beforeEach(function() {
  38. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  39. ctx.ds.query(query).then(function(data) { results = data; });
  40. ctx.$httpBackend.flush();
  41. });
  42. it('should generate the correct query', function() {
  43. ctx.$httpBackend.verifyNoOutstandingExpectation();
  44. });
  45. it('should return series list', function() {
  46. expect(results.data.length).to.be(1);
  47. expect(results.data[0].target).to.be('test{job="testjob"}');
  48. });
  49. });
  50. describe('When querying prometheus with one target which return multiple series', function() {
  51. var results;
  52. var start = 1443438675;
  53. var end = 1443460275;
  54. var step = 60;
  55. var urlExpected = 'proxied/api/v1/query_range?query=' +
  56. encodeURIComponent('test{job="testjob"}') +
  57. '&start=' + start + '&end=' + end + '&step=' + step;
  58. var query = {
  59. range: { from: moment(1443438674760), to: moment(1443460274760) },
  60. targets: [{ expr: 'test{job="testjob"}' }],
  61. interval: '60s'
  62. };
  63. var response = {
  64. status: "success",
  65. data: {
  66. resultType: "matrix",
  67. result: [
  68. {
  69. metric: {"__name__": "test", job: "testjob", series: 'series 1'},
  70. values: [
  71. [start + step * 1, "3846"],
  72. [start + step * 3, "3847"],
  73. [end - step * 1, "3848"],
  74. ]
  75. },
  76. {
  77. metric: {"__name__": "test", job: "testjob", series: 'series 2'},
  78. values: [
  79. [start + step * 2, "4846"]
  80. ]
  81. },
  82. ]
  83. }
  84. };
  85. beforeEach(function() {
  86. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  87. ctx.ds.query(query).then(function(data) { results = data; });
  88. ctx.$httpBackend.flush();
  89. });
  90. it('should be same length', function() {
  91. expect(results.data.length).to.be(2);
  92. expect(results.data[0].datapoints.length).to.be((end - start) / step + 1);
  93. expect(results.data[1].datapoints.length).to.be((end - start) / step + 1);
  94. });
  95. it('should fill null until first datapoint in response', function() {
  96. expect(results.data[0].datapoints[0][1]).to.be(start * 1000);
  97. expect(results.data[0].datapoints[0][0]).to.be(null);
  98. expect(results.data[0].datapoints[1][1]).to.be((start + step * 1) * 1000);
  99. expect(results.data[0].datapoints[1][0]).to.be(3846);
  100. });
  101. it('should fill null after last datapoint in response', function() {
  102. var length = (end - start) / step + 1;
  103. expect(results.data[0].datapoints[length-2][1]).to.be((end - step * 1) * 1000);
  104. expect(results.data[0].datapoints[length-2][0]).to.be(3848);
  105. expect(results.data[0].datapoints[length-1][1]).to.be(end * 1000);
  106. expect(results.data[0].datapoints[length-1][0]).to.be(null);
  107. });
  108. it('should fill null at gap between series', function() {
  109. expect(results.data[0].datapoints[2][1]).to.be((start + step * 2) * 1000);
  110. expect(results.data[0].datapoints[2][0]).to.be(null);
  111. expect(results.data[1].datapoints[1][1]).to.be((start + step * 1) * 1000);
  112. expect(results.data[1].datapoints[1][0]).to.be(null);
  113. expect(results.data[1].datapoints[3][1]).to.be((start + step * 3) * 1000);
  114. expect(results.data[1].datapoints[3][0]).to.be(null);
  115. });
  116. });
  117. describe('When performing annotationQuery', function() {
  118. var results;
  119. var urlExpected = 'proxied/api/v1/query_range?query=' +
  120. encodeURIComponent('ALERTS{alertstate="firing"}') +
  121. '&start=1443438675&end=1443460275&step=60s';
  122. var options = {
  123. annotation: {
  124. expr: 'ALERTS{alertstate="firing"}',
  125. tagKeys: 'job',
  126. titleFormat: '{{alertname}}',
  127. textFormat: '{{instance}}'
  128. },
  129. range: {
  130. from: moment(1443438674760),
  131. to: moment(1443460274760)
  132. }
  133. };
  134. var response = {
  135. status: "success",
  136. data: {
  137. resultType: "matrix",
  138. result: [{
  139. metric: {"__name__": "ALERTS", alertname: "InstanceDown", alertstate: "firing", instance: "testinstance", job: "testjob"},
  140. values: [[1443454528, "1"]]
  141. }]
  142. }
  143. };
  144. beforeEach(function() {
  145. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  146. ctx.ds.annotationQuery(options).then(function(data) { results = data; });
  147. ctx.$httpBackend.flush();
  148. });
  149. it('should return annotation list', function() {
  150. ctx.$rootScope.$apply();
  151. expect(results.length).to.be(1);
  152. expect(results[0].tags).to.contain('testjob');
  153. expect(results[0].title).to.be('InstanceDown');
  154. expect(results[0].text).to.be('testinstance');
  155. expect(results[0].time).to.be(1443454528 * 1000);
  156. });
  157. });
  158. });