Merge branch 'master' into development

This commit is contained in:
bergquist 2016-05-12 16:22:18 +02:00
commit 88b2f48493
27 changed files with 154 additions and 104 deletions

View File

@ -4,7 +4,12 @@
* **Singlestat**: Add support for range to text mappings, closes [#1319](https://github.com/grafana/grafana/issues/1319) * **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) * **Graph**: Adds sort order options for graph tooltip, closes [#1189](https://github.com/grafana/grafana/issues/1189)
# 3.0.0 stable (unreleased) # 3.0.2 Stable (unreleased)
* **Templating**: Fixed issue mixing row repeat and panel repeats, fixes [#4988](https://github.com/grafana/grafana/issues/4988)
* **Templating**: Fixed issue detecting dependencies in nested variables, fixes [#4987](https://github.com/grafana/grafana/issues/4987), fixes [#4986](https://github.com/grafana/grafana/issues/4986)
# 3.0.1 Stable (2016-05-11)
### Bug fixes ### Bug fixes
* **Templating**: Fixed issue with new data source variable not persisting current selected value, fixes [#4934](https://github.com/grafana/grafana/issues/4934) * **Templating**: Fixed issue with new data source variable not persisting current selected value, fixes [#4934](https://github.com/grafana/grafana/issues/4934)

View File

@ -16,6 +16,7 @@ Graphite, Elasticsearch, OpenTSDB, Prometheus and InfluxDB.
- [What's New in Grafana 2.0](http://docs.grafana.org/guides/whats-new-in-v2/) - [What's New in Grafana 2.0](http://docs.grafana.org/guides/whats-new-in-v2/)
- [What's New in Grafana 2.1](http://docs.grafana.org/guides/whats-new-in-v2-1/) - [What's New in Grafana 2.1](http://docs.grafana.org/guides/whats-new-in-v2-1/)
- [What's New in Grafana 2.5](http://docs.grafana.org/guides/whats-new-in-v2-5/) - [What's New in Grafana 2.5](http://docs.grafana.org/guides/whats-new-in-v2-5/)
- [What's New in Grafana 3.0](http://docs.grafana.org/guides/whats-new-in-v3/)
## Features ## Features
### Graphite Target Editor ### Graphite Target Editor
@ -78,7 +79,7 @@ the latest master builds [here](http://grafana.org/download/builds)
### Dependencies ### Dependencies
- Go 1.5 - Go 1.5
- NodeJS v0.12.0 - NodeJS v4+
- [Godep](https://github.com/tools/godep) - [Godep](https://github.com/tools/godep)
### Get Code ### Get Code
@ -109,7 +110,7 @@ go run build.go build
### Building frontend assets ### Building frontend assets
To build less to css for the frontend you will need a recent version of of **node (v0.12.0)**, To build less to css for the frontend you will need a recent version of of **node (v4+)**,
npm (v2.5.0) and grunt (v0.4.5). Run the following: npm (v2.5.0) and grunt (v0.4.5). Run the following:
```bash ```bash

View File

@ -132,12 +132,10 @@ func readVersionFromPackageJson() {
if len(parts) > 1 { if len(parts) > 1 {
linuxPackageVersion = parts[0] linuxPackageVersion = parts[0]
linuxPackageIteration = parts[1] linuxPackageIteration = parts[1]
if linuxPackageIteration != "" {
// add timestamp to iteration
linuxPackageIteration = fmt.Sprintf("%s%v", linuxPackageIteration, time.Now().Unix())
}
log.Println(fmt.Sprintf("Iteration %v", linuxPackageIteration))
} }
// add timestamp to iteration
linuxPackageIteration = fmt.Sprintf("%d%s", time.Now().Unix(), linuxPackageIteration)
} }
type linuxPackageOptions struct { type linuxPackageOptions struct {

View File

@ -39,12 +39,13 @@ entire experience right within Grafana.
<img src="/img/v3/grafana_net_tour.png"> <img src="/img/v3/grafana_net_tour.png">
A preview of [Grafana.net](http://grafana.net) is launching along with this release. We [Grafana.net](https://grafana.net) offers a central repository where the community can come together to discover, create and
think its the perfect compliment to Grafana. share plugins (data sources, panels, apps) and dashboards.
Grafana.net currently offers a central repository where the community We are also working on a hosted Graphite-compatible data source that will be optimized for use with Grafana.
can come together to discover and share plugins (Data Sources, Panels, Itll be easy to combine your existing data source(s) with this OpenSaaS option. Finally, Grafana.net can
Apps) and Dashboards for Grafana 3.0 and above. also be a hub to manage all your Grafana instances. Youll be able to monitor their health and availability,
perform dashboard backups, and more.
We are also working on a hosted Graphite-compatible Data Source that We are also working on a hosted Graphite-compatible Data Source that
will be optimized for use with Grafana. Itll be easy to combine your will be optimized for use with Grafana. Itll be easy to combine your
@ -65,7 +66,6 @@ Grafana 3.0 comes with a new command line tool called grafana-cli. You
can easily install plugins from Grafana.net with it. For can easily install plugins from Grafana.net with it. For
example: example:
``` ```
grafana-cli install grafana-pie-chart-panel grafana-cli install grafana-pie-chart-panel
``` ```
@ -188,6 +188,33 @@ you can still install manually from [Grafana.net](http://grafana.net)
* KairosDB: This data source has also no longer shipped with Grafana, * KairosDB: This data source has also no longer shipped with Grafana,
you can install it manually from [Grafana.net](http://grafana.net) you can install it manually from [Grafana.net](http://grafana.net)
## Plugin showcase
Discovering and installing plugins is very quick and easy with Grafana 3.0 and [Grafana.net](https://grafana.net). Here
are a couple that I incurage you try!
#### [Clock Panel](https://grafana.net/plugins/grafana-clock-panel)
Support's both current time and count down mode.
<img src="/img/v3/clock_panel.png">
#### [Pie Chart Panel](https://grafana.net/plugins/grafana-piechart-panel)
A simple pie chart panel is now available as an external plugin.
<img src="/img/v3/pie_chart_panel.png">
#### [WorldPing App](https://grafana.net/plugins/raintank-worldping-app)
This is full blown Grafana App that adds new panels, data sources and pages to give
feature rich global performance monitoring directly from your on-prem Grafana.
<img src="/img/v3/wP-Screenshot-dash-web.png">
#### [Zabbix App](https://grafana.net/plugins/alexanderzobnin-zabbix-app)
This app contains the already very pouplar Zabbix data source plugin, 2 dashboards and a triggers panel. It is
created and maintained by [Alexander Zobnin](https://github.com/alexanderzobnin/grafana-zabbix).
<img src="/img/v3/zabbix_app.png">
Checkout the full list of plugins on [Grafana.net](https://grafana.net/plugins)
## CHANGELOG ## CHANGELOG
For a detailed list and link to github issues for everything included For a detailed list and link to github issues for everything included

View File

@ -10,20 +10,13 @@ page_keywords: grafana, installation, debian, ubuntu, guide
Description | Download Description | Download
------------ | ------------- ------------ | -------------
Stable .deb for Debian-based Linux | [grafana_2.6.0_amd64.deb](https://grafanarel.s3.amazonaws.com/builds/grafana_2.6.0_amd64.deb) Stable .deb for Debian-based Linux | [grafana_3.0.1_amd64.deb](https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.1_amd64.deb)
Beta .deb for Debian-based Linux | [grafana_3.0.0-beta71462173753_amd64.deb](https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.0-beta71462173753_amd64.deb)
## Install Stable ## Install Stable
$ wget https://grafanarel.s3.amazonaws.com/builds/grafana_2.6.0_amd64.deb $ wget https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.1_amd64.deb
$ sudo apt-get install -y adduser libfontconfig $ sudo apt-get install -y adduser libfontconfig
$ sudo dpkg -i grafana_2.6.0_amd64.deb $ sudo dpkg -i grafana_3.0.1_amd64.deb
## Install 3.0 Beta
$ wget https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.0-beta71462173753_amd64.deb
$ sudo apt-get install -y adduser libfontconfig
$ sudo dpkg -i grafana_3.0.0-beta71462173753_amd64.deb
## APT Repository ## APT Repository

View File

@ -6,8 +6,33 @@ page_keywords: grafana, installation, mac, osx, guide
# Installing on Mac # Installing on Mac
There is currently no binary build for Mac, but Grafana will happily build on Mac. Read the [build from Installation can be done using [homebrew](http://brew.sh/)
source](/project/building_from_source) page for instructions on how to
build it yourself. Install latest stable:
```
brew install grafana/grafana/grafana
```
To start grafana look at the command printed after the homebrew install completes.
You can also add the grafana as tap.
```
brew tap grafana/grafana
brew install grafana
```
Install latest unstable from master:
```
brew install --HEAD grafana/grafana/grafana
```
To upgrade use the reinstall command
```
brew reinstall --HEAD grafana/grafana/grafana
```

View File

@ -10,43 +10,24 @@ page_keywords: grafana, installation, centos, fedora, opensuse, redhat, guide
Description | Download Description | Download
------------ | ------------- ------------ | -------------
Stable .RPM for CentOS / Fedora / OpenSuse / Redhat Linux | [grafana-2.6.0-1.x86_64.rpm](https://grafanarel.s3.amazonaws.com/builds/grafana-2.6.0-1.x86_64.rpm) Stable .RPM for CentOS / Fedora / OpenSuse / Redhat Linux | [grafana-3.0.1-1.x86_64.rpm](https://grafanarel.s3.amazonaws.com/builds/grafana-3.0.1-1.x86_64.rpm)
Beta .RPM for CentOS / Fedor / OpenSuse / Redhat Linux | [grafana-3.0.0-beta71462173753.x86_64.rpm](https://grafanarel.s3.amazonaws.com/builds/grafana-3.0.0-beta71462173753.x86_64.rpm)
## Install Stable Release from package file ## Install Stable Release from package file
You can install Grafana using Yum directly. You can install Grafana using Yum directly.
$ sudo yum install https://grafanarel.s3.amazonaws.com/builds/grafana-2.6.0-1.x86_64.rpm $ sudo yum install https://grafanarel.s3.amazonaws.com/builds/grafana-3.0.1-1.x86_64.rpm
Or install manually using `rpm`. Or install manually using `rpm`.
#### On CentOS / Fedora / Redhat: #### On CentOS / Fedora / Redhat:
$ sudo yum install initscripts fontconfig $ sudo yum install initscripts fontconfig
$ sudo rpm -Uvh grafana-2.6.0-1.x86_64.rpm $ sudo rpm -Uvh grafana-3.0.1-1.x86_64.rpm
#### On OpenSuse: #### On OpenSuse:
$ sudo rpm -i --nodeps grafana-2.6.0-1.x86_64.rpm $ sudo rpm -i --nodeps grafana-3.0.1-1.x86_64.rpm
## Install Beta Release from package file
You can install Grafana using Yum directly.
$ sudo yum install https://grafanarel.s3.amazonaws.com/builds/grafana-3.0.0-beta71462173753.x86_64.rpm
Or install manually using `rpm`.
#### On CentOS / Fedora / Redhat:
$ sudo yum install initscripts fontconfig
$ sudo rpm -Uvh grafana-3.0.0-beta71462173753.x86_64.rpm
#### On OpenSuse:
$ sudo rpm -i --nodeps grafana-3.0.0-beta71462173753.x86_64.rpm
## Install via YUM Repository ## Install via YUM Repository

View File

@ -26,7 +26,7 @@ module.exports = function(config) {
browsers: ['PhantomJS'], browsers: ['PhantomJS'],
captureTimeout: 20000, captureTimeout: 20000,
singleRun: true, singleRun: true,
autoWatchBatchDelay: 10000, autoWatchBatchDelay: 1000,
browserNoActivityTimeout: 60000, browserNoActivityTimeout: 60000,
}); });

View File

@ -1,4 +1,4 @@
{ {
"stable": "2.6.0", "stable": "3.0.1",
"testing": "3.0.0-beta7" "testing": "3.0.1"
} }

View File

@ -4,7 +4,7 @@
"company": "Coding Instinct AB" "company": "Coding Instinct AB"
}, },
"name": "grafana", "name": "grafana",
"version": "3.0.0-beta7", "version": "3.0.2",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "http://github.com/grafana/grafana.git" "url": "http://github.com/grafana/grafana.git"

View File

@ -14,6 +14,6 @@ CONF_DIR=/etc/grafana
CONF_FILE=/etc/grafana/grafana.ini CONF_FILE=/etc/grafana/grafana.ini
RESTART_ON_UPGRADE=false RESTART_ON_UPGRADE=true
PLUGINS_DIR=/var/lib/grafana/plugins PLUGINS_DIR=/var/lib/grafana/plugins

View File

@ -1,7 +1,7 @@
#! /usr/bin/env bash #! /usr/bin/env bash
deb_ver=3.0.0-beta51460725904 deb_ver=3.0.1
rpm_ver=3.0.0-beta51460725904 rpm_ver=3.0.1-1
#rpm_ver=3.0.0-1 #rpm_ver=3.0.0-1
@ -16,7 +16,7 @@ rpm_ver=3.0.0-beta51460725904
#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/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/7 grafana-${rpm_ver}.x86_64.rpm
# package_cloud push grafana/stable/el/7 grafana-${version}-1.x86_64.rpm package_cloud push grafana/stable/el/7 grafana-${rpm_ver}.x86_64.rpm
# package_cloud push grafana/stable/el/6 grafana-${version}-1.x86_64.rpm package_cloud push grafana/stable/el/6 grafana-${rpm_ver}.x86_64.rpm

View File

@ -14,6 +14,6 @@ CONF_DIR=/etc/grafana
CONF_FILE=/etc/grafana/grafana.ini CONF_FILE=/etc/grafana/grafana.ini
RESTART_ON_UPGRADE=false RESTART_ON_UPGRADE=true
PLUGINS_DIR=/var/lib/grafana/plugins PLUGINS_DIR=/var/lib/grafana/plugins

View File

@ -1,6 +1,8 @@
package commands package commands
import ( import (
"github.com/fatih/color"
"github.com/grafana/grafana/pkg/cmd/grafana-cli/log"
s "github.com/grafana/grafana/pkg/cmd/grafana-cli/services" s "github.com/grafana/grafana/pkg/cmd/grafana-cli/services"
) )
@ -14,20 +16,17 @@ func upgradeCommand(c CommandLine) error {
return err return err
} }
remotePlugins, err2 := s.ListAllPlugins(c.GlobalString("repo")) v, err2 := s.GetPlugin(localPlugin.Id, c.GlobalString("repo"))
if err2 != nil { if err2 != nil {
return err2 return err2
} }
for _, v := range remotePlugins.Plugins { if ShouldUpgrade(localPlugin.Info.Version, v) {
if localPlugin.Id == v.Id { s.RemoveInstalledPlugin(pluginsDir, pluginName)
if ShouldUpgrade(localPlugin.Info.Version, v) { return InstallPlugin(localPlugin.Id, "", c)
s.RemoveInstalledPlugin(pluginsDir, pluginName)
return InstallPlugin(localPlugin.Id, "", c)
}
}
} }
log.Infof("%s %s is up to date \n", color.GreenString("✔"), localPlugin.Id)
return nil return nil
} }

View File

@ -44,7 +44,7 @@ func ReadPlugin(pluginDir, pluginName string) (m.InstalledPlugin, error) {
} }
if res.Id == "" { if res.Id == "" {
return m.InstalledPlugin{}, errors.New("could not read find plugin " + pluginName) return m.InstalledPlugin{}, errors.New("could not find plugin " + pluginName + " in " + pluginDir)
} }
return res, nil return res, nil
@ -69,13 +69,21 @@ func RemoveInstalledPlugin(pluginPath, id string) error {
} }
func GetPlugin(pluginId, repoUrl string) (m.Plugin, error) { func GetPlugin(pluginId, repoUrl string) (m.Plugin, error) {
resp, _ := ListAllPlugins(repoUrl) fullUrl := repoUrl + "/repo/" + pluginId
for _, i := range resp.Plugins { res, err := goreq.Request{Uri: fullUrl, MaxRedirects: 3}.Do()
if i.Id == pluginId { if err != nil {
return i, nil return m.Plugin{}, err
} }
if res.StatusCode != 200 {
return m.Plugin{}, fmt.Errorf("Could not access %s statuscode %v", fullUrl, res.StatusCode)
} }
return m.Plugin{}, errors.New("could not find plugin named \"" + pluginId + "\"") var resp m.Plugin
err = res.Body.FromJsonTo(&resp)
if err != nil {
return m.Plugin{}, errors.New("Could not load plugin data")
}
return resp, nil
} }

View File

@ -91,14 +91,14 @@ func checkForUpdates() {
resp2, err := client.Get("https://raw.githubusercontent.com/grafana/grafana/master/latest.json") resp2, err := client.Get("https://raw.githubusercontent.com/grafana/grafana/master/latest.json")
if err != nil { if err != nil {
log.Trace("Failed to get lates.json repo from github: %v", err.Error()) log.Trace("Failed to get latest.json repo from github: %v", err.Error())
return return
} }
defer resp2.Body.Close() defer resp2.Body.Close()
body, err = ioutil.ReadAll(resp2.Body) body, err = ioutil.ReadAll(resp2.Body)
if err != nil { if err != nil {
log.Trace("Update check failed, reading response from github.net, %v", err.Error()) log.Trace("Update check failed, reading response from github.com, %v", err.Error())
return return
} }

View File

@ -52,6 +52,8 @@ function (angular, _) {
else if (panel.repeatPanelId && panel.repeatIteration !== this.iteration) { else if (panel.repeatPanelId && panel.repeatIteration !== this.iteration) {
row.panels = _.without(row.panels, panel); row.panels = _.without(row.panels, panel);
j = j - 1; j = j - 1;
} else if (row.repeat || row.repeatRowId) {
continue;
} else if (!_.isEmpty(panel.scopedVars) && panel.repeatIteration !== this.iteration) { } else if (!_.isEmpty(panel.scopedVars) && panel.repeatIteration !== this.iteration) {
panel.scopedVars = {}; panel.scopedVars = {};
} }
@ -118,7 +120,6 @@ function (angular, _) {
panel = copy.panels[i]; panel = copy.panels[i];
panel.scopedVars = {}; panel.scopedVars = {};
panel.scopedVars[variable.name] = option; panel.scopedVars[variable.name] = option;
panel.repeatIteration = this.iteration;
} }
}, this); }, this);
}; };

View File

@ -97,7 +97,8 @@ function (angular, _) {
if (!str) { if (!str) {
return false; return false;
} }
return str.indexOf('$' + variableName) !== -1 || str.indexOf('[[' + variableName + ']]') !== -1; var match = this._regex.exec(str);
return match && (match[1] === variableName || match[2] === variableName);
}; };
this.highlightVariablesAsHtml = function(str) { this.highlightVariablesAsHtml = function(str) {

View File

@ -204,7 +204,7 @@ function (angular, _, kbn) {
} }
if (options.length === 0) { if (options.length === 0) {
options.push({text: 'No datasurces found', value: ''}); options.push({text: 'No data sources found', value: ''});
} }
variable.options = options; variable.options = options;

View File

@ -30,7 +30,7 @@
<div class="gf-form-inline" ng-repeat="selectParts in ctrl.queryModel.selectModels"> <div class="gf-form-inline" ng-repeat="selectParts in ctrl.queryModel.selectModels">
<div class="gf-form"> <div class="gf-form">
<label class="gf-form-label query-keyword width-7"> <label class="gf-form-label query-keyword width-7">
<span ng-show="$index === 0">SELECT</span> <span ng-show="$index === 0">SELECT</span>&nbsp;
</label> </label>
</div> </div>

Binary file not shown.

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Binary file not shown.

View File

@ -1,10 +1,10 @@
@font-face { @font-face {
font-family: 'grafana-icons'; font-family: 'grafana-icons';
src: url('../fonts/grafana-icons.eot?h6rv8b'); src: url('../fonts/grafana-icons.eot?okx5td');
src: url('../fonts/grafana-icons.eot?h6rv8b#iefix') format('embedded-opentype'), src: url('../fonts/grafana-icons.eot?okx5td#iefix') format('embedded-opentype'),
url('../fonts/grafana-icons.ttf?h6rv8b') format('truetype'), url('../fonts/grafana-icons.ttf?okx5td') format('truetype'),
url('../fonts/grafana-icons.woff?h6rv8b') format('woff'), url('../fonts/grafana-icons.woff?okx5td') format('woff'),
url('../fonts/grafana-icons.svg?h6rv8b#grafana-icons') format('svg'); url('../fonts/grafana-icons.svg?okx5td#grafana-icons') format('svg');
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
} }
@ -61,6 +61,9 @@
.icon-gf-endpoint:before { .icon-gf-endpoint:before {
content: "\e609"; content: "\e609";
} }
.icon-gf-page:before {
content: "\e908";
}
.icon-gf-filter:before { .icon-gf-filter:before {
content: "\e60a"; content: "\e60a";
} }
@ -112,9 +115,6 @@
.icon-gf-save:before { .icon-gf-save:before {
content: "\e614"; content: "\e614";
} }
.icon-gf-settings:before {
content: "\e615";
}
.icon-gf-share:before { .icon-gf-share:before {
content: "\e616"; content: "\e616";
} }
@ -124,10 +124,13 @@
.icon-gf-search:before { .icon-gf-search:before {
content: "\e618"; content: "\e618";
} }
.icon-gf-tag-add:before { .icon-gf-settings:before {
content: "\e615";
}
.icon-gf-add:before {
content: "\e619"; content: "\e619";
} }
.icon-gf-tag-remove:before { .icon-gf-remove:before {
content: "\e61a"; content: "\e61a";
} }
.icon-gf-video:before { .icon-gf-video:before {
@ -169,6 +172,12 @@
.icon-gf-scale:before { .icon-gf-scale:before {
content: "\e906"; content: "\e906";
} }
.icon-gf-pending:before {
content: "\e909";
}
.icon-gf-verified:before {
content: "\e90a";
}
.icon-gf-worldping:before { .icon-gf-worldping:before {
content: "\e627"; content: "\e627";
} }
@ -176,10 +185,3 @@
content: "\e903"; content: "\e903";
} }
.icon-gf-app:before {
content: "\e902";
}
.icon-gf-datasource:before {
content: "\e607";
}

View File

@ -167,6 +167,7 @@ define([
it('should generate a repeartRowId based on repeat row index', function() { it('should generate a repeartRowId based on repeat row index', function() {
expect(ctx.rows[1].repeatRowId).to.be(1); expect(ctx.rows[1].repeatRowId).to.be(1);
expect(ctx.rows[1].repeatIteration).to.be(ctx.dynamicDashboardSrv.iteration);
}); });
it('should set scopedVars on row panels', function() { it('should set scopedVars on row panels', function() {

View File

@ -190,6 +190,11 @@ define([
expect(contains).to.be(true); expect(contains).to.be(true);
}); });
it('should not find it if only part matches with $var syntax', function() {
var contains = _templateSrv.containsVariable('this.$ServerDomain.filters', 'Server');
expect(contains).to.be(false);
});
it('should find it with [[var]] syntax', function() { it('should find it with [[var]] syntax', function() {
var contains = _templateSrv.containsVariable('this.[[test]].filters', 'test'); var contains = _templateSrv.containsVariable('this.[[test]].filters', 'test');
expect(contains).to.be(true); expect(contains).to.be(true);