datasource_specs.ts 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. import { describe, beforeEach, it, 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 = {
  8. url: 'proxied',
  9. directUrl: 'direct',
  10. user: 'test',
  11. password: 'mupp',
  12. jsonData: {},
  13. };
  14. beforeEach(angularMocks.module('grafana.core'));
  15. beforeEach(angularMocks.module('grafana.services'));
  16. beforeEach(ctx.providePhase(['timeSrv']));
  17. beforeEach(
  18. angularMocks.inject(function($q, $rootScope, $httpBackend, $injector) {
  19. ctx.$q = $q;
  20. ctx.$httpBackend = $httpBackend;
  21. ctx.$rootScope = $rootScope;
  22. ctx.ds = $injector.instantiate(PrometheusDatasource, {
  23. instanceSettings: instanceSettings,
  24. });
  25. $httpBackend.when('GET', /\.html$/).respond('');
  26. })
  27. );
  28. describe('When querying prometheus with one target using query editor target spec', function() {
  29. var results;
  30. var urlExpected =
  31. 'proxied/api/v1/query_range?query=' +
  32. encodeURIComponent('test{job="testjob"}') +
  33. '&start=1443438660&end=1443460320&step=60';
  34. var query = {
  35. range: { from: moment(1443438674760), to: moment(1443460274760) },
  36. targets: [{ expr: 'test{job="testjob"}', format: 'time_series' }],
  37. interval: '60s',
  38. };
  39. var response = {
  40. status: 'success',
  41. data: {
  42. resultType: 'matrix',
  43. result: [
  44. {
  45. metric: { __name__: 'test', job: 'testjob' },
  46. values: [[1443454528, '3846']],
  47. },
  48. ],
  49. },
  50. };
  51. beforeEach(function() {
  52. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  53. ctx.ds.query(query).then(function(data) {
  54. results = data;
  55. });
  56. ctx.$httpBackend.flush();
  57. });
  58. it('should generate the correct query', function() {
  59. ctx.$httpBackend.verifyNoOutstandingExpectation();
  60. });
  61. it('should return series list', function() {
  62. expect(results.data.length).to.be(1);
  63. expect(results.data[0].target).to.be('test{job="testjob"}');
  64. });
  65. });
  66. describe('When querying prometheus with one target which return multiple series', function() {
  67. var results;
  68. var start = 1443438660;
  69. var end = 1443460320;
  70. var step = 60;
  71. var urlExpected =
  72. 'proxied/api/v1/query_range?query=' +
  73. encodeURIComponent('test{job="testjob"}') +
  74. '&start=' +
  75. start +
  76. '&end=' +
  77. end +
  78. '&step=' +
  79. step;
  80. var query = {
  81. range: { from: moment(1443438674760), to: moment(1443460274760) },
  82. targets: [{ expr: 'test{job="testjob"}', format: 'time_series' }],
  83. interval: '60s',
  84. };
  85. var response = {
  86. status: 'success',
  87. data: {
  88. resultType: 'matrix',
  89. result: [
  90. {
  91. metric: { __name__: 'test', job: 'testjob', series: 'series 1' },
  92. values: [[start + step * 1, '3846'], [start + step * 3, '3847'], [end - step * 1, '3848']],
  93. },
  94. {
  95. metric: { __name__: 'test', job: 'testjob', series: 'series 2' },
  96. values: [[start + step * 2, '4846']],
  97. },
  98. ],
  99. },
  100. };
  101. // console.log(util.inspect(response, {depth: null}));
  102. beforeEach(function() {
  103. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  104. ctx.ds.query(query).then(function(data) {
  105. results = data;
  106. });
  107. ctx.$httpBackend.flush();
  108. });
  109. it('should be same length', function() {
  110. expect(results.data.length).to.be(2);
  111. expect(results.data[0].datapoints.length).to.be((end - start) / step + 1);
  112. expect(results.data[1].datapoints.length).to.be((end - start) / step + 1);
  113. });
  114. it('should fill null until first datapoint in response', function() {
  115. //console.log(util.inspect(results, {depth: null}));
  116. expect(results.data[0].datapoints[0][1]).to.be(start * 1000);
  117. expect(results.data[0].datapoints[0][0]).to.be(null);
  118. expect(results.data[0].datapoints[1][1]).to.be((start + step * 1) * 1000);
  119. expect(results.data[0].datapoints[1][0]).to.be(3846);
  120. });
  121. it('should fill null after last datapoint in response', function() {
  122. var length = (end - start) / step + 1;
  123. expect(results.data[0].datapoints[length - 2][1]).to.be((end - step * 1) * 1000);
  124. expect(results.data[0].datapoints[length - 2][0]).to.be(3848);
  125. expect(results.data[0].datapoints[length - 1][1]).to.be(end * 1000);
  126. expect(results.data[0].datapoints[length - 1][0]).to.be(null);
  127. });
  128. it('should fill null at gap between series', function() {
  129. //console.log(util.inspect(results, {depth: null}));
  130. expect(results.data[0].datapoints[2][1]).to.be((start + step * 2) * 1000);
  131. expect(results.data[0].datapoints[2][0]).to.be(null);
  132. expect(results.data[1].datapoints[1][1]).to.be((start + step * 1) * 1000);
  133. expect(results.data[1].datapoints[1][0]).to.be(null);
  134. expect(results.data[1].datapoints[3][1]).to.be((start + step * 3) * 1000);
  135. expect(results.data[1].datapoints[3][0]).to.be(null);
  136. });
  137. });
  138. describe('When querying prometheus with one target and instant = true', function() {
  139. var results;
  140. var urlExpected = 'proxied/api/v1/query?query=' + encodeURIComponent('test{job="testjob"}') + '&time=1443460275';
  141. var query = {
  142. range: { from: moment(1443438674760), to: moment(1443460274760) },
  143. targets: [{ expr: 'test{job="testjob"}', format: 'time_series', instant: true }],
  144. interval: '60s',
  145. };
  146. var response = {
  147. status: 'success',
  148. data: {
  149. resultType: 'vector',
  150. result: [
  151. {
  152. metric: { __name__: 'test', job: 'testjob' },
  153. value: [1443454528, '3846'],
  154. },
  155. ],
  156. },
  157. };
  158. beforeEach(function() {
  159. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  160. ctx.ds.query(query).then(function(data) {
  161. results = data;
  162. });
  163. ctx.$httpBackend.flush();
  164. });
  165. it('should generate the correct query', function() {
  166. ctx.$httpBackend.verifyNoOutstandingExpectation();
  167. });
  168. it('should return series list', function() {
  169. expect(results.data.length).to.be(1);
  170. expect(results.data[0].target).to.be('test{job="testjob"}');
  171. });
  172. });
  173. describe('When performing annotationQuery', function() {
  174. var results;
  175. var urlExpected =
  176. 'proxied/api/v1/query_range?query=' +
  177. encodeURIComponent('ALERTS{alertstate="firing"}') +
  178. '&start=1443438660&end=1443460320&step=60';
  179. var options = {
  180. annotation: {
  181. expr: 'ALERTS{alertstate="firing"}',
  182. tagKeys: 'job',
  183. titleFormat: '{{alertname}}',
  184. textFormat: '{{instance}}',
  185. },
  186. range: {
  187. from: moment(1443438674760),
  188. to: moment(1443460274760),
  189. },
  190. };
  191. var response = {
  192. status: 'success',
  193. data: {
  194. resultType: 'matrix',
  195. result: [
  196. {
  197. metric: {
  198. __name__: 'ALERTS',
  199. alertname: 'InstanceDown',
  200. alertstate: 'firing',
  201. instance: 'testinstance',
  202. job: 'testjob',
  203. },
  204. values: [[1443454528, '1']],
  205. },
  206. ],
  207. },
  208. };
  209. beforeEach(function() {
  210. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  211. ctx.ds.annotationQuery(options).then(function(data) {
  212. results = data;
  213. });
  214. ctx.$httpBackend.flush();
  215. });
  216. it('should return annotation list', function() {
  217. ctx.$rootScope.$apply();
  218. expect(results.length).to.be(1);
  219. expect(results[0].tags).to.contain('testjob');
  220. expect(results[0].title).to.be('InstanceDown');
  221. expect(results[0].text).to.be('testinstance');
  222. expect(results[0].time).to.be(1443454528 * 1000);
  223. });
  224. });
  225. describe('When resultFormat is table', function() {
  226. var response = {
  227. status: 'success',
  228. data: {
  229. resultType: 'matrix',
  230. result: [
  231. {
  232. metric: { __name__: 'test', job: 'testjob' },
  233. values: [[1443454528, '3846']],
  234. },
  235. {
  236. metric: {
  237. __name__: 'test',
  238. instance: 'localhost:8080',
  239. job: 'otherjob',
  240. },
  241. values: [[1443454529, '3847']],
  242. },
  243. ],
  244. },
  245. };
  246. it('should return table model', function() {
  247. var table = ctx.ds.transformMetricDataToTable(response.data.result);
  248. expect(table.type).to.be('table');
  249. expect(table.rows).to.eql([
  250. [1443454528000, 'test', '', 'testjob', 3846],
  251. [1443454529000, 'test', 'localhost:8080', 'otherjob', 3847],
  252. ]);
  253. expect(table.columns).to.eql([
  254. { text: 'Time', type: 'time' },
  255. { text: '__name__' },
  256. { text: 'instance' },
  257. { text: 'job' },
  258. { text: 'Value' },
  259. ]);
  260. });
  261. });
  262. describe('When resultFormat is table and instant = true', function() {
  263. var results;
  264. var urlExpected = 'proxied/api/v1/query?query=' + encodeURIComponent('test{job="testjob"}') + '&time=1443460275';
  265. var query = {
  266. range: { from: moment(1443438674760), to: moment(1443460274760) },
  267. targets: [{ expr: 'test{job="testjob"}', format: 'time_series', instant: true }],
  268. interval: '60s',
  269. };
  270. var response = {
  271. status: 'success',
  272. data: {
  273. resultType: 'vector',
  274. result: [
  275. {
  276. metric: { __name__: 'test', job: 'testjob' },
  277. value: [1443454528, '3846'],
  278. },
  279. ],
  280. },
  281. };
  282. beforeEach(function() {
  283. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  284. ctx.ds.query(query).then(function(data) {
  285. results = data;
  286. });
  287. ctx.$httpBackend.flush();
  288. });
  289. it('should return result', () => {
  290. expect(results).not.to.be(null);
  291. });
  292. it('should return table model', function() {
  293. var table = ctx.ds.transformMetricDataToTable(response.data.result);
  294. expect(table.type).to.be('table');
  295. expect(table.rows).to.eql([[1443454528000, 'test', 'testjob', 3846]]);
  296. expect(table.columns).to.eql([
  297. { text: 'Time', type: 'time' },
  298. { text: '__name__' },
  299. { text: 'job' },
  300. { text: 'Value' },
  301. ]);
  302. });
  303. });
  304. describe('The "step" query parameter', function() {
  305. var response = {
  306. status: 'success',
  307. data: {
  308. resultType: 'matrix',
  309. result: [],
  310. },
  311. };
  312. it('should be min interval when greater than auto interval', function() {
  313. var query = {
  314. // 6 hour range
  315. range: { from: moment(1443438674760), to: moment(1443460274760) },
  316. targets: [
  317. {
  318. expr: 'test',
  319. interval: '10s',
  320. },
  321. ],
  322. interval: '5s',
  323. };
  324. var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438670&end=1443460280&step=10';
  325. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  326. ctx.ds.query(query);
  327. ctx.$httpBackend.verifyNoOutstandingExpectation();
  328. });
  329. it('step should never go below 1', function() {
  330. var query = {
  331. // 6 hour range
  332. range: { from: moment(1508318768202), to: moment(1508318770118) },
  333. targets: [{ expr: 'test' }],
  334. interval: '100ms',
  335. };
  336. var urlExpected = 'proxied/api/v1/query_range?query=test&start=1508318769&end=1508318772&step=1';
  337. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  338. ctx.ds.query(query);
  339. ctx.$httpBackend.verifyNoOutstandingExpectation();
  340. });
  341. it('should be auto interval when greater than min interval', function() {
  342. var query = {
  343. // 6 hour range
  344. range: { from: moment(1443438674760), to: moment(1443460274760) },
  345. targets: [
  346. {
  347. expr: 'test',
  348. interval: '5s',
  349. },
  350. ],
  351. interval: '10s',
  352. };
  353. var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438670&end=1443460280&step=10';
  354. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  355. ctx.ds.query(query);
  356. ctx.$httpBackend.verifyNoOutstandingExpectation();
  357. });
  358. it('should result in querying fewer than 11000 data points', function() {
  359. var query = {
  360. // 6 hour range
  361. range: { from: moment(1443438674760), to: moment(1443460274760) },
  362. targets: [{ expr: 'test' }],
  363. interval: '1s',
  364. };
  365. var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438674&end=1443460276&step=2';
  366. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  367. ctx.ds.query(query);
  368. ctx.$httpBackend.verifyNoOutstandingExpectation();
  369. });
  370. it('should not apply min interval when interval * intervalFactor greater', function() {
  371. var query = {
  372. // 6 hour range
  373. range: { from: moment(1443438674760), to: moment(1443460274760) },
  374. targets: [
  375. {
  376. expr: 'test',
  377. interval: '10s',
  378. intervalFactor: 10,
  379. },
  380. ],
  381. interval: '5s',
  382. };
  383. var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438650&end=1443460300&step=50';
  384. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  385. ctx.ds.query(query);
  386. ctx.$httpBackend.verifyNoOutstandingExpectation();
  387. });
  388. it('should apply min interval when interval * intervalFactor smaller', function() {
  389. var query = {
  390. // 6 hour range
  391. range: { from: moment(1443438674760), to: moment(1443460274760) },
  392. targets: [
  393. {
  394. expr: 'test',
  395. interval: '15s',
  396. intervalFactor: 2,
  397. },
  398. ],
  399. interval: '5s',
  400. };
  401. var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438675&end=1443460290&step=15';
  402. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  403. ctx.ds.query(query);
  404. ctx.$httpBackend.verifyNoOutstandingExpectation();
  405. });
  406. it('should apply intervalFactor to auto interval when greater', function() {
  407. var query = {
  408. // 6 hour range
  409. range: { from: moment(1443438674760), to: moment(1443460274760) },
  410. targets: [
  411. {
  412. expr: 'test',
  413. interval: '5s',
  414. intervalFactor: 10,
  415. },
  416. ],
  417. interval: '10s',
  418. };
  419. var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438600&end=1443460300&step=100';
  420. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  421. ctx.ds.query(query);
  422. ctx.$httpBackend.verifyNoOutstandingExpectation();
  423. });
  424. it('should not not be affected by the 11000 data points limit when large enough', function() {
  425. var query = {
  426. // 1 week range
  427. range: { from: moment(1443438674760), to: moment(1444043474760) },
  428. targets: [
  429. {
  430. expr: 'test',
  431. intervalFactor: 10,
  432. },
  433. ],
  434. interval: '10s',
  435. };
  436. var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438600&end=1444043500&step=100';
  437. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  438. ctx.ds.query(query);
  439. ctx.$httpBackend.verifyNoOutstandingExpectation();
  440. });
  441. it('should be determined by the 11000 data points limit when too small', function() {
  442. var query = {
  443. // 1 week range
  444. range: { from: moment(1443438674760), to: moment(1444043474760) },
  445. targets: [
  446. {
  447. expr: 'test',
  448. intervalFactor: 10,
  449. },
  450. ],
  451. interval: '5s',
  452. };
  453. var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438660&end=1444043520&step=60';
  454. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  455. ctx.ds.query(query);
  456. ctx.$httpBackend.verifyNoOutstandingExpectation();
  457. });
  458. });
  459. describe('The __interval and __interval_ms template variables', function() {
  460. var response = {
  461. status: 'success',
  462. data: {
  463. resultType: 'matrix',
  464. result: [],
  465. },
  466. };
  467. it('should be unchanged when auto interval is greater than min interval', function() {
  468. var query = {
  469. // 6 hour range
  470. range: { from: moment(1443438674760), to: moment(1443460274760) },
  471. targets: [
  472. {
  473. expr: 'rate(test[$__interval])',
  474. interval: '5s',
  475. },
  476. ],
  477. interval: '10s',
  478. scopedVars: {
  479. __interval: { text: '10s', value: '10s' },
  480. __interval_ms: { text: 10 * 1000, value: 10 * 1000 },
  481. },
  482. };
  483. var urlExpected =
  484. 'proxied/api/v1/query_range?query=' +
  485. encodeURIComponent('rate(test[10s])') +
  486. '&start=1443438670&end=1443460280&step=10';
  487. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  488. ctx.ds.query(query);
  489. ctx.$httpBackend.verifyNoOutstandingExpectation();
  490. expect(query.scopedVars.__interval.text).to.be('10s');
  491. expect(query.scopedVars.__interval.value).to.be('10s');
  492. expect(query.scopedVars.__interval_ms.text).to.be(10 * 1000);
  493. expect(query.scopedVars.__interval_ms.value).to.be(10 * 1000);
  494. });
  495. it('should be min interval when it is greater than auto interval', function() {
  496. var query = {
  497. // 6 hour range
  498. range: { from: moment(1443438674760), to: moment(1443460274760) },
  499. targets: [
  500. {
  501. expr: 'rate(test[$__interval])',
  502. interval: '10s',
  503. },
  504. ],
  505. interval: '5s',
  506. scopedVars: {
  507. __interval: { text: '5s', value: '5s' },
  508. __interval_ms: { text: 5 * 1000, value: 5 * 1000 },
  509. },
  510. };
  511. var urlExpected =
  512. 'proxied/api/v1/query_range?query=' +
  513. encodeURIComponent('rate(test[10s])') +
  514. '&start=1443438670&end=1443460280&step=10';
  515. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  516. ctx.ds.query(query);
  517. ctx.$httpBackend.verifyNoOutstandingExpectation();
  518. expect(query.scopedVars.__interval.text).to.be('5s');
  519. expect(query.scopedVars.__interval.value).to.be('5s');
  520. expect(query.scopedVars.__interval_ms.text).to.be(5 * 1000);
  521. expect(query.scopedVars.__interval_ms.value).to.be(5 * 1000);
  522. });
  523. it('should account for intervalFactor', function() {
  524. var query = {
  525. // 6 hour range
  526. range: { from: moment(1443438674760), to: moment(1443460274760) },
  527. targets: [
  528. {
  529. expr: 'rate(test[$__interval])',
  530. interval: '5s',
  531. intervalFactor: 10,
  532. },
  533. ],
  534. interval: '10s',
  535. scopedVars: {
  536. __interval: { text: '10s', value: '10s' },
  537. __interval_ms: { text: 10 * 1000, value: 10 * 1000 },
  538. },
  539. };
  540. var urlExpected =
  541. 'proxied/api/v1/query_range?query=' +
  542. encodeURIComponent('rate(test[100s])') +
  543. '&start=1443438600&end=1443460300&step=100';
  544. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  545. ctx.ds.query(query);
  546. ctx.$httpBackend.verifyNoOutstandingExpectation();
  547. expect(query.scopedVars.__interval.text).to.be('10s');
  548. expect(query.scopedVars.__interval.value).to.be('10s');
  549. expect(query.scopedVars.__interval_ms.text).to.be(10 * 1000);
  550. expect(query.scopedVars.__interval_ms.value).to.be(10 * 1000);
  551. });
  552. it('should be interval * intervalFactor when greater than min interval', function() {
  553. var query = {
  554. // 6 hour range
  555. range: { from: moment(1443438674760), to: moment(1443460274760) },
  556. targets: [
  557. {
  558. expr: 'rate(test[$__interval])',
  559. interval: '10s',
  560. intervalFactor: 10,
  561. },
  562. ],
  563. interval: '5s',
  564. scopedVars: {
  565. __interval: { text: '5s', value: '5s' },
  566. __interval_ms: { text: 5 * 1000, value: 5 * 1000 },
  567. },
  568. };
  569. var urlExpected =
  570. 'proxied/api/v1/query_range?query=' +
  571. encodeURIComponent('rate(test[50s])') +
  572. '&start=1443438650&end=1443460300&step=50';
  573. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  574. ctx.ds.query(query);
  575. ctx.$httpBackend.verifyNoOutstandingExpectation();
  576. expect(query.scopedVars.__interval.text).to.be('5s');
  577. expect(query.scopedVars.__interval.value).to.be('5s');
  578. expect(query.scopedVars.__interval_ms.text).to.be(5 * 1000);
  579. expect(query.scopedVars.__interval_ms.value).to.be(5 * 1000);
  580. });
  581. it('should be min interval when greater than interval * intervalFactor', function() {
  582. var query = {
  583. // 6 hour range
  584. range: { from: moment(1443438674760), to: moment(1443460274760) },
  585. targets: [
  586. {
  587. expr: 'rate(test[$__interval])',
  588. interval: '15s',
  589. intervalFactor: 2,
  590. },
  591. ],
  592. interval: '5s',
  593. scopedVars: {
  594. __interval: { text: '5s', value: '5s' },
  595. __interval_ms: { text: 5 * 1000, value: 5 * 1000 },
  596. },
  597. };
  598. var urlExpected =
  599. 'proxied/api/v1/query_range?query=' +
  600. encodeURIComponent('rate(test[15s])') +
  601. '&start=1443438675&end=1443460290&step=15';
  602. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  603. ctx.ds.query(query);
  604. ctx.$httpBackend.verifyNoOutstandingExpectation();
  605. expect(query.scopedVars.__interval.text).to.be('5s');
  606. expect(query.scopedVars.__interval.value).to.be('5s');
  607. expect(query.scopedVars.__interval_ms.text).to.be(5 * 1000);
  608. expect(query.scopedVars.__interval_ms.value).to.be(5 * 1000);
  609. });
  610. it('should be determined by the 11000 data points limit, accounting for intervalFactor', function() {
  611. var query = {
  612. // 1 week range
  613. range: { from: moment(1443438674760), to: moment(1444043474760) },
  614. targets: [
  615. {
  616. expr: 'rate(test[$__interval])',
  617. intervalFactor: 10,
  618. },
  619. ],
  620. interval: '5s',
  621. scopedVars: {
  622. __interval: { text: '5s', value: '5s' },
  623. __interval_ms: { text: 5 * 1000, value: 5 * 1000 },
  624. },
  625. };
  626. var urlExpected =
  627. 'proxied/api/v1/query_range?query=' +
  628. encodeURIComponent('rate(test[60s])') +
  629. '&start=1443438660&end=1444043520&step=60';
  630. ctx.$httpBackend.expect('GET', urlExpected).respond(response);
  631. ctx.ds.query(query);
  632. ctx.$httpBackend.verifyNoOutstandingExpectation();
  633. expect(query.scopedVars.__interval.text).to.be('5s');
  634. expect(query.scopedVars.__interval.value).to.be('5s');
  635. expect(query.scopedVars.__interval_ms.text).to.be(5 * 1000);
  636. expect(query.scopedVars.__interval_ms.value).to.be(5 * 1000);
  637. });
  638. });
  639. });