mirror of https://github.com/grafana/grafana.git
feat(elasticsearch): adds support for inline script and missing options to all elasticsearch metrics, closes #3500
This commit is contained in:
parent
0cbc493113
commit
10f66fa78f
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
### New Features
|
### New Features
|
||||||
* **Elasticsearch**: Support for pipeline aggregations Moving average and derivative, closes [#2715](https://github.com/grafana/grafana/issues/2715)
|
* **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)
|
* **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)
|
* **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)
|
* **Login**: Make it possible to change the login hint on the login page, closes [#2571](https://github.com/grafana/grafana/pull/2571)
|
||||||
|
|
|
@ -22,7 +22,7 @@ function (angular) {
|
||||||
|
|
||||||
module.directive('elasticMetricAgg', function() {
|
module.directive('elasticMetricAgg', function() {
|
||||||
return {
|
return {
|
||||||
templateUrl: 'app/plugins/datasource/elasticsearch/partials/metricAgg.html',
|
templateUrl: 'app/plugins/datasource/elasticsearch/partials/metric_agg.html',
|
||||||
controller: 'ElasticMetricAggCtrl',
|
controller: 'ElasticMetricAggCtrl',
|
||||||
restrict: 'E',
|
restrict: 'E',
|
||||||
scope: {
|
scope: {
|
||||||
|
@ -36,7 +36,7 @@ function (angular) {
|
||||||
|
|
||||||
module.directive('elasticBucketAgg', function() {
|
module.directive('elasticBucketAgg', function() {
|
||||||
return {
|
return {
|
||||||
templateUrl: 'app/plugins/datasource/elasticsearch/partials/bucketAgg.html',
|
templateUrl: 'app/plugins/datasource/elasticsearch/partials/bucket_agg.html',
|
||||||
controller: 'ElasticBucketAggCtrl',
|
controller: 'ElasticBucketAggCtrl',
|
||||||
restrict: 'E',
|
restrict: 'E',
|
||||||
scope: {
|
scope: {
|
||||||
|
|
|
@ -55,10 +55,15 @@ function (angular, _, queryDef) {
|
||||||
switch($scope.agg.type) {
|
switch($scope.agg.type) {
|
||||||
case 'percentiles': {
|
case 'percentiles': {
|
||||||
$scope.agg.settings.percents = $scope.agg.settings.percents || [25,50,75,95,99];
|
$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;
|
break;
|
||||||
}
|
}
|
||||||
case 'extended_stats': {
|
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) {
|
var stats = _.reduce($scope.agg.meta, function(memo, val, key) {
|
||||||
if (val) {
|
if (val) {
|
||||||
var def = _.findWhere($scope.extendedStats, {value: key});
|
var def = _.findWhere($scope.extendedStats, {value: key});
|
||||||
|
@ -66,17 +71,29 @@ function (angular, _, queryDef) {
|
||||||
}
|
}
|
||||||
return memo;
|
return memo;
|
||||||
}, []);
|
}, []);
|
||||||
$scope.settingsLinkText = 'Stats: ' + stats.join(', ');
|
|
||||||
|
|
||||||
if (stats.length === 0) {
|
$scope.settingsLinkText = 'Stats: ' + stats.join(', ');
|
||||||
$scope.agg.meta.std_deviation_bounds_lower = true;
|
|
||||||
$scope.agg.meta.std_deviation_bounds_upper = true;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'raw_document': {
|
case 'raw_document': {
|
||||||
$scope.target.metrics = [$scope.agg];
|
$scope.target.metrics = [$scope.agg];
|
||||||
$scope.target.bucketAggs = [];
|
$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';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -85,7 +85,7 @@
|
||||||
<div class="clearfix"></div>
|
<div class="clearfix"></div>
|
||||||
</div>
|
</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">
|
<ul class="tight-form-list">
|
||||||
<li class="tight-form-item" style="width: 100px">
|
<li class="tight-form-item" style="width: 100px">
|
||||||
Sigma
|
Sigma
|
||||||
|
@ -96,5 +96,31 @@
|
||||||
</ul>
|
</ul>
|
||||||
<div class="clearfix"></div>
|
<div class="clearfix"></div>
|
||||||
</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>
|
||||||
</div>
|
</div>
|
|
@ -7,15 +7,15 @@ function (_) {
|
||||||
return {
|
return {
|
||||||
metricAggTypes: [
|
metricAggTypes: [
|
||||||
{text: "Count", value: 'count', requiresField: false},
|
{text: "Count", value: 'count', requiresField: false},
|
||||||
{text: "Average", value: 'avg', requiresField: true},
|
{text: "Average", value: 'avg', requiresField: true, supportsInlineScript: true, supportsMissing: true},
|
||||||
{text: "Sum", value: 'sum', requiresField: true},
|
{text: "Sum", value: 'sum', requiresField: true, supportsInlineScript: true, supportsMissing: true},
|
||||||
{text: "Max", value: 'max', requiresField: true},
|
{text: "Max", value: 'max', requiresField: true, supportsInlineScript: true, supportsMissing: true},
|
||||||
{text: "Min", value: 'min', requiresField: true},
|
{text: "Min", value: 'min', requiresField: true, supportsInlineScript: true, supportsMissing: true},
|
||||||
{text: "Extended Stats", value: 'extended_stats', requiresField: true},
|
{text: "Extended Stats", value: 'extended_stats', requiresField: true, supportsMissing: true, supportsInlineScript: true},
|
||||||
{text: "Percentiles", value: 'percentiles', requiresField: 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: "Moving Average", value: 'moving_avg', requiresField: false, isPipelineAgg: true },
|
||||||
{text: "Derivative", value: 'derivative', 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}
|
{text: "Raw Document", value: "raw_document", requiresField: false}
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue