From f83d5f42809be6cec330067c408689259c4ba5a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 15 Dec 2015 11:21:00 +0100 Subject: [PATCH] cleanup(influxdb_08): removed influxdb 0.8 data source as an built in official data source, moved it to an external plugin repo, https://github.com/grafana/datasource-plugin-influxdb-08, closes #3523 --- CHANGELOG.md | 8 +- conf/defaults.ini | 4 + conf/sample.ini | 5 + packaging/deb/default/grafana-server | 2 + packaging/deb/init.d/grafana-server | 4 +- packaging/deb/systemd/grafana-server.service | 3 +- packaging/rpm/init.d/grafana-server | 3 +- packaging/rpm/sysconfig/grafana-server | 2 + packaging/rpm/systemd/grafana-server.service | 3 +- pkg/plugins/plugins.go | 2 + pkg/setting/setting.go | 9 +- .../datasource/influxdb_08/datasource.js | 288 ------------------ .../datasource/influxdb_08/directives.js | 21 -- .../datasource/influxdb_08/func_editor.js | 136 --------- .../datasource/influxdb_08/influx_series.js | 129 -------- .../partials/annotations.editor.html | 29 -- .../influxdb_08/partials/config.html | 36 --- .../influxdb_08/partials/query.editor.html | 159 ---------- .../influxdb_08/partials/query.options.html | 85 ------ .../datasource/influxdb_08/plugin.json | 17 -- .../datasource/influxdb_08/query_builder.js | 67 ---- .../datasource/influxdb_08/query_ctrl.js | 95 ------ .../influxdb_08/specs/datasource-specs.ts | 98 ------ .../influxdb_08/specs/influx_series_specs.ts | 220 ------------- .../influxdb_08/specs/query_builder_specs.ts | 78 ----- 25 files changed, 37 insertions(+), 1466 deletions(-) delete mode 100644 public/app/plugins/datasource/influxdb_08/datasource.js delete mode 100644 public/app/plugins/datasource/influxdb_08/directives.js delete mode 100644 public/app/plugins/datasource/influxdb_08/func_editor.js delete mode 100644 public/app/plugins/datasource/influxdb_08/influx_series.js delete mode 100644 public/app/plugins/datasource/influxdb_08/partials/annotations.editor.html delete mode 100644 public/app/plugins/datasource/influxdb_08/partials/config.html delete mode 100644 public/app/plugins/datasource/influxdb_08/partials/query.editor.html delete mode 100644 public/app/plugins/datasource/influxdb_08/partials/query.options.html delete mode 100644 public/app/plugins/datasource/influxdb_08/plugin.json delete mode 100644 public/app/plugins/datasource/influxdb_08/query_builder.js delete mode 100644 public/app/plugins/datasource/influxdb_08/query_ctrl.js delete mode 100644 public/app/plugins/datasource/influxdb_08/specs/datasource-specs.ts delete mode 100644 public/app/plugins/datasource/influxdb_08/specs/influx_series_specs.ts delete mode 100644 public/app/plugins/datasource/influxdb_08/specs/query_builder_specs.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 850ebfee008..6cd518f11eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ -# 2.6.1 +# 3.0.0 (unrelased master branch) + + +### Breaking changes +**InfluxDB 0.8.x** The data source for the old version of influxdb (0.8.x) is no longer included in default builds. Can easily be installed via plugin system, closes #3523 + +# 2.6.1 (unrelased, 2.6.x branch) ### New Features * **Elasticsearch**: Support for derivative unit option, closes [#3512](https://github.com/grafana/grafana/issues/3512) diff --git a/conf/defaults.ini b/conf/defaults.ini index 92ed0d7d344..06938b9370b 100644 --- a/conf/defaults.ini +++ b/conf/defaults.ini @@ -15,6 +15,10 @@ data = data # Directory where grafana can store logs # logs = data/log +# +# Directory where grafana will automatically scan and look for plugins +# +plugins = data/plugins #################################### Server #################################### [server] diff --git a/conf/sample.ini b/conf/sample.ini index 97480e6e008..b875cbda093 100644 --- a/conf/sample.ini +++ b/conf/sample.ini @@ -15,7 +15,12 @@ # Directory where grafana can store logs # ;logs = /var/log/grafana +# +# Directory where grafana will automatically scan and look for plugins +# +;plugins = /var/lib/grafana/plugins +# #################################### Server #################################### [server] # Protocol (http or https) diff --git a/packaging/deb/default/grafana-server b/packaging/deb/default/grafana-server index 14d2545f6ce..dd06906b903 100644 --- a/packaging/deb/default/grafana-server +++ b/packaging/deb/default/grafana-server @@ -15,3 +15,5 @@ CONF_DIR=/etc/grafana CONF_FILE=/etc/grafana/grafana.ini RESTART_ON_UPGRADE=false + +PLUGINS_DIR=/var/lib/grafana/plugins diff --git a/packaging/deb/init.d/grafana-server b/packaging/deb/init.d/grafana-server index 9de4bf42092..61e82d4c612 100755 --- a/packaging/deb/init.d/grafana-server +++ b/packaging/deb/init.d/grafana-server @@ -30,12 +30,14 @@ GRAFANA_HOME=/usr/share/grafana CONF_DIR=/etc/grafana WORK_DIR=$GRAFANA_HOME DATA_DIR=/var/lib/grafana +PLUGINS_DIR=/var/lib/grafana/plugins LOG_DIR=/var/log/grafana CONF_FILE=$CONF_DIR/grafana.ini MAX_OPEN_FILES=10000 PID_FILE=/var/run/$NAME.pid DAEMON=/usr/sbin/$NAME + umask 0027 if [ `id -u` -ne 0 ]; then @@ -59,7 +61,7 @@ if [ -f "$DEFAULT" ]; then . "$DEFAULT" fi -DAEMON_OPTS="--pidfile=${PID_FILE} --config=${CONF_FILE} cfg:default.paths.data=${DATA_DIR} cfg:default.paths.logs=${LOG_DIR}" +DAEMON_OPTS="--pidfile=${PID_FILE} --config=${CONF_FILE} cfg:default.paths.data=${DATA_DIR} cfg:default.paths.logs=${LOG_DIR} cfg:default.paths.plugins=${PLUGINS_DIR}" case "$1" in start) diff --git a/packaging/deb/systemd/grafana-server.service b/packaging/deb/systemd/grafana-server.service index dd5d2097149..923a0d76cc2 100644 --- a/packaging/deb/systemd/grafana-server.service +++ b/packaging/deb/systemd/grafana-server.service @@ -14,7 +14,8 @@ ExecStart=/usr/sbin/grafana-server \ --config=${CONF_FILE} \ --pidfile=${PID_FILE} \ cfg:default.paths.logs=${LOG_DIR} \ - cfg:default.paths.data=${DATA_DIR} + cfg:default.paths.data=${DATA_DIR} \ + cfg:default.paths.plugins=${PLUGINS_DIR} LimitNOFILE=10000 TimeoutStopSec=20 UMask=0027 diff --git a/packaging/rpm/init.d/grafana-server b/packaging/rpm/init.d/grafana-server index bb27882f625..c60f4fb6080 100755 --- a/packaging/rpm/init.d/grafana-server +++ b/packaging/rpm/init.d/grafana-server @@ -29,6 +29,7 @@ GRAFANA_HOME=/usr/share/grafana CONF_DIR=/etc/grafana WORK_DIR=$GRAFANA_HOME DATA_DIR=/var/lib/grafana +PLUGINS_DIR=/var/lib/grafana/plugins LOG_DIR=/var/log/grafana CONF_FILE=$CONF_DIR/grafana.ini MAX_OPEN_FILES=10000 @@ -63,7 +64,7 @@ fi # overwrite settings from default file [ -e /etc/sysconfig/$NAME ] && . /etc/sysconfig/$NAME -DAEMON_OPTS="--pidfile=${PID_FILE} --config=${CONF_FILE} cfg:default.paths.data=${DATA_DIR} cfg:default.paths.logs=${LOG_DIR}" +DAEMON_OPTS="--pidfile=${PID_FILE} --config=${CONF_FILE} cfg:default.paths.data=${DATA_DIR} cfg:default.paths.logs=${LOG_DIR} cfg:default.paths.plugins=${PLUGINS_DIR}" function isRunning() { status -p $PID_FILE $NAME > /dev/null 2>&1 diff --git a/packaging/rpm/sysconfig/grafana-server b/packaging/rpm/sysconfig/grafana-server index 14d2545f6ce..dd06906b903 100644 --- a/packaging/rpm/sysconfig/grafana-server +++ b/packaging/rpm/sysconfig/grafana-server @@ -15,3 +15,5 @@ CONF_DIR=/etc/grafana CONF_FILE=/etc/grafana/grafana.ini RESTART_ON_UPGRADE=false + +PLUGINS_DIR=/var/lib/grafana/plugins diff --git a/packaging/rpm/systemd/grafana-server.service b/packaging/rpm/systemd/grafana-server.service index fb2ec24d123..20762ff6935 100644 --- a/packaging/rpm/systemd/grafana-server.service +++ b/packaging/rpm/systemd/grafana-server.service @@ -14,7 +14,8 @@ ExecStart=/usr/sbin/grafana-server \ --config=${CONF_FILE} \ --pidfile=${PID_FILE} \ cfg:default.paths.logs=${LOG_DIR} \ - cfg:default.paths.data=${DATA_DIR} + cfg:default.paths.data=${DATA_DIR} \ + cfg:default.paths.plugins=${PLUGINS_DIR} LimitNOFILE=10000 TimeoutStopSec=20 diff --git a/pkg/plugins/plugins.go b/pkg/plugins/plugins.go index 10adc6ba09b..315a947a8d4 100644 --- a/pkg/plugins/plugins.go +++ b/pkg/plugins/plugins.go @@ -29,7 +29,9 @@ func Init() error { Panels = make(map[string]PanelPlugin) scan(path.Join(setting.StaticRootPath, "app/plugins")) + scan(path.Join(setting.PluginsPath)) checkExternalPluginPaths() + return nil } diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go index 28e0364e766..4e081e4e00b 100644 --- a/pkg/setting/setting.go +++ b/pkg/setting/setting.go @@ -48,9 +48,10 @@ var ( BuildStamp int64 // Paths - LogsPath string - HomePath string - DataPath string + LogsPath string + HomePath string + DataPath string + PluginsPath string // Log settings. LogModes []string @@ -393,6 +394,7 @@ func NewConfigContext(args *CommandLineArgs) error { loadConfiguration(args) Env = Cfg.Section("").Key("app_mode").MustString("development") + PluginsPath = Cfg.Section("paths").Key("plugins").String() server := Cfg.Section("server") AppUrl, AppSubUrl = parseAppUrlAndSubUrl(server) @@ -626,6 +628,7 @@ func LogConfigurationInfo() { text.WriteString(fmt.Sprintf(" home: %s\n", HomePath)) text.WriteString(fmt.Sprintf(" data: %s\n", DataPath)) text.WriteString(fmt.Sprintf(" logs: %s\n", LogsPath)) + text.WriteString(fmt.Sprintf(" plugins: %s\n", PluginsPath)) log.Info(text.String()) } diff --git a/public/app/plugins/datasource/influxdb_08/datasource.js b/public/app/plugins/datasource/influxdb_08/datasource.js deleted file mode 100644 index cba2e27b0cf..00000000000 --- a/public/app/plugins/datasource/influxdb_08/datasource.js +++ /dev/null @@ -1,288 +0,0 @@ -define([ - 'angular', - 'lodash', - 'app/core/utils/datemath', - './influx_series', - './query_builder', - './directives', - './query_ctrl', - './func_editor', -], -function (angular, _, dateMath, InfluxSeries, InfluxQueryBuilder) { - 'use strict'; - - var module = angular.module('grafana.services'); - - module.factory('InfluxDatasource_08', function($q, backendSrv, templateSrv) { - - function InfluxDatasource(datasource) { - this.urls = _.map(datasource.url.split(','), function(url) { - return url.trim(); - }); - - this.username = datasource.username; - this.password = datasource.password; - this.name = datasource.name; - this.basicAuth = datasource.basicAuth; - } - - InfluxDatasource.prototype.query = function(options) { - var timeFilter = getTimeFilter(options); - - var promises = _.map(options.targets, function(target) { - if (target.hide || !((target.series && target.column) || target.query)) { - return []; - } - - // build query - var queryBuilder = new InfluxQueryBuilder(target); - var query = queryBuilder.build(); - - // replace grafana variables - query = query.replace('$timeFilter', timeFilter); - query = query.replace(/\$interval/g, (target.interval || options.interval)); - - // replace templated variables - query = templateSrv.replace(query, options.scopedVars); - - var alias = target.alias ? templateSrv.replace(target.alias, options.scopedVars) : ''; - - var handleResponse = _.partial(handleInfluxQueryResponse, alias, queryBuilder.groupByField); - return this._seriesQuery(query).then(handleResponse); - - }, this); - - return $q.all(promises).then(function(results) { - return { data: _.flatten(results) }; - }); - }; - - InfluxDatasource.prototype.annotationQuery = function(options) { - var timeFilter = getTimeFilter({rangeRaw: options.rangeRaw}); - var query = options.annotation.query.replace('$timeFilter', timeFilter); - query = templateSrv.replace(query); - - return this._seriesQuery(query).then(function(results) { - return new InfluxSeries({seriesList: results, annotation: options.annotation}).getAnnotations(); - }); - }; - - InfluxDatasource.prototype.listColumns = function(seriesName) { - seriesName = templateSrv.replace(seriesName); - - if(!seriesName.match('^/.*/') && !seriesName.match(/^merge\(.*\)/)) { - seriesName = '"' + seriesName+ '"'; - } - - return this._seriesQuery('select * from ' + seriesName + ' limit 1').then(function(data) { - if (!data) { - return []; - } - return data[0].columns.map(function(item) { - return /^\w+$/.test(item) ? item : ('"' + item + '"'); - }); - }); - }; - - InfluxDatasource.prototype.listSeries = function(query) { - // wrap in regex - if (query && query.length > 0 && query[0] !== '/') { - query = '/' + query + '/'; - } - - return this._seriesQuery('list series ' + query).then(function(data) { - if (!data || data.length === 0) { - return []; - } - return _.map(data[0].points, function(point) { - return point[1]; - }); - }); - }; - - InfluxDatasource.prototype.testDatasource = function() { - return this.metricFindQuery('list series').then(function () { - return { status: "success", message: "Data source is working", title: "Success" }; - }); - }; - - InfluxDatasource.prototype.metricFindQuery = function (query) { - var interpolated; - try { - interpolated = templateSrv.replace(query); - } - catch (err) { - return $q.reject(err); - } - - return this._seriesQuery(interpolated) - .then(function (results) { - if (!results || results.length === 0) { return []; } - - return _.map(results[0].points, function (metric) { - return { - text: metric[1], - expandable: false - }; - }); - }); - }; - - function retry(deferred, callback, delay) { - return callback().then(undefined, function(reason) { - if (reason.status !== 0 || reason.status >= 300) { - reason.message = 'InfluxDB Error:
' + reason.data; - deferred.reject(reason); - } - else { - setTimeout(function() { - return retry(deferred, callback, Math.min(delay * 2, 30000)); - }, delay); - } - }); - } - - InfluxDatasource.prototype._seriesQuery = function(query) { - return this._influxRequest('GET', '/series', { - q: query, - }); - }; - - InfluxDatasource.prototype._influxRequest = function(method, url, data) { - var _this = this; - var deferred = $q.defer(); - - retry(deferred, function() { - var currentUrl = _this.urls.shift(); - _this.urls.push(currentUrl); - - var params = { - u: _this.username, - p: _this.password, - }; - - if (method === 'GET') { - _.extend(params, data); - data = null; - } - - var options = { - method: method, - url: currentUrl + url, - params: params, - data: data, - inspect: { type: 'influxdb' }, - }; - - options.headers = options.headers || {}; - if (_this.basicAuth) { - options.headers.Authorization = 'Basic ' + _this.basicAuth; - } - - return backendSrv.datasourceRequest(options).then(function(response) { - deferred.resolve(response.data); - }); - }, 10); - - return deferred.promise; - }; - - InfluxDatasource.prototype._getDashboardInternal = function(id) { - var queryString = 'select dashboard from "grafana.dashboard_' + btoa(id) + '"'; - - return this._seriesQuery(queryString).then(function(results) { - if (!results || !results.length) { - return null; - } - - var dashCol = _.indexOf(results[0].columns, 'dashboard'); - var dashJson = results[0].points[0][dashCol]; - - return angular.fromJson(dashJson); - }, function() { - return null; - }); - }; - - InfluxDatasource.prototype.getDashboard = function(id) { - return this._getDashboardInternal(id).then(function(dashboard) { - if (dashboard !== null) { - return dashboard; - } - throw "Dashboard not found"; - }, function(err) { - throw "Could not load dashboard, " + err.data; - }); - }; - - InfluxDatasource.prototype.searchDashboards = function() { - var influxQuery = 'select * from /grafana.dashboard_.*/ '; - return this._seriesQuery(influxQuery).then(function(results) { - var hits = { dashboards: [], tags: [], tagsOnly: false }; - - if (!results || !results.length) { - return hits; - } - - for (var i = 0; i < results.length; i++) { - var dashCol = _.indexOf(results[i].columns, 'title'); - var idCol = _.indexOf(results[i].columns, 'id'); - - var hit = { - id: results[i].points[0][dashCol], - title: results[i].points[0][dashCol], - }; - - if (idCol !== -1) { - hit.id = results[i].points[0][idCol]; - } - - hits.dashboards.push(hit); - } - return hits; - }); - }; - - function handleInfluxQueryResponse(alias, groupByField, seriesList) { - var influxSeries = new InfluxSeries({ - seriesList: seriesList, - alias: alias, - groupByField: groupByField - }); - - return influxSeries.getTimeSeries(); - } - - function getTimeFilter(options) { - var from = getInfluxTime(options.rangeRaw.from, false); - var until = getInfluxTime(options.rangeRaw.to, true); - var fromIsAbsolute = from[from.length-1] === 's'; - - if (until === 'now()' && !fromIsAbsolute) { - return 'time > ' + from; - } - - return 'time > ' + from + ' and time < ' + until; - } - - function getInfluxTime(date, roundUp) { - if (_.isString(date)) { - if (date === 'now') { - return 'now()'; - } - - var parts = /^now-(\d+)([d|h|m|s])$/.exec(date); - if (parts) { - var amount = parseInt(parts[1]); - var unit = parts[2]; - return 'now()-' + amount + unit; - } - - date = dateMath.parse(date, roundUp); - } - return (date.valueOf() / 1000).toFixed(0) + 's'; - } - - return InfluxDatasource; - }); -}); diff --git a/public/app/plugins/datasource/influxdb_08/directives.js b/public/app/plugins/datasource/influxdb_08/directives.js deleted file mode 100644 index 35a29975442..00000000000 --- a/public/app/plugins/datasource/influxdb_08/directives.js +++ /dev/null @@ -1,21 +0,0 @@ -define([ - 'angular', -], -function (angular) { - 'use strict'; - - var module = angular.module('grafana.directives'); - - module.directive('metricQueryEditorInfluxdb08', function() { - return {controller: 'InfluxQueryCtrl_08', templateUrl: 'app/plugins/datasource/influxdb_08/partials/query.editor.html'}; - }); - - module.directive('metricQueryOptionsInfluxdb08', function() { - return {templateUrl: 'app/plugins/datasource/influxdb_08/partials/query.options.html'}; - }); - - module.directive('annotationsQueryEditorInfluxdb08', function() { - return {templateUrl: 'app/plugins/datasource/influxdb_08/partials/annotations.editor.html'}; - }); - -}); diff --git a/public/app/plugins/datasource/influxdb_08/func_editor.js b/public/app/plugins/datasource/influxdb_08/func_editor.js deleted file mode 100644 index 7d48f40792f..00000000000 --- a/public/app/plugins/datasource/influxdb_08/func_editor.js +++ /dev/null @@ -1,136 +0,0 @@ -define([ - 'angular', - 'lodash', - 'jquery', -], -function (angular, _, $) { - 'use strict'; - - angular - .module('grafana.directives') - .directive('influxdbFuncEditor08', function($compile) { - - var funcSpanTemplate = '{{target.function}}('; - - var paramTemplate = ''; - - return { - restrict: 'A', - link: function postLink($scope, elem) { - var $funcLink = $(funcSpanTemplate); - - $scope.functionMenu = _.map($scope.functions, function(func) { - return { - text: func, - click: "changeFunction('" + func + "');" - }; - }); - - function clickFuncParam() { - /*jshint validthis:true */ - - var $link = $(this); - var $input = $link.next(); - - $input.val($scope.target.column); - $input.css('width', ($link.width() + 16) + 'px'); - - $link.hide(); - $input.show(); - $input.focus(); - $input.select(); - - var typeahead = $input.data('typeahead'); - if (typeahead) { - $input.val(''); - typeahead.lookup(); - } - } - - function inputBlur() { - /*jshint validthis:true */ - - var $input = $(this); - var $link = $input.prev(); - - if ($input.val() !== '') { - $link.text($input.val()); - - $scope.target.column = $input.val(); - $scope.$apply($scope.get_data); - } - - $input.hide(); - $link.show(); - } - - function inputKeyPress(e) { - /*jshint validthis:true */ - - if(e.which === 13) { - inputBlur.call(this); - } - } - - function inputKeyDown() { - /*jshint validthis:true */ - this.style.width = (3 + this.value.length) * 8 + 'px'; - } - - function addTypeahead($input) { - $input.attr('data-provide', 'typeahead'); - - $input.typeahead({ - source: function () { - return $scope.listColumns.apply(null, arguments); - }, - minLength: 0, - items: 20, - updater: function (value) { - setTimeout(function() { - inputBlur.call($input[0]); - }, 0); - return value; - } - }); - - var typeahead = $input.data('typeahead'); - typeahead.lookup = function () { - var items; - this.query = this.$element.val() || ''; - items = this.source(this.query, $.proxy(this.process, this)); - return items ? this.process(items) : items; - }; - } - - function addElementsAndCompile() { - $funcLink.appendTo(elem); - - var $paramLink = $('' + $scope.target.column + ''); - var $input = $(paramTemplate); - - $paramLink.appendTo(elem); - $input.appendTo(elem); - - $input.blur(inputBlur); - $input.keyup(inputKeyDown); - $input.keypress(inputKeyPress); - $paramLink.click(clickFuncParam); - - addTypeahead($input); - - $(')').appendTo(elem); - - $compile(elem.contents())($scope); - } - - addElementsAndCompile(); - - } - }; - - }); - -}); diff --git a/public/app/plugins/datasource/influxdb_08/influx_series.js b/public/app/plugins/datasource/influxdb_08/influx_series.js deleted file mode 100644 index bca6ca7a865..00000000000 --- a/public/app/plugins/datasource/influxdb_08/influx_series.js +++ /dev/null @@ -1,129 +0,0 @@ -define([ - 'lodash', -], -function (_) { - 'use strict'; - - function InfluxSeries(options) { - this.seriesList = options.seriesList; - this.alias = options.alias; - this.groupByField = options.groupByField; - this.annotation = options.annotation; - } - - var p = InfluxSeries.prototype; - - p.getTimeSeries = function() { - var output = []; - var self = this; - var i; - - _.each(self.seriesList, function(series) { - var seriesName; - var timeCol = series.columns.indexOf('time'); - var valueCol = 1; - var groupByCol = -1; - - if (self.groupByField) { - groupByCol = series.columns.indexOf(self.groupByField); - } - - // find value column - _.each(series.columns, function(column, index) { - if (column !== 'time' && column !== 'sequence_number' && column !== self.groupByField) { - valueCol = index; - } - }); - - var groups = {}; - - if (self.groupByField) { - groups = _.groupBy(series.points, function (point) { - return point[groupByCol]; - }); - } - else { - groups[series.columns[valueCol]] = series.points; - } - - _.each(groups, function(groupPoints, key) { - var datapoints = []; - for (i = 0; i < groupPoints.length; i++) { - var metricValue = isNaN(groupPoints[i][valueCol]) ? null : groupPoints[i][valueCol]; - datapoints[i] = [metricValue, groupPoints[i][timeCol]]; - } - - seriesName = series.name + '.' + key; - - if (self.alias) { - seriesName = self.createNameForSeries(series.name, key); - } - - output.push({ target: seriesName, datapoints: datapoints }); - }); - }); - - return output; - }; - - p.getAnnotations = function () { - var list = []; - var self = this; - - _.each(this.seriesList, function (series) { - var titleCol = null; - var timeCol = null; - var tagsCol = null; - var textCol = null; - - _.each(series.columns, function(column, index) { - if (column === 'time') { timeCol = index; return; } - if (column === 'sequence_number') { return; } - if (!titleCol) { titleCol = index; } - if (column === self.annotation.titleColumn) { titleCol = index; return; } - if (column === self.annotation.tagsColumn) { tagsCol = index; return; } - if (column === self.annotation.textColumn) { textCol = index; return; } - }); - - _.each(series.points, function (point) { - var data = { - annotation: self.annotation, - time: point[timeCol], - title: point[titleCol], - tags: point[tagsCol], - text: point[textCol] - }; - - if (tagsCol) { - data.tags = point[tagsCol]; - } - - list.push(data); - }); - }); - - return list; - }; - - p.createNameForSeries = function(seriesName, groupByColValue) { - var regex = /\$(\w+)/g; - var segments = seriesName.split('.'); - - return this.alias.replace(regex, function(match, group) { - if (group === 's') { - return seriesName; - } - else if (group === 'g') { - return groupByColValue; - } - var index = parseInt(group); - if (_.isNumber(index) && index < segments.length) { - return segments[index]; - } - return match; - }); - - }; - - return InfluxSeries; -}); diff --git a/public/app/plugins/datasource/influxdb_08/partials/annotations.editor.html b/public/app/plugins/datasource/influxdb_08/partials/annotations.editor.html deleted file mode 100644 index cec47e7a7e4..00000000000 --- a/public/app/plugins/datasource/influxdb_08/partials/annotations.editor.html +++ /dev/null @@ -1,29 +0,0 @@ -
-
-
InfluxDB Query Example: select text from events where $timeFilter
-
- -
-
-
- -
-
-
Column mappings If your influxdb query returns more than one column you need to specify the column names below. An annotation event is composed of a title, tags, and an additional text field.
-
- - -
- -
- - -
- -
- - -
-
-
- diff --git a/public/app/plugins/datasource/influxdb_08/partials/config.html b/public/app/plugins/datasource/influxdb_08/partials/config.html deleted file mode 100644 index 0c05f8f5bd1..00000000000 --- a/public/app/plugins/datasource/influxdb_08/partials/config.html +++ /dev/null @@ -1,36 +0,0 @@ -
- -
- -
InfluxDB Details
- -
- -
-
-
- -
-
- - diff --git a/public/app/plugins/datasource/influxdb_08/partials/query.editor.html b/public/app/plugins/datasource/influxdb_08/partials/query.editor.html deleted file mode 100644 index 2498a16eb41..00000000000 --- a/public/app/plugins/datasource/influxdb_08/partials/query.editor.html +++ /dev/null @@ -1,159 +0,0 @@ -
- - - - - - - - - - -
-
- -
- - - - - -
-
- - diff --git a/public/app/plugins/datasource/influxdb_08/partials/query.options.html b/public/app/plugins/datasource/influxdb_08/partials/query.options.html deleted file mode 100644 index 413616fb4be..00000000000 --- a/public/app/plugins/datasource/influxdb_08/partials/query.options.html +++ /dev/null @@ -1,85 +0,0 @@ -
-
-
    -
  • - -
  • -
  • - group by time -
  • -
  • - -
  • -
  • - -
  • -
-
-
- - -
- -
-
- -
-
Alias patterns
-
    -
  • $s = series name
  • -
  • $g = group by
  • -
  • $[0-9] part of series name for series names seperated by dots.
  • -
-
- -
-
Stacking and fill
-
    -
  • When stacking is enabled it important that points align
  • -
  • If there are missing points for one series it can cause gaps or missing bars
  • -
  • You must use fill(0), and select a group by time low limit
  • -
  • Use the group by time option below your queries and specify for example >10s if your metrics are written every 10 seconds
  • -
  • This will insert zeros for series that are missing measurements and will make stacking work properly
  • -
-
- -
-
Group by time
-
    -
  • Group by time is important, otherwise the query could return many thousands of datapoints that will slow down Grafana
  • -
  • Leave the group by time field empty for each query and it will be calculated based on time range and pixel width of the graph
  • -
  • If you use fill(0) or fill(null) set a low limit for the auto group by time interval
  • -
  • The low limit can only be set in the group by time option below your queries
  • -
  • You set a low limit by adding a greater sign before the interval
  • -
  • Example: >60s if you write metrics to InfluxDB every 60 seconds
  • -
-
- - -
-
- - diff --git a/public/app/plugins/datasource/influxdb_08/plugin.json b/public/app/plugins/datasource/influxdb_08/plugin.json deleted file mode 100644 index 975b2cceaf4..00000000000 --- a/public/app/plugins/datasource/influxdb_08/plugin.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "pluginType": "datasource", - "name": "InfluxDB 0.8.x", - - "type": "influxdb_08", - "serviceName": "InfluxDatasource_08", - - "module": "app/plugins/datasource/influxdb_08/datasource", - - "partials": { - "config": "app/plugins/datasource/influxdb_08/partials/config.html" - }, - - "defaultMatchFormat": "regex values", - "metrics": true, - "annotations": true -} diff --git a/public/app/plugins/datasource/influxdb_08/query_builder.js b/public/app/plugins/datasource/influxdb_08/query_builder.js deleted file mode 100644 index 5ee7746af6b..00000000000 --- a/public/app/plugins/datasource/influxdb_08/query_builder.js +++ /dev/null @@ -1,67 +0,0 @@ -define([ -], -function () { - 'use strict'; - - function InfluxQueryBuilder(target) { - this.target = target; - } - - var p = InfluxQueryBuilder.prototype; - - p.build = function() { - return this.target.rawQuery ? this._modifyRawQuery() : this._buildQuery(); - }; - - p._buildQuery = function() { - var target = this.target; - var query = 'select '; - var seriesName = target.series; - - if(!seriesName.match('^/.*/') && !seriesName.match(/^merge\(.*\)/)) { - seriesName = '"' + seriesName+ '"'; - } - - if (target.groupby_field) { - query += target.groupby_field + ', '; - } - - query += target.function + '(' + target.column + ')'; - query += ' from ' + seriesName + ' where $timeFilter'; - - if (target.condition) { - query += ' and ' + target.condition; - } - - query += ' group by time($interval)'; - - if (target.groupby_field) { - query += ', ' + target.groupby_field; - this.groupByField = target.groupby_field; - } - - if (target.fill) { - query += ' fill(' + target.fill + ')'; - } - - query += " order asc"; - target.query = query; - - return query; - }; - - p._modifyRawQuery = function () { - var query = this.target.query.replace(";", ""); - - var queryElements = query.split(" "); - var lowerCaseQueryElements = query.toLowerCase().split(" "); - - if (lowerCaseQueryElements[1].indexOf(',') !== -1) { - this.groupByField = lowerCaseQueryElements[1].replace(',', ''); - } - - return queryElements.join(" "); - }; - - return InfluxQueryBuilder; -}); diff --git a/public/app/plugins/datasource/influxdb_08/query_ctrl.js b/public/app/plugins/datasource/influxdb_08/query_ctrl.js deleted file mode 100644 index 093e0af84d1..00000000000 --- a/public/app/plugins/datasource/influxdb_08/query_ctrl.js +++ /dev/null @@ -1,95 +0,0 @@ -define([ - 'angular', -], -function (angular) { - 'use strict'; - - var module = angular.module('grafana.controllers'); - - var seriesList = null; - - module.controller('InfluxQueryCtrl_08', function($scope, $timeout) { - - $scope.init = function() { - var target = $scope.target; - - target.function = target.function || 'mean'; - target.column = target.column || 'value'; - - // backward compatible correction of schema - if (target.condition_value) { - target.condition = target.condition_key + ' ' + target.condition_op + ' ' + target.condition_value; - delete target.condition_key; - delete target.condition_op; - delete target.condition_value; - } - - if (target.groupby_field_add === false) { - target.groupby_field = ''; - delete target.groupby_field_add; - } - - $scope.functions = [ - 'count', 'mean', 'sum', 'min', - 'max', 'mode', 'distinct', 'median', - 'derivative', 'stddev', 'first', 'last', - 'difference' - ]; - - $scope.operators = ['=', '=~', '>', '<', '!~', '<>']; - $scope.oldSeries = target.series; - $scope.$on('typeahead-updated', function() { - $timeout($scope.get_data); - }); - }; - - $scope.toggleQueryMode = function () { - $scope.target.rawQuery = !$scope.target.rawQuery; - }; - - // Cannot use typeahead and ng-change on blur at the same time - $scope.seriesBlur = function() { - if ($scope.oldSeries !== $scope.target.series) { - $scope.oldSeries = $scope.target.series; - $scope.columnList = null; - $scope.get_data(); - } - }; - - $scope.changeFunction = function(func) { - $scope.target.function = func; - $scope.get_data(); - }; - - // called outside of digest - $scope.listColumns = function(query, callback) { - if (!$scope.columnList) { - $scope.$apply(function() { - $scope.datasource.listColumns($scope.target.series).then(function(columns) { - $scope.columnList = columns; - callback(columns); - }); - }); - } - else { - return $scope.columnList; - } - }; - - $scope.listSeries = function(query, callback) { - if (query !== '') { - seriesList = []; - $scope.datasource.listSeries(query).then(function(series) { - seriesList = series; - callback(seriesList); - }); - } - else { - return seriesList; - } - }; - - $scope.init(); - - }); -}); diff --git a/public/app/plugins/datasource/influxdb_08/specs/datasource-specs.ts b/public/app/plugins/datasource/influxdb_08/specs/datasource-specs.ts deleted file mode 100644 index a8111776465..00000000000 --- a/public/app/plugins/datasource/influxdb_08/specs/datasource-specs.ts +++ /dev/null @@ -1,98 +0,0 @@ -/// -/// -/// -/// - -import {describe, beforeEach, it, sinon, expect, angularMocks} from 'test/lib/common'; - -declare var helpers: any; - -describe('InfluxDatasource', function() { - var ctx = new helpers.ServiceTestContext(); - - beforeEach(angularMocks.module('grafana.core')); - beforeEach(angularMocks.module('grafana.services')); - beforeEach(ctx.providePhase(['templateSrv'])); - beforeEach(ctx.createService('InfluxDatasource_08')); - beforeEach(function() { - ctx.ds = new ctx.service({ url: '', user: 'test', password: 'mupp' }); - }); - - describe('When querying influxdb with one target using query editor target spec', function() { - var results; - var urlExpected = "/series?p=mupp&q=select+mean(value)+from+%22test%22+where+time+%3E+now()-1h+group+by+time(1s)+order+asc"; - var query = { - rangeRaw: { from: 'now-1h', to: 'now' }, - targets: [{ series: 'test', column: 'value', function: 'mean' }], - interval: '1s' - }; - - var response = [{ - columns: ["time", "sequence_nr", "value"], - name: 'test', - points: [[10, 1, 1]], - }]; - - beforeEach(function() { - ctx.$httpBackend.expect('GET', urlExpected).respond(response); - ctx.ds.query(query).then(function(data) { results = data; }); - ctx.$httpBackend.flush(); - }); - - it('should generate the correct query', function() { - ctx.$httpBackend.verifyNoOutstandingExpectation(); - }); - - it('should return series list', function() { - expect(results.data.length).to.be(1); - expect(results.data[0].target).to.be('test.value'); - }); - - }); - - describe('When querying influxdb with one raw query', function() { - var results; - var urlExpected = "/series?p=mupp&q=select+value+from+series+where+time+%3E+now()-1h"; - var query = { - rangeRaw: { from: 'now-1h', to: 'now' }, - targets: [{ query: "select value from series where $timeFilter", rawQuery: true }] - }; - - var response = []; - - beforeEach(function() { - ctx.$httpBackend.expect('GET', urlExpected).respond(response); - ctx.ds.query(query).then(function(data) { results = data; }); - ctx.$httpBackend.flush(); - }); - - it('should generate the correct query', function() { - ctx.$httpBackend.verifyNoOutstandingExpectation(); - }); - - }); - - describe('When issuing annotation query', function() { - var results; - var urlExpected = "/series?p=mupp&q=select+title+from+events.backend_01+where+time+%3E+now()-1h"; - - var range = { from: 'now-1h', to: 'now' }; - var annotation = { query: 'select title from events.$server where $timeFilter' }; - var response = []; - - beforeEach(function() { - ctx.templateSrv.replace = function(str) { - return str.replace('$server', 'backend_01'); - }; - ctx.$httpBackend.expect('GET', urlExpected).respond(response); - ctx.ds.annotationQuery({annotation: annotation, rangeRaw: range}).then(function(data) { results = data; }); - ctx.$httpBackend.flush(); - }); - - it('should generate the correct query', function() { - ctx.$httpBackend.verifyNoOutstandingExpectation(); - }); - - }); - -}); diff --git a/public/app/plugins/datasource/influxdb_08/specs/influx_series_specs.ts b/public/app/plugins/datasource/influxdb_08/specs/influx_series_specs.ts deleted file mode 100644 index f8f2e4ed62f..00000000000 --- a/public/app/plugins/datasource/influxdb_08/specs/influx_series_specs.ts +++ /dev/null @@ -1,220 +0,0 @@ -/// - -import {describe, beforeEach, it, sinon, expect} from 'test/lib/common'; - -declare var InfluxSeries: any; - -describe('when generating timeseries from influxdb response', function() { - - describe('given two series', function() { - var series = new InfluxSeries({ - seriesList: [ - { - columns: ['time', 'mean', 'sequence_number'], - name: 'prod.server1.cpu', - points: [[1402596000, 10, 1], [1402596001, 12, 2]] - }, - { - columns: ['time', 'mean', 'sequence_number'], - name: 'prod.server2.cpu', - points: [[1402596000, 15, 1], [1402596001, 16, 2]] - } - ] - }); - - var result = series.getTimeSeries(); - - it('should generate two time series', function() { - expect(result.length).to.be(2); - expect(result[0].target).to.be('prod.server1.cpu.mean'); - expect(result[0].datapoints[0][0]).to.be(10); - expect(result[0].datapoints[0][1]).to.be(1402596000); - expect(result[0].datapoints[1][0]).to.be(12); - expect(result[0].datapoints[1][1]).to.be(1402596001); - - expect(result[1].target).to.be('prod.server2.cpu.mean'); - expect(result[1].datapoints[0][0]).to.be(15); - expect(result[1].datapoints[0][1]).to.be(1402596000); - expect(result[1].datapoints[1][0]).to.be(16); - expect(result[1].datapoints[1][1]).to.be(1402596001); - }); - - }); - - describe('given an alias format', function() { - var series = new InfluxSeries({ - seriesList: [ - { - columns: ['time', 'mean', 'sequence_number'], - name: 'prod.server1.cpu', - points: [[1402596000, 10, 1], [1402596001, 12, 2]] - } - ], - alias: '$s.testing' - }); - - var result = series.getTimeSeries(); - - it('should generate correct series name', function() { - expect(result[0].target).to.be('prod.server1.cpu.testing'); - }); - - }); - - describe('given an alias format with segment numbers', function() { - var series = new InfluxSeries({ - seriesList: [ - { - columns: ['time', 'mean', 'sequence_number'], - name: 'prod.server1.cpu', - points: [[1402596000, 10, 1], [1402596001, 12, 2]] - } - ], - alias: '$1.mean' - }); - - var result = series.getTimeSeries(); - - it('should generate correct series name', function() { - expect(result[0].target).to.be('server1.mean'); - }); - - }); - - describe('given an alias format and many segments', function() { - var series = new InfluxSeries({ - seriesList: [ - { - columns: ['time', 'mean', 'sequence_number'], - name: 'a0.a1.a2.a3.a4.a5.a6.a7.a8.a9.a10.a11.a12', - points: [[1402596000, 10, 1], [1402596001, 12, 2]] - } - ], - alias: '$5.$11.mean' - }); - - var result = series.getTimeSeries(); - - it('should generate correct series name', function() { - expect(result[0].target).to.be('a5.a11.mean'); - }); - - }); - - - describe('given an alias format with group by field', function() { - var series = new InfluxSeries({ - seriesList: [ - { - columns: ['time', 'mean', 'host'], - name: 'prod.cpu', - points: [[1402596000, 10, 'A']] - } - ], - groupByField: 'host', - alias: '$g.$1' - }); - - var result = series.getTimeSeries(); - - it('should generate correct series name', function() { - expect(result[0].target).to.be('A.cpu'); - }); - - }); - - describe('given group by column', function() { - var series = new InfluxSeries({ - seriesList: [ - { - columns: ['time', 'mean', 'host'], - name: 'prod.cpu', - points: [ - [1402596000, 10, 'A'], - [1402596001, 11, 'A'], - [1402596000, 5, 'B'], - [1402596001, 6, 'B'], - ] - } - ], - groupByField: 'host' - }); - - var result = series.getTimeSeries(); - - it('should generate two time series', function() { - expect(result.length).to.be(2); - expect(result[0].target).to.be('prod.cpu.A'); - expect(result[0].datapoints[0][0]).to.be(10); - expect(result[0].datapoints[0][1]).to.be(1402596000); - expect(result[0].datapoints[1][0]).to.be(11); - expect(result[0].datapoints[1][1]).to.be(1402596001); - - expect(result[1].target).to.be('prod.cpu.B'); - expect(result[1].datapoints[0][0]).to.be(5); - expect(result[1].datapoints[0][1]).to.be(1402596000); - expect(result[1].datapoints[1][0]).to.be(6); - expect(result[1].datapoints[1][1]).to.be(1402596001); - }); - - }); - -}); - -describe("when creating annotations from influxdb response", function() { - describe('given column mapping for all columns', function() { - var series = new InfluxSeries({ - seriesList: [ - { - columns: ['time', 'text', 'sequence_number', 'title', 'tags'], - name: 'events1', - points: [[1402596000000, 'some text', 1, 'Hello', 'B'], [1402596001000, 'asd', 2, 'Hello2', 'B']] - } - ], - annotation: { - query: 'select', - titleColumn: 'title', - tagsColumn: 'tags', - textColumn: 'text', - } - }); - - var result = series.getAnnotations(); - - it(' should generate 2 annnotations ', function() { - expect(result.length).to.be(2); - expect(result[0].annotation.query).to.be('select'); - expect(result[0].title).to.be('Hello'); - expect(result[0].time).to.be(1402596000000); - expect(result[0].tags).to.be('B'); - expect(result[0].text).to.be('some text'); - }); - - }); - - describe('given no column mapping', function() { - var series = new InfluxSeries({ - seriesList: [ - { - columns: ['time', 'text', 'sequence_number'], - name: 'events1', - points: [[1402596000000, 'some text', 1]] - } - ], - annotation: { query: 'select' } - }); - - var result = series.getAnnotations(); - - it('should generate 1 annnotation', function() { - expect(result.length).to.be(1); - expect(result[0].title).to.be('some text'); - expect(result[0].time).to.be(1402596000000); - expect(result[0].tags).to.be(undefined); - expect(result[0].text).to.be(undefined); - }); - - }); - -}); - diff --git a/public/app/plugins/datasource/influxdb_08/specs/query_builder_specs.ts b/public/app/plugins/datasource/influxdb_08/specs/query_builder_specs.ts deleted file mode 100644 index 5876efb962e..00000000000 --- a/public/app/plugins/datasource/influxdb_08/specs/query_builder_specs.ts +++ /dev/null @@ -1,78 +0,0 @@ -/// - -import {describe, beforeEach, it, sinon, expect} from 'test/lib/common'; - -declare var InfluxQueryBuilder: any; - -describe('InfluxQueryBuilder', function() { - - describe('series with conditon and group by', function() { - var builder = new InfluxQueryBuilder({ - series: 'google.test', - column: 'value', - function: 'mean', - condition: "code=1", - groupby_field: 'code' - }); - - var query = builder.build(); - - it('should generate correct query', function() { - expect(query).to.be('select code, mean(value) from "google.test" where $timeFilter and code=1 ' + - 'group by time($interval), code order asc'); - }); - - it('should expose groupByFiled', function() { - expect(builder.groupByField).to.be('code'); - }); - - }); - - describe('series with fill and minimum group by time', function() { - var builder = new InfluxQueryBuilder({ - series: 'google.test', - column: 'value', - function: 'mean', - fill: '0', - }); - - var query = builder.build(); - - it('should generate correct query', function() { - expect(query).to.be('select mean(value) from "google.test" where $timeFilter ' + - 'group by time($interval) fill(0) order asc'); - }); - - }); - - describe('merge function detection', function() { - it('should not quote wrap regex merged series', function() { - var builder = new InfluxQueryBuilder({ - series: 'merge(/^google.test/)', - column: 'value', - function: 'mean' - }); - - var query = builder.build(); - - expect(query).to.be('select mean(value) from merge(/^google.test/) where $timeFilter ' + - 'group by time($interval) order asc'); - }); - - it('should quote wrap series names that start with "merge"', function() { - var builder = new InfluxQueryBuilder({ - series: 'merge.google.test', - column: 'value', - function: 'mean' - }); - - var query = builder.build(); - - expect(query).to.be('select mean(value) from "merge.google.test" where $timeFilter ' + - 'group by time($interval) order asc'); - }); - - }); - -}); -