metric_find_query_specs.ts 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. import {
  2. describe,
  3. beforeEach,
  4. it,
  5. expect,
  6. angularMocks
  7. } from "test/lib/common";
  8. import moment from "moment";
  9. import helpers from "test/specs/helpers";
  10. import { PrometheusDatasource } from "../datasource";
  11. import PrometheusMetricFindQuery from "../metric_find_query";
  12. describe("PrometheusMetricFindQuery", function() {
  13. var ctx = new helpers.ServiceTestContext();
  14. var instanceSettings = {
  15. url: "proxied",
  16. directUrl: "direct",
  17. user: "test",
  18. password: "mupp",
  19. jsonData: {}
  20. };
  21. beforeEach(angularMocks.module("grafana.core"));
  22. beforeEach(angularMocks.module("grafana.services"));
  23. beforeEach(
  24. angularMocks.inject(function($q, $rootScope, $httpBackend, $injector) {
  25. ctx.$q = $q;
  26. ctx.$httpBackend = $httpBackend;
  27. ctx.$rootScope = $rootScope;
  28. ctx.ds = $injector.instantiate(PrometheusDatasource, {
  29. instanceSettings: instanceSettings
  30. });
  31. $httpBackend.when("GET", /\.html$/).respond("");
  32. })
  33. );
  34. describe("When performing metricFindQuery", function() {
  35. var results;
  36. var response;
  37. it("label_values(resource) should generate label search query", function() {
  38. response = {
  39. status: "success",
  40. data: ["value1", "value2", "value3"]
  41. };
  42. ctx.$httpBackend
  43. .expect("GET", "proxied/api/v1/label/resource/values")
  44. .respond(response);
  45. var pm = new PrometheusMetricFindQuery(
  46. ctx.ds,
  47. "label_values(resource)",
  48. ctx.timeSrv
  49. );
  50. pm.process().then(function(data) {
  51. results = data;
  52. });
  53. ctx.$httpBackend.flush();
  54. ctx.$rootScope.$apply();
  55. expect(results.length).to.be(3);
  56. });
  57. it("label_values(metric, resource) should generate series query", function() {
  58. response = {
  59. status: "success",
  60. data: [
  61. { __name__: "metric", resource: "value1" },
  62. { __name__: "metric", resource: "value2" },
  63. { __name__: "metric", resource: "value3" }
  64. ]
  65. };
  66. ctx.$httpBackend
  67. .expect(
  68. "GET",
  69. /proxied\/api\/v1\/series\?match\[\]=metric&start=.*&end=.*/
  70. )
  71. .respond(response);
  72. var pm = new PrometheusMetricFindQuery(
  73. ctx.ds,
  74. "label_values(metric, resource)",
  75. ctx.timeSrv
  76. );
  77. pm.process().then(function(data) {
  78. results = data;
  79. });
  80. ctx.$httpBackend.flush();
  81. ctx.$rootScope.$apply();
  82. expect(results.length).to.be(3);
  83. });
  84. it("label_values(metric, resource) should pass correct time", function() {
  85. ctx.timeSrv.setTime({
  86. from: moment.utc("2011-01-01"),
  87. to: moment.utc("2015-01-01")
  88. });
  89. ctx.$httpBackend
  90. .expect(
  91. "GET",
  92. /proxied\/api\/v1\/series\?match\[\]=metric&start=1293840000&end=1420070400/
  93. )
  94. .respond(response);
  95. var pm = new PrometheusMetricFindQuery(
  96. ctx.ds,
  97. "label_values(metric, resource)",
  98. ctx.timeSrv
  99. );
  100. pm.process().then(function(data) {
  101. results = data;
  102. });
  103. ctx.$httpBackend.flush();
  104. ctx.$rootScope.$apply();
  105. });
  106. it('label_values(metric{label1="foo", label2="bar", label3="baz"}, resource) should generate series query', function() {
  107. response = {
  108. status: "success",
  109. data: [
  110. { __name__: "metric", resource: "value1" },
  111. { __name__: "metric", resource: "value2" },
  112. { __name__: "metric", resource: "value3" }
  113. ]
  114. };
  115. ctx.$httpBackend
  116. .expect(
  117. "GET",
  118. /proxied\/api\/v1\/series\?match\[\]=metric&start=.*&end=.*/
  119. )
  120. .respond(response);
  121. var pm = new PrometheusMetricFindQuery(
  122. ctx.ds,
  123. "label_values(metric, resource)",
  124. ctx.timeSrv
  125. );
  126. pm.process().then(function(data) {
  127. results = data;
  128. });
  129. ctx.$httpBackend.flush();
  130. ctx.$rootScope.$apply();
  131. expect(results.length).to.be(3);
  132. });
  133. it("label_values(metric, resource) result should not contain empty string", function() {
  134. response = {
  135. status: "success",
  136. data: [
  137. { __name__: "metric", resource: "value1" },
  138. { __name__: "metric", resource: "value2" },
  139. { __name__: "metric", resource: "" }
  140. ]
  141. };
  142. ctx.$httpBackend
  143. .expect(
  144. "GET",
  145. /proxied\/api\/v1\/series\?match\[\]=metric&start=.*&end=.*/
  146. )
  147. .respond(response);
  148. var pm = new PrometheusMetricFindQuery(
  149. ctx.ds,
  150. "label_values(metric, resource)",
  151. ctx.timeSrv
  152. );
  153. pm.process().then(function(data) {
  154. results = data;
  155. });
  156. ctx.$httpBackend.flush();
  157. ctx.$rootScope.$apply();
  158. expect(results.length).to.be(2);
  159. expect(results[0].text).to.be("value1");
  160. expect(results[1].text).to.be("value2");
  161. });
  162. it("metrics(metric.*) should generate metric name query", function() {
  163. response = {
  164. status: "success",
  165. data: ["metric1", "metric2", "metric3", "nomatch"]
  166. };
  167. ctx.$httpBackend
  168. .expect("GET", "proxied/api/v1/label/__name__/values")
  169. .respond(response);
  170. var pm = new PrometheusMetricFindQuery(
  171. ctx.ds,
  172. "metrics(metric.*)",
  173. ctx.timeSrv
  174. );
  175. pm.process().then(function(data) {
  176. results = data;
  177. });
  178. ctx.$httpBackend.flush();
  179. ctx.$rootScope.$apply();
  180. expect(results.length).to.be(3);
  181. });
  182. it("query_result(metric) should generate metric name query", function() {
  183. response = {
  184. status: "success",
  185. data: {
  186. resultType: "vector",
  187. result: [
  188. {
  189. metric: { __name__: "metric", job: "testjob" },
  190. value: [1443454528.0, "3846"]
  191. }
  192. ]
  193. }
  194. };
  195. ctx.$httpBackend
  196. .expect("GET", /proxied\/api\/v1\/query\?query=metric&time=.*/)
  197. .respond(response);
  198. var pm = new PrometheusMetricFindQuery(
  199. ctx.ds,
  200. "query_result(metric)",
  201. ctx.timeSrv
  202. );
  203. pm.process().then(function(data) {
  204. results = data;
  205. });
  206. ctx.$httpBackend.flush();
  207. ctx.$rootScope.$apply();
  208. expect(results.length).to.be(1);
  209. expect(results[0].text).to.be('metric{job="testjob"} 3846 1443454528000');
  210. });
  211. });
  212. describe("When performing performSuggestQuery", function() {
  213. var results;
  214. var response;
  215. it("cache response", function() {
  216. response = {
  217. status: "success",
  218. data: ["value1", "value2", "value3"]
  219. };
  220. ctx.$httpBackend
  221. .expect("GET", "proxied/api/v1/label/__name__/values")
  222. .respond(response);
  223. ctx.ds.performSuggestQuery("value", true).then(function(data) {
  224. results = data;
  225. });
  226. ctx.$httpBackend.flush();
  227. ctx.$rootScope.$apply();
  228. expect(results.length).to.be(3);
  229. ctx.ds.performSuggestQuery("value", true).then(function(data) {
  230. // get from cache, no need to flush
  231. results = data;
  232. expect(results.length).to.be(3);
  233. });
  234. });
  235. });
  236. });