txchen
11/19/2014 - 12:57 AM

Patch for kibana4, to enable percentile aggregation (dirty and hacky) title

Patch for kibana4, to enable percentile aggregation (dirty and hacky) descdesc

From e7299b01d3367be2a54b89ca4a90db9f3edbab90 Mon Sep 17 00:00:00 2001
From: Tianxiang Chen <txchendev@gmail.com>
Date: Tue, 18 Nov 2014 16:55:43 -0800
Subject: [PATCH] add percentile metric support

---
 src/kibana/components/agg_response/flat.js         | 10 +++++++-
 .../components/agg_response/tabify/tabify.js       |  6 +++++
 src/kibana/components/agg_types/metric_aggs.js     | 27 +++++++++++++++++++++-
 3 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/src/kibana/components/agg_response/flat.js b/src/kibana/components/agg_response/flat.js
index 2c454ad..bcc199b 100644
--- a/src/kibana/components/agg_response/flat.js
+++ b/src/kibana/components/agg_response/flat.js
@@ -72,7 +72,15 @@ define(function (require) {
           row[i] = val;
         });
 
-        var metric = bucket.value == null ? bucket.doc_count : bucket.value;
+        var metric = null;
+        if (bucket.values != null) {
+          for (var firstKey in bucket.values) break;
+          if (bucket.values[firstKey] != null) {
+            metric = bucket.values[firstKey];
+          }
+        } else {
+          metric = bucket.value == null ? bucket.doc_count : bucket.value;
+        }
         if (metric != null) {
           row[row.length - 1] = metric;
         } else {
diff --git a/src/kibana/components/agg_response/tabify/tabify.js b/src/kibana/components/agg_response/tabify/tabify.js
index 04e758f..74f07b9 100644
--- a/src/kibana/components/agg_response/tabify/tabify.js
+++ b/src/kibana/components/agg_response/tabify/tabify.js
@@ -80,6 +80,12 @@ define(function (require) {
 
     // read the metric value from a metric response
     function metricValue(aggResp) {
+      if (aggResp.values != null) {
+        for (var firstKey in aggResp.values) break;
+        if (aggResp.values[firstKey] != null) {
+          return aggResp.values[firstKey];
+        }
+      }
       return aggResp.value == null ? 0 : aggResp.value;
     }
 
diff --git a/src/kibana/components/agg_types/metric_aggs.js b/src/kibana/components/agg_types/metric_aggs.js
index cbed3c9..0fdef2c 100644
--- a/src/kibana/components/agg_types/metric_aggs.js
+++ b/src/kibana/components/agg_types/metric_aggs.js
@@ -74,9 +74,34 @@ define(function (require) {
             name: 'field'
           }
         ]
+      },
+      {
+        name: 'percentiles',
+        title: 'Percentiles',
+        makeLabel: function (aggConfig) {
+          return aggConfig.params.percents + ' percentile of ' + aggConfig.params.field.name;
+        },
+        params: [
+          {
+            name: 'field',
+            filterFieldTypes: 'number'
+          },
+          {
+            name: 'percents',
+            default:  95 ,
+            editor: '<div class="vis-editor-agg-form-row">\n  <div class="form-group">\n    <label>Percents</label>\n    <div class="vis-editor-agg-form-row">\n      <input\n        name="percentsn"\n        ng-model="params.percents"\n        required\n        class="form-control"\n        type="range"\n        min="1"\n        max="99"\n        >\n      <div class="form-group vis-editor-agg-form-value">\n        {{params.percents}}\n      </div>\n    </div>\n  </div>\n</div>',
+            write: function (aggConfig, output) {
+              var percents = parseInt(aggConfig.params.percents);
+              if (isNaN(percents)) {
+                percents = 80;
+              }
+              output.params.percents = [ percents ];
+            }
+          }
+        ]
       }
     ].map(function (def) {
       return new AggType(def);
     });
   };
-});
\ No newline at end of file
+});
-- 
2.1.3