grafana/public/app/plugins/datasource/opentsdb/queryCtrl.js
2016-02-01 17:06:44 +01:00

128 lines
3.4 KiB
JavaScript

define([
'angular',
'lodash',
'app/core/utils/kbn'
],
function (angular, _, kbn) {
'use strict';
var module = angular.module('grafana.controllers');
module.controller('OpenTSDBQueryCtrl', function($scope) {
$scope.panelCtrl = $scope.ctrl;
$scope.init = function() {
$scope.target.errors = validateTarget($scope.target);
$scope.aggregators = ['avg', 'sum', 'min', 'max', 'dev', 'zimsum', 'mimmin', 'mimmax'];
$scope.fillPolicies = ['none', 'nan', 'null', 'zero'];
if (!$scope.target.aggregator) {
$scope.target.aggregator = 'sum';
}
if (!$scope.target.downsampleAggregator) {
$scope.target.downsampleAggregator = 'avg';
}
if (!$scope.target.downsampleFillPolicy) {
$scope.target.downsampleFillPolicy = 'none';
}
$scope.datasource.getAggregators().then(function(aggs) {
$scope.aggregators = aggs;
});
};
$scope.targetBlur = function() {
$scope.target.errors = validateTarget($scope.target);
// this does not work so good
if (!_.isEqual($scope.oldTarget, $scope.target) && _.isEmpty($scope.target.errors)) {
$scope.oldTarget = angular.copy($scope.target);
$scope.get_data();
}
};
$scope.getTextValues = function(metricFindResult) {
return _.map(metricFindResult, function(value) { return value.text; });
};
$scope.suggestMetrics = function(query, callback) {
$scope.datasource.metricFindQuery('metrics(' + query + ')')
.then($scope.getTextValues)
.then(callback);
};
$scope.suggestTagKeys = function(query, callback) {
$scope.datasource.metricFindQuery('suggest_tagk(' + query + ')')
.then($scope.getTextValues)
.then(callback);
};
$scope.suggestTagValues = function(query, callback) {
$scope.datasource.metricFindQuery('suggest_tagv(' + query + ')')
.then($scope.getTextValues)
.then(callback);
};
$scope.addTag = function() {
if (!$scope.addTagMode) {
$scope.addTagMode = true;
return;
}
if (!$scope.target.tags) {
$scope.target.tags = {};
}
$scope.target.errors = validateTarget($scope.target);
if (!$scope.target.errors.tags) {
$scope.target.tags[$scope.target.currentTagKey] = $scope.target.currentTagValue;
$scope.target.currentTagKey = '';
$scope.target.currentTagValue = '';
$scope.targetBlur();
}
$scope.addTagMode = false;
};
$scope.removeTag = function(key) {
delete $scope.target.tags[key];
$scope.targetBlur();
};
$scope.editTag = function(key, value) {
$scope.removeTag(key);
$scope.target.currentTagKey = key;
$scope.target.currentTagValue = value;
$scope.addTag();
};
function validateTarget(target) {
var errs = {};
if (target.shouldDownsample) {
try {
if (target.downsampleInterval) {
kbn.describe_interval(target.downsampleInterval);
} else {
errs.downsampleInterval = "You must supply a downsample interval (e.g. '1m' or '1h').";
}
} catch(err) {
errs.downsampleInterval = err.message;
}
}
if (target.tags && _.has(target.tags, target.currentTagKey)) {
errs.tags = "Duplicate tag key '" + target.currentTagKey + "'.";
}
return errs;
}
$scope.init();
});
});