elastic_response.test.ts 25 KB

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