mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Merge branch 'master' of github.com:torkelo/grafana-private into pro
Conflicts: src/app/app.js src/app/controllers/all.js src/app/routes/all.js src/app/services/datasourceSrv.js src/test/test-main.js
This commit is contained in:
commit
75c77a44c9
@ -1,9 +1,12 @@
|
||||
# 1.9.1 (unreleased)
|
||||
# 1.9.1 (2014-12-29)
|
||||
|
||||
**Enhancements**
|
||||
- [Issue #1028](https://github.com/grafana/grafana/issues/1028). Graph: New legend option ``hideEmtpy`` to hide series with only null values
|
||||
- [Issue #1028](https://github.com/grafana/grafana/issues/1028). Graph: New legend option ``hideEmtpy`` to hide series with only null values from legend
|
||||
- [Issue #1242](https://github.com/grafana/grafana/issues/1242). OpenTSDB: Downsample query field now supports interval template variable
|
||||
- [Issue #1126](https://github.com/grafana/grafana/issues/1126). InfluxDB: Support more than 10 series name segments when using alias ``$number`` patterns
|
||||
|
||||
**Fixes**
|
||||
- [Issue #1251](https://github.com/grafana/grafana/issues/1251). Graph: Fix for y axis and scaled units (GiB etc) caused rounding, for example 400 GiB instead of 378 GiB
|
||||
- [Issue #1199](https://github.com/grafana/grafana/issues/1199). Graph: fix for series tooltip when one series is hidden/disabled
|
||||
- [Issue #1207](https://github.com/grafana/grafana/issues/1207). Graphite: movingAverage / movingMedian parameter type impovement, now handles int and interval parameter
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
{
|
||||
"version": "1.9.0",
|
||||
"url": "http://grafanarel.s3.amazonaws.com/grafana-1.9.0.tar.gz"
|
||||
"version": "1.9.1",
|
||||
"url": "http://grafanarel.s3.amazonaws.com/grafana-1.9.1.tar.gz"
|
||||
}
|
||||
|
@ -4,7 +4,7 @@
|
||||
"company": "Coding Instinct AB"
|
||||
},
|
||||
"name": "grafana",
|
||||
"version": "1.9.0",
|
||||
"version": "1.9.1",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "http://github.com/torkelo/grafana.git"
|
||||
|
@ -85,7 +85,7 @@ function (angular, $, _, appLevelRequire, config) {
|
||||
'directives/all',
|
||||
'filters/all',
|
||||
'components/partials',
|
||||
'routes/all',
|
||||
'routes/backend/all',
|
||||
];
|
||||
|
||||
_.each(config.plugins.dependencies, function(dep) {
|
||||
|
@ -339,7 +339,7 @@ function($, _, moment) {
|
||||
return "";
|
||||
}
|
||||
|
||||
var factor = decimals ? Math.pow(10, decimals) : 1;
|
||||
var factor = decimals ? Math.pow(10, Math.max(0, decimals)) : 1;
|
||||
var formatted = String(Math.round(value * factor) / factor);
|
||||
|
||||
// if exponent return directly
|
||||
|
@ -1,20 +1,9 @@
|
||||
define([
|
||||
'./pro/grafanaCtrl',
|
||||
'./pro/sharePanelCtrl',
|
||||
'./dashboardCtrl',
|
||||
'./dashboardNavCtrl',
|
||||
'./row',
|
||||
'./submenuCtrl',
|
||||
'./grafanaCtrl',
|
||||
'./pulldown',
|
||||
'./search',
|
||||
'./metricKeys',
|
||||
'./graphiteTarget',
|
||||
'./graphiteImport',
|
||||
'./influxTargetCtrl',
|
||||
'./playlistCtrl',
|
||||
'./inspectCtrl',
|
||||
'./opentsdbTargetCtrl',
|
||||
'./annotationsEditorCtrl',
|
||||
'./templateEditorCtrl',
|
||||
'./jsonEditorCtrl',
|
||||
], function () {});
|
||||
|
@ -1,6 +1,5 @@
|
||||
define([
|
||||
'angular',
|
||||
'services/pro/backendSrv',
|
||||
],
|
||||
function (angular) {
|
||||
'use strict';
|
||||
|
@ -1,6 +1,5 @@
|
||||
define([
|
||||
'angular',
|
||||
'services/pro/backendSrv',
|
||||
],
|
||||
function (angular) {
|
||||
'use strict';
|
||||
|
@ -19,6 +19,9 @@ function (angular, _, config, $) {
|
||||
$scope.db = datasourceSrv.getGrafanaDB();
|
||||
$scope.currentSearchId = 0;
|
||||
|
||||
// events
|
||||
$scope.onAppEvent('dashboard-deleted', $scope.dashboardDeleted);
|
||||
|
||||
$timeout(function() {
|
||||
$scope.giveSearchFocus = $scope.giveSearchFocus + 1;
|
||||
$scope.query.query = 'title:';
|
||||
@ -123,6 +126,10 @@ function (angular, _, config, $) {
|
||||
$scope.deleteDashboard = function(dash, evt) {
|
||||
evt.stopPropagation();
|
||||
$scope.appEvent('delete-dashboard', { id: dash.id, title: dash.title });
|
||||
};
|
||||
|
||||
$scope.dashboardDeleted = function(evt, id) {
|
||||
var dash = _.findWhere($scope.results.dashboards, {id: id});
|
||||
$scope.results.dashboards = _.without($scope.results.dashboards, dash);
|
||||
};
|
||||
|
||||
|
@ -12,11 +12,8 @@ define([
|
||||
'./spectrumPicker',
|
||||
'./bootstrap-tagsinput',
|
||||
'./bodyClass',
|
||||
'./addGraphiteFunc',
|
||||
'./graphiteFuncEditor',
|
||||
'./templateParamSelector',
|
||||
'./graphiteSegment',
|
||||
'./grafanaVersionCheck',
|
||||
'./dropdown.typeahead',
|
||||
'./influxdbFuncEditor'
|
||||
], function () {});
|
||||
|
@ -18,7 +18,7 @@ function (angular, $, config) {
|
||||
'<div class="panel-header">'+
|
||||
'<span class="alert-error panel-error small pointer"' +
|
||||
'config-modal="app/partials/inspector.html" ng-if="panelMeta.error">' +
|
||||
'<span data-placement="right" bs-tooltip="panelMeta.error">' +
|
||||
'<span data-placement="top" bs-tooltip="panelMeta.error">' +
|
||||
'<i class="icon-exclamation-sign"></i><span class="panel-error-arrow"></span>' +
|
||||
'</span>' +
|
||||
'</span>' +
|
||||
|
@ -1,3 +1,10 @@
|
||||
define([
|
||||
'./panellinkeditor/module',
|
||||
'./annotations/annotationsSrv',
|
||||
'./templating/templateSrv',
|
||||
'./graphite/datasource',
|
||||
'./influxdb/datasource',
|
||||
'./opentsdb/datasource',
|
||||
'./elasticsearch/datasource',
|
||||
'./dashboard/all',
|
||||
], function () {});
|
||||
|
@ -1,7 +1,8 @@
|
||||
define([
|
||||
'angular',
|
||||
'lodash',
|
||||
'moment'
|
||||
'moment',
|
||||
'./editorCtrl'
|
||||
], function (angular, _, moment) {
|
||||
'use strict';
|
||||
|
@ -16,7 +16,7 @@
|
||||
<div class="dashboard-editor-body">
|
||||
<div class="editor-row row" ng-if="editor.index == 0">
|
||||
<div class="span6">
|
||||
<div ng-if="variables.length === 0">
|
||||
<div ng-if="annotations.length === 0">
|
||||
<em>No annotations defined</em>
|
||||
</div>
|
||||
<table class="grafana-options-table">
|
14
src/app/features/dashboard/all.js
Normal file
14
src/app/features/dashboard/all.js
Normal file
@ -0,0 +1,14 @@
|
||||
define([
|
||||
'./dashboardCtrl',
|
||||
'./dashboardNavCtrl',
|
||||
'./playlistCtrl',
|
||||
'./rowCtrl',
|
||||
'./sharePanelCtrl',
|
||||
'./submenuCtrl',
|
||||
'./dashboardSrv',
|
||||
'./keybindings',
|
||||
'./viewStateSrv',
|
||||
'./playlistSrv',
|
||||
'./panelSrv',
|
||||
'./timeSrv',
|
||||
], function () {});
|
@ -107,6 +107,7 @@ function (angular, _, moment, config, store) {
|
||||
$scope.deleteDashboardConfirmed = function(options) {
|
||||
var id = options.id;
|
||||
$scope.db.deleteDashboard(id).then(function(id) {
|
||||
$scope.appEvent('dashboard-deleted', id);
|
||||
$scope.appEvent('alert-success', ['Dashboard Deleted', id + ' has been deleted']);
|
||||
}, function(err) {
|
||||
$scope.appEvent('alert-error', ['Deleted failed', err]);
|
@ -4,7 +4,6 @@ define([
|
||||
'kbn',
|
||||
'lodash',
|
||||
'moment',
|
||||
'../timer',
|
||||
],
|
||||
function (angular, $, kbn, _, moment) {
|
||||
'use strict';
|
@ -24,7 +24,7 @@ function (angular, _, config, kbn, moment) {
|
||||
this.saveTemp = _.isUndefined(datasource.save_temp) ? true : datasource.save_temp;
|
||||
this.saveTempTTL = _.isUndefined(datasource.save_temp_ttl) ? '30d' : datasource.save_temp_ttl;
|
||||
|
||||
this.annotationEditorSrc = 'app/partials/elasticsearch/annotation_editor.html';
|
||||
this.annotationEditorSrc = 'app/features/elasticsearch/partials/annotations.editor.html';
|
||||
this.supportAnnotations = true;
|
||||
this.supportMetrics = false;
|
||||
}
|
@ -3,7 +3,7 @@ define([
|
||||
'app',
|
||||
'lodash',
|
||||
'jquery',
|
||||
'../services/graphite/gfunc',
|
||||
'./gfunc',
|
||||
],
|
||||
function (angular, app, _, $, gfunc) {
|
||||
'use strict';
|
@ -4,7 +4,10 @@ define([
|
||||
'jquery',
|
||||
'config',
|
||||
'kbn',
|
||||
'moment'
|
||||
'moment',
|
||||
'./queryCtrl',
|
||||
'./funcEditor',
|
||||
'./addGraphiteFunc',
|
||||
],
|
||||
function (angular, _, $, config, kbn, moment) {
|
||||
'use strict';
|
||||
@ -17,14 +20,15 @@ function (angular, _, $, config, kbn, moment) {
|
||||
this.type = 'graphite';
|
||||
this.basicAuth = datasource.basicAuth;
|
||||
this.url = datasource.url;
|
||||
this.editorSrc = 'app/partials/graphite/editor.html';
|
||||
this.name = datasource.name;
|
||||
this.render_method = datasource.render_method || 'POST';
|
||||
this.supportAnnotations = true;
|
||||
this.supportMetrics = true;
|
||||
this.annotationEditorSrc = 'app/partials/graphite/annotation_editor.html';
|
||||
this.cacheTimeout = datasource.cacheTimeout;
|
||||
this.withCredentials = datasource.withCredentials;
|
||||
this.render_method = datasource.render_method || 'POST';
|
||||
|
||||
this.supportAnnotations = true;
|
||||
this.supportMetrics = true;
|
||||
this.editorSrc = 'app/features/graphite/partials/query.editor.html';
|
||||
this.annotationEditorSrc = 'app/features/graphite/partials/annotations.editor.html';
|
||||
}
|
||||
|
||||
GraphiteDatasource.prototype.query = function(options) {
|
@ -3,7 +3,7 @@
|
||||
<div ng-repeat="target in panel.targets"
|
||||
class="grafana-target"
|
||||
ng-class="{'grafana-target-hidden': target.hide}"
|
||||
ng-controller="GraphiteTargetCtrl"
|
||||
ng-controller="GraphiteQueryCtrl"
|
||||
ng-init="init()">
|
||||
|
||||
<div class="grafana-target-inner">
|
@ -2,8 +2,8 @@ define([
|
||||
'angular',
|
||||
'lodash',
|
||||
'config',
|
||||
'../services/graphite/gfunc',
|
||||
'../services/graphite/parser'
|
||||
'./gfunc',
|
||||
'./parser'
|
||||
],
|
||||
function (angular, _, config, gfunc, Parser) {
|
||||
'use strict';
|
||||
@ -11,7 +11,7 @@ function (angular, _, config, gfunc, Parser) {
|
||||
var module = angular.module('grafana.controllers');
|
||||
var targetLetters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O'];
|
||||
|
||||
module.controller('GraphiteTargetCtrl', function($scope, $sce, templateSrv) {
|
||||
module.controller('GraphiteQueryCtrl', function($scope, $sce, templateSrv) {
|
||||
|
||||
$scope.init = function() {
|
||||
$scope.target.target = $scope.target.target || '';
|
@ -3,7 +3,9 @@ define([
|
||||
'lodash',
|
||||
'kbn',
|
||||
'./influxSeries',
|
||||
'./influxQueryBuilder'
|
||||
'./queryBuilder',
|
||||
'./queryCtrl',
|
||||
'./funcEditor',
|
||||
],
|
||||
function (angular, _, kbn, InfluxSeries, InfluxQueryBuilder) {
|
||||
'use strict';
|
||||
@ -14,20 +16,20 @@ function (angular, _, kbn, InfluxSeries, InfluxQueryBuilder) {
|
||||
|
||||
function InfluxDatasource(datasource) {
|
||||
this.type = 'influxDB';
|
||||
this.editorSrc = 'app/partials/influxdb/editor.html';
|
||||
this.urls = datasource.urls;
|
||||
this.username = datasource.username;
|
||||
this.password = datasource.password;
|
||||
this.name = datasource.name;
|
||||
this.basicAuth = datasource.basicAuth;
|
||||
this.grafanaDB = datasource.grafanaDB;
|
||||
|
||||
this.saveTemp = _.isUndefined(datasource.save_temp) ? true : datasource.save_temp;
|
||||
this.saveTempTTL = _.isUndefined(datasource.save_temp_ttl) ? '30d' : datasource.save_temp_ttl;
|
||||
|
||||
this.grafanaDB = datasource.grafanaDB;
|
||||
this.supportAnnotations = true;
|
||||
this.supportMetrics = true;
|
||||
this.annotationEditorSrc = 'app/partials/influxdb/annotation_editor.html';
|
||||
this.editorSrc = 'app/features/influxdb/partials/query.editor.html';
|
||||
this.annotationEditorSrc = 'app/features/influxdb/partials/annotations.editor.html';
|
||||
}
|
||||
|
||||
InfluxDatasource.prototype.query = function(options) {
|
@ -106,21 +106,23 @@ function (_) {
|
||||
};
|
||||
|
||||
p.createNameForSeries = function(seriesName, groupByColValue) {
|
||||
var name = this.alias
|
||||
.replace('$s', seriesName);
|
||||
|
||||
var regex = /\$(\w+)/g;
|
||||
var segments = seriesName.split('.');
|
||||
for (var i = 0; i < segments.length; i++) {
|
||||
if (segments[i].length > 0) {
|
||||
name = name.replace('$' + i, segments[i]);
|
||||
|
||||
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;
|
||||
});
|
||||
|
||||
if (this.groupByField) {
|
||||
name = name.replace('$g', groupByColValue);
|
||||
}
|
||||
|
||||
return name;
|
||||
};
|
||||
|
||||
return InfluxSeries;
|
@ -3,7 +3,7 @@
|
||||
<div ng-repeat="target in panel.targets"
|
||||
class="grafana-target"
|
||||
ng-class="{'grafana-target-hidden': target.hide}"
|
||||
ng-controller="InfluxTargetCtrl"
|
||||
ng-controller="InfluxQueryCtrl"
|
||||
ng-init="init()">
|
||||
|
||||
<div class="grafana-target-inner-wrapper">
|
@ -9,7 +9,7 @@ function (angular, _) {
|
||||
|
||||
var seriesList = null;
|
||||
|
||||
module.controller('InfluxTargetCtrl', function($scope, $timeout) {
|
||||
module.controller('InfluxQueryCtrl', function($scope, $timeout) {
|
||||
|
||||
$scope.init = function() {
|
||||
var target = $scope.target;
|
@ -2,7 +2,8 @@ define([
|
||||
'angular',
|
||||
'lodash',
|
||||
'kbn',
|
||||
'moment'
|
||||
'moment',
|
||||
'./queryCtrl',
|
||||
],
|
||||
function (angular, _, kbn) {
|
||||
'use strict';
|
||||
@ -13,7 +14,7 @@ function (angular, _, kbn) {
|
||||
|
||||
function OpenTSDBDatasource(datasource) {
|
||||
this.type = 'opentsdb';
|
||||
this.editorSrc = 'app/partials/opentsdb/editor.html';
|
||||
this.editorSrc = 'app/features/opentsdb/partials/query.editor.html';
|
||||
this.url = datasource.url;
|
||||
this.name = datasource.name;
|
||||
this.supportMetrics = true;
|
||||
@ -148,7 +149,7 @@ function (angular, _, kbn) {
|
||||
}
|
||||
|
||||
if (target.shouldDownsample) {
|
||||
query.downsample = target.downsampleInterval + "-" + target.downsampleAggregator;
|
||||
query.downsample = templateSrv.replace(target.downsampleInterval) + "-" + target.downsampleAggregator;
|
||||
}
|
||||
|
||||
query.tags = angular.copy(target.tags);
|
@ -2,7 +2,7 @@
|
||||
<div ng-repeat="target in panel.targets"
|
||||
class="grafana-target"
|
||||
ng-class="{'grafana-target-hidden': target.hide}"
|
||||
ng-controller="OpenTSDBTargetCtrl"
|
||||
ng-controller="OpenTSDBQueryCtrl"
|
||||
ng-init="init()">
|
||||
|
||||
<div class="grafana-target-inner-wrapper">
|
@ -8,7 +8,7 @@ function (angular, _, kbn) {
|
||||
|
||||
var module = angular.module('grafana.controllers');
|
||||
|
||||
module.controller('OpenTSDBTargetCtrl', function($scope, $timeout) {
|
||||
module.controller('OpenTSDBQueryCtrl', function($scope, $timeout) {
|
||||
|
||||
$scope.init = function() {
|
||||
$scope.target.errors = validateTarget($scope.target);
|
@ -1,6 +1,8 @@
|
||||
define([
|
||||
'angular',
|
||||
'lodash',
|
||||
'./editorCtrl',
|
||||
'./templateValuesSrv',
|
||||
],
|
||||
function (angular, _) {
|
||||
'use strict';
|
@ -70,7 +70,11 @@ function ($) {
|
||||
|
||||
for (i = 0; i < seriesList.length; i++) {
|
||||
series = seriesList[i];
|
||||
if (!series.data.length) { continue; }
|
||||
|
||||
if (!series.data.length) {
|
||||
results.push({ hidden: true });
|
||||
continue;
|
||||
}
|
||||
|
||||
if (scope.panel.stack) {
|
||||
if (scope.panel.tooltip.value_type === 'individual') {
|
||||
@ -99,9 +103,9 @@ function ($) {
|
||||
lasthoverIndex = hoverIndex;
|
||||
}
|
||||
|
||||
results.push({ value: value, hoverIndex: newhoverIndex, series: series });
|
||||
results.push({ value: value, hoverIndex: newhoverIndex});
|
||||
} else {
|
||||
results.push({ value: value, hoverIndex: hoverIndex, series: series });
|
||||
results.push({ value: value, hoverIndex: hoverIndex});
|
||||
}
|
||||
}
|
||||
|
||||
@ -150,7 +154,12 @@ function ($) {
|
||||
|
||||
for (i = 0; i < seriesHoverInfo.length; i++) {
|
||||
hoverInfo = seriesHoverInfo[i];
|
||||
series = hoverInfo.series;
|
||||
|
||||
if (hoverInfo.hidden) {
|
||||
continue;
|
||||
}
|
||||
|
||||
series = seriesList[i];
|
||||
value = series.formatValue(hoverInfo.value);
|
||||
|
||||
seriesHtml += '<div class="graph-tooltip-list-item"><div class="graph-tooltip-series-name">';
|
||||
|
@ -7,9 +7,6 @@ define([
|
||||
'moment',
|
||||
'components/timeSeries',
|
||||
'components/panelmeta',
|
||||
'services/panelSrv',
|
||||
'services/annotationsSrv',
|
||||
'services/datasourceSrv',
|
||||
'./seriesOverridesCtrl',
|
||||
'./graph',
|
||||
'./legend',
|
||||
@ -146,10 +143,9 @@ function (angular, app, $, _, kbn, moment, TimeSeries, PanelMeta) {
|
||||
};
|
||||
|
||||
$scope.dataHandler = function(results) {
|
||||
$scope.panelMeta.loading = false;
|
||||
|
||||
// png renderer returns just a url
|
||||
if (_.isString(results)) {
|
||||
$scope.panelMeta.loading = false;
|
||||
$scope.render(results);
|
||||
return;
|
||||
}
|
||||
@ -164,9 +160,11 @@ function (angular, app, $, _, kbn, moment, TimeSeries, PanelMeta) {
|
||||
|
||||
$scope.annotationsPromise
|
||||
.then(function(annotations) {
|
||||
$scope.panelMeta.loading = false;
|
||||
$scope.seriesList.annotations = annotations;
|
||||
$scope.render($scope.seriesList);
|
||||
}, function() {
|
||||
$scope.panelMeta.loading = false;
|
||||
$scope.render($scope.seriesList);
|
||||
});
|
||||
};
|
||||
|
@ -23,15 +23,15 @@
|
||||
<h5>Big value font size</h5>
|
||||
<div class="editor-option">
|
||||
<label class="small">Prefix</label>
|
||||
<select class="input-mini" style="width: 75px;" ng-model="panel.prefixFontSize" ng-options="f for f in ['30%','50%','70%','80%','100%']" ng-change="render()"></select>
|
||||
<select class="input-mini" style="width: 75px;" ng-model="panel.prefixFontSize" ng-options="f for f in fontSizes" ng-change="render()"></select>
|
||||
</div>
|
||||
<div class="editor-option">
|
||||
<label class="small">Value</label>
|
||||
<select class="input-mini" style="width: 75px;" ng-model="panel.valueFontSize" ng-options="f for f in ['30%','50%','70%','80%','100%', '110%', '120%']" ng-change="render()"></select>
|
||||
<select class="input-mini" style="width: 75px;" ng-model="panel.valueFontSize" ng-options="f for f in fontSizes" ng-change="render()"></select>
|
||||
</div>
|
||||
<div class="editor-option">
|
||||
<label class="small">Postfix</label>
|
||||
<select class="input-mini" style="width: 75px;" ng-model="panel.postfixFontSize" ng-options="f for f in ['30%','50%','70%','80%','100%']" ng-change="render()"></select>
|
||||
<select class="input-mini" style="width: 75px;" ng-model="panel.postfixFontSize" ng-options="f for f in fontSizes" ng-change="render()"></select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -5,7 +5,6 @@ define([
|
||||
'components/timeSeries',
|
||||
'kbn',
|
||||
'components/panelmeta',
|
||||
'services/panelSrv',
|
||||
'./singleStatPanel',
|
||||
],
|
||||
function (angular, app, _, TimeSeries, kbn, PanelMeta) {
|
||||
@ -22,6 +21,8 @@ function (angular, app, _, TimeSeries, kbn, PanelMeta) {
|
||||
metricsEditor: true
|
||||
});
|
||||
|
||||
$scope.fontSizes = ['20%', '30%','50%','70%','80%','100%', '110%', '120%', '150%', '170%', '200%'];
|
||||
|
||||
$scope.panelMeta.addEditorTab('Options', 'app/panels/singlestat/editor.html');
|
||||
|
||||
// Set and populate defaults
|
||||
|
@ -10,7 +10,7 @@
|
||||
</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="pointer" dash-editor-link="app/partials/templating_editor.html">Templating</a></li>
|
||||
<li><a class="pointer" dash-editor-link="app/partials/annotations_editor.html">Annotations</a></li>
|
||||
<li><a class="pointer" dash-editor-link="app/features/annotations/partials/editor.html">Annotations</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
|
@ -1,7 +0,0 @@
|
||||
define([
|
||||
'./pro/dashboard',
|
||||
'./pro/admin',
|
||||
'./pro/solo-panel',
|
||||
'./pro/login',
|
||||
],
|
||||
function () {});
|
6
src/app/routes/backend/all.js
Normal file
6
src/app/routes/backend/all.js
Normal file
@ -0,0 +1,6 @@
|
||||
define([
|
||||
'./dashboard',
|
||||
'./admin',
|
||||
'./login',
|
||||
'./solo-panel',
|
||||
], function() {});
|
@ -1,20 +0,0 @@
|
||||
define([
|
||||
'angular',
|
||||
'config',
|
||||
'store'
|
||||
],
|
||||
function (angular, config, store) {
|
||||
"use strict";
|
||||
|
||||
var module = angular.module('grafana.routes');
|
||||
|
||||
module.config(function($routeProvider) {
|
||||
$routeProvider
|
||||
.when('/', {
|
||||
redirectTo: function() {
|
||||
return store.get('grafanaDashboardDefault') || config.default_route;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
});
|
23
src/app/routes/standalone/all.js
Normal file
23
src/app/routes/standalone/all.js
Normal file
@ -0,0 +1,23 @@
|
||||
define([
|
||||
'angular',
|
||||
'config',
|
||||
'store',
|
||||
'./fromDB',
|
||||
'./fromFile',
|
||||
'./fromScript',
|
||||
],
|
||||
function (angular, config, store) {
|
||||
'use strict';
|
||||
|
||||
var module = angular.module('grafana.routes');
|
||||
|
||||
module.config(function($routeProvider) {
|
||||
$routeProvider
|
||||
.when('/', {
|
||||
redirectTo: function() {
|
||||
return store.get('grafanaDashboardDefault') || config.default_route;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
});
|
@ -2,18 +2,10 @@ define([
|
||||
'./alertSrv',
|
||||
'./utilSrv',
|
||||
'./datasourceSrv',
|
||||
'./timeSrv',
|
||||
'./templateSrv',
|
||||
'./templateValuesSrv',
|
||||
'./panelSrv',
|
||||
'./timer',
|
||||
'./keyboardManager',
|
||||
'./annotationsSrv',
|
||||
'./popoverSrv',
|
||||
'./playlistSrv',
|
||||
'./unsavedChangesSrv',
|
||||
'./dashboard/dashboardKeyBindings',
|
||||
'./dashboard/dashboardSrv',
|
||||
'./dashboard/dashboardViewStateSrv',
|
||||
'./backendSrv',
|
||||
'./grafanaDatasource',
|
||||
],
|
||||
function () {});
|
||||
|
@ -2,11 +2,6 @@ define([
|
||||
'angular',
|
||||
'lodash',
|
||||
'config',
|
||||
'./graphite/graphiteDatasource',
|
||||
'./grafana/grafanaDatasource',
|
||||
'./influxdb/influxdbDatasource',
|
||||
'./opentsdb/opentsdbDatasource',
|
||||
'./elasticsearch/es-datasource',
|
||||
],
|
||||
function (angular, _, config) {
|
||||
'use strict';
|
||||
@ -68,6 +63,9 @@ function (angular, _, config) {
|
||||
case 'opentsdb':
|
||||
Datasource = $injector.get('OpenTSDBDatasource');
|
||||
break;
|
||||
case 'elasticsearch':
|
||||
Datasource = $injector.get('ElasticDatasource');
|
||||
break;
|
||||
case 'grafana':
|
||||
Datasource = $injector.get('GrafanaDatasource');
|
||||
break;
|
||||
|
@ -62,6 +62,7 @@
|
||||
left: 0;
|
||||
padding: 0px 17px 6px 5px;
|
||||
top: 0;
|
||||
z-index: 10;
|
||||
i {
|
||||
position: relative;
|
||||
top: -2px;
|
||||
|
@ -21,8 +21,8 @@ function (angular, _, kbn) {
|
||||
|
||||
CustomDatasource.prototype.query = function(options) {
|
||||
// get from & to in seconds
|
||||
var from = kbn.parseDate(options.range.from).getTime() / 1000;
|
||||
var to = kbn.parseDate(options.range.to).getTime() / 1000;
|
||||
var from = kbn.parseDate(options.range.from).getTime();
|
||||
var to = kbn.parseDate(options.range.to).getTime();
|
||||
|
||||
var series = [];
|
||||
var stepInSeconds = (to - from) / options.maxDataPoints;
|
||||
|
@ -1,5 +1,5 @@
|
||||
define([
|
||||
'services/dashboard/dashboardSrv'
|
||||
'features/dashboard/dashboardSrv'
|
||||
], function() {
|
||||
'use strict';
|
||||
|
||||
@ -95,7 +95,7 @@ define([
|
||||
beforeEach(module('grafana.services'));
|
||||
beforeEach(inject(function(dashboardSrv) {
|
||||
model = dashboardSrv.create({
|
||||
services: { filter: { time: { from: 'now-1d', to: 'now'}, list: [1] }},
|
||||
services: { filter: { time: { from: 'now-1d', to: 'now'}, list: [{}] }},
|
||||
pulldowns: [
|
||||
{
|
||||
type: 'filtering',
|
||||
@ -135,7 +135,7 @@ define([
|
||||
|
||||
it('should move time and filtering list', function() {
|
||||
expect(model.time.from).to.be('now-1d');
|
||||
expect(model.templating.list[0]).to.be(1);
|
||||
expect(model.templating.list[0].allFormat).to.be('glob');
|
||||
});
|
||||
|
||||
it('graphite panel should change name too graph', function() {
|
||||
|
@ -1,5 +1,5 @@
|
||||
define([
|
||||
'services/dashboard/dashboardViewStateSrv'
|
||||
'features/dashboard/viewStateSrv'
|
||||
], function() {
|
||||
'use strict';
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
define([
|
||||
'services/graphite/gfunc'
|
||||
'features/graphite/gfunc'
|
||||
], function(gfunc) {
|
||||
'use strict';
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
define([
|
||||
'./helpers',
|
||||
'helpers',
|
||||
'features/dashboard/panelSrv',
|
||||
'panels/graph/module'
|
||||
], function(helpers) {
|
||||
'use strict';
|
||||
|
@ -1,5 +1,5 @@
|
||||
define([
|
||||
'./helpers',
|
||||
'helpers',
|
||||
'angular',
|
||||
'jquery',
|
||||
'components/timeSeries',
|
||||
|
@ -1,6 +1,6 @@
|
||||
define([
|
||||
'./helpers',
|
||||
'services/graphite/graphiteDatasource'
|
||||
'helpers',
|
||||
'features/graphite/datasource'
|
||||
], function(helpers) {
|
||||
'use strict';
|
||||
|
||||
|
@ -1,16 +1,16 @@
|
||||
define([
|
||||
'./helpers',
|
||||
'services/graphite/gfunc',
|
||||
'controllers/graphiteTarget'
|
||||
'helpers',
|
||||
'features/graphite/gfunc',
|
||||
'features/graphite/queryCtrl'
|
||||
], function(helpers, gfunc) {
|
||||
'use strict';
|
||||
|
||||
describe('GraphiteTargetCtrl', function() {
|
||||
describe('GraphiteQueryCtrl', function() {
|
||||
var ctx = new helpers.ControllerTestContext();
|
||||
|
||||
beforeEach(module('grafana.controllers'));
|
||||
beforeEach(ctx.providePhase());
|
||||
beforeEach(ctx.createControllerPhase('GraphiteTargetCtrl'));
|
||||
beforeEach(ctx.createControllerPhase('GraphiteQueryCtrl'));
|
||||
|
||||
beforeEach(function() {
|
||||
ctx.scope.target = {
|
||||
|
@ -1,5 +1,5 @@
|
||||
define([
|
||||
'services/influxdb/influxQueryBuilder'
|
||||
'features/influxdb/queryBuilder'
|
||||
], function(InfluxQueryBuilder) {
|
||||
'use strict';
|
||||
|
||||
@ -68,7 +68,7 @@ define([
|
||||
var query = builder.build();
|
||||
|
||||
expect(query).to.be('select mean(value) from "merge.google.test" where $timeFilter ' +
|
||||
'group by time($interval) order asc');
|
||||
'group by time($interval) order asc');
|
||||
});
|
||||
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
define([
|
||||
'services/influxdb/influxSeries'
|
||||
'features/influxdb/influxSeries'
|
||||
], function(InfluxSeries) {
|
||||
'use strict';
|
||||
|
||||
@ -80,6 +80,27 @@ define([
|
||||
|
||||
});
|
||||
|
||||
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: [
|
||||
|
@ -1,6 +1,6 @@
|
||||
define([
|
||||
'./helpers',
|
||||
'services/influxdb/influxdbDatasource'
|
||||
'helpers',
|
||||
'features/influxdb/datasource'
|
||||
], function(helpers) {
|
||||
'use strict';
|
||||
|
||||
|
@ -29,6 +29,13 @@ define([
|
||||
describeValueFormat('ns', 25, 1, 0, '25 ns');
|
||||
describeValueFormat('ns', 2558, 50, 0, '2.56 µs');
|
||||
|
||||
describe('kbn.toFixed and negative decimals', function() {
|
||||
it('should treat as zero decimals', function() {
|
||||
var str = kbn.toFixed(186.123, -2);
|
||||
expect(str).to.be('186');
|
||||
});
|
||||
});
|
||||
|
||||
describe('calculateInterval', function() {
|
||||
it('1h 100 resultion', function() {
|
||||
var range = { from: kbn.parseDate('now-1h'), to: kbn.parseDate('now') };
|
||||
|
@ -1,5 +1,5 @@
|
||||
define([
|
||||
'services/graphite/lexer'
|
||||
'features/graphite/lexer'
|
||||
], function(Lexer) {
|
||||
'use strict';
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
define([
|
||||
'services/graphite/parser'
|
||||
'features/graphite/parser'
|
||||
], function(Parser) {
|
||||
'use strict';
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
define([
|
||||
'./helpers',
|
||||
'controllers/row'
|
||||
'helpers',
|
||||
'features/dashboard/rowCtrl'
|
||||
], function(helpers) {
|
||||
'use strict';
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
define([
|
||||
'./helpers',
|
||||
'helpers',
|
||||
'panels/graph/seriesOverridesCtrl'
|
||||
], function(helpers) {
|
||||
'use strict';
|
||||
|
@ -1,6 +1,6 @@
|
||||
define([
|
||||
'./helpers',
|
||||
'controllers/sharePanelCtrl'
|
||||
'helpers',
|
||||
'features/dashboard/sharePanelCtrl'
|
||||
], function(helpers) {
|
||||
'use strict';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
define([
|
||||
'mocks/dashboard-mock',
|
||||
'lodash',
|
||||
'services/templateSrv'
|
||||
'features/templating/templateSrv'
|
||||
], function(dashboardMock) {
|
||||
'use strict';
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
define([
|
||||
'mocks/dashboard-mock',
|
||||
'./helpers',
|
||||
'helpers',
|
||||
'moment',
|
||||
'services/templateValuesSrv'
|
||||
'features/templating/templateValuesSrv'
|
||||
], function(dashboardMock, helpers, moment) {
|
||||
'use strict';
|
||||
|
||||
|
@ -1,8 +1,9 @@
|
||||
define([
|
||||
'mocks/dashboard-mock',
|
||||
'./helpers',
|
||||
'helpers',
|
||||
'lodash',
|
||||
'services/timeSrv'
|
||||
'services/timer',
|
||||
'features/dashboard/timeSrv'
|
||||
], function(dashboardMock, helpers, _) {
|
||||
'use strict';
|
||||
|
||||
|
@ -4,7 +4,8 @@ require.config({
|
||||
paths: {
|
||||
specs: '../test/specs',
|
||||
mocks: '../test/mocks',
|
||||
config: '../config.sample',
|
||||
helpers: '../test/specs/helpers',
|
||||
config: ['../config', '../config.sample'],
|
||||
kbn: 'components/kbn',
|
||||
store: 'components/store',
|
||||
|
||||
@ -96,9 +97,10 @@ require.config({
|
||||
|
||||
require([
|
||||
'angular',
|
||||
'config',
|
||||
'angularMocks',
|
||||
'app',
|
||||
], function(angular) {
|
||||
], function(angular, config) {
|
||||
'use strict';
|
||||
|
||||
for (var file in window.__karma__.files) {
|
||||
@ -111,11 +113,9 @@ require([
|
||||
angular.module('grafana', ['ngRoute']);
|
||||
angular.module('grafana.services', ['ngRoute', '$strap.directives']);
|
||||
angular.module('grafana.panels', []);
|
||||
angular.module('grafana.routes', ['ngRoute']);
|
||||
angular.module('grafana.filters', []);
|
||||
|
||||
require([
|
||||
'specs/overview-ctrl-specs',
|
||||
var specs = [
|
||||
'specs/lexer-specs',
|
||||
'specs/parser-specs',
|
||||
'specs/gfunc-specs',
|
||||
@ -136,12 +136,16 @@ require([
|
||||
'specs/templateValuesSrv-specs',
|
||||
'specs/kbn-format-specs',
|
||||
'specs/dashboardSrv-specs',
|
||||
'specs/dashboardViewStateSrv-specs',
|
||||
'specs/overview-ctrl-specs',
|
||||
'specs/dashboardViewStateSrv-specs'
|
||||
'specs/pro/soloPanelCtrl-specs',
|
||||
], function () {
|
||||
window.__karma__.start();
|
||||
];
|
||||
|
||||
var pluginSpecs = (config.plugins.specs || []).map(function (spec) {
|
||||
return '../plugins/' + spec;
|
||||
});
|
||||
|
||||
require(specs.concat(pluginSpecs), function () {
|
||||
window.__karma__.start();
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -4,6 +4,7 @@ module.exports = function(grunt) {
|
||||
grunt.registerTask('build', [
|
||||
'jshint:source',
|
||||
'jshint:tests',
|
||||
'karma:test',
|
||||
'clean:on_start',
|
||||
'less:src',
|
||||
'concat:cssDark',
|
||||
|
@ -3,6 +3,7 @@ module.exports = function(config) {
|
||||
src: [
|
||||
'Gruntfile.js',
|
||||
'<%= srcDir %>/app/**/*.js',
|
||||
'<%= srcDir %>/plugins/**/*.js',
|
||||
'!<%= srcDir %>/app/panels/*/{lib,leaflet}/*',
|
||||
'!<%= srcDir %>/app/dashboards/*'
|
||||
],
|
||||
|
@ -63,7 +63,7 @@ module.exports = function(config,grunt) {
|
||||
'directives/all',
|
||||
'filters/all',
|
||||
'controllers/all',
|
||||
'routes/all',
|
||||
'routes/standalone/default',
|
||||
'components/partials',
|
||||
]
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user