mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
239 lines
5.5 KiB
TypeScript
239 lines
5.5 KiB
TypeScript
///<reference path="../../../headers/common.d.ts" />
|
|
|
|
import _ from "lodash";
|
|
import kbn from "app/core/utils/kbn";
|
|
import { QueryCtrl } from "app/plugins/sdk";
|
|
|
|
export class OpenTsQueryCtrl extends QueryCtrl {
|
|
static templateUrl = "partials/query.editor.html";
|
|
aggregators: any;
|
|
fillPolicies: any;
|
|
filterTypes: any;
|
|
tsdbVersion: any;
|
|
aggregator: any;
|
|
downsampleInterval: any;
|
|
downsampleAggregator: any;
|
|
downsampleFillPolicy: any;
|
|
errors: any;
|
|
suggestMetrics: any;
|
|
suggestTagKeys: any;
|
|
suggestTagValues: any;
|
|
addTagMode: boolean;
|
|
addFilterMode: boolean;
|
|
|
|
/** @ngInject **/
|
|
constructor($scope, $injector) {
|
|
super($scope, $injector);
|
|
|
|
this.errors = this.validateTarget();
|
|
this.aggregators = [
|
|
"avg",
|
|
"sum",
|
|
"min",
|
|
"max",
|
|
"dev",
|
|
"zimsum",
|
|
"mimmin",
|
|
"mimmax"
|
|
];
|
|
this.fillPolicies = ["none", "nan", "null", "zero"];
|
|
this.filterTypes = [
|
|
"wildcard",
|
|
"iliteral_or",
|
|
"not_iliteral_or",
|
|
"not_literal_or",
|
|
"iwildcard",
|
|
"literal_or",
|
|
"regexp"
|
|
];
|
|
|
|
this.tsdbVersion = this.datasource.tsdbVersion;
|
|
|
|
if (!this.target.aggregator) {
|
|
this.target.aggregator = "sum";
|
|
}
|
|
|
|
if (!this.target.downsampleAggregator) {
|
|
this.target.downsampleAggregator = "avg";
|
|
}
|
|
|
|
if (!this.target.downsampleFillPolicy) {
|
|
this.target.downsampleFillPolicy = "none";
|
|
}
|
|
|
|
this.datasource.getAggregators().then(aggs => {
|
|
if (aggs.length !== 0) {
|
|
this.aggregators = aggs;
|
|
}
|
|
});
|
|
|
|
this.datasource.getFilterTypes().then(filterTypes => {
|
|
if (filterTypes.length !== 0) {
|
|
this.filterTypes = filterTypes;
|
|
}
|
|
});
|
|
|
|
// needs to be defined here as it is called from typeahead
|
|
this.suggestMetrics = (query, callback) => {
|
|
this.datasource
|
|
.metricFindQuery("metrics(" + query + ")")
|
|
.then(this.getTextValues)
|
|
.then(callback);
|
|
};
|
|
|
|
this.suggestTagKeys = (query, callback) => {
|
|
this.datasource.suggestTagKeys(this.target.metric).then(callback);
|
|
};
|
|
|
|
this.suggestTagValues = (query, callback) => {
|
|
this.datasource
|
|
.metricFindQuery("suggest_tagv(" + query + ")")
|
|
.then(this.getTextValues)
|
|
.then(callback);
|
|
};
|
|
}
|
|
|
|
targetBlur() {
|
|
this.errors = this.validateTarget();
|
|
this.refresh();
|
|
}
|
|
|
|
getTextValues(metricFindResult) {
|
|
return _.map(metricFindResult, function(value) {
|
|
return value.text;
|
|
});
|
|
}
|
|
|
|
addTag() {
|
|
if (this.target.filters && this.target.filters.length > 0) {
|
|
this.errors.tags =
|
|
"Please remove filters to use tags, tags and filters are mutually exclusive.";
|
|
}
|
|
|
|
if (!this.addTagMode) {
|
|
this.addTagMode = true;
|
|
return;
|
|
}
|
|
|
|
if (!this.target.tags) {
|
|
this.target.tags = {};
|
|
}
|
|
|
|
this.errors = this.validateTarget();
|
|
|
|
if (!this.errors.tags) {
|
|
this.target.tags[this.target.currentTagKey] = this.target.currentTagValue;
|
|
this.target.currentTagKey = "";
|
|
this.target.currentTagValue = "";
|
|
this.targetBlur();
|
|
}
|
|
|
|
this.addTagMode = false;
|
|
}
|
|
|
|
removeTag(key) {
|
|
delete this.target.tags[key];
|
|
this.targetBlur();
|
|
}
|
|
|
|
editTag(key, value) {
|
|
this.removeTag(key);
|
|
this.target.currentTagKey = key;
|
|
this.target.currentTagValue = value;
|
|
this.addTag();
|
|
}
|
|
|
|
closeAddTagMode() {
|
|
this.addTagMode = false;
|
|
return;
|
|
}
|
|
|
|
addFilter() {
|
|
if (this.target.tags && _.size(this.target.tags) > 0) {
|
|
this.errors.filters =
|
|
"Please remove tags to use filters, tags and filters are mutually exclusive.";
|
|
}
|
|
|
|
if (!this.addFilterMode) {
|
|
this.addFilterMode = true;
|
|
return;
|
|
}
|
|
|
|
if (!this.target.filters) {
|
|
this.target.filters = [];
|
|
}
|
|
|
|
if (!this.target.currentFilterType) {
|
|
this.target.currentFilterType = "iliteral_or";
|
|
}
|
|
|
|
if (!this.target.currentFilterGroupBy) {
|
|
this.target.currentFilterGroupBy = false;
|
|
}
|
|
|
|
this.errors = this.validateTarget();
|
|
|
|
if (!this.errors.filters) {
|
|
var currentFilter = {
|
|
type: this.target.currentFilterType,
|
|
tagk: this.target.currentFilterKey,
|
|
filter: this.target.currentFilterValue,
|
|
groupBy: this.target.currentFilterGroupBy
|
|
};
|
|
this.target.filters.push(currentFilter);
|
|
this.target.currentFilterType = "literal_or";
|
|
this.target.currentFilterKey = "";
|
|
this.target.currentFilterValue = "";
|
|
this.target.currentFilterGroupBy = false;
|
|
this.targetBlur();
|
|
}
|
|
|
|
this.addFilterMode = false;
|
|
}
|
|
|
|
removeFilter(index) {
|
|
this.target.filters.splice(index, 1);
|
|
this.targetBlur();
|
|
}
|
|
|
|
editFilter(fil, index) {
|
|
this.removeFilter(index);
|
|
this.target.currentFilterKey = fil.tagk;
|
|
this.target.currentFilterValue = fil.filter;
|
|
this.target.currentFilterType = fil.type;
|
|
this.target.currentFilterGroupBy = fil.groupBy;
|
|
this.addFilter();
|
|
}
|
|
|
|
closeAddFilterMode() {
|
|
this.addFilterMode = false;
|
|
return;
|
|
}
|
|
|
|
validateTarget() {
|
|
var errs: any = {};
|
|
|
|
if (this.target.shouldDownsample) {
|
|
try {
|
|
if (this.target.downsampleInterval) {
|
|
kbn.describe_interval(this.target.downsampleInterval);
|
|
} else {
|
|
errs.downsampleInterval =
|
|
"You must supply a downsample interval (e.g. '1m' or '1h').";
|
|
}
|
|
} catch (err) {
|
|
errs.downsampleInterval = err.message;
|
|
}
|
|
}
|
|
|
|
if (
|
|
this.target.tags &&
|
|
_.has(this.target.tags, this.target.currentTagKey)
|
|
) {
|
|
errs.tags = "Duplicate tag key '" + this.target.currentTagKey + "'.";
|
|
}
|
|
|
|
return errs;
|
|
}
|
|
}
|