Sfoglia il codice sorgente

feat(elasticsearch): adds support for inline script and missing options to all elasticsearch metrics, closes #3500

Torkel Ödegaard 10 anni fa
parent
commit
10f66fa78f

+ 1 - 0
CHANGELOG.md

@@ -2,6 +2,7 @@
 
 ### New Features
 * **Elasticsearch**: Support for pipeline aggregations Moving average and derivative, closes [#2715](https://github.com/grafana/grafana/issues/2715)
+* **Elasticsearch**: Support for inline script and missing options for metrics, closes [#3500](https://github.com/grafana/grafana/issues/3500)
 * **Syslog**: Support for syslog logging, closes [#3161](https://github.com/grafana/grafana/pull/3161)
 * **Timepicker**: Always show refresh button even with refresh rate, closes [#3498](https://github.com/grafana/grafana/pull/3498)
 * **Login**: Make it possible to change the login hint on the login page, closes [#2571](https://github.com/grafana/grafana/pull/2571)

+ 2 - 2
public/app/plugins/datasource/elasticsearch/directives.js

@@ -22,7 +22,7 @@ function (angular) {
 
   module.directive('elasticMetricAgg', function() {
     return {
-      templateUrl: 'app/plugins/datasource/elasticsearch/partials/metricAgg.html',
+      templateUrl: 'app/plugins/datasource/elasticsearch/partials/metric_agg.html',
       controller: 'ElasticMetricAggCtrl',
       restrict: 'E',
       scope: {
@@ -36,7 +36,7 @@ function (angular) {
 
   module.directive('elasticBucketAgg', function() {
     return {
-      templateUrl: 'app/plugins/datasource/elasticsearch/partials/bucketAgg.html',
+      templateUrl: 'app/plugins/datasource/elasticsearch/partials/bucket_agg.html',
       controller: 'ElasticBucketAggCtrl',
       restrict: 'E',
       scope: {

+ 23 - 6
public/app/plugins/datasource/elasticsearch/metric_agg.js

@@ -55,10 +55,15 @@ function (angular, _, queryDef) {
       switch($scope.agg.type) {
         case 'percentiles': {
           $scope.agg.settings.percents = $scope.agg.settings.percents || [25,50,75,95,99];
-          $scope.settingsLinkText = 'values: ' + $scope.agg.settings.percents.join(',');
+          $scope.settingsLinkText = 'Values: ' + $scope.agg.settings.percents.join(',');
           break;
         }
         case 'extended_stats': {
+          if (_.keys($scope.agg.meta).length === 0)  {
+            $scope.agg.meta.std_deviation_bounds_lower = true;
+            $scope.agg.meta.std_deviation_bounds_upper = true;
+          }
+
           var stats = _.reduce($scope.agg.meta, function(memo, val, key) {
             if (val) {
               var def = _.findWhere($scope.extendedStats, {value: key});
@@ -66,17 +71,29 @@ function (angular, _, queryDef) {
             }
             return memo;
           }, []);
-          $scope.settingsLinkText = 'Stats: ' + stats.join(', ');
 
-          if (stats.length === 0)  {
-            $scope.agg.meta.std_deviation_bounds_lower = true;
-            $scope.agg.meta.std_deviation_bounds_upper = true;
-          }
+          $scope.settingsLinkText = 'Stats: ' + stats.join(', ');
           break;
         }
         case 'raw_document': {
           $scope.target.metrics = [$scope.agg];
           $scope.target.bucketAggs = [];
+          break;
+        }
+      }
+
+      if ($scope.aggDef.supportsInlineScript) {
+        // I know this stores the inline script twice
+        // but having it like this simplifes the query_builder
+        var inlineScript = $scope.agg.inlineScript;
+        if (inlineScript) {
+          $scope.agg.settings.script = {inline: inlineScript};
+        } else {
+          delete $scope.agg.settings.script;
+        }
+
+        if ($scope.settingsLinkText === '') {
+          $scope.settingsLinkText = 'Options';
         }
       }
     };

+ 0 - 0
public/app/plugins/datasource/elasticsearch/partials/bucketAgg.html → public/app/plugins/datasource/elasticsearch/partials/bucket_agg.html


+ 27 - 1
public/app/plugins/datasource/elasticsearch/partials/metricAgg.html → public/app/plugins/datasource/elasticsearch/partials/metric_agg.html

@@ -85,7 +85,7 @@
 				<div class="clearfix"></div>
 			</div>
 		</div>
-		<div class="tight-form last" ng-if="agg.type === 'extended_stats'">
+		<div class="tight-form" ng-if="agg.type === 'extended_stats'">
 			<ul class="tight-form-list">
 				<li class="tight-form-item" style="width: 100px">
 					Sigma
@@ -96,5 +96,31 @@
 			</ul>
 			<div class="clearfix"></div>
 		</div>
+
+		<div class="tight-form" ng-if="aggDef.supportsInlineScript">
+			<ul class="tight-form-list">
+				<li class="tight-form-item" style="width: 100px;">
+					Script
+				</li>
+				<li>
+					<input type="text" class="input-medium tight-form-input last" empty-to-null ng-model="agg.inlineScript" ng-blur="onChangeInternal()" spellcheck='false' placeholder="_value * 1">
+				</li>
+			</ul>
+			<div class="clearfix"></div>
+		</div>
+
+		<div class="tight-form" ng-if="aggDef.supportsMissing">
+			<ul class="tight-form-list">
+				<li class="tight-form-item" style="width: 100px;">
+					Missing
+					<tip>The missing parameter defines how documents that are missing a value should be treated. By default they will be ignored but it is also possible to treat them as if they had a value</tip>
+				</li>
+				<li>
+					<input type="number" class="input-medium tight-form-input last" empty-to-null ng-model="agg.settings.missing" ng-blur="onChangeInternal()" spellcheck='false'>
+				</li>
+			</ul>
+			<div class="clearfix"></div>
+		</div>
+
 	</div>
 </div>

+ 7 - 7
public/app/plugins/datasource/elasticsearch/query_def.js

@@ -7,15 +7,15 @@ function (_) {
   return {
     metricAggTypes: [
       {text: "Count",   value: 'count', requiresField: false},
-      {text: "Average",  value: 'avg', requiresField: true},
-      {text: "Sum",  value: 'sum', requiresField: true},
-      {text: "Max",  value: 'max', requiresField: true},
-      {text: "Min",  value: 'min', requiresField: true},
-      {text: "Extended Stats",  value: 'extended_stats', requiresField: true},
-      {text: "Percentiles",  value: 'percentiles', requiresField: true},
+      {text: "Average",  value: 'avg', requiresField: true, supportsInlineScript: true, supportsMissing: true},
+      {text: "Sum",  value: 'sum', requiresField: true, supportsInlineScript: true, supportsMissing: true},
+      {text: "Max",  value: 'max', requiresField: true, supportsInlineScript: true, supportsMissing: true},
+      {text: "Min",  value: 'min', requiresField: true, supportsInlineScript: true, supportsMissing: true},
+      {text: "Extended Stats",  value: 'extended_stats', requiresField: true, supportsMissing: true, supportsInlineScript: true},
+      {text: "Percentiles",  value: 'percentiles', requiresField: true, supportsMissing: true, supportsInlineScript: true},
+      {text: "Unique Count", value: "cardinality", requiresField: true, supportsMissing: true},
       {text: "Moving Average",  value: 'moving_avg', requiresField: false, isPipelineAgg: true },
       {text: "Derivative",  value: 'derivative', requiresField: false, isPipelineAgg: true },
-      {text: "Unique Count", value: "cardinality", requiresField: true},
       {text: "Raw Document", value: "raw_document", requiresField: false}
     ],