diff --git a/public/app/plugins/datasource/opentsdb/datasource.d.ts b/public/app/plugins/datasource/opentsdb/datasource.d.ts index a50d7ca49cc..bbbf1680f27 100644 --- a/public/app/plugins/datasource/opentsdb/datasource.d.ts +++ b/public/app/plugins/datasource/opentsdb/datasource.d.ts @@ -1,3 +1,3 @@ -declare var Datasource: any; -export default Datasource; +declare var OpenTsDatasource: any; +export {OpenTsDatasource}; diff --git a/public/app/plugins/datasource/opentsdb/datasource.js b/public/app/plugins/datasource/opentsdb/datasource.js index 0171595060a..eace5275754 100644 --- a/public/app/plugins/datasource/opentsdb/datasource.js +++ b/public/app/plugins/datasource/opentsdb/datasource.js @@ -3,13 +3,12 @@ define([ 'lodash', 'app/core/utils/datemath', 'moment', - './queryCtrl', ], function (angular, _, dateMath) { 'use strict'; /** @ngInject */ - function OpenTSDBDatasource(instanceSettings, $q, backendSrv, templateSrv) { + function OpenTsDatasource(instanceSettings, $q, backendSrv, templateSrv) { this.type = 'opentsdb'; this.url = instanceSettings.url; this.name = instanceSettings.name; @@ -73,13 +72,13 @@ function (angular, _, dateMath) { url: this.url + '/api/query', data: reqBody }; + if (this.basicAuth || this.withCredentials) { options.withCredentials = true; } + if (this.basicAuth) { - options.headers = { - "Authorization": this.basicAuth - }; + options.headers = {"Authorization": this.basicAuth}; } // In case the backend is 3rd-party hosted and does not suport OPTIONS, urlencoded requests @@ -325,5 +324,7 @@ function (angular, _, dateMath) { } - return OpenTSDBDatasource; + return { + OpenTsDatasource: OpenTsDatasource + }; }); diff --git a/public/app/plugins/datasource/opentsdb/module.js b/public/app/plugins/datasource/opentsdb/module.js deleted file mode 100644 index a85daf37bba..00000000000 --- a/public/app/plugins/datasource/opentsdb/module.js +++ /dev/null @@ -1,23 +0,0 @@ -define([ - './datasource', -], -function (OpenTsDatasource) { - 'use strict'; - - function metricsQueryEditor() { - return { - controller: 'OpenTSDBQueryCtrl', - templateUrl: 'public/app/plugins/datasource/opentsdb/partials/query.editor.html', - }; - } - - function configView() { - return {templateUrl: 'public/app/plugins/datasource/opentsdb/partials/config.html'}; - } - - return { - Datasource: OpenTsDatasource, - metricsQueryEditor: metricsQueryEditor, - configView: configView, - }; -}); diff --git a/public/app/plugins/datasource/opentsdb/module.ts b/public/app/plugins/datasource/opentsdb/module.ts new file mode 100644 index 00000000000..ba7a6ccf316 --- /dev/null +++ b/public/app/plugins/datasource/opentsdb/module.ts @@ -0,0 +1,13 @@ +import {OpenTsDatasource} from './datasource'; +import {OpenTsQueryCtrl} from './query_ctrl'; + +class OpenTsConfigCtrl { + static templateUrl = 'public/app/plugins/datasource/opentsdb/partials/config.html'; +} + +export { + OpenTsDatasource as Datasource, + OpenTsQueryCtrl as QueryCtrl, + OpenTsConfigCtrl as ConfigCtrl, +}; + diff --git a/public/app/plugins/datasource/opentsdb/partials/config.html b/public/app/plugins/datasource/opentsdb/partials/config.html index 9f5259cb2ea..3b7f169a0a8 100644 --- a/public/app/plugins/datasource/opentsdb/partials/config.html +++ b/public/app/plugins/datasource/opentsdb/partials/config.html @@ -1,2 +1,2 @@ - + diff --git a/public/app/plugins/datasource/opentsdb/partials/query.editor.html b/public/app/plugins/datasource/opentsdb/partials/query.editor.html index e27f068032f..0c7c7d25a57 100644 --- a/public/app/plugins/datasource/opentsdb/partials/query.editor.html +++ b/public/app/plugins/datasource/opentsdb/partials/query.editor.html @@ -1,82 +1,42 @@ -
- + +
  • + Metric +
  • +
  • + + + + + +
  • +
  • + Aggregator +
  • +
  • + + + + +
  • - - - - -
    -
    +
  • + Alias: + Use patterns like $tag_tagname to replace part of the alias for a tag value +
  • +
  • + +
  • +
    @@ -128,35 +88,35 @@
  • Tags
  • -
  • - {{key}} = {{value}} - - - - +
  • + {{key}} = {{value}} + + + +
  • -
  • - +
  • +
  • -
  • +
  • + bs-typeahead="ctrl.suggestTagKeys" data-min-length=0 data-items=100 + ng-model="ctrl.target.currentTagKey" placeholder="key"> + spellcheck='false' bs-typeahead="ctrl.suggestTagValues" + data-min-length=0 data-items=100 ng-model="ctrl.target.currentTagValue" placeholder="value"> - + add tag - @@ -169,31 +129,31 @@
    diff --git a/public/app/plugins/datasource/opentsdb/queryCtrl.js b/public/app/plugins/datasource/opentsdb/queryCtrl.js deleted file mode 100644 index 04259382390..00000000000 --- a/public/app/plugins/datasource/opentsdb/queryCtrl.js +++ /dev/null @@ -1,127 +0,0 @@ -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(); - }); - -}); diff --git a/public/app/plugins/datasource/opentsdb/query_ctrl.ts b/public/app/plugins/datasource/opentsdb/query_ctrl.ts new file mode 100644 index 00000000000..9ed1aab55ce --- /dev/null +++ b/public/app/plugins/datasource/opentsdb/query_ctrl.ts @@ -0,0 +1,128 @@ +/// + +import _ from 'lodash'; +import kbn from 'app/core/utils/kbn'; +import {QueryCtrl} from 'app/features/panel/panel'; + +export class OpenTsQueryCtrl extends QueryCtrl { + static templateUrl = 'public/app/plugins/datasource/opentsdb/partials/query.editor.html'; + aggregators: any; + fillPolicies: any; + aggregator: any; + downsampleInterval: any; + downsampleAggregator: any; + downsampleFillPolicy: any; + errors: any; + suggestMetrics: any; + suggestTagKeys: any; + suggestTagValues: any; + addTagMode: boolean; + + 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']; + + 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(function(aggs) { + this.aggregators = aggs; + }); + + // 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.metricFindQuery('suggest_tagk(' + query + ')') + .then(this.getTextValues) + .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.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(); + } + + 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; + } +} diff --git a/public/app/plugins/datasource/opentsdb/specs/datasource-specs.ts b/public/app/plugins/datasource/opentsdb/specs/datasource-specs.ts index 6f8b8917588..b786a93f14c 100644 --- a/public/app/plugins/datasource/opentsdb/specs/datasource-specs.ts +++ b/public/app/plugins/datasource/opentsdb/specs/datasource-specs.ts @@ -1,6 +1,6 @@ import {describe, beforeEach, it, sinon, expect, angularMocks} from 'test/lib/common'; import helpers from 'test/specs/helpers'; -import Datasource from "../datasource"; +import {OpenTsDatasource} from "../datasource"; describe('opentsdb', function() { var ctx = new helpers.ServiceTestContext(); @@ -14,7 +14,7 @@ describe('opentsdb', function() { ctx.$q = $q; ctx.$httpBackend = $httpBackend; ctx.$rootScope = $rootScope; - ctx.ds = $injector.instantiate(Datasource, {instanceSettings: instanceSettings}); + ctx.ds = $injector.instantiate(OpenTsDatasource, {instanceSettings: instanceSettings}); })); describe('When performing metricFindQuery', function() {