From de26a17dc7350f9c40e84857f4c999b2a6dd5e01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 3 May 2016 09:00:58 +0200 Subject: [PATCH 01/63] feat(footer): began work on page footer --- pkg/api/dtos/index.go | 18 ++++++++------ pkg/api/frontendsettings.go | 8 +++--- pkg/api/index.go | 14 +++++++---- public/app/core/controllers/login_ctrl.js | 9 ------- public/app/partials/login.html | 9 ------- public/app/partials/signup_step2.html | 1 - public/sass/components/_footer.scss | 3 +++ public/views/index.html | 30 +++++++++++++++++++++++ 8 files changed, 56 insertions(+), 36 deletions(-) diff --git a/pkg/api/dtos/index.go b/pkg/api/dtos/index.go index 21201d30adf..b813c78f2bb 100644 --- a/pkg/api/dtos/index.go +++ b/pkg/api/dtos/index.go @@ -1,13 +1,17 @@ package dtos type IndexViewData struct { - User *CurrentUser - Settings map[string]interface{} - AppUrl string - AppSubUrl string - GoogleAnalyticsId string - GoogleTagManagerId string - MainNavLinks []*NavLink + User *CurrentUser + Settings map[string]interface{} + AppUrl string + AppSubUrl string + GoogleAnalyticsId string + GoogleTagManagerId string + MainNavLinks []*NavLink + BuildVersion string + BuildCommit string + NewGrafanaVersionExists bool + NewGrafanaVersion string } type PluginCss struct { diff --git a/pkg/api/frontendsettings.go b/pkg/api/frontendsettings.go index dd84f7827eb..f23f416b47a 100644 --- a/pkg/api/frontendsettings.go +++ b/pkg/api/frontendsettings.go @@ -137,11 +137,9 @@ func getFrontendSettingsMap(c *middleware.Context) (map[string]interface{}, erro "allowOrgCreate": (setting.AllowUserOrgCreate && c.IsSignedIn) || c.IsGrafanaAdmin, "authProxyEnabled": setting.AuthProxyEnabled, "buildInfo": map[string]interface{}{ - "version": setting.BuildVersion, - "commit": setting.BuildCommit, - "buildstamp": setting.BuildStamp, - "latestVersion": plugins.GrafanaLatestVersion, - "hasUpdate": plugins.GrafanaHasUpdate, + "version": setting.BuildVersion, + "commit": setting.BuildCommit, + "buildstamp": setting.BuildStamp, }, } diff --git a/pkg/api/index.go b/pkg/api/index.go index 53538fd2775..4e4f4fadfeb 100644 --- a/pkg/api/index.go +++ b/pkg/api/index.go @@ -36,11 +36,15 @@ func setIndexViewData(c *middleware.Context) (*dtos.IndexViewData, error) { LightTheme: prefs.Theme == "light", Timezone: prefs.Timezone, }, - Settings: settings, - AppUrl: setting.AppUrl, - AppSubUrl: setting.AppSubUrl, - GoogleAnalyticsId: setting.GoogleAnalyticsId, - GoogleTagManagerId: setting.GoogleTagManagerId, + Settings: settings, + AppUrl: setting.AppUrl, + AppSubUrl: setting.AppSubUrl, + GoogleAnalyticsId: setting.GoogleAnalyticsId, + GoogleTagManagerId: setting.GoogleTagManagerId, + BuildVersion: setting.BuildVersion, + BuildCommit: setting.BuildCommit, + NewGrafanaVersion: plugins.GrafanaLatestVersion, + NewGrafanaVersionExists: plugins.GrafanaHasUpdate, } if setting.DisableGravatar { diff --git a/public/app/core/controllers/login_ctrl.js b/public/app/core/controllers/login_ctrl.js index 4249d55a44f..45a47558ed7 100644 --- a/public/app/core/controllers/login_ctrl.js +++ b/public/app/core/controllers/login_ctrl.js @@ -35,15 +35,6 @@ function (angular, coreModule, config) { } }; - // build info view model - $scope.buildInfo = { - version: config.buildInfo.version, - commit: config.buildInfo.commit, - buildstamp: new Date(config.buildInfo.buildstamp * 1000), - latestVersion: config.buildInfo.latestVersion, - hasUpdate: config.buildInfo.hasUpdate, - }; - $scope.submit = function() { if ($scope.loginMode) { $scope.login(); diff --git a/public/app/partials/login.html b/public/app/partials/login.html index ff8d22451a8..8143ff35125 100644 --- a/public/app/partials/login.html +++ b/public/app/partials/login.html @@ -73,14 +73,5 @@ -
- - -
diff --git a/public/app/partials/signup_step2.html b/public/app/partials/signup_step2.html index 7b72c2357b9..afb6d0d4fc4 100644 --- a/public/app/partials/signup_step2.html +++ b/public/app/partials/signup_step2.html @@ -67,7 +67,6 @@ - diff --git a/public/sass/components/_footer.scss b/public/sass/components/_footer.scss index 9f2674980b0..3796275d7f9 100644 --- a/public/sass/components/_footer.scss +++ b/public/sass/components/_footer.scss @@ -7,3 +7,6 @@ a { color: darken($gray-1, 25%); } } +.footer { + padding: 5rem 0 1rem 0; +} diff --git a/public/views/index.html b/public/views/index.html index c4bffae5019..9bf1f9f2f0c 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -39,6 +39,36 @@
+ + From 7c4642372795ca6418f127f1de07395224fa6908 Mon Sep 17 00:00:00 2001 From: Richard Hartmann Date: Thu, 19 May 2016 10:34:12 +0200 Subject: [PATCH 02/63] ISSUE_TEMPLATE.md: Fix typo (#5099) --- .github/ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index b7d73592ef4..29b44752bc5 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -4,7 +4,7 @@ To help us respond to your issues faster, please make sure to add as much inform If this issue is about a plugin, please open the issue in that repository. -Start your issues title with [Feature Request] / [Bug] / [Question] or no tag if your unsure. Also, please be aware that GitHub now supports uploading of screenshots; look at the bottom of this input field. +Start your issues title with [Feature Request] / [Bug] / [Question] or no tag if you're unsure. Also, please be aware that GitHub now supports uploading of screenshots; look at the bottom of this input field. Please include some basic information: - What grafana version are you using? From 78360ece8ae2f4e411a650fc9b85b65aa812468c Mon Sep 17 00:00:00 2001 From: Richard Hartmann Date: Thu, 19 May 2016 10:59:38 +0200 Subject: [PATCH 03/63] ISSUE_TEMPLATE.md: Improve wording and fix typos (#5101) --- .github/ISSUE_TEMPLATE.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 29b44752bc5..e53a1159941 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,20 +1,19 @@ -Thank you! For helping us make Grafana even better. +Thank you for helping us make Grafana even better! -To help us respond to your issues faster, please make sure to add as much information as possible. +To help us respond to your issues more quickly, please make sure to add as much information as possible. -If this issue is about a plugin, please open the issue in that repository. +If this issue is about a plugin, please open the issue in that plugin's repository. -Start your issues title with [Feature Request] / [Bug] / [Question] or no tag if you're unsure. Also, please be aware that GitHub now supports uploading of screenshots; look at the bottom of this input field. +Start your issue's title with [Feature Request] / [Bug] / [Question] or no tag if you're unsure. Also, please be aware that GitHub now supports uploading of screenshots; look at the bottom of this input field. Please include some basic information: -- What grafana version are you using? +- What Grafana version are you using? - What datasource are you using? - What OS are you running grafana on? - What did you do? - What was the expected result? - What happenend instead? -If you question/bug relates to a metric query / unexpected data visualization, please include: +If your question/bug relates to a metric query / unexpected data visualization, please include: - An image or text representation of your metric query - The raw query and response from your data source (check this in chrome dev tools network tab) - From 37821e6d63440cb3ec1d5e5724d9a7c5230213f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Fri, 20 May 2016 08:31:27 +0200 Subject: [PATCH 04/63] fix(share modal): fixed link in share modal when sub app url is /dashboard/, fixes #5109 --- public/app/features/dashboard/shareModalCtrl.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/app/features/dashboard/shareModalCtrl.js b/public/app/features/dashboard/shareModalCtrl.js index 2944cc79e42..c28f73282b0 100644 --- a/public/app/features/dashboard/shareModalCtrl.js +++ b/public/app/features/dashboard/shareModalCtrl.js @@ -70,7 +70,7 @@ function (angular, _, require, config) { $scope.shareUrl = linkSrv.addParamsToUrl(baseUrl, params); var soloUrl = $scope.shareUrl; - soloUrl = soloUrl.replace('/dashboard/', '/dashboard-solo/'); + soloUrl = soloUrl.replace(config.appSubUrl + '/dashboard/', config.appSubUrl + '/dashboard-solo/'); soloUrl = soloUrl.replace("&fullscreen", ""); $scope.iframeHtml = ''; From 2e02abffc048653c7ce6b03ea944bc6e22070159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Fri, 20 May 2016 08:34:35 +0200 Subject: [PATCH 05/63] fix(render): fixed issue with image renderer caused by disabling angular debug info --- vendor/phantomjs/render.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/phantomjs/render.js b/vendor/phantomjs/render.js index e4bb83054a7..0de97273c5c 100644 --- a/vendor/phantomjs/render.js +++ b/vendor/phantomjs/render.js @@ -38,10 +38,10 @@ function checkIsReady() { var canvas = page.evaluate(function() { if (!window.angular) { return false; } - var body = window.angular.element(document.body); // 1 + var body = window.angular.element(document.body); if (!body.scope) { return false; } - var rootScope = body.scope(); + var rootScope = body.injector().get('$rootScope'); if (!rootScope) {return false;} if (!rootScope.performance) { return false; } var panelsToLoad = window.angular.element('div.panel').length; From df0ddc0b5034f9ec7b5ae4feb8c718a63ec8cc8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Fri, 20 May 2016 09:03:52 +0200 Subject: [PATCH 06/63] fix(prometheus): fixed bug in prometheus query editor, fixes #5107 --- public/app/plugins/datasource/prometheus/query_ctrl.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/app/plugins/datasource/prometheus/query_ctrl.ts b/public/app/plugins/datasource/prometheus/query_ctrl.ts index 94340804988..92cec328d87 100644 --- a/public/app/plugins/datasource/prometheus/query_ctrl.ts +++ b/public/app/plugins/datasource/prometheus/query_ctrl.ts @@ -58,6 +58,10 @@ class PrometheusQueryCtrl extends QueryCtrl { updateLink() { var range = this.panelCtrl.range; + if (!range) { + return; + } + var rangeDiff = Math.ceil((range.to.valueOf() - range.from.valueOf()) / 1000); var endTime = range.to.utc().format('YYYY-MM-DD HH:mm'); var expr = { From 2416ee04c840c45a4c38087a6e6a2ef4053a7543 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Fri, 20 May 2016 09:58:07 +0200 Subject: [PATCH 07/63] fix(templating): fixed detection of nested template variables, fixes #5103 --- public/app/features/templating/templateSrv.js | 7 +++++-- public/test/specs/templateSrv-specs.js | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/public/app/features/templating/templateSrv.js b/public/app/features/templating/templateSrv.js index 7e96af22e2a..e2e628c1cd5 100644 --- a/public/app/features/templating/templateSrv.js +++ b/public/app/features/templating/templateSrv.js @@ -97,8 +97,11 @@ function (angular, _) { if (!str) { return false; } - var match = this._regex.exec(str); - return match && (match[1] === variableName || match[2] === variableName); + + variableName = regexEscape(variableName); + var findVarRegex = new RegExp('\\$(' + variableName + ')[\\W|$]|\\[\\[(' + variableName + ')\\]\\]', 'g'); + var match = findVarRegex.exec(str); + return match !== null; }; this.highlightVariablesAsHtml = function(str) { diff --git a/public/test/specs/templateSrv-specs.js b/public/test/specs/templateSrv-specs.js index fd7247cbd81..c1f0e25ff9e 100644 --- a/public/test/specs/templateSrv-specs.js +++ b/public/test/specs/templateSrv-specs.js @@ -200,6 +200,11 @@ define([ expect(contains).to.be(true); }); + it('should find it when part of segment', function() { + var contains = _templateSrv.containsVariable('metrics.$env.$group-*', 'group'); + expect(contains).to.be(true); + }); + }); describe('updateTemplateData with simple value', function() { From e0e8fd663776a995142aa87565c282c11b3a9ed0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Fri, 20 May 2016 10:24:24 +0200 Subject: [PATCH 08/63] fix(templating): fixed handling of numeric values in tempalting query results, fixes #5097 --- public/app/features/templating/templateValuesSrv.js | 8 ++++++++ public/test/specs/templateSrv-specs.js | 4 ++-- public/test/specs/templateValuesSrv-specs.js | 13 +++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/public/app/features/templating/templateValuesSrv.js b/public/app/features/templating/templateValuesSrv.js index d44f07ed366..489e6291011 100644 --- a/public/app/features/templating/templateValuesSrv.js +++ b/public/app/features/templating/templateValuesSrv.js @@ -313,6 +313,14 @@ function (angular, _, kbn) { var value = item.value || item.text; var text = item.text || item.value; + if (_.isNumber(value)) { + value = value.toString(); + } + + if (_.isNumber(text)) { + text = text.toString(); + } + if (regex) { matches = regex.exec(value); if (!matches) { continue; } diff --git a/public/test/specs/templateSrv-specs.js b/public/test/specs/templateSrv-specs.js index c1f0e25ff9e..c5f33d4f72f 100644 --- a/public/test/specs/templateSrv-specs.js +++ b/public/test/specs/templateSrv-specs.js @@ -141,8 +141,8 @@ define([ }); it('slash should be properly escaped in regex format', function() { - var result = _templateSrv.formatValue('Gi3/14', 'regex'); - expect(result).to.be('Gi3\\/14'); + var result = _templateSrv.formatValue('Gi3/14', 'regex'); + expect(result).to.be('Gi3\\/14'); }); }); diff --git a/public/test/specs/templateValuesSrv-specs.js b/public/test/specs/templateValuesSrv-specs.js index 2edcd03da9a..8652ec421b2 100644 --- a/public/test/specs/templateValuesSrv-specs.js +++ b/public/test/specs/templateValuesSrv-specs.js @@ -126,6 +126,19 @@ define([ }); }); + describeUpdateVariable('query variable with numeric results', function(scenario) { + scenario.setup(function() { + scenario.variable = { type: 'query', query: '', name: 'test', current: {} }; + scenario.queryResult = [{text: 12, value: 12}]; + }); + + it('should set current value to first option', function() { + expect(scenario.variable.current.value).to.be('12'); + expect(scenario.variable.options[0].value).to.be('12'); + expect(scenario.variable.options[0].text).to.be('12'); + }); + }); + describeUpdateVariable('interval variable without auto', function(scenario) { scenario.setup(function() { scenario.variable = { type: 'interval', query: '1s,2h,5h,1d', name: 'test' }; From ee86d24797b65bcd74358afc179155d5492ad422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Fri, 20 May 2016 10:31:22 +0200 Subject: [PATCH 09/63] fix(elasticsearch): minor editor layout fix --- .../datasource/elasticsearch/partials/bucket_agg.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/app/plugins/datasource/elasticsearch/partials/bucket_agg.html b/public/app/plugins/datasource/elasticsearch/partials/bucket_agg.html index 75979226963..36e914d06e0 100644 --- a/public/app/plugins/datasource/elasticsearch/partials/bucket_agg.html +++ b/public/app/plugins/datasource/elasticsearch/partials/bucket_agg.html @@ -70,9 +70,9 @@
-
+
- +
@@ -88,7 +88,7 @@
- +
From f00cbc0aebfdaa736877ce4828f7d6146ec55a47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Fri, 20 May 2016 12:23:26 +0200 Subject: [PATCH 10/63] fix(panel height): fixed issue with singlestat height, fixes #4679, fixes #4894, fixes #5113 --- public/app/features/panel/panel_ctrl.ts | 3 ++- public/app/plugins/panel/graph/graph.js | 2 +- public/app/plugins/panel/singlestat/module.html | 1 - public/app/plugins/panel/singlestat/module.ts | 5 +++-- public/sass/components/_panel_singlestat.scss | 1 - 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/public/app/features/panel/panel_ctrl.ts b/public/app/features/panel/panel_ctrl.ts index 82e19f8681b..73aefb4c1bd 100644 --- a/public/app/features/panel/panel_ctrl.ts +++ b/public/app/features/panel/panel_ctrl.ts @@ -8,6 +8,7 @@ import $ from 'jquery'; const TITLE_HEIGHT = 25; const EMPTY_TITLE_HEIGHT = 9; const PANEL_PADDING = 5; +const PANEL_BORDER = 2; import {Emitter} from 'app/core/core'; @@ -141,7 +142,7 @@ export class PanelCtrl { } } - this.height = this.containerHeight - (PANEL_PADDING + (this.panel.title ? TITLE_HEIGHT : EMPTY_TITLE_HEIGHT)); + this.height = this.containerHeight - (PANEL_BORDER + PANEL_PADDING + (this.panel.title ? TITLE_HEIGHT : EMPTY_TITLE_HEIGHT)); } render(payload?) { diff --git a/public/app/plugins/panel/graph/graph.js b/public/app/plugins/panel/graph/graph.js index 562bf71c947..86ad3b5f025 100755 --- a/public/app/plugins/panel/graph/graph.js +++ b/public/app/plugins/panel/graph/graph.js @@ -66,7 +66,7 @@ function (angular, $, moment, _, kbn, GraphTooltip) { function getLegendHeight(panelHeight) { if (!panel.legend.show || panel.legend.rightSide) { - return 2; + return 0; } if (panel.legend.alignAsTable) { diff --git a/public/app/plugins/panel/singlestat/module.html b/public/app/plugins/panel/singlestat/module.html index 599e8724159..75a35374566 100644 --- a/public/app/plugins/panel/singlestat/module.html +++ b/public/app/plugins/panel/singlestat/module.html @@ -1,4 +1,3 @@
-
diff --git a/public/app/plugins/panel/singlestat/module.ts b/public/app/plugins/panel/singlestat/module.ts index 9fa3e8e39c6..d8a623b7ac1 100644 --- a/public/app/plugins/panel/singlestat/module.ts +++ b/public/app/plugins/panel/singlestat/module.ts @@ -234,10 +234,13 @@ class SingleStatCtrl extends MetricsPanelCtrl { var panel = ctrl.panel; var templateSrv = this.templateSrv; var data, linkInfo; + var width, height; var $panelContainer = elem.find('.panel-container'); elem = elem.find('.singlestat-panel'); function setElementHeight() { + width = elem.width(); + height = elem.height(); elem.css('height', ctrl.height + 'px'); } @@ -291,8 +294,6 @@ class SingleStatCtrl extends MetricsPanelCtrl { } var plotCanvas = $('
'); - var width = elem.width(); - var height = elem.height(); var plotCss = { top: '10px', margin: 'auto', diff --git a/public/sass/components/_panel_singlestat.scss b/public/sass/components/_panel_singlestat.scss index fac2f716674..48d0a29f4b8 100644 --- a/public/sass/components/_panel_singlestat.scss +++ b/public/sass/components/_panel_singlestat.scss @@ -5,7 +5,6 @@ } .singlestat-panel-value-container { - padding: 20px; display: table-cell; vertical-align: middle; text-align: center; From 9c672f6ec1ad09b633144d42a17d57cd9bc37746 Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanda Date: Fri, 20 May 2016 19:29:10 +0900 Subject: [PATCH 11/63] (prometheus) support new legend format (with backward compatibility) (#5096) * (prometheus) support new legend format (with backward compatibility) * (prometheus) use regex replace for legend format * (prometheus) allow white space --- .../datasource/prometheus/datasource.ts | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/public/app/plugins/datasource/prometheus/datasource.ts b/public/app/plugins/datasource/prometheus/datasource.ts index f1c58f6a61d..cbd7b1ba24b 100644 --- a/public/app/plugins/datasource/prometheus/datasource.ts +++ b/public/app/plugins/datasource/prometheus/datasource.ts @@ -256,23 +256,14 @@ export function PrometheusDatasource(instanceSettings, $q, backendSrv, templateS return this.renderTemplate(options.legendFormat, labelData) || '{}'; }; - this.renderTemplate = function(format, data) { - var originalSettings = _.templateSettings; - _.templateSettings = { - interpolate: /\{\{(.+?)\}\}/g - }; - - var template = _.template(templateSrv.replace(format)); - var result; - try { - result = template(data); - } catch (e) { - result = null; - } - - _.templateSettings = originalSettings; - - return result; + this.renderTemplate = function(aliasPattern, aliasData) { + var aliasRegex = /\{\{\s*(.+?)\s*\}\}/g; + return aliasPattern.replace(aliasRegex, function(match, g1) { + if (aliasData[g1]) { + return aliasData[g1]; + } + return g1; + }); }; this.getOriginalMetricName = function(labelData) { From 441682b5986535aefb47160161b9ba097c389465 Mon Sep 17 00:00:00 2001 From: "David J. Felix" Date: Fri, 20 May 2016 08:01:12 -0400 Subject: [PATCH 12/63] Fix linking for /dashboard-solo/ proxy prefix (#5116) Fixes #5109 --- public/app/features/dashboard/shareModalCtrl.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/app/features/dashboard/shareModalCtrl.js b/public/app/features/dashboard/shareModalCtrl.js index c28f73282b0..6f778ea27c2 100644 --- a/public/app/features/dashboard/shareModalCtrl.js +++ b/public/app/features/dashboard/shareModalCtrl.js @@ -75,7 +75,7 @@ function (angular, _, require, config) { $scope.iframeHtml = ''; - $scope.imageUrl = soloUrl.replace('/dashboard-solo/', '/render/dashboard-solo/'); + $scope.imageUrl = soloUrl.replace(config.appSubUrl + '/dashboard-solo/', config.appSubUrl + '/render/dashboard-solo/'); $scope.imageUrl += '&width=1000'; $scope.imageUrl += '&height=500'; }; From e6f251011fb9c7cf523ee822fb8019dace353abe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Fri, 20 May 2016 15:15:02 +0200 Subject: [PATCH 13/63] fix(panel span): fixed issue setting panel span while in fullscren and also an issue when changing repeat variable while in fullscreen view, fixes #4957 --- public/app/features/dashboard/rowCtrl.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/public/app/features/dashboard/rowCtrl.js b/public/app/features/dashboard/rowCtrl.js index 5607f1eecac..8ab1fcf88f8 100644 --- a/public/app/features/dashboard/rowCtrl.js +++ b/public/app/features/dashboard/rowCtrl.js @@ -142,12 +142,18 @@ function (angular, _, config) { }); module.directive('panelWidth', function() { + var fullscreen = false; + return function(scope, element) { function updateWidth() { - element[0].style.width = ((scope.panel.span / 1.2) * 10) + '%'; + if (!fullscreen) { + element[0].style.width = ((scope.panel.span / 1.2) * 10) + '%'; + } } scope.onAppEvent('panel-fullscreen-enter', function(evt, info) { + fullscreen = true; + if (scope.panel.id !== info.panelId) { element.hide(); } else { @@ -156,14 +162,20 @@ function (angular, _, config) { }); scope.onAppEvent('panel-fullscreen-exit', function(evt, info) { + fullscreen = false; + if (scope.panel.id !== info.panelId) { element.show(); - } else { - updateWidth(); } + + updateWidth(); }); scope.$watch('panel.span', updateWidth); + + if (fullscreen) { + element.hide(); + } }; }); From fb4dc77f36684b1e3e678047b670c6cc91b9f177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Fri, 20 May 2016 15:26:19 +0200 Subject: [PATCH 14/63] docs(): updated changelog with 3.0.3 fixes --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf074487057..1c4004f46a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,14 @@ # 3.0.3 Patch release (unreleased) * **Time picker**: Fixed issue timepicker and UTC when reading time from URL, fixes [#5078](https://github.com/grafana/grafana/issues/5078) * **CloudWatch**: Support for Multiple Account by AssumeRole, closes [#3522](https://github.com/grafana/grafana/issues/3522) +* **Singlestat**: Fixed alignment and minium height issue, fixes [#5113](https://github.com/grafana/grafana/issues/5113), fixes [#4679](https://github.com/grafana/grafana/issues/4679) +* **Share modal**: Fixed link when using grafana under dashboard sub url, fixes [#5109](https://github.com/grafana/grafana/issues/5109) +* **Prometheus**: Fixed bug in query editor that caused it not to load when reloading page, fixes [#5107](https://github.com/grafana/grafana/issues/5107) +* **Elasticsearch**: Fixed bug when template variable query returns numeric values, fixes [#5097](https://github.com/grafana/grafana/issues/5097), fixes [#5088](https://github.com/grafana/grafana/issues/5088) +* **Logging**: Fixed issue with reading logging level value, fixes [#5079](https://github.com/grafana/grafana/issues/5079) +* **Timepicker**: Fixed issue with timepicker and UTC when reading time from URL, fixes [#5078](https://github.com/grafana/grafana/issues/5078) +* **Docs**: Added docs for org & user preferences HTTP API, closes [#5069](https://github.com/grafana/grafana/issues/5069) +* **Plugin list panel**: Now shows correct enable state for apps when not enabled, fixes [#5068](https://github.com/grafana/grafana/issues/5068) # 3.0.2 Patch release (2016-05-16) From c727c3c441942a9bdcfb9ef37a3925a857844966 Mon Sep 17 00:00:00 2001 From: Trent White Date: Fri, 20 May 2016 15:58:14 -0400 Subject: [PATCH 15/63] resize and color of links --- .bra.toml | 2 +- public/sass/components/_footer.scss | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.bra.toml b/.bra.toml index 54019208984..f56e88fb02a 100644 --- a/.bra.toml +++ b/.bra.toml @@ -3,7 +3,7 @@ init_cmds = [ ["go", "build", "-o", "./bin/grafana-server", "./pkg/cmd/grafana-server"], ["./bin/grafana-server"] ] -watch_all = true +watch_all = false watch_dirs = [ "$WORKDIR/pkg", "$WORKDIR/public/views", diff --git a/public/sass/components/_footer.scss b/public/sass/components/_footer.scss index 3796275d7f9..5f9b433f45b 100644 --- a/public/sass/components/_footer.scss +++ b/public/sass/components/_footer.scss @@ -1,8 +1,14 @@ +footer { + font-size: 75%; + a { + color: $gray-1; + } +} + .grafana-version-info { position: absolute; bottom: 2px; left: 3px; - font-size: 80%; color: darken($gray-1, 25%); a { color: darken($gray-1, 25%); } } From cffcc4c7a5de8b12e1e925eb9c1e9b4095204ba5 Mon Sep 17 00:00:00 2001 From: Trent White Date: Fri, 20 May 2016 16:44:19 -0400 Subject: [PATCH 16/63] make footer unordered list. add new icons. --- public/sass/components/_footer.scss | 18 +++++++++ public/views/index.html | 57 ++++++++++++++++------------- 2 files changed, 49 insertions(+), 26 deletions(-) diff --git a/public/sass/components/_footer.scss b/public/sass/components/_footer.scss index 5f9b433f45b..3c8353ecbc7 100644 --- a/public/sass/components/_footer.scss +++ b/public/sass/components/_footer.scss @@ -1,8 +1,26 @@ footer { font-size: 75%; + width: 98%; /* was causing horiz scrollbars - need to examine */ a { color: $gray-1; } + ul { + list-style: none; + } + li { display: inline-block; + padding-right: 2px; + &:after { + content: ' | '; + padding-left: 2px; + color: $gray-1; + } + } + li:last-child { + &:after { + padding-left: 0; + content: ''; + } + } } .grafana-version-info { diff --git a/public/views/index.html b/public/views/index.html index 9bf1f9f2f0c..e6f05c4593b 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -39,34 +39,39 @@
- From 1d27a7f93d2ff495a555bc369b888a29ab27084c Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanda Date: Sat, 21 May 2016 16:02:04 +0900 Subject: [PATCH 17/63] (cloudwatch) fix wrong cache key of credentials (#5124) --- pkg/api/cloudwatch/cloudwatch.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pkg/api/cloudwatch/cloudwatch.go b/pkg/api/cloudwatch/cloudwatch.go index 5b4449b5c02..4e9c6cc9064 100644 --- a/pkg/api/cloudwatch/cloudwatch.go +++ b/pkg/api/cloudwatch/cloudwatch.go @@ -57,11 +57,12 @@ var awsCredentialCache map[string]cache = make(map[string]cache) var credentialCacheLock sync.RWMutex func getCredentials(profile string, region string, assumeRoleArn string) *credentials.Credentials { + cacheKey := profile + ":" + assumeRoleArn credentialCacheLock.RLock() - if _, ok := awsCredentialCache[profile]; ok { - if awsCredentialCache[profile].expiration != nil && - (*awsCredentialCache[profile].expiration).After(time.Now().UTC()) { - result := awsCredentialCache[profile].credential + if _, ok := awsCredentialCache[cacheKey]; ok { + if awsCredentialCache[cacheKey].expiration != nil && + (*awsCredentialCache[cacheKey].expiration).After(time.Now().UTC()) { + result := awsCredentialCache[cacheKey].credential credentialCacheLock.RUnlock() return result } @@ -118,7 +119,7 @@ func getCredentials(profile string, region string, assumeRoleArn string) *creden &ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(sess), ExpiryWindow: 5 * time.Minute}, }) credentialCacheLock.Lock() - awsCredentialCache[profile] = cache{ + awsCredentialCache[cacheKey] = cache{ credential: creds, expiration: expiration, } From 75940c1f5dd544451743541c8b4f5d82f8e81f83 Mon Sep 17 00:00:00 2001 From: Trent White Date: Sat, 21 May 2016 13:21:31 -0400 Subject: [PATCH 18/63] turn watch all back on --- .bra.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bra.toml b/.bra.toml index f56e88fb02a..54019208984 100644 --- a/.bra.toml +++ b/.bra.toml @@ -3,7 +3,7 @@ init_cmds = [ ["go", "build", "-o", "./bin/grafana-server", "./pkg/cmd/grafana-server"], ["./bin/grafana-server"] ] -watch_all = false +watch_all = true watch_dirs = [ "$WORKDIR/pkg", "$WORKDIR/public/views", From 70d6b32e14edd2653a81e1dd52fc834e55c21456 Mon Sep 17 00:00:00 2001 From: minki Date: Sun, 22 May 2016 05:38:57 +0900 Subject: [PATCH 19/63] Fixed type --- public/app/core/directives/plugin_component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/app/core/directives/plugin_component.ts b/public/app/core/directives/plugin_component.ts index 6f693a13d68..c8fb5c9ba91 100644 --- a/public/app/core/directives/plugin_component.ts +++ b/public/app/core/directives/plugin_component.ts @@ -244,7 +244,7 @@ function pluginDirectiveLoader($compile, datasourceSrv, $rootScope, $q, $http, $ registerPluginComponent(scope, elem, attrs, componentInfo); }).catch(err => { $rootScope.appEvent('alert-error', ['Plugin Error', err.message || err]); - console.log('Plugin componnet error', err); + console.log('Plugin component error', err); }); } }; From 43ba563a1c409402ba9ac0afbe68d227341b37a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 23 May 2016 07:55:55 +0200 Subject: [PATCH 20/63] fix(logging): change log level to trace for plugin proxy logging call, fixes #5126 --- pkg/api/pluginproxy/pluginproxy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/api/pluginproxy/pluginproxy.go b/pkg/api/pluginproxy/pluginproxy.go index 92d07988b64..21d40ecb948 100644 --- a/pkg/api/pluginproxy/pluginproxy.go +++ b/pkg/api/pluginproxy/pluginproxy.go @@ -88,7 +88,7 @@ func NewApiPluginProxy(ctx *middleware.Context, proxyPath string, route *plugins } for key, value := range headers { - log.Info("setting key %v value %v", key, value[0]) + log.Trace("setting key %v value %v", key, value[0]) req.Header.Set(key, value[0]) } } From 1da149d9e1c179c2b0d139474ad750f0c6fdc9ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 23 May 2016 09:28:14 +0200 Subject: [PATCH 21/63] feat(annotations): annotations can now use a template variable as data source, closes #5054 --- package.json | 2 +- public/app/core/services/datasource_srv.js | 51 +++++++++++-------- .../app/features/annotations/editor_ctrl.js | 2 +- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index b9b87ab6e75..b110d6107c8 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "company": "Coding Instinct AB" }, "name": "grafana", - "version": "3.0.2", + "version": "3.0.3", "repository": { "type": "git", "url": "http://github.com/grafana/grafana.git" diff --git a/public/app/core/services/datasource_srv.js b/public/app/core/services/datasource_srv.js index 32bc9a39725..378cfa2d9d5 100644 --- a/public/app/core/services/datasource_srv.js +++ b/public/app/core/services/datasource_srv.js @@ -66,14 +66,17 @@ function (angular, _, coreModule, config) { }; this.getAnnotationSources = function() { - return _.reduce(config.datasources, function(memo, value) { + var sources = []; + this.addDataSourceVariables(sources); + + _.each(config.datasources, function(value) { if (value.meta && value.meta.annotations) { - memo.push(value); + sources.push(value); } + }); - return memo; - }, []); + return sources; }; this.getMetricSources = function(options) { @@ -90,24 +93,7 @@ function (angular, _, coreModule, config) { }); if (!options || !options.skipVariables) { - // look for data source variables - for (var i = 0; i < templateSrv.variables.length; i++) { - var variable = templateSrv.variables[i]; - if (variable.type !== 'datasource') { - continue; - } - - var first = variable.current.value; - var ds = config.datasources[first]; - - if (ds) { - metricSources.push({ - name: '$' + variable.name, - value: '$' + variable.name, - meta: ds.meta, - }); - } - } + this.addDataSourceVariables(metricSources); } metricSources.sort(function(a, b) { @@ -123,6 +109,27 @@ function (angular, _, coreModule, config) { return metricSources; }; + this.addDataSourceVariables = function(list) { + // look for data source variables + for (var i = 0; i < templateSrv.variables.length; i++) { + var variable = templateSrv.variables[i]; + if (variable.type !== 'datasource') { + continue; + } + + var first = variable.current.value; + var ds = config.datasources[first]; + + if (ds) { + list.push({ + name: '$' + variable.name, + value: '$' + variable.name, + meta: ds.meta, + }); + } + } + }; + this.init(); }); }); diff --git a/public/app/features/annotations/editor_ctrl.js b/public/app/features/annotations/editor_ctrl.js index ca754b094a8..c37592cc905 100644 --- a/public/app/features/annotations/editor_ctrl.js +++ b/public/app/features/annotations/editor_ctrl.js @@ -30,7 +30,7 @@ function (angular, _, $) { $scope.datasourceChanged = function() { return datasourceSrv.get($scope.currentAnnotation.datasource).then(function(ds) { $scope.currentDatasource = ds; - $scope.currentAnnotation.datasource = ds.name; + $scope.currentAnnotation.datasource = $scope.currentAnnotation.datasource; }); }; From cfc771020503dac3c4a30982ec121a24b229dc5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 23 May 2016 09:31:52 +0200 Subject: [PATCH 22/63] docs(): changelog updated --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c4004f46a7..7d12dfa0bc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,12 @@ -# 3.1.0 +# 3.1.0 (unreleased) ### Enhancements * **Singlestat**: Add support for range to text mappings, closes [#1319](https://github.com/grafana/grafana/issues/1319) * **Graph**: Adds sort order options for graph tooltip, closes [#1189](https://github.com/grafana/grafana/issues/1189) * **Theme**: Add default theme to config file [#5011](https://github.com/grafana/grafana/pull/5011) -# 3.0.3 Patch release (unreleased) +# 3.0.3 Patch release (2016-05-23) +* **Annotations**: Annotations can now use a template variable as data source, closes [#5054](https://github.com/grafana/grafana/issues/5054) * **Time picker**: Fixed issue timepicker and UTC when reading time from URL, fixes [#5078](https://github.com/grafana/grafana/issues/5078) * **CloudWatch**: Support for Multiple Account by AssumeRole, closes [#3522](https://github.com/grafana/grafana/issues/3522) * **Singlestat**: Fixed alignment and minium height issue, fixes [#5113](https://github.com/grafana/grafana/issues/5113), fixes [#4679](https://github.com/grafana/grafana/issues/4679) From dfe3806d01b68e13360cb14b84b0b9027fa67af0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 23 May 2016 10:14:40 +0200 Subject: [PATCH 23/63] fix(elasticsearch): fixed query editor issue with elasticsearch --- public/app/core/directives/metric_segment.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/app/core/directives/metric_segment.js b/public/app/core/directives/metric_segment.js index 61415a660b2..4b3cd2e8de3 100644 --- a/public/app/core/directives/metric_segment.js +++ b/public/app/core/directives/metric_segment.js @@ -209,7 +209,9 @@ function (_, $, coreModule) { // needs to call this after digest so // property is synced with outerscope $scope.$$postDigest(function() { - $scope.onChange(); + $scope.$apply(function() { + $scope.onChange(); + }); }); }; From dc77d555f92ef16745d21bd844a2cdaebff95a65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 23 May 2016 10:58:31 +0200 Subject: [PATCH 24/63] fix(elasticsearch): fixed templating issue with elasticsearch, fixes #5135 --- public/app/features/templating/templateSrv.js | 18 +++++++++++------- .../datasource/elasticsearch/datasource.js | 14 +++++++++++--- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/public/app/features/templating/templateSrv.js b/public/app/features/templating/templateSrv.js index e2e628c1cd5..2e5f945c96a 100644 --- a/public/app/features/templating/templateSrv.js +++ b/public/app/features/templating/templateSrv.js @@ -42,6 +42,16 @@ function (angular, _) { return value.replace(/([\!\*\+\-\=<>\s\&\|\(\)\[\]\{\}\^\~\?\:\\/"])/g, "\\$1"); } + this.luceneFormat = function(value) { + if (typeof value === 'string') { + return luceneEscape(value); + } + var quotedValues = _.map(value, function(val) { + return '\"' + luceneEscape(val) + '\"'; + }); + return '(' + quotedValues.join(' OR ') + ')'; + }; + this.formatValue = function(value, format, variable) { // for some scopedVars there is no variable variable = variable || {}; @@ -60,13 +70,7 @@ function (angular, _) { return '(' + escapedValues.join('|') + ')'; } case "lucene": { - if (typeof value === 'string') { - return luceneEscape(value); - } - var quotedValues = _.map(value, function(val) { - return '\"' + luceneEscape(val) + '\"'; - }); - return '(' + quotedValues.join(' OR ') + ')'; + return this.luceneFormat(value, format, variable); } case "pipe": { if (typeof value === 'string') { diff --git a/public/app/plugins/datasource/elasticsearch/datasource.js b/public/app/plugins/datasource/elasticsearch/datasource.js index c7c2351d0cc..d5926be3f81 100644 --- a/public/app/plugins/datasource/elasticsearch/datasource.js +++ b/public/app/plugins/datasource/elasticsearch/datasource.js @@ -78,7 +78,7 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes range[timeField]["format"] = "epoch_millis"; } - var queryInterpolated = templateSrv.replace(queryString); + var queryInterpolated = templateSrv.replace(queryString, {}, 'lucene'); var filter = { "bool": { "must": [{ "range": range }] } }; var query = { "bool": { "should": [{ "query_string": { "query": queryInterpolated } }] } }; var data = { @@ -204,6 +204,14 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes }); }; + function escapeForJson(value) { + return value.replace(/\"/g, '\\"'); + } + + function luceneThenJsonFormat(value) { + return escapeForJson(templateSrv.luceneFormat(value)); + } + this.getFields = function(query) { return this._get('/_mapping').then(function(res) { var fields = {}; @@ -246,7 +254,7 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes var header = this.getQueryHeader('count', range.from, range.to); var esQuery = angular.toJson(this.queryBuilder.getTermsQuery(queryDef)); - esQuery = esQuery.replace("$lucene_query", queryDef.query || '*'); + esQuery = esQuery.replace("$lucene_query", escapeForJson(queryDef.query || '*')); esQuery = esQuery.replace(/\$timeFrom/g, range.from.valueOf()); esQuery = esQuery.replace(/\$timeTo/g, range.to.valueOf()); esQuery = header + '\n' + esQuery + '\n'; @@ -260,7 +268,7 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes }; this.metricFindQuery = function(query) { - query = templateSrv.replace(query); + query = templateSrv.replace(query, {}, luceneThenJsonFormat); query = angular.fromJson(query); if (!query) { return $q.when([]); From cd82f579bd6fb902f539f87cba8c8aa13373e0f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 23 May 2016 11:08:08 +0200 Subject: [PATCH 25/63] docs(): updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d12dfa0bc6..e6ec23d86bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ * **Timepicker**: Fixed issue with timepicker and UTC when reading time from URL, fixes [#5078](https://github.com/grafana/grafana/issues/5078) * **Docs**: Added docs for org & user preferences HTTP API, closes [#5069](https://github.com/grafana/grafana/issues/5069) * **Plugin list panel**: Now shows correct enable state for apps when not enabled, fixes [#5068](https://github.com/grafana/grafana/issues/5068) +* **Elasticsearch**: Templating & Annotation queries that use template variables are now formatted correctly, fixes [#5135](https://github.com/grafana/grafana/issues/5135) # 3.0.2 Patch release (2016-05-16) From 9eec68985d0f622538bfddb13e33007574e2a8c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 23 May 2016 11:49:07 +0200 Subject: [PATCH 26/63] docs(): updated download links --- docs/sources/installation/debian.md | 6 +++--- docs/sources/installation/windows.md | 2 +- packaging/publish/publish.sh | 22 ++++++++++------------ 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/docs/sources/installation/debian.md b/docs/sources/installation/debian.md index 1b3957fa684..a07e3089e65 100644 --- a/docs/sources/installation/debian.md +++ b/docs/sources/installation/debian.md @@ -10,13 +10,13 @@ page_keywords: grafana, installation, debian, ubuntu, guide Description | Download ------------ | ------------- -Stable .deb for Debian-based Linux | [grafana_3.0.2-1463383025_amd64.deb](https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.2-1463383025_amd64.deb) +Stable .deb for Debian-based Linux | [grafana_3.0.3-1463994644.deb](https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.3-1463994644.deb) ## Install Stable - $ wget https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.2-1463383025_amd64.deb + $ wget https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.3-1463994644.deb $ sudo apt-get install -y adduser libfontconfig - $ sudo dpkg -i grafana_3.0.2-1463383025_amd64.deb + $ sudo dpkg -i grafana_3.0.3-1463994644.deb ## APT Repository diff --git a/docs/sources/installation/windows.md b/docs/sources/installation/windows.md index baa13d0350c..ea9a8de049c 100644 --- a/docs/sources/installation/windows.md +++ b/docs/sources/installation/windows.md @@ -10,7 +10,7 @@ page_keywords: grafana, installation, windows guide Description | Download ------------ | ------------- -Stable Zip package for Windows | [grafana.3.0.2.windows-x64.zip](https://grafanarel.s3.amazonaws.com/winbuilds/dist/grafana-3.0.2.windows-x64.zip) +Stable Zip package for Windows | [grafana.3.0.3.windows-x64.zip](https://grafanarel.s3.amazonaws.com/winbuilds/dist/grafana-3.0.3.windows-x64.zip) ## Configure diff --git a/packaging/publish/publish.sh b/packaging/publish/publish.sh index 79da73d441a..d17a5d01627 100755 --- a/packaging/publish/publish.sh +++ b/packaging/publish/publish.sh @@ -1,22 +1,20 @@ #! /usr/bin/env bash -deb_ver=3.0.1 -rpm_ver=3.0.1-1 +deb_ver=3.0.3-1463994644 +rpm_ver=3.0.3-1463994644 -#rpm_ver=3.0.0-1 +wget https://grafanarel.s3.amazonaws.com/builds/grafana_${deb_ver}_amd64.deb -#wget https://grafanarel.s3.amazonaws.com/builds/grafana_${deb_ver}_amd64.deb +package_cloud push grafana/stable/debian/jessie grafana_${deb_ver}_amd64.deb +package_cloud push grafana/stable/debian/wheezy grafana_${deb_ver}_amd64.deb -#package_cloud push grafana/stable/debian/jessie grafana_${deb_ver}_amd64.deb -#package_cloud push grafana/stable/debian/wheezy grafana_${deb_ver}_amd64.deb +package_cloud push grafana/testing/debian/jessie grafana_${deb_ver}_amd64.deb +package_cloud push grafana/testing/debian/wheezy grafana_${deb_ver}_amd64.deb -#package_cloud push grafana/testing/debian/jessie grafana_${deb_ver}_amd64.deb -#package_cloud push grafana/testing/debian/wheezy grafana_${deb_ver}_amd64.deb +wget https://grafanarel.s3.amazonaws.com/builds/grafana-${rpm_ver}.x86_64.rpm -#wget https://grafanarel.s3.amazonaws.com/builds/grafana-${rpm_ver}.x86_64.rpm - -#package_cloud push grafana/testing/el/6 grafana-${rpm_ver}.x86_64.rpm -#package_cloud push grafana/testing/el/7 grafana-${rpm_ver}.x86_64.rpm +package_cloud push grafana/testing/el/6 grafana-${rpm_ver}.x86_64.rpm +package_cloud push grafana/testing/el/7 grafana-${rpm_ver}.x86_64.rpm package_cloud push grafana/stable/el/7 grafana-${rpm_ver}.x86_64.rpm package_cloud push grafana/stable/el/6 grafana-${rpm_ver}.x86_64.rpm From bbea698af37e81b95d1af5f73eb22dd816d9b7c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 23 May 2016 12:30:46 +0200 Subject: [PATCH 27/63] Update latest.json --- latest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/latest.json b/latest.json index 443a440a529..9a54260bc92 100644 --- a/latest.json +++ b/latest.json @@ -1,4 +1,4 @@ { - "stable": "3.0.2", - "testing": "3.0.2" + "stable": "3.0.3", + "testing": "3.0.3" } From 9e6056551da47cfb9b7f8069d1c74aa3cbe12da7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 23 May 2016 14:13:30 +0200 Subject: [PATCH 28/63] docs(): updated download links --- docs/sources/installation/debian.md | 6 +++--- docs/sources/installation/rpm.md | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/sources/installation/debian.md b/docs/sources/installation/debian.md index a07e3089e65..4bd3d35b1d3 100644 --- a/docs/sources/installation/debian.md +++ b/docs/sources/installation/debian.md @@ -10,13 +10,13 @@ page_keywords: grafana, installation, debian, ubuntu, guide Description | Download ------------ | ------------- -Stable .deb for Debian-based Linux | [grafana_3.0.3-1463994644.deb](https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.3-1463994644.deb) +Stable .deb for Debian-based Linux | [grafana_3.0.3-1463994644.deb](https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.3-1463994644_amd64.deb) ## Install Stable - $ wget https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.3-1463994644.deb + $ wget https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.3-1463994644_amd64.deb $ sudo apt-get install -y adduser libfontconfig - $ sudo dpkg -i grafana_3.0.3-1463994644.deb + $ sudo dpkg -i grafana_3.0.3-1463994644_amd64.deb ## APT Repository diff --git a/docs/sources/installation/rpm.md b/docs/sources/installation/rpm.md index af3ae7f8288..4caf5764903 100644 --- a/docs/sources/installation/rpm.md +++ b/docs/sources/installation/rpm.md @@ -10,24 +10,24 @@ page_keywords: grafana, installation, centos, fedora, opensuse, redhat, guide Description | Download ------------ | ------------- -Stable .RPM for CentOS / Fedora / OpenSuse / Redhat Linux | [grafana-3.0.2-1463383025.x86_64.rpm](https://grafanarel.s3.amazonaws.com/builds/grafana-3.0.2-1463383025.x86_64.rpm) +Stable .RPM for CentOS / Fedora / OpenSuse / Redhat Linux | [grafana-3.0.3-1463994644.x86_64.rpm](https://grafanarel.s3.amazonaws.com/builds/grafana-3.0.3-1463994644.x86_64.rpm) ## Install Stable Release from package file You can install Grafana using Yum directly. - $ sudo yum install https://grafanarel.s3.amazonaws.com/builds/grafana-3.0.2-1463383025.x86_64.rpm + $ sudo yum install https://grafanarel.s3.amazonaws.com/builds/grafana-3.0.3-1463994644.x86_64.rpm Or install manually using `rpm`. #### On CentOS / Fedora / Redhat: $ sudo yum install initscripts fontconfig - $ sudo rpm -Uvh grafana-3.0.2-1463383025.x86_64.rpm + $ sudo rpm -Uvh grafana-3.0.3-1463994644.x86_64.rpm #### On OpenSuse: - $ sudo rpm -i --nodeps grafana-3.0.2-1463383025.x86_64.rpm + $ sudo rpm -i --nodeps grafana-3.0.3-1463994644.x86_64.rpm ## Install via YUM Repository From 76d18e71564d6a26a264061e64d190a2836dfc77 Mon Sep 17 00:00:00 2001 From: Trent White Date: Mon, 23 May 2016 11:45:54 -0400 Subject: [PATCH 29/63] remove height: 100% on .main-view --- public/sass/layout/_page.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/sass/layout/_page.scss b/public/sass/layout/_page.scss index 8de65053888..6203f4be083 100644 --- a/public/sass/layout/_page.scss +++ b/public/sass/layout/_page.scss @@ -4,7 +4,7 @@ } .main-view { - height: 100%; + // height: 100%; REMOVED FOR FOOTER TRW } .page-container { From a52869507efcfc899a78feff468718b42376fbe7 Mon Sep 17 00:00:00 2001 From: Trent White Date: Mon, 23 May 2016 12:46:13 -0400 Subject: [PATCH 30/63] hide footer on non-dashboard pages --- public/sass/components/_footer.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/sass/components/_footer.scss b/public/sass/components/_footer.scss index 3c8353ecbc7..0f34e4b0dd0 100644 --- a/public/sass/components/_footer.scss +++ b/public/sass/components/_footer.scss @@ -1,3 +1,7 @@ +.page-dashboard footer { + display: none; +} + footer { font-size: 75%; width: 98%; /* was causing horiz scrollbars - need to examine */ From 8a0d5aa38d6bb2c8591be10ecdd10a1466120a5f Mon Sep 17 00:00:00 2001 From: Utkarsh Bhatnagar Date: Mon, 23 May 2016 11:58:21 -0700 Subject: [PATCH 31/63] [Bug Fix] #5136 (#5142) --- public/app/core/time_series2.ts | 4 ++-- .../panel/graph/specs/graph_ctrl_specs.ts | 18 +++++++++--------- public/test/core/time_series_specs.js | 6 +++--- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/public/app/core/time_series2.ts b/public/app/core/time_series2.ts index cbceff7afd8..dfae26fb48b 100644 --- a/public/app/core/time_series2.ts +++ b/public/app/core/time_series2.ts @@ -173,8 +173,8 @@ export default class TimeSeries { isMsResolutionNeeded() { for (var i = 0; i < this.datapoints.length; i++) { - if (this.datapoints[i][0] !== null) { - var timestamp = this.datapoints[i][0].toString(); + if (this.datapoints[i][1] !== null) { + var timestamp = this.datapoints[i][1].toString(); if (timestamp.length === 13 && (timestamp % 1000) !== 0) { return true; } diff --git a/public/app/plugins/panel/graph/specs/graph_ctrl_specs.ts b/public/app/plugins/panel/graph/specs/graph_ctrl_specs.ts index dfce4031772..d00c90ae6a1 100644 --- a/public/app/plugins/panel/graph/specs/graph_ctrl_specs.ts +++ b/public/app/plugins/panel/graph/specs/graph_ctrl_specs.ts @@ -22,8 +22,8 @@ describe('GraphCtrl', function() { describe('msResolution with second resolution timestamps', function() { beforeEach(function() { var data = [ - { target: 'test.cpu1', datapoints: [[1234567890, 45], [1234567899, 60]]}, - { target: 'test.cpu2', datapoints: [[1236547890, 55], [1234456709, 90]]} + { target: 'test.cpu1', datapoints: [[45, 1234567890], [60, 1234567899]]}, + { target: 'test.cpu2', datapoints: [[55, 1236547890], [90, 1234456709]]} ]; ctx.ctrl.panel.tooltip.msResolution = false; ctx.ctrl.onDataReceived(data); @@ -37,8 +37,8 @@ describe('GraphCtrl', function() { describe('msResolution with millisecond resolution timestamps', function() { beforeEach(function() { var data = [ - { target: 'test.cpu1', datapoints: [[1234567890000, 45], [1234567899000, 60]]}, - { target: 'test.cpu2', datapoints: [[1236547890001, 55], [1234456709000, 90]]} + { target: 'test.cpu1', datapoints: [[45, 1234567890000], [60, 1234567899000]]}, + { target: 'test.cpu2', datapoints: [[55, 1236547890001], [90, 1234456709000]]} ]; ctx.ctrl.panel.tooltip.msResolution = false; ctx.ctrl.onDataReceived(data); @@ -52,8 +52,8 @@ describe('GraphCtrl', function() { describe('msResolution with millisecond resolution timestamps but with trailing zeroes', function() { beforeEach(function() { var data = [ - { target: 'test.cpu1', datapoints: [[1234567890000, 45], [1234567899000, 60]]}, - { target: 'test.cpu2', datapoints: [[1236547890000, 55], [1234456709000, 90]]} + { target: 'test.cpu1', datapoints: [[45, 1234567890000], [60, 1234567899000]]}, + { target: 'test.cpu2', datapoints: [[55, 1236547890000], [90, 1234456709000]]} ]; ctx.ctrl.panel.tooltip.msResolution = false; ctx.ctrl.onDataReceived(data); @@ -67,9 +67,9 @@ describe('GraphCtrl', function() { describe('msResolution with millisecond resolution timestamps in one of the series', function() { beforeEach(function() { var data = [ - { target: 'test.cpu1', datapoints: [[1234567890000, 45], [1234567899000, 60]]}, - { target: 'test.cpu2', datapoints: [[1236547890010, 55], [1234456709000, 90]]}, - { target: 'test.cpu3', datapoints: [[1236547890000, 65], [1234456709000, 120]]} + { target: 'test.cpu1', datapoints: [[45, 1234567890000], [60, 1234567899000]]}, + { target: 'test.cpu2', datapoints: [[55, 1236547890010], [90, 1234456709000]]}, + { target: 'test.cpu3', datapoints: [[65, 1236547890000], [120, 1234456709000]]} ]; ctx.ctrl.panel.tooltip.msResolution = false; ctx.ctrl.onDataReceived(data); diff --git a/public/test/core/time_series_specs.js b/public/test/core/time_series_specs.js index 9d273c86b94..034e872e2f1 100644 --- a/public/test/core/time_series_specs.js +++ b/public/test/core/time_series_specs.js @@ -56,7 +56,7 @@ define([ }); }); - describe('can detect if serie contains ms precision', function() { + describe('can detect if series contains ms precision', function() { var fakedata; beforeEach(function() { @@ -64,13 +64,13 @@ define([ }); it('missing datapoint with ms precision', function() { - fakedata.datapoints[0] = [1234567890000, 1337]; + fakedata.datapoints[0] = [1337, 1234567890000]; series = new TimeSeries(fakedata); expect(series.isMsResolutionNeeded()).to.be(false); }); it('contains datapoint with ms precision', function() { - fakedata.datapoints[0] = [1236547890001, 1337]; + fakedata.datapoints[0] = [1337, 1236547890001]; series = new TimeSeries(fakedata); expect(series.isMsResolutionNeeded()).to.be(true); }); From ec19a97156ebe2cb599433a4f6f15f0b81dc84be Mon Sep 17 00:00:00 2001 From: Utkarsh Bhatnagar Date: Mon, 23 May 2016 11:58:21 -0700 Subject: [PATCH 32/63] [Bug Fix] #5136 (#5142) --- public/app/core/time_series2.ts | 4 ++-- .../panel/graph/specs/graph_ctrl_specs.ts | 18 +++++++++--------- public/test/core/time_series_specs.js | 6 +++--- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/public/app/core/time_series2.ts b/public/app/core/time_series2.ts index cbceff7afd8..dfae26fb48b 100644 --- a/public/app/core/time_series2.ts +++ b/public/app/core/time_series2.ts @@ -173,8 +173,8 @@ export default class TimeSeries { isMsResolutionNeeded() { for (var i = 0; i < this.datapoints.length; i++) { - if (this.datapoints[i][0] !== null) { - var timestamp = this.datapoints[i][0].toString(); + if (this.datapoints[i][1] !== null) { + var timestamp = this.datapoints[i][1].toString(); if (timestamp.length === 13 && (timestamp % 1000) !== 0) { return true; } diff --git a/public/app/plugins/panel/graph/specs/graph_ctrl_specs.ts b/public/app/plugins/panel/graph/specs/graph_ctrl_specs.ts index dfce4031772..d00c90ae6a1 100644 --- a/public/app/plugins/panel/graph/specs/graph_ctrl_specs.ts +++ b/public/app/plugins/panel/graph/specs/graph_ctrl_specs.ts @@ -22,8 +22,8 @@ describe('GraphCtrl', function() { describe('msResolution with second resolution timestamps', function() { beforeEach(function() { var data = [ - { target: 'test.cpu1', datapoints: [[1234567890, 45], [1234567899, 60]]}, - { target: 'test.cpu2', datapoints: [[1236547890, 55], [1234456709, 90]]} + { target: 'test.cpu1', datapoints: [[45, 1234567890], [60, 1234567899]]}, + { target: 'test.cpu2', datapoints: [[55, 1236547890], [90, 1234456709]]} ]; ctx.ctrl.panel.tooltip.msResolution = false; ctx.ctrl.onDataReceived(data); @@ -37,8 +37,8 @@ describe('GraphCtrl', function() { describe('msResolution with millisecond resolution timestamps', function() { beforeEach(function() { var data = [ - { target: 'test.cpu1', datapoints: [[1234567890000, 45], [1234567899000, 60]]}, - { target: 'test.cpu2', datapoints: [[1236547890001, 55], [1234456709000, 90]]} + { target: 'test.cpu1', datapoints: [[45, 1234567890000], [60, 1234567899000]]}, + { target: 'test.cpu2', datapoints: [[55, 1236547890001], [90, 1234456709000]]} ]; ctx.ctrl.panel.tooltip.msResolution = false; ctx.ctrl.onDataReceived(data); @@ -52,8 +52,8 @@ describe('GraphCtrl', function() { describe('msResolution with millisecond resolution timestamps but with trailing zeroes', function() { beforeEach(function() { var data = [ - { target: 'test.cpu1', datapoints: [[1234567890000, 45], [1234567899000, 60]]}, - { target: 'test.cpu2', datapoints: [[1236547890000, 55], [1234456709000, 90]]} + { target: 'test.cpu1', datapoints: [[45, 1234567890000], [60, 1234567899000]]}, + { target: 'test.cpu2', datapoints: [[55, 1236547890000], [90, 1234456709000]]} ]; ctx.ctrl.panel.tooltip.msResolution = false; ctx.ctrl.onDataReceived(data); @@ -67,9 +67,9 @@ describe('GraphCtrl', function() { describe('msResolution with millisecond resolution timestamps in one of the series', function() { beforeEach(function() { var data = [ - { target: 'test.cpu1', datapoints: [[1234567890000, 45], [1234567899000, 60]]}, - { target: 'test.cpu2', datapoints: [[1236547890010, 55], [1234456709000, 90]]}, - { target: 'test.cpu3', datapoints: [[1236547890000, 65], [1234456709000, 120]]} + { target: 'test.cpu1', datapoints: [[45, 1234567890000], [60, 1234567899000]]}, + { target: 'test.cpu2', datapoints: [[55, 1236547890010], [90, 1234456709000]]}, + { target: 'test.cpu3', datapoints: [[65, 1236547890000], [120, 1234456709000]]} ]; ctx.ctrl.panel.tooltip.msResolution = false; ctx.ctrl.onDataReceived(data); diff --git a/public/test/core/time_series_specs.js b/public/test/core/time_series_specs.js index 9d273c86b94..034e872e2f1 100644 --- a/public/test/core/time_series_specs.js +++ b/public/test/core/time_series_specs.js @@ -56,7 +56,7 @@ define([ }); }); - describe('can detect if serie contains ms precision', function() { + describe('can detect if series contains ms precision', function() { var fakedata; beforeEach(function() { @@ -64,13 +64,13 @@ define([ }); it('missing datapoint with ms precision', function() { - fakedata.datapoints[0] = [1234567890000, 1337]; + fakedata.datapoints[0] = [1337, 1234567890000]; series = new TimeSeries(fakedata); expect(series.isMsResolutionNeeded()).to.be(false); }); it('contains datapoint with ms precision', function() { - fakedata.datapoints[0] = [1236547890001, 1337]; + fakedata.datapoints[0] = [1337, 1236547890001]; series = new TimeSeries(fakedata); expect(series.isMsResolutionNeeded()).to.be(true); }); From a3f2f574c6a00acacd4e1c5f0b232fec392c1497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 23 May 2016 21:23:31 +0200 Subject: [PATCH 33/63] fix(singlestat): fixed Gauge positioning issue, fixes #5143 --- public/app/plugins/panel/singlestat/module.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/app/plugins/panel/singlestat/module.ts b/public/app/plugins/panel/singlestat/module.ts index d8a623b7ac1..a7a3b765631 100644 --- a/public/app/plugins/panel/singlestat/module.ts +++ b/public/app/plugins/panel/singlestat/module.ts @@ -234,13 +234,10 @@ class SingleStatCtrl extends MetricsPanelCtrl { var panel = ctrl.panel; var templateSrv = this.templateSrv; var data, linkInfo; - var width, height; var $panelContainer = elem.find('.panel-container'); elem = elem.find('.singlestat-panel'); function setElementHeight() { - width = elem.width(); - height = elem.height(); elem.css('height', ctrl.height + 'px'); } @@ -287,6 +284,9 @@ class SingleStatCtrl extends MetricsPanelCtrl { } function addGauge() { + var width = elem.width(); + var height = elem.height(); + ctrl.invalidGaugeRange = false; if (panel.gauge.minValue > panel.gauge.maxValue) { ctrl.invalidGaugeRange = true; From f1ec270e3e6f0e01148043aad854c0c982027f5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 23 May 2016 21:24:02 +0200 Subject: [PATCH 34/63] bumped version to 3.0.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b110d6107c8..aab228bf312 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "company": "Coding Instinct AB" }, "name": "grafana", - "version": "3.0.3", + "version": "3.0.4", "repository": { "type": "git", "url": "http://github.com/grafana/grafana.git" From fff5aa30208a6982e0d5b74ccc2dc3aa71d2c889 Mon Sep 17 00:00:00 2001 From: Zdenek Styblik Date: Mon, 23 May 2016 21:24:23 +0200 Subject: [PATCH 35/63] Add missing option `Read-Only Editor` to auto_assign_org_role description (#5139) Commit adds missing option `Read-Only Editor` to `auto_assign_org_role` description. --- docs/sources/installation/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sources/installation/configuration.md b/docs/sources/installation/configuration.md index e7d1d68523a..bbfe381d1f0 100644 --- a/docs/sources/installation/configuration.md +++ b/docs/sources/installation/configuration.md @@ -226,7 +226,7 @@ organization to be created for that new user. The role new users will be assigned for the main organization (if the above setting is set to true). Defaults to `Viewer`, other valid -options are `Admin` and `Editor`. +options are `Admin` and `Editor` and `Read-Only Editor`.
From c41c771e9aac4a9540666439341d1f3c57e03a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 24 May 2016 07:39:58 +0200 Subject: [PATCH 36/63] fix(home dashboard): fixed handling error when default dashboard is not found, fixes #5141 --- pkg/api/dashboard.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index b55a1377bd8..589aa68e737 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -8,6 +8,7 @@ import ( "github.com/grafana/grafana/pkg/api/dtos" "github.com/grafana/grafana/pkg/bus" + "github.com/grafana/grafana/pkg/log" "github.com/grafana/grafana/pkg/metrics" "github.com/grafana/grafana/pkg/middleware" m "github.com/grafana/grafana/pkg/models" @@ -167,14 +168,12 @@ func GetHomeDashboard(c *middleware.Context) { if prefsQuery.Result.HomeDashboardId != 0 { slugQuery := m.GetDashboardSlugByIdQuery{Id: prefsQuery.Result.HomeDashboardId} err := bus.Dispatch(&slugQuery) - if err != nil { - c.JsonApiErr(500, "Failed to get slug from database", err) - return + if err == nil { + dashRedirect := dtos.DashboardRedirect{RedirectUri: "db/" + slugQuery.Result} + c.JSON(200, &dashRedirect) + } else { + log.Warn("Failed to get slug from database, %s", err.Error()) } - - dashRedirect := dtos.DashboardRedirect{RedirectUri: "db/" + slugQuery.Result} - c.JSON(200, &dashRedirect) - return } filePath := path.Join(setting.StaticRootPath, "dashboards/home.json") From 10c47ee27c78fc2a8a434142d2fe10a8ae33b080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 24 May 2016 08:11:28 +0200 Subject: [PATCH 37/63] feat(footer): some minor changes to footer to make it look good in light theme, closes #4889 --- pkg/cmd/grafana-server/main.go | 2 +- public/sass/_variables.dark.scss | 4 ++ public/sass/_variables.light.scss | 4 ++ public/sass/components/_footer.scss | 66 ++++++++++++++--------------- public/views/index.html | 4 +- 5 files changed, 43 insertions(+), 37 deletions(-) diff --git a/pkg/cmd/grafana-server/main.go b/pkg/cmd/grafana-server/main.go index b2c66ba185e..35fae1cbac4 100644 --- a/pkg/cmd/grafana-server/main.go +++ b/pkg/cmd/grafana-server/main.go @@ -24,7 +24,7 @@ import ( "github.com/grafana/grafana/pkg/social" ) -var version = "3.0.0-beta4" +var version = "3.1.0" var commit = "NA" var buildstamp string var build_date string diff --git a/public/sass/_variables.dark.scss b/public/sass/_variables.dark.scss index fed3d805b82..debf15e09d5 100644 --- a/public/sass/_variables.dark.scss +++ b/public/sass/_variables.dark.scss @@ -268,3 +268,7 @@ $checkboxImageUrl: '../img/checkbox.png'; $card-background: linear-gradient(135deg, #2f2f2f, #262626); $card-background-hover: linear-gradient(135deg, #343434, #262626); $card-shadow: -1px -1px 0 0 hsla(0, 0%, 100%, .1), 1px 1px 0 0 rgba(0, 0, 0, .3); + +// footer +$footer-link-color: $gray-1; +$footer-link-hover: $gray-4; diff --git a/public/sass/_variables.light.scss b/public/sass/_variables.light.scss index 42775d989f7..90262a3134c 100644 --- a/public/sass/_variables.light.scss +++ b/public/sass/_variables.light.scss @@ -292,3 +292,7 @@ $checkboxImageUrl: '../img/checkbox_white.png'; $card-background: linear-gradient(135deg, $gray-5, $gray-6); $card-background-hover: linear-gradient(135deg, $gray-6, $gray-7); $card-shadow: -1px -1px 0 0 hsla(0, 0%, 100%, .1), 1px 1px 0 0 rgba(0, 0, 0, .1); + +// footer +$footer-link-color: $gray-3; +$footer-link-hover: $dark-5; diff --git a/public/sass/components/_footer.scss b/public/sass/components/_footer.scss index 2388048f124..8f3b9186d15 100644 --- a/public/sass/components/_footer.scss +++ b/public/sass/components/_footer.scss @@ -1,40 +1,38 @@ -.page-dashboard footer { +.page-dashboard .footer { display: none; } -footer { - font-size: 75%; - width: 98%; /* was causing horiz scrollbars - need to examine */ - a { - color: $gray-1; - } - ul { - list-style: none; - } - li { display: inline-block; - padding-right: 2px; - &:after { - content: ' | '; - padding-left: 2px; - color: $gray-1; - } - } - li:last-child { - &:after { - padding-left: 0; - content: ''; - } - } -} - -.grafana-version-info { - position: absolute; - bottom: 2px; - left: 3px; - color: darken($gray-1, 25%); - a { color: darken($gray-1, 25%); } -} - .footer { + color: $footer-link-color; padding: 5rem 0 1rem 0; + font-size: $font-size-xs; + width: 98%; /* was causing horiz scrollbars - need to examine */ + + a { + color: $footer-link-color; + + &:hover { + color: $footer-link-hover; + } + } + + ul { + list-style: none; + } + + li { + display: inline-block; + padding-right: 2px; + &:after { + content: ' | '; + padding-left: 2px; + } + } + + li:last-child { + &:after { + padding-left: 0; + content: ''; + } + } } diff --git a/public/views/index.html b/public/views/index.html index e6f05c4593b..70981fb7784 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -60,9 +60,9 @@ Community -
  • +
  • Grafana - v[[.BuildVersion]] (commit: [[.BuildCommit]]) + v[[.BuildVersion]] (commit: [[.BuildCommit]])
  • [[if .NewGrafanaVersionExists]] From 366baea099ec85908ab9afef6c8757bd97e8d267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 24 May 2016 08:14:40 +0200 Subject: [PATCH 38/63] docs(): updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6ec23d86bd..36bc37a3246 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * **Singlestat**: Add support for range to text mappings, closes [#1319](https://github.com/grafana/grafana/issues/1319) * **Graph**: Adds sort order options for graph tooltip, closes [#1189](https://github.com/grafana/grafana/issues/1189) * **Theme**: Add default theme to config file [#5011](https://github.com/grafana/grafana/pull/5011) +* **Page Footer**: Added page footer with links to docs, shows Grafana version and info if new version is available, closes [#4889](https://github.com/grafana/grafana/pull/4889) # 3.0.3 Patch release (2016-05-23) * **Annotations**: Annotations can now use a template variable as data source, closes [#5054](https://github.com/grafana/grafana/issues/5054) From 6f094ef215261bcf0c44313a74e299c2cb1e4856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 24 May 2016 09:50:23 +0200 Subject: [PATCH 39/63] fix(templating): fixed issue with nested template variables and multi select, the child variable selection state is now updated like single select variables, so if none matches the first option is selected, fixes #4861 --- .../features/templating/templateValuesSrv.js | 15 ++++++- public/test/specs/templateValuesSrv-specs.js | 40 +++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/public/app/features/templating/templateValuesSrv.js b/public/app/features/templating/templateValuesSrv.js index 489e6291011..7c411377d87 100644 --- a/public/app/features/templating/templateValuesSrv.js +++ b/public/app/features/templating/templateValuesSrv.js @@ -244,15 +244,26 @@ function (angular, _, kbn) { this.validateVariableSelectionState = function(variable) { if (!variable.current) { if (!variable.options.length) { return; } - return self.setVariableValue(variable, variable.options[0], true); + return self.setVariableValue(variable, variable.options[0], false); } if (_.isArray(variable.current.value)) { self.selectOptionsForCurrentValue(variable); + // updated selected value + var selected = { + value: _.map(_.filter(variable.options, {selected: true}), function(op) { + return op.value; + }) + }; + // if none pick first + if (selected.value.length === 0) { + selected = variable.options[0]; + } + return self.setVariableValue(variable, selected, false); } else { var currentOption = _.findWhere(variable.options, {text: variable.current.text}); if (currentOption) { - return self.setVariableValue(variable, currentOption, true); + return self.setVariableValue(variable, currentOption, false); } else { if (!variable.options.length) { return; } return self.setVariableValue(variable, variable.options[0]); diff --git a/public/test/specs/templateValuesSrv-specs.js b/public/test/specs/templateValuesSrv-specs.js index 8652ec421b2..79aa2eafd8d 100644 --- a/public/test/specs/templateValuesSrv-specs.js +++ b/public/test/specs/templateValuesSrv-specs.js @@ -126,6 +126,46 @@ define([ }); }); + describeUpdateVariable('query variable with multi select and new options does not contain some selected values', function(scenario) { + scenario.setup(function() { + scenario.variable = { + type: 'query', + query: '', + name: 'test', + current: { + value: ['val1', 'val2', 'val3'], + text: 'val1 + val2 + val3' + } + }; + scenario.queryResult = [{text: 'val2'}, {text: 'val3'}]; + }); + + it('should update current value', function() { + expect(scenario.variable.current.value).to.eql(['val2', 'val3']); + expect(scenario.variable.current.text).to.eql('val2 + val3'); + }); + }); + + describeUpdateVariable('query variable with multi select and new options does not contain any selected values', function(scenario) { + scenario.setup(function() { + scenario.variable = { + type: 'query', + query: '', + name: 'test', + current: { + value: ['val1', 'val2', 'val3'], + text: 'val1 + val2 + val3' + } + }; + scenario.queryResult = [{text: 'val5'}, {text: 'val6'}]; + }); + + it('should update current value with first one', function() { + expect(scenario.variable.current.value).to.eql('val5'); + expect(scenario.variable.current.text).to.eql('val5'); + }); + }); + describeUpdateVariable('query variable with numeric results', function(scenario) { scenario.setup(function() { scenario.variable = { type: 'query', query: '', name: 'test', current: {} }; From 5607a114f91c5a25457deccbda102502f479bcc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 24 May 2016 09:53:28 +0200 Subject: [PATCH 40/63] updated changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36bc37a3246..a9e1b551b34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ * **Theme**: Add default theme to config file [#5011](https://github.com/grafana/grafana/pull/5011) * **Page Footer**: Added page footer with links to docs, shows Grafana version and info if new version is available, closes [#4889](https://github.com/grafana/grafana/pull/4889) +# 3.0.4 Patch release (unreleased) +* **Templating**: Fixed issue with nested multi select variables and cascading and updating child variable selection state, fixes [#4861](https://github.com/grafana/grafana/pull/4861) +* **Singlestat gauge**: Fixed issue with gauge render position, fixes [#5143](https://github.com/grafana/grafana/pull/5143) + # 3.0.3 Patch release (2016-05-23) * **Annotations**: Annotations can now use a template variable as data source, closes [#5054](https://github.com/grafana/grafana/issues/5054) * **Time picker**: Fixed issue timepicker and UTC when reading time from URL, fixes [#5078](https://github.com/grafana/grafana/issues/5078) From a81806d3d08b15ff08486a6298cb7f38e2f11951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 24 May 2016 13:57:25 +0200 Subject: [PATCH 41/63] feat(dashboard): sync time range with url, closes #458 --- public/app/features/dashboard/timeSrv.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/public/app/features/dashboard/timeSrv.js b/public/app/features/dashboard/timeSrv.js index cd52155ff5f..96ba832f8b0 100644 --- a/public/app/features/dashboard/timeSrv.js +++ b/public/app/features/dashboard/timeSrv.js @@ -10,7 +10,7 @@ define([ var module = angular.module('grafana.services'); - module.service('timeSrv', function($rootScope, $timeout, $routeParams, timer) { + module.service('timeSrv', function($rootScope, $timeout, $routeParams, timer, $location) { var self = this; this.init = function(dashboard) { @@ -108,6 +108,13 @@ define([ this.old_refresh = null; } + // update url params + var urlParams = $location.search(); + var urlRange = this.timeRangeForUrl(); + urlParams.from = urlRange.from; + urlParams.to = urlRange.to; + $location.search(urlParams); + $rootScope.appEvent('time-range-changed', this.time); $timeout(this.refreshDashboard, 0); }; From 41deea90ee0f977863d2dddb6161467f47dd9b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 24 May 2016 16:34:17 +0200 Subject: [PATCH 42/63] feat(dashboard): template variable changes updates url, closes #5002 --- CHANGELOG.md | 2 ++ .../app/features/dashboard/submenu/submenu.ts | 24 ++++++++++++++++++- .../features/templating/templateValuesSrv.js | 6 +++-- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9e1b551b34..3d8252b6a85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # 3.1.0 (unreleased) ### Enhancements +* **Dashboard Url**: Time range changes updates url, closes [#458](https://github.com/grafana/grafana/issues/458) +* **Dashboard Url**: Template variable change updates url, closes [#5002](https://github.com/grafana/grafana/issues/5002) * **Singlestat**: Add support for range to text mappings, closes [#1319](https://github.com/grafana/grafana/issues/1319) * **Graph**: Adds sort order options for graph tooltip, closes [#1189](https://github.com/grafana/grafana/issues/1189) * **Theme**: Add default theme to config file [#5011](https://github.com/grafana/grafana/pull/5011) diff --git a/public/app/features/dashboard/submenu/submenu.ts b/public/app/features/dashboard/submenu/submenu.ts index a9899c3a4b8..ee1dc77def8 100644 --- a/public/app/features/dashboard/submenu/submenu.ts +++ b/public/app/features/dashboard/submenu/submenu.ts @@ -1,6 +1,7 @@ /// import angular from 'angular'; +import _ from 'lodash'; export class SubmenuCtrl { annotations: any; @@ -8,7 +9,11 @@ export class SubmenuCtrl { dashboard: any; /** @ngInject */ - constructor(private $rootScope, private templateValuesSrv, private dynamicDashboardSrv) { + constructor(private $rootScope, + private templateValuesSrv, + private templateSrv, + private dynamicDashboardSrv, + private $location) { this.annotations = this.dashboard.templating.list; this.variables = this.dashboard.templating.list; } @@ -22,8 +27,25 @@ export class SubmenuCtrl { return this.templateValuesSrv.getValuesForTag(variable, tagKey); } + updateUrlParamsWithCurrentVariables() { + // update url + var params = this.$location.search(); + // remove variable params + _.each(params, function(value, key) { + if (key.indexOf('var-') === 0) { + delete params[key]; + } + }); + + // add new values + this.templateSrv.fillVariableValuesForUrl(params); + // update url + this.$location.search(params); + } + variableUpdated(variable) { this.templateValuesSrv.variableUpdated(variable).then(() => { + this.updateUrlParamsWithCurrentVariables(); this.dynamicDashboardSrv.update(this.dashboard); this.$rootScope.$emit('template-variable-value-updated'); this.$rootScope.$broadcast('refresh'); diff --git a/public/app/features/templating/templateValuesSrv.js b/public/app/features/templating/templateValuesSrv.js index 7c411377d87..ce41bc6af7b 100644 --- a/public/app/features/templating/templateValuesSrv.js +++ b/public/app/features/templating/templateValuesSrv.js @@ -79,7 +79,6 @@ function (angular, _, kbn) { else if (variable.refresh === 1 || variable.refresh === 2) { return self.updateOptions(variable).then(function() { if (_.isEmpty(variable.current) && variable.options.length) { - console.log("setting current for %s", variable.name); self.setVariableValue(variable, variable.options[0]); } lock.resolve(); @@ -102,7 +101,10 @@ function (angular, _, kbn) { } return promise.then(function() { - var option = _.findWhere(variable.options, { text: urlValue }); + var option = _.find(variable.options, function(op) { + return op.text === urlValue || op.value === urlValue; + }); + option = option || { text: urlValue, value: urlValue }; self.updateAutoInterval(variable); From 71d62012e1731e3e3c3f39783e90118c35154969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 25 May 2016 09:46:15 +0200 Subject: [PATCH 43/63] fix(panel): fixed issue with fullscreen panel view and switching to another dashboard, fixes #5163 --- public/app/features/dashboard/rowCtrl.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/app/features/dashboard/rowCtrl.js b/public/app/features/dashboard/rowCtrl.js index 8ab1fcf88f8..4534b9bc510 100644 --- a/public/app/features/dashboard/rowCtrl.js +++ b/public/app/features/dashboard/rowCtrl.js @@ -142,9 +142,10 @@ function (angular, _, config) { }); module.directive('panelWidth', function() { - var fullscreen = false; return function(scope, element) { + var fullscreen = false; + function updateWidth() { if (!fullscreen) { element[0].style.width = ((scope.panel.span / 1.2) * 10) + '%'; From 8c2b6b532dc97b56639c5e268532793950767177 Mon Sep 17 00:00:00 2001 From: bergquist Date: Wed, 25 May 2016 09:56:45 +0200 Subject: [PATCH 44/63] fix(preferences): fixes broken default home dashboard closes #5167 --- pkg/api/api.go | 2 +- pkg/api/dashboard.go | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/pkg/api/api.go b/pkg/api/api.go index 684633e0bcd..f4b096f0b04 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -209,7 +209,7 @@ func Register(r *macaron.Macaron) { r.Combo("/db/:slug").Get(GetDashboard).Delete(DeleteDashboard) r.Post("/db", reqEditorRole, bind(m.SaveDashboardCommand{}), PostDashboard) r.Get("/file/:file", GetDashboardFromJsonFile) - r.Get("/home", GetHomeDashboard) + r.Get("/home", wrap(GetHomeDashboard)) r.Get("/tags", GetDashboardTags) r.Post("/import", bind(dtos.ImportDashboardCommand{}), wrap(ImportDashboard)) }) diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index 589aa68e737..cad9da19e82 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -159,10 +159,10 @@ func canEditDashboard(role m.RoleType) bool { return role == m.ROLE_ADMIN || role == m.ROLE_EDITOR || role == m.ROLE_READ_ONLY_EDITOR } -func GetHomeDashboard(c *middleware.Context) { +func GetHomeDashboard(c *middleware.Context) Response { prefsQuery := m.GetPreferencesWithDefaultsQuery{OrgId: c.OrgId, UserId: c.UserId} if err := bus.Dispatch(&prefsQuery); err != nil { - c.JsonApiErr(500, "Failed to get preferences", err) + return ApiError(500, "Failed to get preferences", err) } if prefsQuery.Result.HomeDashboardId != 0 { @@ -170,7 +170,7 @@ func GetHomeDashboard(c *middleware.Context) { err := bus.Dispatch(&slugQuery) if err == nil { dashRedirect := dtos.DashboardRedirect{RedirectUri: "db/" + slugQuery.Result} - c.JSON(200, &dashRedirect) + return Json(200, &dashRedirect) } else { log.Warn("Failed to get slug from database, %s", err.Error()) } @@ -179,8 +179,7 @@ func GetHomeDashboard(c *middleware.Context) { filePath := path.Join(setting.StaticRootPath, "dashboards/home.json") file, err := os.Open(filePath) if err != nil { - c.JsonApiErr(500, "Failed to load home dashboard", err) - return + return ApiError(500, "Failed to load home dashboard", err) } dash := dtos.DashboardFullWithMeta{} @@ -188,11 +187,10 @@ func GetHomeDashboard(c *middleware.Context) { dash.Meta.CanEdit = canEditDashboard(c.OrgRole) jsonParser := json.NewDecoder(file) if err := jsonParser.Decode(&dash.Dashboard); err != nil { - c.JsonApiErr(500, "Failed to load home dashboard", err) - return + return ApiError(500, "Failed to load home dashboard", err) } - c.JSON(200, &dash) + return Json(200, &dash) } func GetDashboardFromJsonFile(c *middleware.Context) { From ec98b7d672f81f9a10130aa6633ceebb1cce69de Mon Sep 17 00:00:00 2001 From: bergquist Date: Wed, 25 May 2016 10:01:49 +0200 Subject: [PATCH 45/63] docs(changelog): add note about fix for 5167 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d8252b6a85..03b375ec51b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ # 3.0.4 Patch release (unreleased) * **Templating**: Fixed issue with nested multi select variables and cascading and updating child variable selection state, fixes [#4861](https://github.com/grafana/grafana/pull/4861) * **Singlestat gauge**: Fixed issue with gauge render position, fixes [#5143](https://github.com/grafana/grafana/pull/5143) +* **Home dashboard**: Fixes broken home dashboard api, fixes [#5167](https://github.com/grafana/grafana/issues/5167) # 3.0.3 Patch release (2016-05-23) * **Annotations**: Annotations can now use a template variable as data source, closes [#5054](https://github.com/grafana/grafana/issues/5054) From 0daadc954c189d2f2b1d1c67f1959262a2ca7a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 25 May 2016 10:46:35 +0200 Subject: [PATCH 46/63] fix(templating): fixed issue with detecting data source variable in other template variable definition, fixes #5165 --- public/app/features/templating/templateSrv.js | 2 +- public/test/specs/templateSrv-specs.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/public/app/features/templating/templateSrv.js b/public/app/features/templating/templateSrv.js index 2e5f945c96a..b8d6cbaee2d 100644 --- a/public/app/features/templating/templateSrv.js +++ b/public/app/features/templating/templateSrv.js @@ -103,7 +103,7 @@ function (angular, _) { } variableName = regexEscape(variableName); - var findVarRegex = new RegExp('\\$(' + variableName + ')[\\W|$]|\\[\\[(' + variableName + ')\\]\\]', 'g'); + var findVarRegex = new RegExp('\\$(' + variableName + ')(?:\\W|$)|\\[\\[(' + variableName + ')\\]\\]', 'g'); var match = findVarRegex.exec(str); return match !== null; }; diff --git a/public/test/specs/templateSrv-specs.js b/public/test/specs/templateSrv-specs.js index c5f33d4f72f..a592cc7a152 100644 --- a/public/test/specs/templateSrv-specs.js +++ b/public/test/specs/templateSrv-specs.js @@ -205,6 +205,10 @@ define([ expect(contains).to.be(true); }); + it('should find it its the only thing', function() { + var contains = _templateSrv.containsVariable('$env', 'env'); + expect(contains).to.be(true); + }); }); describe('updateTemplateData with simple value', function() { From 5040570ea9ec96d8577af50324272afcbdd1e534 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 25 May 2016 11:07:29 +0200 Subject: [PATCH 47/63] docs(): updated changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03b375ec51b..323aaaecac2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,8 +8,10 @@ * **Theme**: Add default theme to config file [#5011](https://github.com/grafana/grafana/pull/5011) * **Page Footer**: Added page footer with links to docs, shows Grafana version and info if new version is available, closes [#4889](https://github.com/grafana/grafana/pull/4889) -# 3.0.4 Patch release (unreleased) +# 3.0.4 Patch release (2016-05-25) +* **Panel**: Fixed blank dashboard issue when switching to other dashboard while in fullscreen edit mode, fixes [#5163](https://github.com/grafana/grafana/pull/5163) * **Templating**: Fixed issue with nested multi select variables and cascading and updating child variable selection state, fixes [#4861](https://github.com/grafana/grafana/pull/4861) +* **Templating**: Fixed issue with using templated data source in another template variable query, fixes [#5165](https://github.com/grafana/grafana/pull/5165) * **Singlestat gauge**: Fixed issue with gauge render position, fixes [#5143](https://github.com/grafana/grafana/pull/5143) * **Home dashboard**: Fixes broken home dashboard api, fixes [#5167](https://github.com/grafana/grafana/issues/5167) From 3312a042dd7f5bd185d9ab4d101f7e5e653a5aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 25 May 2016 11:50:00 +0200 Subject: [PATCH 48/63] docs(): updated download links --- docs/sources/installation/debian.md | 6 +++--- docs/sources/installation/rpm.md | 8 ++++---- docs/sources/installation/windows.md | 2 +- packaging/publish/publish.sh | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/sources/installation/debian.md b/docs/sources/installation/debian.md index 4bd3d35b1d3..6084b9b317d 100644 --- a/docs/sources/installation/debian.md +++ b/docs/sources/installation/debian.md @@ -10,13 +10,13 @@ page_keywords: grafana, installation, debian, ubuntu, guide Description | Download ------------ | ------------- -Stable .deb for Debian-based Linux | [grafana_3.0.3-1463994644.deb](https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.3-1463994644_amd64.deb) +Stable .deb for Debian-based Linux | [grafana_3.0.4-1464167696.deb](https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.4-1464167696_amd64.deb) ## Install Stable - $ wget https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.3-1463994644_amd64.deb + $ wget https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.4-1464167696_amd64.deb $ sudo apt-get install -y adduser libfontconfig - $ sudo dpkg -i grafana_3.0.3-1463994644_amd64.deb + $ sudo dpkg -i grafana_3.0.4-1464167696_amd64.deb ## APT Repository diff --git a/docs/sources/installation/rpm.md b/docs/sources/installation/rpm.md index 4caf5764903..854ba91fcf7 100644 --- a/docs/sources/installation/rpm.md +++ b/docs/sources/installation/rpm.md @@ -10,24 +10,24 @@ page_keywords: grafana, installation, centos, fedora, opensuse, redhat, guide Description | Download ------------ | ------------- -Stable .RPM for CentOS / Fedora / OpenSuse / Redhat Linux | [grafana-3.0.3-1463994644.x86_64.rpm](https://grafanarel.s3.amazonaws.com/builds/grafana-3.0.3-1463994644.x86_64.rpm) +Stable .RPM for CentOS / Fedora / OpenSuse / Redhat Linux | [grafana-3.0.4-1464167696.x86_64.rpm](https://grafanarel.s3.amazonaws.com/builds/grafana-3.0.4-1464167696.x86_64.rpm) ## Install Stable Release from package file You can install Grafana using Yum directly. - $ sudo yum install https://grafanarel.s3.amazonaws.com/builds/grafana-3.0.3-1463994644.x86_64.rpm + $ sudo yum install https://grafanarel.s3.amazonaws.com/builds/grafana-3.0.4-1464167696.x86_64.rpm Or install manually using `rpm`. #### On CentOS / Fedora / Redhat: $ sudo yum install initscripts fontconfig - $ sudo rpm -Uvh grafana-3.0.3-1463994644.x86_64.rpm + $ sudo rpm -Uvh grafana-3.0.4-1464167696.x86_64.rpm #### On OpenSuse: - $ sudo rpm -i --nodeps grafana-3.0.3-1463994644.x86_64.rpm + $ sudo rpm -i --nodeps grafana-3.0.4-1464167696.x86_64.rpm ## Install via YUM Repository diff --git a/docs/sources/installation/windows.md b/docs/sources/installation/windows.md index ea9a8de049c..858f8cfea2d 100644 --- a/docs/sources/installation/windows.md +++ b/docs/sources/installation/windows.md @@ -10,7 +10,7 @@ page_keywords: grafana, installation, windows guide Description | Download ------------ | ------------- -Stable Zip package for Windows | [grafana.3.0.3.windows-x64.zip](https://grafanarel.s3.amazonaws.com/winbuilds/dist/grafana-3.0.3.windows-x64.zip) +Stable Zip package for Windows | [grafana.3.0.4.windows-x64.zip](https://grafanarel.s3.amazonaws.com/winbuilds/dist/grafana-3.0.4.windows-x64.zip) ## Configure diff --git a/packaging/publish/publish.sh b/packaging/publish/publish.sh index d17a5d01627..892bfc178cc 100755 --- a/packaging/publish/publish.sh +++ b/packaging/publish/publish.sh @@ -1,7 +1,7 @@ #! /usr/bin/env bash -deb_ver=3.0.3-1463994644 -rpm_ver=3.0.3-1463994644 +deb_ver=3.0.4-1464167696 +rpm_ver=3.0.4-1464167696 wget https://grafanarel.s3.amazonaws.com/builds/grafana_${deb_ver}_amd64.deb From 2712d9ae8bf612c9b9dcf401c22f583b9a3fa88f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 25 May 2016 12:23:32 +0200 Subject: [PATCH 49/63] Update latest.json --- latest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/latest.json b/latest.json index 9a54260bc92..7fe27b91983 100644 --- a/latest.json +++ b/latest.json @@ -1,4 +1,4 @@ { - "stable": "3.0.3", - "testing": "3.0.3" + "stable": "3.0.4", + "testing": "3.0.4" } From 1060eeb197c0a521ca822c361b05c7f665e1bce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 25 May 2016 16:59:34 +0200 Subject: [PATCH 50/63] feat(dashboard): include org id query parameter in dashboard url, #1613 --- .../app/features/dashboard/submenu/submenu.ts | 17 -------- public/app/features/dashboard/timeSrv.js | 9 +---- public/app/features/dashboard/viewStateSrv.js | 40 ++++++++++++++++--- .../test/specs/dashboardViewStateSrv-specs.js | 18 +++++++-- 4 files changed, 50 insertions(+), 34 deletions(-) diff --git a/public/app/features/dashboard/submenu/submenu.ts b/public/app/features/dashboard/submenu/submenu.ts index ee1dc77def8..75e53e668b0 100644 --- a/public/app/features/dashboard/submenu/submenu.ts +++ b/public/app/features/dashboard/submenu/submenu.ts @@ -27,25 +27,8 @@ export class SubmenuCtrl { return this.templateValuesSrv.getValuesForTag(variable, tagKey); } - updateUrlParamsWithCurrentVariables() { - // update url - var params = this.$location.search(); - // remove variable params - _.each(params, function(value, key) { - if (key.indexOf('var-') === 0) { - delete params[key]; - } - }); - - // add new values - this.templateSrv.fillVariableValuesForUrl(params); - // update url - this.$location.search(params); - } - variableUpdated(variable) { this.templateValuesSrv.variableUpdated(variable).then(() => { - this.updateUrlParamsWithCurrentVariables(); this.dynamicDashboardSrv.update(this.dashboard); this.$rootScope.$emit('template-variable-value-updated'); this.$rootScope.$broadcast('refresh'); diff --git a/public/app/features/dashboard/timeSrv.js b/public/app/features/dashboard/timeSrv.js index 96ba832f8b0..cd52155ff5f 100644 --- a/public/app/features/dashboard/timeSrv.js +++ b/public/app/features/dashboard/timeSrv.js @@ -10,7 +10,7 @@ define([ var module = angular.module('grafana.services'); - module.service('timeSrv', function($rootScope, $timeout, $routeParams, timer, $location) { + module.service('timeSrv', function($rootScope, $timeout, $routeParams, timer) { var self = this; this.init = function(dashboard) { @@ -108,13 +108,6 @@ define([ this.old_refresh = null; } - // update url params - var urlParams = $location.search(); - var urlRange = this.timeRangeForUrl(); - urlParams.from = urlRange.from; - urlParams.to = urlRange.to; - $location.search(urlParams); - $rootScope.appEvent('time-range-changed', this.time); $timeout(this.refreshDashboard, 0); }; diff --git a/public/app/features/dashboard/viewStateSrv.js b/public/app/features/dashboard/viewStateSrv.js index cda5e69f006..975e8d44840 100644 --- a/public/app/features/dashboard/viewStateSrv.js +++ b/public/app/features/dashboard/viewStateSrv.js @@ -8,7 +8,7 @@ function (angular, _, $) { var module = angular.module('grafana.services'); - module.factory('dashboardViewStateSrv', function($location, $timeout) { + module.factory('dashboardViewStateSrv', function($location, $timeout, templateSrv, contextSrv, timeSrv) { // represents the transient view state // like fullscreen panel & edit @@ -25,6 +25,19 @@ function (angular, _, $) { } }; + // update url on time range change + $scope.onAppEvent('time-range-changed', function() { + var urlParams = $location.search(); + var urlRange = timeSrv.timeRangeForUrl(); + urlParams.from = urlRange.from; + urlParams.to = urlRange.to; + $location.search(urlParams); + }); + + $scope.onAppEvent('template-variable-value-updated', function() { + self.updateUrlParamsWithCurrentVariables(); + }); + $scope.onAppEvent('$routeUpdate', function() { var urlState = self.getQueryStringState(); if (self.needsSync(urlState)) { @@ -44,6 +57,22 @@ function (angular, _, $) { this.expandRowForPanel(); } + DashboardViewState.prototype.updateUrlParamsWithCurrentVariables = function() { + // update url + var params = $location.search(); + // remove variable params + _.each(params, function(value, key) { + if (key.indexOf('var-') === 0) { + delete params[key]; + } + }); + + // add new values + templateSrv.fillVariableValuesForUrl(params); + // update url + $location.search(params); + }; + DashboardViewState.prototype.expandRowForPanel = function() { if (!this.state.panelId) { return; } @@ -63,6 +92,7 @@ function (angular, _, $) { state.fullscreen = state.fullscreen ? true : null; state.edit = (state.edit === "true" || state.edit === true) || null; state.editview = state.editview || null; + state.org = contextSrv.user.orgId; return state; }; @@ -70,10 +100,11 @@ function (angular, _, $) { var urlState = _.clone(this.state); urlState.fullscreen = this.state.fullscreen ? true : null; urlState.edit = this.state.edit ? true : null; + urlState.org = contextSrv.user.orgId; return urlState; }; - DashboardViewState.prototype.update = function(state, skipUrlSync) { + DashboardViewState.prototype.update = function(state) { _.extend(this.state, state); this.dashboard.meta.fullscreen = this.state.fullscreen; @@ -83,10 +114,7 @@ function (angular, _, $) { this.state.edit = null; } - if (!skipUrlSync) { - $location.search(this.serializeToUrl()); - } - + $location.search(this.serializeToUrl()); this.syncState(); }; diff --git a/public/test/specs/dashboardViewStateSrv-specs.js b/public/test/specs/dashboardViewStateSrv-specs.js index b33c7156392..202a43670b1 100644 --- a/public/test/specs/dashboardViewStateSrv-specs.js +++ b/public/test/specs/dashboardViewStateSrv-specs.js @@ -5,8 +5,20 @@ define([ describe('when updating view state', function() { var viewState, location; + var timeSrv = {}; + var templateSrv = {}; + var contextSrv = { + user: { + orgId: 19 + } + }; beforeEach(module('grafana.services')); + beforeEach(module(function($provide) { + $provide.value('timeSrv', timeSrv); + $provide.value('templateSrv', templateSrv); + $provide.value('contextSrv', contextSrv); + })); beforeEach(inject(function(dashboardViewStateSrv, $location, $rootScope) { $rootScope.onAppEvent = function() {}; @@ -17,9 +29,9 @@ define([ describe('to fullscreen true and edit true', function() { it('should update querystring and view state', function() { - var updateState = { fullscreen: true, edit: true, panelId: 1 }; + var updateState = {fullscreen: true, edit: true, panelId: 1}; viewState.update(updateState); - expect(location.search()).to.eql(updateState); + expect(location.search()).to.eql({fullscreen: true, edit: true, panelId: 1, org: 19}); expect(viewState.dashboard.meta.fullscreen).to.be(true); expect(viewState.state.fullscreen).to.be(true); }); @@ -29,7 +41,7 @@ define([ it('should remove params from query string', function() { viewState.update({fullscreen: true, panelId: 1, edit: true}); viewState.update({fullscreen: false}); - expect(location.search()).to.eql({}); + expect(location.search()).to.eql({org: 19}); expect(viewState.dashboard.meta.fullscreen).to.be(false); expect(viewState.state.fullscreen).to.be(null); }); From 46551e9d654d1afb6703d73afd62d60bf4cd3da0 Mon Sep 17 00:00:00 2001 From: nfnty Date: Thu, 26 May 2016 01:03:22 +0200 Subject: [PATCH 51/63] package.json: Upgrade grunt-contrib-compress, Fixes #5071 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9dbff96c2b8..3e3cd2faeac 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "grunt-angular-templates": "^0.5.5", "grunt-cli": "~0.1.13", "grunt-contrib-clean": "~0.7.0", - "grunt-contrib-compress": "~0.14.0", + "grunt-contrib-compress": "^1.3.0", "grunt-contrib-concat": "^0.5.1", "grunt-contrib-copy": "~0.8.2", "grunt-contrib-cssmin": "~0.14.0", From 4038b4d17e47684c1aaa05ea432c52123f24dcf1 Mon Sep 17 00:00:00 2001 From: Mukesh Date: Thu, 26 May 2016 10:21:23 +0530 Subject: [PATCH 52/63] Set active org through admin api (#5179) --- pkg/api/api.go | 1 + pkg/api/user.go | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/pkg/api/api.go b/pkg/api/api.go index f4b096f0b04..070f400aaad 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -115,6 +115,7 @@ func Register(r *macaron.Macaron) { r.Get("/:id", wrap(GetUserById)) r.Get("/:id/orgs", wrap(GetUserOrgList)) r.Put("/:id", bind(m.UpdateUserCommand{}), wrap(UpdateUser)) + r.Post("/:id/using/:orgId", wrap(UpdateUserActiveOrg)) }, reqGrafanaAdmin) // org information available to all users. diff --git a/pkg/api/user.go b/pkg/api/user.go index 8f54feaf6a0..f98eec02c40 100644 --- a/pkg/api/user.go +++ b/pkg/api/user.go @@ -40,6 +40,24 @@ func UpdateUser(c *middleware.Context, cmd m.UpdateUserCommand) Response { return handleUpdateUser(cmd) } +//POST /api/users/:id/using/:orgId +func UpdateUserActiveOrg(c *middleware.Context) Response { + userId := c.ParamsInt64(":id") + orgId := c.ParamsInt64(":orgId") + + if !validateUsingOrg(userId, orgId) { + return ApiError(401, "Not a valid organization", nil) + } + + cmd := m.SetUsingOrgCommand{UserId: userId, OrgId: orgId} + + if err := bus.Dispatch(&cmd); err != nil { + return ApiError(500, "Failed change active organization", err) + } + + return ApiSuccess("Active organization changed") +} + func handleUpdateUser(cmd m.UpdateUserCommand) Response { if len(cmd.Login) == 0 { cmd.Login = cmd.Email From c9d6321f382cd7a30f0faa927b43cd5b97d03b06 Mon Sep 17 00:00:00 2001 From: Jared Wiltshire Date: Thu, 26 May 2016 15:13:29 +1000 Subject: [PATCH 53/63] Allow for proxying Authorization header and automatically convert (#4832) Authorization header to X-DS-Authorization in backend_srv.js --- pkg/api/dataproxy.go | 7 +++++++ public/app/core/services/backend_srv.js | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/pkg/api/dataproxy.go b/pkg/api/dataproxy.go index b00ef595161..9a062ddfd2d 100644 --- a/pkg/api/dataproxy.go +++ b/pkg/api/dataproxy.go @@ -55,6 +55,13 @@ func NewReverseProxy(ds *m.DataSource, proxyPath string, targetUrl *url.URL) *ht req.Header.Add("Authorization", util.GetBasicAuthHeader(ds.BasicAuthUser, ds.BasicAuthPassword)) } + dsAuth := req.Header.Get("X-DS-Authorization") + if len(dsAuth) > 0 { + req.Header.Del("X-DS-Authorization") + req.Header.Del("Authorization") + req.Header.Add("Authorization", dsAuth) + } + // clear cookie headers req.Header.Del("Cookie") req.Header.Del("Set-Cookie") diff --git a/public/app/core/services/backend_srv.js b/public/app/core/services/backend_srv.js index ff3784ab45e..f27e427c70b 100644 --- a/public/app/core/services/backend_srv.js +++ b/public/app/core/services/backend_srv.js @@ -96,6 +96,11 @@ function (angular, _, coreModule, config) { var requestIsLocal = options.url.indexOf('/') === 0; var firstAttempt = options.retry === 0; + if (requestIsLocal && options.headers && options.headers.Authorization) { + options.headers['X-DS-Authorization'] = options.headers.Authorization; + delete options.headers.Authorization; + } + return $http(options).then(null, function(err) { // handle unauthorized for backend requests if (requestIsLocal && firstAttempt && err.status === 401) { From dd494e648a5c05dc0eba2e8a82f9f81bf43e5188 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Thu, 26 May 2016 07:45:53 +0200 Subject: [PATCH 54/63] fix(rendering): fixed issue with phantomjs panel rendering --- public/app/features/panel/partials/soloPanel.html | 12 ++++-------- vendor/phantomjs/render.js | 4 +++- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/public/app/features/panel/partials/soloPanel.html b/public/app/features/panel/partials/soloPanel.html index e76ad724343..131d99d4389 100644 --- a/public/app/features/panel/partials/soloPanel.html +++ b/public/app/features/panel/partials/soloPanel.html @@ -1,9 +1,5 @@ -
    -
    -
    -
    - - -
    -
    +
    + +
    +
    diff --git a/vendor/phantomjs/render.js b/vendor/phantomjs/render.js index 0de97273c5c..f40a42380ad 100644 --- a/vendor/phantomjs/render.js +++ b/vendor/phantomjs/render.js @@ -39,7 +39,8 @@ var canvas = page.evaluate(function() { if (!window.angular) { return false; } var body = window.angular.element(document.body); - if (!body.scope) { return false; } + if (!body.injector) { return false; } + if (!body.injector()) { return false; } var rootScope = body.injector().get('$rootScope'); if (!rootScope) {return false;} @@ -59,6 +60,7 @@ width: bb.width, height: bb.height }; + page.render(params.png); phantom.exit(); } From 90c9c70416fb9ca4df6563cd11ea80c5c9d8fe1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Thu, 26 May 2016 08:49:55 +0200 Subject: [PATCH 55/63] fix(): another fix for panel image rendering --- public/app/features/dashboard/viewStateSrv.js | 2 +- public/app/features/panel/solo_panel_ctrl.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/public/app/features/dashboard/viewStateSrv.js b/public/app/features/dashboard/viewStateSrv.js index 975e8d44840..2138dd37438 100644 --- a/public/app/features/dashboard/viewStateSrv.js +++ b/public/app/features/dashboard/viewStateSrv.js @@ -53,7 +53,7 @@ function (angular, _, $) { self.registerPanel(payload.scope); }); - this.update(this.getQueryStringState(), true); + this.update(this.getQueryStringState()); this.expandRowForPanel(); } diff --git a/public/app/features/panel/solo_panel_ctrl.js b/public/app/features/panel/solo_panel_ctrl.js index 313c2014de2..355d5e8b265 100644 --- a/public/app/features/panel/solo_panel_ctrl.js +++ b/public/app/features/panel/solo_panel_ctrl.js @@ -17,6 +17,10 @@ function (angular, $) { var params = $location.search(); panelId = parseInt(params.panelId); + // add fullscreen param; + params.fullscreen = true; + $location.search(params); + dashboardLoaderSrv.loadDashboard($routeParams.type, $routeParams.slug).then(function(result) { $scope.initDashboard(result, $scope); }); From 724a511995f70a84aa3e321cc9687b285b1ea732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Thu, 26 May 2016 13:18:02 +0200 Subject: [PATCH 56/63] fix(templating): fixed issue with value being shown instead of it's text representation, fixes #5172 --- .../features/templating/templateValuesSrv.js | 30 +++++++++++-------- public/test/specs/templateValuesSrv-specs.js | 21 +++++++++++++ 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/public/app/features/templating/templateValuesSrv.js b/public/app/features/templating/templateValuesSrv.js index 7c411377d87..85a3b062229 100644 --- a/public/app/features/templating/templateValuesSrv.js +++ b/public/app/features/templating/templateValuesSrv.js @@ -102,8 +102,8 @@ function (angular, _, kbn) { } return promise.then(function() { - var option = _.findWhere(variable.options, { text: urlValue }); - option = option || { text: urlValue, value: urlValue }; + var option = _.findWhere(variable.options, {text: urlValue}); + option = option || {text: urlValue, value: urlValue}; self.updateAutoInterval(variable); return self.setVariableValue(variable, option, true); @@ -125,8 +125,8 @@ function (angular, _, kbn) { this.setVariableValue = function(variable, option, initPhase) { variable.current = angular.copy(option); - if (_.isArray(variable.current.value)) { - variable.current.text = variable.current.value.join(' + '); + if (_.isArray(variable.current.text)) { + variable.current.text = variable.current.text.join(' + '); } self.selectOptionsForCurrentValue(variable); @@ -224,6 +224,7 @@ function (angular, _, kbn) { this.selectOptionsForCurrentValue = function(variable) { var i, y, value, option; + var selected = []; for (i = 0; i < variable.options.length; i++) { option = variable.options[i]; @@ -233,12 +234,16 @@ function (angular, _, kbn) { value = variable.current.value[y]; if (option.value === value) { option.selected = true; + selected.push(option); } } } else if (option.value === variable.current.value) { option.selected = true; + selected.push(option); } } + + return selected; }; this.validateVariableSelectionState = function(variable) { @@ -248,17 +253,18 @@ function (angular, _, kbn) { } if (_.isArray(variable.current.value)) { - self.selectOptionsForCurrentValue(variable); - // updated selected value - var selected = { - value: _.map(_.filter(variable.options, {selected: true}), function(op) { - return op.value; - }) - }; + var selected = self.selectOptionsForCurrentValue(variable); + // if none pick first - if (selected.value.length === 0) { + if (selected.length === 0) { selected = variable.options[0]; + } else { + selected = { + value: _.map(selected, function(val) {return val.value;}), + text: _.map(selected, function(val) {return val.text;}).join(' + '), + }; } + return self.setVariableValue(variable, selected, false); } else { var currentOption = _.findWhere(variable.options, {text: variable.current.text}); diff --git a/public/test/specs/templateValuesSrv-specs.js b/public/test/specs/templateValuesSrv-specs.js index 79aa2eafd8d..7a8d8c1fccb 100644 --- a/public/test/specs/templateValuesSrv-specs.js +++ b/public/test/specs/templateValuesSrv-specs.js @@ -166,6 +166,27 @@ define([ }); }); + describeUpdateVariable('query variable with multi select and $__all selected', function(scenario) { + scenario.setup(function() { + scenario.variable = { + type: 'query', + query: '', + name: 'test', + includeAll: true, + current: { + value: ['$__all'], + text: 'All' + } + }; + scenario.queryResult = [{text: 'val5'}, {text: 'val6'}]; + }); + + it('should keep current All value', function() { + expect(scenario.variable.current.value).to.eql(['$__all']); + expect(scenario.variable.current.text).to.eql('All'); + }); + }); + describeUpdateVariable('query variable with numeric results', function(scenario) { scenario.setup(function() { scenario.variable = { type: 'query', query: '', name: 'test', current: {} }; From aedba5411c947b5a6590f770a0cd0dbf91c8135b Mon Sep 17 00:00:00 2001 From: Mat Schaffer Date: Fri, 27 May 2016 11:30:16 +0900 Subject: [PATCH 57/63] Add basic metrics for AWS/ElasticBeanstalk --- pkg/api/cloudwatch/metrics.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/api/cloudwatch/metrics.go b/pkg/api/cloudwatch/metrics.go index 5bd318ea3c9..26b4eb0e6c3 100644 --- a/pkg/api/cloudwatch/metrics.go +++ b/pkg/api/cloudwatch/metrics.go @@ -45,6 +45,7 @@ func init() { "AWS/EBS": {"VolumeReadBytes", "VolumeWriteBytes", "VolumeReadOps", "VolumeWriteOps", "VolumeTotalReadTime", "VolumeTotalWriteTime", "VolumeIdleTime", "VolumeQueueLength", "VolumeThroughputPercentage", "VolumeConsumedReadWriteOps"}, "AWS/EC2": {"CPUCreditUsage", "CPUCreditBalance", "CPUUtilization", "DiskReadOps", "DiskWriteOps", "DiskReadBytes", "DiskWriteBytes", "NetworkIn", "NetworkOut", "StatusCheckFailed", "StatusCheckFailed_Instance", "StatusCheckFailed_System"}, "AWS/ELB": {"HealthyHostCount", "UnHealthyHostCount", "RequestCount", "Latency", "HTTPCode_ELB_4XX", "HTTPCode_ELB_5XX", "HTTPCode_Backend_2XX", "HTTPCode_Backend_3XX", "HTTPCode_Backend_4XX", "HTTPCode_Backend_5XX", "BackendConnectionErrors", "SurgeQueueLength", "SpilloverCount"}, + "AWS/ElasticBeanstalk": {"EnvironmentHealth"}, "AWS/ElasticMapReduce": {"IsIdle", "JobsRunning", "JobsFailed", "MapTasksRunning", "MapTasksRemaining", "MapSlotsOpen", "RemainingMapTasksPerSlot", "ReduceTasksRunning", "ReduceTasksRemaining", "ReduceSlotsOpen", "CoreNodesRunning", "CoreNodesPending", "LiveDataNodes", "TaskNodesRunning", "TaskNodesPending", "LiveTaskTrackers", @@ -85,6 +86,7 @@ func init() { "AWS/EBS": {"VolumeId"}, "AWS/EC2": {"AutoScalingGroupName", "ImageId", "InstanceId", "InstanceType"}, "AWS/ELB": {"LoadBalancerName", "AvailabilityZone"}, + "AWS/ElasticBeanstalk": {"EnvironmentName"}, "AWS/ElasticMapReduce": {"ClusterId", "JobFlowId", "JobId"}, "AWS/ES": {"ClientId", "DomainName"}, "AWS/Events": {"RuleName"}, From 18f704533f9c196572876c1fc98d30da5f725cfc Mon Sep 17 00:00:00 2001 From: Mat Schaffer Date: Fri, 27 May 2016 11:47:53 +0900 Subject: [PATCH 58/63] Add enhanced elasticbeanstalk metrics --- pkg/api/cloudwatch/metrics.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pkg/api/cloudwatch/metrics.go b/pkg/api/cloudwatch/metrics.go index 26b4eb0e6c3..54e60b781cb 100644 --- a/pkg/api/cloudwatch/metrics.go +++ b/pkg/api/cloudwatch/metrics.go @@ -45,7 +45,15 @@ func init() { "AWS/EBS": {"VolumeReadBytes", "VolumeWriteBytes", "VolumeReadOps", "VolumeWriteOps", "VolumeTotalReadTime", "VolumeTotalWriteTime", "VolumeIdleTime", "VolumeQueueLength", "VolumeThroughputPercentage", "VolumeConsumedReadWriteOps"}, "AWS/EC2": {"CPUCreditUsage", "CPUCreditBalance", "CPUUtilization", "DiskReadOps", "DiskWriteOps", "DiskReadBytes", "DiskWriteBytes", "NetworkIn", "NetworkOut", "StatusCheckFailed", "StatusCheckFailed_Instance", "StatusCheckFailed_System"}, "AWS/ELB": {"HealthyHostCount", "UnHealthyHostCount", "RequestCount", "Latency", "HTTPCode_ELB_4XX", "HTTPCode_ELB_5XX", "HTTPCode_Backend_2XX", "HTTPCode_Backend_3XX", "HTTPCode_Backend_4XX", "HTTPCode_Backend_5XX", "BackendConnectionErrors", "SurgeQueueLength", "SpilloverCount"}, - "AWS/ElasticBeanstalk": {"EnvironmentHealth"}, + "AWS/ElasticBeanstalk": { + "EnvironmentHealth", + "ApplicationLatencyP10", "ApplicationLatencyP50", "ApplicationLatencyP75", "ApplicationLatencyP85", "ApplicationLatencyP90", "ApplicationLatencyP95", "ApplicationLatencyP99", "ApplicationLatencyP99.9", + "ApplicationRequests2xx", "ApplicationRequests3xx", "ApplicationRequests4xx", "ApplicationRequests5xx", "ApplicationRequestsTotal", + "CPUIdle", "CPUIowait", "CPUIrq", "CPUNice", "CPUSoftirq", "CPUSystem", "CPUUser", + "InstanceHealth", "InstancesDegraded", "InstancesInfo", "InstancesNoData", "InstancesOk", "InstancesPending", "InstancesSevere", "InstancesUnknown", "InstancesWarning", + "LoadAverage1min", "LoadAverage5min", + "RootFilesystemUtil", + }, "AWS/ElasticMapReduce": {"IsIdle", "JobsRunning", "JobsFailed", "MapTasksRunning", "MapTasksRemaining", "MapSlotsOpen", "RemainingMapTasksPerSlot", "ReduceTasksRunning", "ReduceTasksRemaining", "ReduceSlotsOpen", "CoreNodesRunning", "CoreNodesPending", "LiveDataNodes", "TaskNodesRunning", "TaskNodesPending", "LiveTaskTrackers", @@ -86,7 +94,7 @@ func init() { "AWS/EBS": {"VolumeId"}, "AWS/EC2": {"AutoScalingGroupName", "ImageId", "InstanceId", "InstanceType"}, "AWS/ELB": {"LoadBalancerName", "AvailabilityZone"}, - "AWS/ElasticBeanstalk": {"EnvironmentName"}, + "AWS/ElasticBeanstalk": {"EnvironmentName", "InstanceId"}, "AWS/ElasticMapReduce": {"ClusterId", "JobFlowId", "JobId"}, "AWS/ES": {"ClientId", "DomainName"}, "AWS/Events": {"RuleName"}, From 2b9d26068680dbebf1a0232ad0565f5212641fff Mon Sep 17 00:00:00 2001 From: Tim Bielawa Date: Fri, 27 May 2016 02:58:42 -0400 Subject: [PATCH 59/63] docs(rebuild): Include new http api preferences docs in menus (#5194) This updates the mkdocs.yml source file such that the HTTP Preferences API is included in the website navigation bar and in the HTTP API overview page. This commit also refreshes the docs/README.md file with more verbose instructions for building and viewing the documentation locally. * Original issue: #5069 Document org & user preferences HTTP docs * Original PR: #5087 Closes #5193 --- docs/README.md | 53 ++++++++++++++++++++++++++++++++++++++++++++----- docs/mkdocs.yml | 1 + 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index 36c636fcc72..65bd5714615 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,7 +1,15 @@ -To build the docs locally, you need to have docker installed. The docs are built using a custom [docker](https://www.docker.com/) -image and [mkdocs](http://www.mkdocs.org/). +# Building The Docs -Build the `grafana/docs-base:latest` image: +To build the docs locally, you need to have docker installed. The +docs are built using a custom [docker](https://www.docker.com/) image +and the [mkdocs](http://www.mkdocs.org/) tool. + +**Prepare the Docker Image**: + +Build the `grafana/docs-base:latest` image. Run these commands in the +same directory this file is in. **Note** that you may require ``sudo`` +when running ``make docs-build`` depending on how your system's docker +service is configured): ``` $ git clone https://github.com/grafana/docs-base @@ -9,10 +17,45 @@ $ cd docs-base $ make docs-build ``` -To build the docs: +**Build the Documentation**: + +Now that the docker image has been prepared we can build the +docs. Switch your working directory back to the directory this file +(README.md) is in and run (possibly with ``sudo``): + ``` -$ cd docs $ make docs ``` +This command will not return control of the shell to the user. Instead +the command is now running a new docker container built from the image +we created in the previous step. + Open [localhost:8180](http://localhost:8180) to view the docs. + +**Note** that after running ``make docs`` you may notice a message +like this in the console output + +> Running at: http://0.0.0.0:8000/ + +This is misleading. That is **not** the port the documentation is +served from. You must browse to port **8180** to view the new +documentation. + + +# Adding a New Page + +Adding a new page requires updating the ``mkdocs.yml`` file which is +located in this directory. + +For example, if you are adding documentation for a new HTTP API called +``preferences`` you would: + +1. Create the file ``docs/sources/http_api/preferences.md`` +1. Add a reference to it in ``docs/sources/http_api/overview.md`` +1. Update the list under the **pages** key in the ``docs/mkdocs.yml`` file with a reference to your new page: + + +```yaml +- ['http_api/preferences.md', 'API', 'Preferences API'] +``` diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index ff88133dfdd..c969a568906 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -84,6 +84,7 @@ pages: - ['http_api/user.md', 'API', 'User API'] - ['http_api/admin.md', 'API', 'Admin API'] - ['http_api/snapshot.md', 'API', 'Snapshot API'] +- ['http_api/preferences.md', 'API', 'Preferences API'] - ['http_api/other.md', 'API', 'Other API'] - ['plugins/index.md', 'Plugins', 'Overview'] From bf90fbc6786e6185100431717f709b2808086095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Fri, 27 May 2016 09:23:08 +0200 Subject: [PATCH 60/63] fix(templating): fixed failing templating unit test --- public/app/features/templating/templateValuesSrv.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/app/features/templating/templateValuesSrv.js b/public/app/features/templating/templateValuesSrv.js index b79713ebbb4..be553509be2 100644 --- a/public/app/features/templating/templateValuesSrv.js +++ b/public/app/features/templating/templateValuesSrv.js @@ -105,6 +105,8 @@ function (angular, _, kbn) { return op.text === urlValue || op.value === urlValue; }); + option = option || { text: urlValue, value: urlValue }; + self.updateAutoInterval(variable); return self.setVariableValue(variable, option, true); }); From cf87e8ecf569f7bb52cfb7e6c3bb301a7235243c Mon Sep 17 00:00:00 2001 From: hc4 Date: Fri, 27 May 2016 18:26:20 +0300 Subject: [PATCH 61/63] Fix parsing of intervals. defined in ms (#5151) * Fix parsing of intervals. defined in ms Fix parsing of intervals. defined in ms. Increase accuracy for sub-second inrevals. Closes #5008 * Tests for sub-ms intervals Unit test for https://github.com/grafana/grafana/commit/2034d4b9710b0cb9fd0cdf14aa9981cd0417eda4 --- public/app/core/utils/kbn.js | 23 ++++++++++++++++++----- public/test/core/utils/kbn_specs.js | 6 ++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/public/app/core/utils/kbn.js b/public/app/core/utils/kbn.js index 9d714c34fb3..f54979b0e97 100644 --- a/public/app/core/utils/kbn.js +++ b/public/app/core/utils/kbn.js @@ -12,9 +12,21 @@ function($, _) { kbn.round_interval = function(interval) { switch (true) { - // 0.3s - case (interval <= 300): - return 100; // 0.1s + // 0.015s + case (interval <= 15): + return 10; // 0.01s + // 0.035s + case (interval <= 35): + return 20; // 0.02s + // 0.075s + case (interval <= 75): + return 50; // 0.05s + // 0.15s + case (interval <= 150): + return 100; // 0.1s + // 0.35s + case (interval <= 350): + return 200; // 0.2s // 0.75s case (interval <= 750): return 500; // 0.5s @@ -133,7 +145,7 @@ function($, _) { return str; }; - kbn.interval_regex = /(\d+(?:\.\d+)?)([Mwdhmsy])/; + kbn.interval_regex = /(\d+(?:\.\d+)?)(ms|[Mwdhmsy])/; // histogram & trends kbn.intervals_in_seconds = { @@ -143,7 +155,8 @@ function($, _) { d: 86400, h: 3600, m: 60, - s: 1 + s: 1, + ms: 0.001 }; kbn.calculateInterval = function(range, resolution, userInterval) { diff --git a/public/test/core/utils/kbn_specs.js b/public/test/core/utils/kbn_specs.js index 7e75e880546..0a2ad165253 100644 --- a/public/test/core/utils/kbn_specs.js +++ b/public/test/core/utils/kbn_specs.js @@ -147,5 +147,11 @@ define([ var str = kbn.calculateInterval(range, 1000, '>10s'); expect(str).to.be('20m'); }); + + it('10s 900 resolution and user low limit in ms', function() { + var range = { from: dateMath.parse('now-10s'), to: dateMath.parse('now') }; + var str = kbn.calculateInterval(range, 900, '>15ms'); + expect(str).to.be('15ms'); + }); }); }); From ca8543348b2f8430f5d8ad205f54c84ae002f361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Sat, 28 May 2016 10:13:51 +0200 Subject: [PATCH 62/63] docker(): added collectd system metrics collector that writes to graphite, just for testing --- docker/blocks/collectd/Dockerfile | 16 +++++ docker/blocks/collectd/README.md | 37 ++++++++++++ docker/blocks/collectd/collectd.conf.tpl | 76 ++++++++++++++++++++++++ docker/blocks/collectd/etc_mtab | 1 + docker/blocks/collectd/fig | 11 ++++ docker/blocks/collectd/start_container | 5 ++ 6 files changed, 146 insertions(+) create mode 100644 docker/blocks/collectd/Dockerfile create mode 100644 docker/blocks/collectd/README.md create mode 100644 docker/blocks/collectd/collectd.conf.tpl create mode 100644 docker/blocks/collectd/etc_mtab create mode 100644 docker/blocks/collectd/fig create mode 100644 docker/blocks/collectd/start_container diff --git a/docker/blocks/collectd/Dockerfile b/docker/blocks/collectd/Dockerfile new file mode 100644 index 00000000000..a08b1f9c1b2 --- /dev/null +++ b/docker/blocks/collectd/Dockerfile @@ -0,0 +1,16 @@ +FROM ubuntu:xenial + +ENV DEBIAN_FRONTEND noninteractive + +RUN apt-get -y update +RUN apt-get -y install collectd curl python-pip + +# add a fake mtab for host disk stats +ADD etc_mtab /etc/mtab + +ADD collectd.conf.tpl /etc/collectd/collectd.conf.tpl + +RUN pip install envtpl +ADD start_container /usr/bin/start_container +RUN chmod +x /usr/bin/start_container +CMD start_container diff --git a/docker/blocks/collectd/README.md b/docker/blocks/collectd/README.md new file mode 100644 index 00000000000..2c1a8cb79fc --- /dev/null +++ b/docker/blocks/collectd/README.md @@ -0,0 +1,37 @@ +collectd-write-graphite +======================= + +Basic collectd-based server monitoring. Sends stats to Graphite. + +Collectd metrics: + +* CPU used/free/idle/etc +* Free disk (via mounting hosts '/' into container, eg: -v /:/hostfs:ro) +* Disk performance +* Load average +* Memory used/free/etc +* Uptime +* Network interface +* Swap + +Environment variables +--------------------- + +* `HOST_NAME` + - Will be sent to Graphite + - Required +* `GRAPHITE_HOST` + - Graphite IP or hostname + - Required +* `GRAPHITE_PORT` + - Graphite port + - Optional, defaults to 2003 +* `GRAPHITE_PREFIX` + - Graphite prefix + - Optional, defaults to collectd. +* `REPORT_BY_CPU` + - Report per-CPU metrics if true, global sum of CPU metrics if false (details: [collectd.conf man page](https://collectd.org/documentation/manpages/collectd.conf.5.shtml#plugin_cpu)) + - Optional, defaults to false. +* `COLLECT_INTERVAL` + - Collection interval and thus resolution of metrics + - Optional, defaults to 10 diff --git a/docker/blocks/collectd/collectd.conf.tpl b/docker/blocks/collectd/collectd.conf.tpl new file mode 100644 index 00000000000..c19654b39f9 --- /dev/null +++ b/docker/blocks/collectd/collectd.conf.tpl @@ -0,0 +1,76 @@ +Hostname "{{ HOST_NAME }}" + +FQDNLookup false +Interval {{ COLLECT_INTERVAL | default("10") }} +Timeout 2 +ReadThreads 5 + +LoadPlugin cpu +LoadPlugin df +LoadPlugin load +LoadPlugin memory +LoadPlugin disk +LoadPlugin interface +LoadPlugin uptime +LoadPlugin swap +LoadPlugin write_graphite + + + ReportByCpu {{ REPORT_BY_CPU | default("false") }} + + + + # expose host's mounts into container using -v /:/host:ro (location inside container does not matter much) + # ignore rootfs; else, the root file-system would appear twice, causing + # one of the updates to fail and spam the log + FSType rootfs + # ignore the usual virtual / temporary file-systems + FSType sysfs + FSType proc + FSType devtmpfs + FSType devpts + FSType tmpfs + FSType fusectl + FSType cgroup + FSType overlay + FSType debugfs + FSType pstore + FSType securityfs + FSType hugetlbfs + FSType squashfs + FSType mqueue + MountPoint "/etc/resolv.conf" + MountPoint "/etc/hostname" + MountPoint "/etc/hosts" + IgnoreSelected true + ReportByDevice false + ReportReserved true + ReportInodes true + + + + Disk "/^[hs]d[a-z]/" + IgnoreSelected false + + + + + Interface "lo" + Interface "/^veth.*/" + Interface "/^docker.*/" + IgnoreSelected true + + + + + + Host "{{ GRAPHITE_HOST }}" + Port "{{ GRAPHITE_PORT | default("2003") }}" + Prefix "{{ GRAPHITE_PREFIX | default("collectd.") }}" + EscapeCharacter "_" + SeparateInstances true + StoreRates true + AlwaysAppendDS false + + + diff --git a/docker/blocks/collectd/etc_mtab b/docker/blocks/collectd/etc_mtab new file mode 100644 index 00000000000..749f9789482 --- /dev/null +++ b/docker/blocks/collectd/etc_mtab @@ -0,0 +1 @@ +hostfs /.dockerinit ext4 ro,relatime,user_xattr,barrier=1,data=ordered 0 0 diff --git a/docker/blocks/collectd/fig b/docker/blocks/collectd/fig new file mode 100644 index 00000000000..99f45a66d12 --- /dev/null +++ b/docker/blocks/collectd/fig @@ -0,0 +1,11 @@ +collectd: + build: blocks/collectd + environment: + HOST_NAME: myserver + GRAPHITE_HOST: graphite + GRAPHITE_PORT: 2003 + GRAPHITE_PREFIX: collectd. + REPORT_BY_CPU: 'false' + COLLECT_INTERVAL: 10 + links: + - graphite diff --git a/docker/blocks/collectd/start_container b/docker/blocks/collectd/start_container new file mode 100644 index 00000000000..b01cd0d5ff2 --- /dev/null +++ b/docker/blocks/collectd/start_container @@ -0,0 +1,5 @@ +#!/bin/bash + +envtpl /etc/collectd/collectd.conf.tpl + +collectd -f From 1ea54049d07c4cc7959e20a6f9b6ffde24e670b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Sat, 28 May 2016 16:59:29 +0200 Subject: [PATCH 63/63] feat(templating): added new template variable type constant --- public/app/features/templating/editorCtrl.js | 20 +++++++++++++++++++ .../features/templating/partials/editor.html | 10 +++++++++- .../features/templating/templateValuesSrv.js | 8 +++++++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/public/app/features/templating/editorCtrl.js b/public/app/features/templating/editorCtrl.js index 43bda1db05f..5efebc21e30 100644 --- a/public/app/features/templating/editorCtrl.js +++ b/public/app/features/templating/editorCtrl.js @@ -25,6 +25,7 @@ function (angular, _) { {value: "interval", text: "Interval"}, {value: "datasource", text: "Data source"}, {value: "custom", text: "Custom"}, + {value: "constant", text: "Constant"}, ]; $scope.refreshOptions = [ @@ -141,15 +142,34 @@ function (angular, _) { $scope.current = angular.copy(replacementDefaults); }; + $scope.showSelectionOptions = function() { + if ($scope.current) { + if ($scope.current.type === 'query') { + return true; + } + if ($scope.current.type === 'custom') { + return true; + } + } + return false; + }; + $scope.typeChanged = function () { if ($scope.current.type === 'interval') { $scope.current.query = '1m,10m,30m,1h,6h,12h,1d,7d,14d,30d'; + $scope.current.refresh = 0; } if ($scope.current.type === 'query') { $scope.current.query = ''; } + if ($scope.current.type === 'constant') { + $scope.current.query = ''; + $scope.current.refresh = 0; + $scope.current.hide = 2; + } + if ($scope.current.type === 'datasource') { $scope.current.query = $scope.datasourceTypes[0].value; $scope.current.regex = ''; diff --git a/public/app/features/templating/partials/editor.html b/public/app/features/templating/partials/editor.html index fc387ff44cf..19f9c25715b 100644 --- a/public/app/features/templating/partials/editor.html +++ b/public/app/features/templating/partials/editor.html @@ -152,6 +152,14 @@
    +
    +
    Constant options
    +
    + Value + +
    +
    +
    Query Options
    @@ -214,7 +222,7 @@
  • -
    +
    Selection Options