datasource_specs.ts 22 KB

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