elastic_response_specs.ts 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. ///<amd-dependency path="../elastic_response" name="ElasticResponse"/>
  2. import {describe, beforeEach, it, sinon, expect} from 'test/lib/common';
  3. declare var ElasticResponse: any;
  4. describe('ElasticResponse', function() {
  5. var targets;
  6. var response;
  7. var result;
  8. describe('simple query and count', function() {
  9. beforeEach(function() {
  10. targets = [{
  11. refId: 'A',
  12. metrics: [{type: 'count', id: '1'}],
  13. bucketAggs: [{type: 'date_histogram', field: '@timestamp', id: '2'}],
  14. }];
  15. response = {
  16. responses: [{
  17. aggregations: {
  18. "2": {
  19. buckets: [
  20. {
  21. doc_count: 10,
  22. key: 1000
  23. },
  24. {
  25. doc_count: 15,
  26. key: 2000
  27. }
  28. ]
  29. }
  30. }
  31. }]
  32. };
  33. result = new ElasticResponse(targets, response).getTimeSeries();
  34. });
  35. it('should return 1 series', function() {
  36. expect(result.data.length).to.be(1);
  37. expect(result.data[0].target).to.be('Count');
  38. expect(result.data[0].datapoints.length).to.be(2);
  39. expect(result.data[0].datapoints[0][0]).to.be(10);
  40. expect(result.data[0].datapoints[0][1]).to.be(1000);
  41. });
  42. });
  43. describe('simple query count & avg aggregation', function() {
  44. var result;
  45. beforeEach(function() {
  46. targets = [{
  47. refId: 'A',
  48. metrics: [{type: 'count', id: '1'}, {type: 'avg', field: 'value', id: '2'}],
  49. bucketAggs: [{type: 'date_histogram', field: '@timestamp', id: '3'}],
  50. }];
  51. response = {
  52. responses: [{
  53. aggregations: {
  54. "3": {
  55. buckets: [
  56. {
  57. "2": {value: 88},
  58. doc_count: 10,
  59. key: 1000
  60. },
  61. {
  62. "2": {value: 99},
  63. doc_count: 15,
  64. key: 2000
  65. }
  66. ]
  67. }
  68. }
  69. }]
  70. };
  71. result = new ElasticResponse(targets, response).getTimeSeries();
  72. });
  73. it('should return 2 series', function() {
  74. expect(result.data.length).to.be(2);
  75. expect(result.data[0].datapoints.length).to.be(2);
  76. expect(result.data[0].datapoints[0][0]).to.be(10);
  77. expect(result.data[0].datapoints[0][1]).to.be(1000);
  78. expect(result.data[1].target).to.be("Average value");
  79. expect(result.data[1].datapoints[0][0]).to.be(88);
  80. expect(result.data[1].datapoints[1][0]).to.be(99);
  81. });
  82. });
  83. describe('single group by query one metric', function() {
  84. var result;
  85. beforeEach(function() {
  86. targets = [{
  87. refId: 'A',
  88. metrics: [{type: 'count', id: '1'}],
  89. bucketAggs: [{type: 'terms', field: 'host', id: '2'}, {type: 'date_histogram', field: '@timestamp', id: '3'}],
  90. }];
  91. response = {
  92. responses: [{
  93. aggregations: {
  94. "2": {
  95. buckets: [
  96. {
  97. "3": {
  98. buckets: [
  99. {doc_count: 1, key: 1000},
  100. {doc_count: 3, key: 2000}
  101. ]
  102. },
  103. doc_count: 4,
  104. key: 'server1',
  105. },
  106. {
  107. "3": {
  108. buckets: [
  109. {doc_count: 2, key: 1000},
  110. {doc_count: 8, key: 2000}
  111. ]
  112. },
  113. doc_count: 10,
  114. key: 'server2',
  115. },
  116. ]
  117. }
  118. }
  119. }]
  120. };
  121. result = new ElasticResponse(targets, response).getTimeSeries();
  122. });
  123. it('should return 2 series', function() {
  124. expect(result.data.length).to.be(2);
  125. expect(result.data[0].datapoints.length).to.be(2);
  126. expect(result.data[0].target).to.be('server1');
  127. expect(result.data[1].target).to.be('server2');
  128. });
  129. });
  130. describe('single group by query two metrics', function() {
  131. var result;
  132. beforeEach(function() {
  133. targets = [{
  134. refId: 'A',
  135. metrics: [{type: 'count', id: '1'}, {type: 'avg', field: '@value', id: '4'}],
  136. bucketAggs: [{type: 'terms', field: 'host', id: '2'}, {type: 'date_histogram', field: '@timestamp', id: '3'}],
  137. }];
  138. response = {
  139. responses: [{
  140. aggregations: {
  141. "2": {
  142. buckets: [
  143. {
  144. "3": {
  145. buckets: [
  146. { "4": {value: 10}, doc_count: 1, key: 1000},
  147. { "4": {value: 12}, doc_count: 3, key: 2000}
  148. ]
  149. },
  150. doc_count: 4,
  151. key: 'server1',
  152. },
  153. {
  154. "3": {
  155. buckets: [
  156. { "4": {value: 20}, doc_count: 1, key: 1000},
  157. { "4": {value: 32}, doc_count: 3, key: 2000}
  158. ]
  159. },
  160. doc_count: 10,
  161. key: 'server2',
  162. },
  163. ]
  164. }
  165. }
  166. }]
  167. };
  168. result = new ElasticResponse(targets, response).getTimeSeries();
  169. });
  170. it('should return 2 series', function() {
  171. expect(result.data.length).to.be(4);
  172. expect(result.data[0].datapoints.length).to.be(2);
  173. expect(result.data[0].target).to.be('server1 Count');
  174. expect(result.data[1].target).to.be('server1 Average @value');
  175. expect(result.data[2].target).to.be('server2 Count');
  176. expect(result.data[3].target).to.be('server2 Average @value');
  177. });
  178. });
  179. describe('with percentiles ', function() {
  180. var result;
  181. beforeEach(function() {
  182. targets = [{
  183. refId: 'A',
  184. metrics: [{type: 'percentiles', settings: {percents: [75, 90]}, id: '1'}],
  185. bucketAggs: [{type: 'date_histogram', field: '@timestamp', id: '3'}],
  186. }];
  187. response = {
  188. responses: [{
  189. aggregations: {
  190. "3": {
  191. buckets: [
  192. {
  193. "1": {values: {"75": 3.3, "90": 5.5}},
  194. doc_count: 10,
  195. key: 1000
  196. },
  197. {
  198. "1": {values: {"75": 2.3, "90": 4.5}},
  199. doc_count: 15,
  200. key: 2000
  201. }
  202. ]
  203. }
  204. }
  205. }]
  206. };
  207. result = new ElasticResponse(targets, response).getTimeSeries();
  208. });
  209. it('should return 2 series', function() {
  210. expect(result.data.length).to.be(2);
  211. expect(result.data[0].datapoints.length).to.be(2);
  212. expect(result.data[0].target).to.be('p75');
  213. expect(result.data[1].target).to.be('p90');
  214. expect(result.data[0].datapoints[0][0]).to.be(3.3);
  215. expect(result.data[0].datapoints[0][1]).to.be(1000);
  216. expect(result.data[1].datapoints[1][0]).to.be(4.5);
  217. });
  218. });
  219. describe('with extended_stats', function() {
  220. var result;
  221. beforeEach(function() {
  222. targets = [{
  223. refId: 'A',
  224. metrics: [{type: 'extended_stats', meta: {max: true, std_deviation_bounds_upper: true}, id: '1'}],
  225. bucketAggs: [{type: 'terms', field: 'host', id: '3'}, {type: 'date_histogram', id: '4'}],
  226. }];
  227. response = {
  228. responses: [{
  229. aggregations: {
  230. "3": {
  231. buckets: [
  232. {
  233. key: 'server1',
  234. "4": {
  235. buckets: [{
  236. "1": {max: 10.2, min: 5.5, std_deviation_bounds: {upper: 3, lower: -2}},
  237. doc_count: 10,
  238. key: 1000
  239. }]
  240. }
  241. },
  242. {
  243. key: 'server2',
  244. "4": {
  245. buckets: [{
  246. "1": {max: 10.2, min: 5.5, std_deviation_bounds: {upper: 3, lower: -2}},
  247. doc_count: 10,
  248. key: 1000
  249. }]
  250. }
  251. },
  252. ]
  253. }
  254. }
  255. }]
  256. };
  257. result = new ElasticResponse(targets, response).getTimeSeries();
  258. });
  259. it('should return 4 series', function() {
  260. expect(result.data.length).to.be(4);
  261. expect(result.data[0].datapoints.length).to.be(1);
  262. expect(result.data[0].target).to.be('server1 Max');
  263. expect(result.data[1].target).to.be('server1 Std Dev Upper');
  264. expect(result.data[0].datapoints[0][0]).to.be(10.2);
  265. expect(result.data[1].datapoints[0][0]).to.be(3);
  266. });
  267. });
  268. describe('single group by with alias pattern', function() {
  269. var result;
  270. beforeEach(function() {
  271. targets = [{
  272. refId: 'A',
  273. metrics: [{type: 'count', id: '1'}],
  274. alias: '{{term @host}} {{metric}} and!',
  275. bucketAggs: [
  276. {type: 'terms', field: '@host', id: '2'},
  277. {type: 'date_histogram', field: '@timestamp', id: '3'}
  278. ],
  279. }];
  280. response = {
  281. responses: [{
  282. aggregations: {
  283. "2": {
  284. buckets: [
  285. {
  286. "3": {
  287. buckets: [
  288. {doc_count: 1, key: 1000},
  289. {doc_count: 3, key: 2000}
  290. ]
  291. },
  292. doc_count: 4,
  293. key: 'server1',
  294. },
  295. {
  296. "3": {
  297. buckets: [
  298. {doc_count: 2, key: 1000},
  299. {doc_count: 8, key: 2000}
  300. ]
  301. },
  302. doc_count: 10,
  303. key: 'server2',
  304. },
  305. ]
  306. }
  307. }
  308. }]
  309. };
  310. result = new ElasticResponse(targets, response).getTimeSeries();
  311. });
  312. it('should return 2 series', function() {
  313. expect(result.data.length).to.be(2);
  314. expect(result.data[0].datapoints.length).to.be(2);
  315. expect(result.data[0].target).to.be('server1 Count and!');
  316. expect(result.data[1].target).to.be('server2 Count and!');
  317. });
  318. });
  319. describe('with two filters agg', function() {
  320. var result;
  321. beforeEach(function() {
  322. targets = [{
  323. refId: 'A',
  324. metrics: [{type: 'count', id: '1'}],
  325. bucketAggs: [
  326. {
  327. id: '2',
  328. type: 'filters',
  329. settings: {
  330. filters: [
  331. {query: '@metric:cpu' },
  332. {query: '@metric:logins.count' },
  333. ]
  334. }
  335. },
  336. {type: 'date_histogram', field: '@timestamp', id: '3'}
  337. ],
  338. }];
  339. response = {
  340. responses: [{
  341. aggregations: {
  342. "2": {
  343. buckets: {
  344. "@metric:cpu": {
  345. "3": {
  346. buckets: [
  347. {doc_count: 1, key: 1000},
  348. {doc_count: 3, key: 2000}
  349. ]
  350. },
  351. },
  352. "@metric:logins.count": {
  353. "3": {
  354. buckets: [
  355. {doc_count: 2, key: 1000},
  356. {doc_count: 8, key: 2000}
  357. ]
  358. },
  359. },
  360. }
  361. }
  362. }
  363. }]
  364. };
  365. result = new ElasticResponse(targets, response).getTimeSeries();
  366. });
  367. it('should return 2 series', function() {
  368. expect(result.data.length).to.be(2);
  369. expect(result.data[0].datapoints.length).to.be(2);
  370. expect(result.data[0].target).to.be('@metric:cpu');
  371. expect(result.data[1].target).to.be('@metric:logins.count');
  372. });
  373. });
  374. describe('with dropfirst and last aggregation', function() {
  375. beforeEach(function() {
  376. targets = [{
  377. refId: 'A',
  378. metrics: [{ type: 'avg', id: '1' }, { type: 'count' }],
  379. bucketAggs: [{ id: '2', type: 'date_histogram', field: 'host', settings: { dropFirstLast: true} }],
  380. }];
  381. response = {
  382. responses: [{
  383. aggregations: {
  384. "2": {
  385. buckets: [
  386. {
  387. "1": { value: 1000 },
  388. key: 1,
  389. doc_count: 369,
  390. },
  391. {
  392. "1": { value: 2000 },
  393. key: 2,
  394. doc_count: 200,
  395. },
  396. {
  397. "1": { value: 2000 },
  398. key: 3,
  399. doc_count: 200,
  400. },
  401. ]
  402. }
  403. }
  404. }]
  405. };
  406. result = new ElasticResponse(targets, response).getTimeSeries();
  407. });
  408. it('should remove first and last value', function() {
  409. expect(result.data.length).to.be(2);
  410. expect(result.data[0].datapoints.length).to.be(1);
  411. });
  412. });
  413. describe('No group by time', function() {
  414. beforeEach(function() {
  415. targets = [{
  416. refId: 'A',
  417. metrics: [{type: 'avg', id: '1'}, {type: 'count' }],
  418. bucketAggs: [{id: '2', type: 'terms', field: 'host'}],
  419. }];
  420. response = {
  421. responses: [{
  422. aggregations: {
  423. "2": {
  424. buckets: [
  425. {
  426. "1": { value: 1000},
  427. key: "server-1",
  428. doc_count: 369,
  429. },
  430. {
  431. "1": { value: 2000},
  432. key: "server-2",
  433. doc_count: 200,
  434. },
  435. ]
  436. }
  437. }
  438. }]
  439. };
  440. result = new ElasticResponse(targets, response).getTimeSeries();
  441. });
  442. it('should return table', function() {
  443. expect(result.data.length).to.be(1);
  444. expect(result.data[0].type).to.be('docs');
  445. expect(result.data[0].datapoints.length).to.be(2);
  446. expect(result.data[0].datapoints[0].host).to.be("server-1");
  447. expect(result.data[0].datapoints[0].Average).to.be(1000);
  448. expect(result.data[0].datapoints[0].Count).to.be(369);
  449. expect(result.data[0].datapoints[1].host).to.be("server-2");
  450. expect(result.data[0].datapoints[1].Average).to.be(2000);
  451. });
  452. });
  453. describe('', function() {
  454. });
  455. describe('Raw documents query', function() {
  456. beforeEach(function() {
  457. targets = [{ refId: 'A', metrics: [{type: 'raw_document', id: '1'}], bucketAggs: [] }];
  458. response = {
  459. responses: [{
  460. hits: {
  461. total: 100,
  462. hits: [
  463. {
  464. _id: '1',
  465. _type: 'type',
  466. _index: 'index',
  467. _source: {sourceProp: "asd"},
  468. fields: {fieldProp: "field" },
  469. },
  470. {
  471. _source: {sourceProp: "asd2"},
  472. fields: {fieldProp: "field2" },
  473. }
  474. ]
  475. }
  476. }]
  477. };
  478. result = new ElasticResponse(targets, response).getTimeSeries();
  479. });
  480. it('should return docs', function() {
  481. expect(result.data.length).to.be(1);
  482. expect(result.data[0].type).to.be('docs');
  483. expect(result.data[0].total).to.be(100);
  484. expect(result.data[0].datapoints.length).to.be(2);
  485. expect(result.data[0].datapoints[0].sourceProp).to.be("asd");
  486. expect(result.data[0].datapoints[0].fieldProp).to.be("field");
  487. });
  488. });
  489. });