Browse Source

Added ES histogram setting to drop/ignore the first and last datapoints

Qtax 10 years ago
parent
commit
bf41eb824d

+ 3 - 0
public/app/plugins/datasource/elasticsearch/bucket_agg.js

@@ -96,6 +96,9 @@ function (angular, _, queryDef) {
           $scope.agg.field = $scope.target.timeField;
           $scope.agg.field = $scope.target.timeField;
           settingsLinkText = 'Interval: ' + settings.interval;
           settingsLinkText = 'Interval: ' + settings.interval;
           settingsLinkText += ', Min Doc Count: ' + settings.min_doc_count;
           settingsLinkText += ', Min Doc Count: ' + settings.min_doc_count;
+          if (settings.dropFirstLast) {
+            settingsLinkText += ', Drop first & last value';
+          }
         }
         }
       }
       }
 
 

+ 9 - 8
public/app/plugins/datasource/elasticsearch/elastic_response.js

@@ -10,8 +10,9 @@ function (_, queryDef) {
     this.response = response;
     this.response = response;
   }
   }
 
 
-  ElasticResponse.prototype.processMetrics = function(esAgg, target, seriesList, props) {
+  ElasticResponse.prototype.processMetrics = function(esAgg, target, seriesList, props, dropFirstLast) {
     var metric, y, i, newSeries, bucket, value;
     var metric, y, i, newSeries, bucket, value;
+    dropFirstLast = dropFirstLast ? 1 : 0;
 
 
     for (y = 0; y < target.metrics.length; y++) {
     for (y = 0; y < target.metrics.length; y++) {
       metric = target.metrics[y];
       metric = target.metrics[y];
@@ -22,7 +23,7 @@ function (_, queryDef) {
       switch(metric.type) {
       switch(metric.type) {
         case 'count': {
         case 'count': {
           newSeries = { datapoints: [], metric: 'count', props: props};
           newSeries = { datapoints: [], metric: 'count', props: props};
-          for (i = 0; i < esAgg.buckets.length; i++) {
+          for (i = dropFirstLast; i < esAgg.buckets.length - dropFirstLast; i++) {
             bucket = esAgg.buckets[i];
             bucket = esAgg.buckets[i];
             value = bucket.doc_count;
             value = bucket.doc_count;
             newSeries.datapoints.push([value, bucket.key]);
             newSeries.datapoints.push([value, bucket.key]);
@@ -31,17 +32,17 @@ function (_, queryDef) {
           break;
           break;
         }
         }
         case 'percentiles': {
         case 'percentiles': {
-          if (esAgg.buckets.length === 0) {
+          if (esAgg.buckets.length - dropFirstLast * 2 <= 0) {
             break;
             break;
           }
           }
 
 
-          var firstBucket = esAgg.buckets[0];
+          var firstBucket = esAgg.buckets[dropFirstLast];
           var percentiles = firstBucket[metric.id].values;
           var percentiles = firstBucket[metric.id].values;
 
 
           for (var percentileName in percentiles) {
           for (var percentileName in percentiles) {
             newSeries = {datapoints: [], metric: 'p' + percentileName, props: props, field: metric.field};
             newSeries = {datapoints: [], metric: 'p' + percentileName, props: props, field: metric.field};
 
 
-            for (i = 0; i < esAgg.buckets.length; i++) {
+            for (i = dropFirstLast; i < esAgg.buckets.length - dropFirstLast; i++) {
               bucket = esAgg.buckets[i];
               bucket = esAgg.buckets[i];
               var values = bucket[metric.id].values;
               var values = bucket[metric.id].values;
               newSeries.datapoints.push([values[percentileName], bucket.key]);
               newSeries.datapoints.push([values[percentileName], bucket.key]);
@@ -59,7 +60,7 @@ function (_, queryDef) {
 
 
             newSeries = {datapoints: [], metric: statName, props: props, field: metric.field};
             newSeries = {datapoints: [], metric: statName, props: props, field: metric.field};
 
 
-            for (i = 0; i < esAgg.buckets.length; i++) {
+            for (i = dropFirstLast; i < esAgg.buckets.length - dropFirstLast; i++) {
               bucket = esAgg.buckets[i];
               bucket = esAgg.buckets[i];
               var stats = bucket[metric.id];
               var stats = bucket[metric.id];
 
 
@@ -77,7 +78,7 @@ function (_, queryDef) {
         }
         }
         default: {
         default: {
           newSeries = { datapoints: [], metric: metric.type, field: metric.field, props: props};
           newSeries = { datapoints: [], metric: metric.type, field: metric.field, props: props};
-          for (i = 0; i < esAgg.buckets.length; i++) {
+          for (i = dropFirstLast; i < esAgg.buckets.length - dropFirstLast; i++) {
             bucket = esAgg.buckets[i];
             bucket = esAgg.buckets[i];
 
 
             value = bucket[metric.id];
             value = bucket[metric.id];
@@ -158,7 +159,7 @@ function (_, queryDef) {
 
 
       if (depth === maxDepth) {
       if (depth === maxDepth) {
         if (aggDef.type === 'date_histogram')  {
         if (aggDef.type === 'date_histogram')  {
-          this.processMetrics(esAgg, target, seriesList, props);
+          this.processMetrics(esAgg, target, seriesList, props, aggDef.settings && aggDef.settings.dropFirstLast);
         } else {
         } else {
           this.processAggregationDocs(esAgg, aggDef, target, docs, props);
           this.processAggregationDocs(esAgg, aggDef, target, docs, props);
         }
         }

+ 20 - 4
public/app/plugins/datasource/elasticsearch/partials/bucket_agg.html

@@ -37,7 +37,7 @@
 	<div class="tight-form-inner-box" ng-if="agg.type === 'date_histogram'">
 	<div class="tight-form-inner-box" ng-if="agg.type === 'date_histogram'">
 		<div class="tight-form">
 		<div class="tight-form">
 			<ul class="tight-form-list">
 			<ul class="tight-form-list">
-				<li class="tight-form-item" style="width: 94px">
+				<li class="tight-form-item" style="width: 140px">
 					Interval
 					Interval
 				</li>
 				</li>
 				<li>
 				<li>
@@ -46,13 +46,29 @@
 			</ul>
 			</ul>
 			<div class="clearfix"></div>
 			<div class="clearfix"></div>
 		</div>
 		</div>
-		<div class="tight-form last">
+		<div class="tight-form">
 			<ul class="tight-form-list">
 			<ul class="tight-form-list">
-				<li class="tight-form-item" style="width: 94px">
+				<li class="tight-form-item" style="width: 140px">
 					Min Doc Count
 					Min Doc Count
 				</li>
 				</li>
 				<li>
 				<li>
-					<input type="number" class="tight-form-input" ng-model="agg.settings.min_doc_count" ng-blur="onChangeInternal()"></input>
+					<input type="number" class="tight-form-input" ng-model="agg.settings.min_doc_count" ng-blur="onChangeInternal()">
+				</li>
+			</ul>
+			<div class="clearfix"></div>
+		</div>
+		<div class="tight-form last">
+			<ul class="tight-form-list">
+				<li class="tight-form-item" style="width: 140px">
+					Drop first &amp; last value
+				</li>
+				<li class="tight-form-item">
+					<input class="cr1" type="checkbox" id="agg[{{agg.id}}].settings.dropFirstLast"
+					ng-model="agg.settings.dropFirstLast" ng-checked="agg.settings.dropFirstLast" ng-change="onChangeInternal()">
+					<label for="agg[{{agg.id}}].settings.dropFirstLast" class="cr1"></label>
+				</li>
+				<li class="tight-form-item last">
+					<i class="fa fa-question-circle" bs-tooltip="'Ignore the first and last values of the dataset'" data-placement="right"></i>
 				</li>
 				</li>
 			</ul>
 			</ul>
 			<div class="clearfix"></div>
 			<div class="clearfix"></div>