elasticResponse.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. define([
  2. ],
  3. function () {
  4. 'use strict';
  5. function ElasticResponse(targets, response) {
  6. this.targets = targets;
  7. this.response = response;
  8. }
  9. // This is quite complex
  10. // neeed to recurise down the nested buckets to build series
  11. ElasticResponse.prototype.processBuckets = function(aggs, target, series, level, parentName) {
  12. var seriesName, value, metric, i, y, bucket, aggDef, esAgg;
  13. function addMetricPoint(seriesName, value, time) {
  14. var current = series[seriesName];
  15. if (!current) {
  16. current = series[seriesName] = {target: seriesName, datapoints: []};
  17. }
  18. current.datapoints.push([value, time]);
  19. }
  20. aggDef = target.bucketAggs[level];
  21. esAgg = aggs[aggDef.id];
  22. for (i = 0; i < esAgg.buckets.length; i++) {
  23. bucket = esAgg.buckets[i];
  24. // if last agg collect series
  25. if (level === target.bucketAggs.length - 1) {
  26. for (y = 0; y < target.metrics.length; y++) {
  27. metric = target.metrics[y];
  28. seriesName = parentName;
  29. switch(metric.type) {
  30. case 'count': {
  31. seriesName += ' count';
  32. value = bucket.doc_count;
  33. addMetricPoint(seriesName, value, bucket.key);
  34. break;
  35. }
  36. case 'percentiles': {
  37. var values = bucket[metric.id].values;
  38. for (var prop in values) {
  39. addMetricPoint(seriesName + ' ' + prop, values[prop], bucket.key);
  40. }
  41. break;
  42. }
  43. case 'extended_stats': {
  44. var stats = bucket[metric.id];
  45. stats.std_deviation_bounds_upper = stats.std_deviation_bounds.upper;
  46. stats.std_deviation_bounds_lower = stats.std_deviation_bounds.lower;
  47. for (var statName in metric.meta) {
  48. if (metric.meta[statName]) {
  49. addMetricPoint(seriesName + ' ' + statName, stats[statName], bucket.key);
  50. }
  51. }
  52. break;
  53. }
  54. default: {
  55. seriesName += ' ' + metric.field + ' ' + metric.type;
  56. value = bucket[metric.id].value;
  57. addMetricPoint(seriesName, value, bucket.key);
  58. break;
  59. }
  60. }
  61. }
  62. }
  63. else {
  64. this.processBuckets(bucket, target, series, level+1, parentName + ' ' + bucket.key);
  65. }
  66. }
  67. };
  68. ElasticResponse.prototype.getTimeSeries = function() {
  69. var series = [];
  70. for (var i = 0; i < this.response.responses.length; i++) {
  71. var response = this.response.responses[i];
  72. if (response.error) {
  73. throw { message: response.error };
  74. }
  75. var aggregations = response.aggregations;
  76. var target = this.targets[i];
  77. var querySeries = {};
  78. this.processBuckets(aggregations, target, querySeries, 0, target.refId);
  79. for (var prop in querySeries) {
  80. if (querySeries.hasOwnProperty(prop)) {
  81. series.push(querySeries[prop]);
  82. }
  83. }
  84. }
  85. return { data: series };
  86. };
  87. return ElasticResponse;
  88. });