elastic_response.test.ts 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897
  1. import { DataFrameView, KeyValue, MutableDataFrame } from '@grafana/data';
  2. import { ElasticResponse } from '../elastic_response';
  3. describe('ElasticResponse', () => {
  4. let targets;
  5. let response: any;
  6. let result: any;
  7. describe('simple query and count', () => {
  8. beforeEach(() => {
  9. targets = [
  10. {
  11. refId: 'A',
  12. metrics: [{ type: 'count', id: '1' }],
  13. bucketAggs: [{ type: 'date_histogram', field: '@timestamp', id: '2' }],
  14. },
  15. ];
  16. response = {
  17. responses: [
  18. {
  19. aggregations: {
  20. '2': {
  21. buckets: [
  22. {
  23. doc_count: 10,
  24. key: 1000,
  25. },
  26. {
  27. doc_count: 15,
  28. key: 2000,
  29. },
  30. ],
  31. },
  32. },
  33. },
  34. ],
  35. };
  36. result = new ElasticResponse(targets, response).getTimeSeries();
  37. });
  38. it('should return 1 series', () => {
  39. expect(result.data.length).toBe(1);
  40. expect(result.data[0].target).toBe('Count');
  41. expect(result.data[0].datapoints.length).toBe(2);
  42. expect(result.data[0].datapoints[0][0]).toBe(10);
  43. expect(result.data[0].datapoints[0][1]).toBe(1000);
  44. });
  45. });
  46. describe('simple query count & avg aggregation', () => {
  47. let result: any;
  48. beforeEach(() => {
  49. targets = [
  50. {
  51. refId: 'A',
  52. metrics: [{ type: 'count', id: '1' }, { type: 'avg', field: 'value', id: '2' }],
  53. bucketAggs: [{ type: 'date_histogram', field: '@timestamp', id: '3' }],
  54. },
  55. ];
  56. response = {
  57. responses: [
  58. {
  59. aggregations: {
  60. '3': {
  61. buckets: [
  62. {
  63. '2': { value: 88 },
  64. doc_count: 10,
  65. key: 1000,
  66. },
  67. {
  68. '2': { value: 99 },
  69. doc_count: 15,
  70. key: 2000,
  71. },
  72. ],
  73. },
  74. },
  75. },
  76. ],
  77. };
  78. result = new ElasticResponse(targets, response).getTimeSeries();
  79. });
  80. it('should return 2 series', () => {
  81. expect(result.data.length).toBe(2);
  82. expect(result.data[0].datapoints.length).toBe(2);
  83. expect(result.data[0].datapoints[0][0]).toBe(10);
  84. expect(result.data[0].datapoints[0][1]).toBe(1000);
  85. expect(result.data[1].target).toBe('Average value');
  86. expect(result.data[1].datapoints[0][0]).toBe(88);
  87. expect(result.data[1].datapoints[1][0]).toBe(99);
  88. });
  89. });
  90. describe('single group by query one metric', () => {
  91. let result: any;
  92. beforeEach(() => {
  93. targets = [
  94. {
  95. refId: 'A',
  96. metrics: [{ type: 'count', id: '1' }],
  97. bucketAggs: [
  98. { type: 'terms', field: 'host', id: '2' },
  99. { type: 'date_histogram', field: '@timestamp', id: '3' },
  100. ],
  101. },
  102. ];
  103. response = {
  104. responses: [
  105. {
  106. aggregations: {
  107. '2': {
  108. buckets: [
  109. {
  110. '3': {
  111. buckets: [{ doc_count: 1, key: 1000 }, { doc_count: 3, key: 2000 }],
  112. },
  113. doc_count: 4,
  114. key: 'server1',
  115. },
  116. {
  117. '3': {
  118. buckets: [{ doc_count: 2, key: 1000 }, { doc_count: 8, key: 2000 }],
  119. },
  120. doc_count: 10,
  121. key: 'server2',
  122. },
  123. ],
  124. },
  125. },
  126. },
  127. ],
  128. };
  129. result = new ElasticResponse(targets, response).getTimeSeries();
  130. });
  131. it('should return 2 series', () => {
  132. expect(result.data.length).toBe(2);
  133. expect(result.data[0].datapoints.length).toBe(2);
  134. expect(result.data[0].target).toBe('server1');
  135. expect(result.data[1].target).toBe('server2');
  136. });
  137. });
  138. describe('single group by query two metrics', () => {
  139. let result: any;
  140. beforeEach(() => {
  141. targets = [
  142. {
  143. refId: 'A',
  144. metrics: [{ type: 'count', id: '1' }, { type: 'avg', field: '@value', id: '4' }],
  145. bucketAggs: [
  146. { type: 'terms', field: 'host', id: '2' },
  147. { type: 'date_histogram', field: '@timestamp', id: '3' },
  148. ],
  149. },
  150. ];
  151. response = {
  152. responses: [
  153. {
  154. aggregations: {
  155. '2': {
  156. buckets: [
  157. {
  158. '3': {
  159. buckets: [
  160. { '4': { value: 10 }, doc_count: 1, key: 1000 },
  161. { '4': { value: 12 }, doc_count: 3, key: 2000 },
  162. ],
  163. },
  164. doc_count: 4,
  165. key: 'server1',
  166. },
  167. {
  168. '3': {
  169. buckets: [
  170. { '4': { value: 20 }, doc_count: 1, key: 1000 },
  171. { '4': { value: 32 }, doc_count: 3, key: 2000 },
  172. ],
  173. },
  174. doc_count: 10,
  175. key: 'server2',
  176. },
  177. ],
  178. },
  179. },
  180. },
  181. ],
  182. };
  183. result = new ElasticResponse(targets, response).getTimeSeries();
  184. });
  185. it('should return 2 series', () => {
  186. expect(result.data.length).toBe(4);
  187. expect(result.data[0].datapoints.length).toBe(2);
  188. expect(result.data[0].target).toBe('server1 Count');
  189. expect(result.data[1].target).toBe('server1 Average @value');
  190. expect(result.data[2].target).toBe('server2 Count');
  191. expect(result.data[3].target).toBe('server2 Average @value');
  192. });
  193. });
  194. describe('with percentiles ', () => {
  195. let result: any;
  196. beforeEach(() => {
  197. targets = [
  198. {
  199. refId: 'A',
  200. metrics: [{ type: 'percentiles', settings: { percents: [75, 90] }, id: '1' }],
  201. bucketAggs: [{ type: 'date_histogram', field: '@timestamp', id: '3' }],
  202. },
  203. ];
  204. response = {
  205. responses: [
  206. {
  207. aggregations: {
  208. '3': {
  209. buckets: [
  210. {
  211. '1': { values: { '75': 3.3, '90': 5.5 } },
  212. doc_count: 10,
  213. key: 1000,
  214. },
  215. {
  216. '1': { values: { '75': 2.3, '90': 4.5 } },
  217. doc_count: 15,
  218. key: 2000,
  219. },
  220. ],
  221. },
  222. },
  223. },
  224. ],
  225. };
  226. result = new ElasticResponse(targets, response).getTimeSeries();
  227. });
  228. it('should return 2 series', () => {
  229. expect(result.data.length).toBe(2);
  230. expect(result.data[0].datapoints.length).toBe(2);
  231. expect(result.data[0].target).toBe('p75');
  232. expect(result.data[1].target).toBe('p90');
  233. expect(result.data[0].datapoints[0][0]).toBe(3.3);
  234. expect(result.data[0].datapoints[0][1]).toBe(1000);
  235. expect(result.data[1].datapoints[1][0]).toBe(4.5);
  236. });
  237. });
  238. describe('with extended_stats', () => {
  239. let result: any;
  240. beforeEach(() => {
  241. targets = [
  242. {
  243. refId: 'A',
  244. metrics: [
  245. {
  246. type: 'extended_stats',
  247. meta: { max: true, std_deviation_bounds_upper: true },
  248. id: '1',
  249. },
  250. ],
  251. bucketAggs: [{ type: 'terms', field: 'host', id: '3' }, { type: 'date_histogram', id: '4' }],
  252. },
  253. ];
  254. response = {
  255. responses: [
  256. {
  257. aggregations: {
  258. '3': {
  259. buckets: [
  260. {
  261. key: 'server1',
  262. '4': {
  263. buckets: [
  264. {
  265. '1': {
  266. max: 10.2,
  267. min: 5.5,
  268. std_deviation_bounds: { upper: 3, lower: -2 },
  269. },
  270. doc_count: 10,
  271. key: 1000,
  272. },
  273. ],
  274. },
  275. },
  276. {
  277. key: 'server2',
  278. '4': {
  279. buckets: [
  280. {
  281. '1': {
  282. max: 10.2,
  283. min: 5.5,
  284. std_deviation_bounds: { upper: 3, lower: -2 },
  285. },
  286. doc_count: 10,
  287. key: 1000,
  288. },
  289. ],
  290. },
  291. },
  292. ],
  293. },
  294. },
  295. },
  296. ],
  297. };
  298. result = new ElasticResponse(targets, response).getTimeSeries();
  299. });
  300. it('should return 4 series', () => {
  301. expect(result.data.length).toBe(4);
  302. expect(result.data[0].datapoints.length).toBe(1);
  303. expect(result.data[0].target).toBe('server1 Max');
  304. expect(result.data[1].target).toBe('server1 Std Dev Upper');
  305. expect(result.data[0].datapoints[0][0]).toBe(10.2);
  306. expect(result.data[1].datapoints[0][0]).toBe(3);
  307. });
  308. });
  309. describe('single group by with alias pattern', () => {
  310. let result: any;
  311. beforeEach(() => {
  312. targets = [
  313. {
  314. refId: 'A',
  315. metrics: [{ type: 'count', id: '1' }],
  316. alias: '{{term @host}} {{metric}} and {{not_exist}} {{@host}}',
  317. bucketAggs: [
  318. { type: 'terms', field: '@host', id: '2' },
  319. { type: 'date_histogram', field: '@timestamp', id: '3' },
  320. ],
  321. },
  322. ];
  323. response = {
  324. responses: [
  325. {
  326. aggregations: {
  327. '2': {
  328. buckets: [
  329. {
  330. '3': {
  331. buckets: [{ doc_count: 1, key: 1000 }, { doc_count: 3, key: 2000 }],
  332. },
  333. doc_count: 4,
  334. key: 'server1',
  335. },
  336. {
  337. '3': {
  338. buckets: [{ doc_count: 2, key: 1000 }, { doc_count: 8, key: 2000 }],
  339. },
  340. doc_count: 10,
  341. key: 'server2',
  342. },
  343. {
  344. '3': {
  345. buckets: [{ doc_count: 2, key: 1000 }, { doc_count: 8, key: 2000 }],
  346. },
  347. doc_count: 10,
  348. key: 0,
  349. },
  350. ],
  351. },
  352. },
  353. },
  354. ],
  355. };
  356. result = new ElasticResponse(targets, response).getTimeSeries();
  357. });
  358. it('should return 2 series', () => {
  359. expect(result.data.length).toBe(3);
  360. expect(result.data[0].datapoints.length).toBe(2);
  361. expect(result.data[0].target).toBe('server1 Count and {{not_exist}} server1');
  362. expect(result.data[1].target).toBe('server2 Count and {{not_exist}} server2');
  363. expect(result.data[2].target).toBe('0 Count and {{not_exist}} 0');
  364. });
  365. });
  366. describe('histogram response', () => {
  367. let result: any;
  368. beforeEach(() => {
  369. targets = [
  370. {
  371. refId: 'A',
  372. metrics: [{ type: 'count', id: '1' }],
  373. bucketAggs: [{ type: 'histogram', field: 'bytes', id: '3' }],
  374. },
  375. ];
  376. response = {
  377. responses: [
  378. {
  379. aggregations: {
  380. '3': {
  381. buckets: [{ doc_count: 1, key: 1000 }, { doc_count: 3, key: 2000 }, { doc_count: 2, key: 1000 }],
  382. },
  383. },
  384. },
  385. ],
  386. };
  387. result = new ElasticResponse(targets, response).getTimeSeries();
  388. });
  389. it('should return table with byte and count', () => {
  390. expect(result.data[0].rows.length).toBe(3);
  391. expect(result.data[0].columns).toEqual([{ text: 'bytes', filterable: true }, { text: 'Count' }]);
  392. });
  393. });
  394. describe('with two filters agg', () => {
  395. let result: any;
  396. beforeEach(() => {
  397. targets = [
  398. {
  399. refId: 'A',
  400. metrics: [{ type: 'count', id: '1' }],
  401. bucketAggs: [
  402. {
  403. id: '2',
  404. type: 'filters',
  405. settings: {
  406. filters: [{ query: '@metric:cpu' }, { query: '@metric:logins.count' }],
  407. },
  408. },
  409. { type: 'date_histogram', field: '@timestamp', id: '3' },
  410. ],
  411. },
  412. ];
  413. response = {
  414. responses: [
  415. {
  416. aggregations: {
  417. '2': {
  418. buckets: {
  419. '@metric:cpu': {
  420. '3': {
  421. buckets: [{ doc_count: 1, key: 1000 }, { doc_count: 3, key: 2000 }],
  422. },
  423. },
  424. '@metric:logins.count': {
  425. '3': {
  426. buckets: [{ doc_count: 2, key: 1000 }, { doc_count: 8, key: 2000 }],
  427. },
  428. },
  429. },
  430. },
  431. },
  432. },
  433. ],
  434. };
  435. result = new ElasticResponse(targets, response).getTimeSeries();
  436. });
  437. it('should return 2 series', () => {
  438. expect(result.data.length).toBe(2);
  439. expect(result.data[0].datapoints.length).toBe(2);
  440. expect(result.data[0].target).toBe('@metric:cpu');
  441. expect(result.data[1].target).toBe('@metric:logins.count');
  442. });
  443. });
  444. describe('with dropfirst and last aggregation', () => {
  445. beforeEach(() => {
  446. targets = [
  447. {
  448. refId: 'A',
  449. metrics: [{ type: 'avg', id: '1' }, { type: 'count' }],
  450. bucketAggs: [
  451. {
  452. id: '2',
  453. type: 'date_histogram',
  454. field: 'host',
  455. settings: { trimEdges: 1 },
  456. },
  457. ],
  458. },
  459. ];
  460. response = {
  461. responses: [
  462. {
  463. aggregations: {
  464. '2': {
  465. buckets: [
  466. {
  467. '1': { value: 1000 },
  468. key: 1,
  469. doc_count: 369,
  470. },
  471. {
  472. '1': { value: 2000 },
  473. key: 2,
  474. doc_count: 200,
  475. },
  476. {
  477. '1': { value: 2000 },
  478. key: 3,
  479. doc_count: 200,
  480. },
  481. ],
  482. },
  483. },
  484. },
  485. ],
  486. };
  487. result = new ElasticResponse(targets, response).getTimeSeries();
  488. });
  489. it('should remove first and last value', () => {
  490. expect(result.data.length).toBe(2);
  491. expect(result.data[0].datapoints.length).toBe(1);
  492. });
  493. });
  494. describe('No group by time', () => {
  495. beforeEach(() => {
  496. targets = [
  497. {
  498. refId: 'A',
  499. metrics: [{ type: 'avg', id: '1' }, { type: 'count' }],
  500. bucketAggs: [{ id: '2', type: 'terms', field: 'host' }],
  501. },
  502. ];
  503. response = {
  504. responses: [
  505. {
  506. aggregations: {
  507. '2': {
  508. buckets: [
  509. {
  510. '1': { value: 1000 },
  511. key: 'server-1',
  512. doc_count: 369,
  513. },
  514. {
  515. '1': { value: 2000 },
  516. key: 'server-2',
  517. doc_count: 200,
  518. },
  519. ],
  520. },
  521. },
  522. },
  523. ],
  524. };
  525. result = new ElasticResponse(targets, response).getTimeSeries();
  526. });
  527. it('should return table', () => {
  528. expect(result.data.length).toBe(1);
  529. expect(result.data[0].type).toBe('table');
  530. expect(result.data[0].rows.length).toBe(2);
  531. expect(result.data[0].rows[0][0]).toBe('server-1');
  532. expect(result.data[0].rows[0][1]).toBe(1000);
  533. expect(result.data[0].rows[0][2]).toBe(369);
  534. expect(result.data[0].rows[1][0]).toBe('server-2');
  535. expect(result.data[0].rows[1][1]).toBe(2000);
  536. });
  537. });
  538. describe('No group by time with percentiles ', () => {
  539. let result: any;
  540. beforeEach(() => {
  541. targets = [
  542. {
  543. refId: 'A',
  544. metrics: [{ type: 'percentiles', field: 'value', settings: { percents: [75, 90] }, id: '1' }],
  545. bucketAggs: [{ type: 'term', field: 'id', id: '3' }],
  546. },
  547. ];
  548. response = {
  549. responses: [
  550. {
  551. aggregations: {
  552. '3': {
  553. buckets: [
  554. {
  555. '1': { values: { '75': 3.3, '90': 5.5 } },
  556. doc_count: 10,
  557. key: 'id1',
  558. },
  559. {
  560. '1': { values: { '75': 2.3, '90': 4.5 } },
  561. doc_count: 15,
  562. key: 'id2',
  563. },
  564. ],
  565. },
  566. },
  567. },
  568. ],
  569. };
  570. result = new ElasticResponse(targets, response).getTimeSeries();
  571. });
  572. it('should return table', () => {
  573. expect(result.data.length).toBe(1);
  574. expect(result.data[0].type).toBe('table');
  575. expect(result.data[0].columns[0].text).toBe('id');
  576. expect(result.data[0].columns[1].text).toBe('p75 value');
  577. expect(result.data[0].columns[2].text).toBe('p90 value');
  578. expect(result.data[0].rows.length).toBe(2);
  579. expect(result.data[0].rows[0][0]).toBe('id1');
  580. expect(result.data[0].rows[0][1]).toBe(3.3);
  581. expect(result.data[0].rows[0][2]).toBe(5.5);
  582. expect(result.data[0].rows[1][0]).toBe('id2');
  583. expect(result.data[0].rows[1][1]).toBe(2.3);
  584. expect(result.data[0].rows[1][2]).toBe(4.5);
  585. });
  586. });
  587. describe('Multiple metrics of same type', () => {
  588. beforeEach(() => {
  589. targets = [
  590. {
  591. refId: 'A',
  592. metrics: [{ type: 'avg', id: '1', field: 'test' }, { type: 'avg', id: '2', field: 'test2' }],
  593. bucketAggs: [{ id: '2', type: 'terms', field: 'host' }],
  594. },
  595. ];
  596. response = {
  597. responses: [
  598. {
  599. aggregations: {
  600. '2': {
  601. buckets: [
  602. {
  603. '1': { value: 1000 },
  604. '2': { value: 3000 },
  605. key: 'server-1',
  606. doc_count: 369,
  607. },
  608. ],
  609. },
  610. },
  611. },
  612. ],
  613. };
  614. result = new ElasticResponse(targets, response).getTimeSeries();
  615. });
  616. it('should include field in metric name', () => {
  617. expect(result.data[0].type).toBe('table');
  618. expect(result.data[0].rows[0][1]).toBe(1000);
  619. expect(result.data[0].rows[0][2]).toBe(3000);
  620. });
  621. });
  622. describe('Raw documents query', () => {
  623. beforeEach(() => {
  624. targets = [
  625. {
  626. refId: 'A',
  627. metrics: [{ type: 'raw_document', id: '1' }],
  628. bucketAggs: [],
  629. },
  630. ];
  631. response = {
  632. responses: [
  633. {
  634. hits: {
  635. total: 100,
  636. hits: [
  637. {
  638. _id: '1',
  639. _type: 'type',
  640. _index: 'index',
  641. _source: { sourceProp: 'asd' },
  642. fields: { fieldProp: 'field' },
  643. },
  644. {
  645. _source: { sourceProp: 'asd2' },
  646. fields: { fieldProp: 'field2' },
  647. },
  648. ],
  649. },
  650. },
  651. ],
  652. };
  653. result = new ElasticResponse(targets, response).getTimeSeries();
  654. });
  655. it('should return docs', () => {
  656. expect(result.data.length).toBe(1);
  657. expect(result.data[0].type).toBe('docs');
  658. expect(result.data[0].total).toBe(100);
  659. expect(result.data[0].datapoints.length).toBe(2);
  660. expect(result.data[0].datapoints[0].sourceProp).toBe('asd');
  661. expect(result.data[0].datapoints[0].fieldProp).toBe('field');
  662. });
  663. });
  664. describe('with bucket_script ', () => {
  665. let result: any;
  666. beforeEach(() => {
  667. targets = [
  668. {
  669. refId: 'A',
  670. metrics: [
  671. { id: '1', type: 'sum', field: '@value' },
  672. { id: '3', type: 'max', field: '@value' },
  673. {
  674. id: '4',
  675. field: 'select field',
  676. pipelineVariables: [{ name: 'var1', pipelineAgg: '1' }, { name: 'var2', pipelineAgg: '3' }],
  677. settings: { script: 'params.var1 * params.var2' },
  678. type: 'bucket_script',
  679. },
  680. ],
  681. bucketAggs: [{ type: 'date_histogram', field: '@timestamp', id: '2' }],
  682. },
  683. ];
  684. response = {
  685. responses: [
  686. {
  687. aggregations: {
  688. '2': {
  689. buckets: [
  690. {
  691. 1: { value: 2 },
  692. 3: { value: 3 },
  693. 4: { value: 6 },
  694. doc_count: 60,
  695. key: 1000,
  696. },
  697. {
  698. 1: { value: 3 },
  699. 3: { value: 4 },
  700. 4: { value: 12 },
  701. doc_count: 60,
  702. key: 2000,
  703. },
  704. ],
  705. },
  706. },
  707. },
  708. ],
  709. };
  710. result = new ElasticResponse(targets, response).getTimeSeries();
  711. });
  712. it('should return 3 series', () => {
  713. expect(result.data.length).toBe(3);
  714. expect(result.data[0].datapoints.length).toBe(2);
  715. expect(result.data[0].target).toBe('Sum @value');
  716. expect(result.data[1].target).toBe('Max @value');
  717. expect(result.data[2].target).toBe('Sum @value * Max @value');
  718. expect(result.data[0].datapoints[0][0]).toBe(2);
  719. expect(result.data[1].datapoints[0][0]).toBe(3);
  720. expect(result.data[2].datapoints[0][0]).toBe(6);
  721. expect(result.data[0].datapoints[1][0]).toBe(3);
  722. expect(result.data[1].datapoints[1][0]).toBe(4);
  723. expect(result.data[2].datapoints[1][0]).toBe(12);
  724. });
  725. });
  726. describe('simple logs query and count', () => {
  727. beforeEach(() => {
  728. targets = [
  729. {
  730. refId: 'A',
  731. metrics: [{ type: 'count', id: '1' }],
  732. bucketAggs: [{ type: 'date_histogram', settings: { interval: 'auto' }, id: '2' }],
  733. context: 'explore',
  734. interval: '10s',
  735. isLogsQuery: true,
  736. key: 'Q-1561369883389-0.7611823271062786-0',
  737. live: false,
  738. maxDataPoints: 1620,
  739. query: '',
  740. timeField: '@timestamp',
  741. },
  742. ];
  743. response = {
  744. responses: [
  745. {
  746. aggregations: {
  747. '2': {
  748. buckets: [
  749. {
  750. doc_count: 10,
  751. key: 1000,
  752. },
  753. {
  754. doc_count: 15,
  755. key: 2000,
  756. },
  757. ],
  758. },
  759. },
  760. hits: {
  761. hits: [
  762. {
  763. _id: 'fdsfs',
  764. _type: '_doc',
  765. _index: 'mock-index',
  766. _source: {
  767. '@timestamp': '2019-06-24T09:51:19.765Z',
  768. host: 'djisaodjsoad',
  769. message: 'hello, i am a message',
  770. },
  771. fields: {
  772. '@timestamp': ['2019-06-24T09:51:19.765Z'],
  773. },
  774. },
  775. {
  776. _id: 'kdospaidopa',
  777. _type: '_doc',
  778. _index: 'mock-index',
  779. _source: {
  780. '@timestamp': '2019-06-24T09:52:19.765Z',
  781. host: 'dsalkdakdop',
  782. message: 'hello, i am also message',
  783. },
  784. fields: {
  785. '@timestamp': ['2019-06-24T09:52:19.765Z'],
  786. },
  787. },
  788. ],
  789. },
  790. },
  791. ],
  792. };
  793. result = new ElasticResponse(targets, response).getLogs();
  794. });
  795. it('should return histogram aggregation and documents', () => {
  796. expect(result.data.length).toBe(2);
  797. const logResults = result.data[0] as MutableDataFrame;
  798. const fields = logResults.fields.map(f => {
  799. return {
  800. name: f.name,
  801. type: f.type,
  802. };
  803. });
  804. expect(fields).toContainEqual({ name: '@timestamp', type: 'time' });
  805. expect(fields).toContainEqual({ name: 'host', type: 'string' });
  806. expect(fields).toContainEqual({ name: 'message', type: 'string' });
  807. let rows = new DataFrameView(logResults);
  808. for (let i = 0; i < rows.length; i++) {
  809. const r = rows.get(i);
  810. expect(r._id).toEqual(response.responses[0].hits.hits[i]._id);
  811. expect(r._type).toEqual(response.responses[0].hits.hits[i]._type);
  812. expect(r._index).toEqual(response.responses[0].hits.hits[i]._index);
  813. expect(r._source).toEqual(response.responses[0].hits.hits[i]._source);
  814. }
  815. // Make a map from the histogram results
  816. const hist: KeyValue<number> = {};
  817. const histogramResults = new MutableDataFrame(result.data[1]);
  818. rows = new DataFrameView(histogramResults);
  819. for (let i = 0; i < rows.length; i++) {
  820. const row = rows.get(i);
  821. hist[row.Time] = row.Count;
  822. }
  823. response.responses[0].aggregations['2'].buckets.forEach((bucket: any) => {
  824. expect(hist[bucket.key]).toEqual(bucket.doc_count);
  825. });
  826. });
  827. });
  828. });