metric_find_query_specs.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. import PrometheusMetricFindQuery from '../metric_find_query';
  6. describe('PrometheusMetricFindQuery', function() {
  7. var ctx = new helpers.ServiceTestContext();
  8. var instanceSettings = {url: 'proxied', directUrl: 'direct', user: 'test', password: 'mupp', jsonData: {}};
  9. beforeEach(angularMocks.module('grafana.core'));
  10. beforeEach(angularMocks.module('grafana.services'));
  11. beforeEach(angularMocks.inject(function($q, $rootScope, $httpBackend, $injector) {
  12. ctx.$q = $q;
  13. ctx.$httpBackend = $httpBackend;
  14. ctx.$rootScope = $rootScope;
  15. ctx.ds = $injector.instantiate(PrometheusDatasource, {instanceSettings: instanceSettings});
  16. $httpBackend.when('GET', /\.html$/).respond('');
  17. }));
  18. describe('When performing metricFindQuery', function() {
  19. var results;
  20. var response;
  21. it('label_values(resource) should generate label search query', function() {
  22. response = {
  23. status: "success",
  24. data: ["value1", "value2", "value3"]
  25. };
  26. ctx.$httpBackend.expect('GET', 'proxied/api/v1/label/resource/values').respond(response);
  27. var pm = new PrometheusMetricFindQuery(ctx.ds, 'label_values(resource)', ctx.timeSrv);
  28. pm.process().then(function(data) { results = data; });
  29. ctx.$httpBackend.flush();
  30. ctx.$rootScope.$apply();
  31. expect(results.length).to.be(3);
  32. });
  33. it('label_values(metric, resource) should generate series query', function() {
  34. response = {
  35. status: "success",
  36. data: [
  37. {__name__: "metric", resource: "value1"},
  38. {__name__: "metric", resource: "value2"},
  39. {__name__: "metric", resource: "value3"}
  40. ]
  41. };
  42. ctx.$httpBackend.expect('GET', /proxied\/api\/v1\/series\?match\[\]=metric&start=.*&end=.*/).respond(response);
  43. var pm = new PrometheusMetricFindQuery(ctx.ds, 'label_values(metric, resource)', ctx.timeSrv);
  44. pm.process().then(function(data) { results = data; });
  45. ctx.$httpBackend.flush();
  46. ctx.$rootScope.$apply();
  47. expect(results.length).to.be(3);
  48. });
  49. it('label_values(metric, resource) should pass correct time', function() {
  50. ctx.timeSrv.setTime({ from: moment.utc('2011-01-01'), to: moment.utc('2015-01-01') });
  51. ctx.$httpBackend.expect('GET',
  52. /proxied\/api\/v1\/series\?match\[\]=metric&start=1293840000&end=1420070400/).respond(response);
  53. var pm = new PrometheusMetricFindQuery(ctx.ds, 'label_values(metric, resource)', ctx.timeSrv);
  54. pm.process().then(function(data) { results = data; });
  55. ctx.$httpBackend.flush();
  56. ctx.$rootScope.$apply();
  57. });
  58. it('label_values(metric{label1="foo", label2="bar", label3="baz"}, resource) should generate series query', function() {
  59. response = {
  60. status: "success",
  61. data: [
  62. {__name__: "metric", resource: "value1"},
  63. {__name__: "metric", resource: "value2"},
  64. {__name__: "metric", resource: "value3"}
  65. ]
  66. };
  67. ctx.$httpBackend.expect('GET', /proxied\/api\/v1\/series\?match\[\]=metric&start=.*&end=.*/).respond(response);
  68. var pm = new PrometheusMetricFindQuery(ctx.ds, 'label_values(metric, resource)', ctx.timeSrv);
  69. pm.process().then(function(data) { results = data; });
  70. ctx.$httpBackend.flush();
  71. ctx.$rootScope.$apply();
  72. expect(results.length).to.be(3);
  73. });
  74. it('label_values(metric, resource) result should not contain empty string', function() {
  75. response = {
  76. status: "success",
  77. data: [
  78. {__name__: "metric", resource: "value1"},
  79. {__name__: "metric", resource: "value2"},
  80. {__name__: "metric", resource: ""}
  81. ]
  82. };
  83. ctx.$httpBackend.expect('GET', /proxied\/api\/v1\/series\?match\[\]=metric&start=.*&end=.*/).respond(response);
  84. var pm = new PrometheusMetricFindQuery(ctx.ds, 'label_values(metric, resource)', ctx.timeSrv);
  85. pm.process().then(function(data) { results = data; });
  86. ctx.$httpBackend.flush();
  87. ctx.$rootScope.$apply();
  88. expect(results.length).to.be(2);
  89. expect(results[0].text).to.be("value1");
  90. expect(results[1].text).to.be("value2");
  91. });
  92. it('metrics(metric.*) should generate metric name query', function() {
  93. response = {
  94. status: "success",
  95. data: ["metric1","metric2","metric3","nomatch"]
  96. };
  97. ctx.$httpBackend.expect('GET', 'proxied/api/v1/label/__name__/values').respond(response);
  98. var pm = new PrometheusMetricFindQuery(ctx.ds, 'metrics(metric.*)', ctx.timeSrv);
  99. pm.process().then(function(data) { results = data; });
  100. ctx.$httpBackend.flush();
  101. ctx.$rootScope.$apply();
  102. expect(results.length).to.be(3);
  103. });
  104. it('query_result(metric) should generate metric name query', function() {
  105. response = {
  106. status: "success",
  107. data: {
  108. resultType: "vector",
  109. result: [{
  110. metric: {"__name__": "metric", job: "testjob"},
  111. value: [1443454528.000, "3846"]
  112. }]
  113. }
  114. };
  115. ctx.$httpBackend.expect('GET', /proxied\/api\/v1\/query\?query=metric&time=.*/).respond(response);
  116. var pm = new PrometheusMetricFindQuery(ctx.ds, 'query_result(metric)', ctx.timeSrv);
  117. pm.process().then(function(data) { results = data; });
  118. ctx.$httpBackend.flush();
  119. ctx.$rootScope.$apply();
  120. expect(results.length).to.be(1);
  121. expect(results[0].text).to.be('metric{job="testjob"} 3846 1443454528000');
  122. });
  123. });
  124. describe('When performing performSuggestQuery', function() {
  125. var results;
  126. var response;
  127. it('cache response', function() {
  128. response = {
  129. status: "success",
  130. data: ["value1", "value2", "value3"]
  131. };
  132. ctx.$httpBackend.expect('GET', 'proxied/api/v1/label/__name__/values').respond(response);
  133. ctx.ds.performSuggestQuery('value', true).then(function(data) { results = data; });
  134. ctx.$httpBackend.flush();
  135. ctx.$rootScope.$apply();
  136. expect(results.length).to.be(3);
  137. ctx.ds.performSuggestQuery('value', true).then(function (data) {
  138. // get from cache, no need to flush
  139. results = data;
  140. expect(results.length).to.be(3);
  141. });
  142. });
  143. });
  144. });