Bläddra i källkod

Merge branch 'master' into alerting

Conflicts:
	conf/sample.ini
Torkel Ödegaard 9 år sedan
förälder
incheckning
05697d5ecd

+ 2 - 1
CHANGELOG.md

@@ -10,7 +10,8 @@
 # 3.1.2 (unreleased)
 * **Templating**: Fixed issue when combining row & panel repeats, fixes [#5790](https://github.com/grafana/grafana/issues/5790)
 * **Drag&Drop**: Fixed issue with drag and drop in latest Chrome(51+), fixes [#5767](https://github.com/grafana/grafana/issues/5767)
-* **Internal Metrics**: Fixed issue with dots in instance_name when sending internal metrics to Graphitge, fixes [#5739](https://github.com/grafana/grafana/issues/5739)
+* **Internal Metrics**: Fixed issue with dots in instance_name when sending internal metrics to Graphite, fixes [#5739](https://github.com/grafana/grafana/issues/5739)
+* **Grafana-CLI**: Add default plugin path for MAC OS, fixes [#5806](https://github.com/grafana/grafana/issues/5806)
 
 # 3.1.1 (2016-08-01)
 * **IFrame embedding**: Fixed issue of using full iframe height, fixes [#5605](https://github.com/grafana/grafana/issues/5606)

+ 5 - 4
conf/defaults.ini

@@ -373,12 +373,13 @@ enabled = false
 # Metrics available at HTTP API Url /api/metrics
 [metrics]
 enabled           = true
-interval_seconds  = 60
+interval_seconds  = 10
 
 # Send internal Grafana metrics to graphite
-; [metrics.graphite]
-; address = localhost:2003
-; prefix = service.grafana.%(instance_name)s.
+[metrics.graphite]
+# Enable by setting the address setting (ex localhost:2003)
+address =
+prefix = prod.grafana.%(instance_name)s.
 
 [grafana_net]
 url = https://grafana.net

+ 13 - 12
conf/sample.ini

@@ -298,33 +298,34 @@ check_for_updates = true
 # Metrics available at HTTP API Url /api/metrics
 [metrics]
 # Disable / Enable internal metrics
-enabled           = true
+;enabled           = true
 
 # Publish interval
 ;interval_seconds  = 10
 
 # Send internal metrics to Graphite
-; [metrics.graphite]
-; address = localhost:2003
-; prefix = service.grafana.%(instance_name)s.
+[metrics.graphite]
+# Enable by setting the address setting (ex localhost:2003)
+;address =
+;prefix = prod.grafana.%(instance_name)s.
 
 #################################### Internal Grafana Metrics ##########################
 # Url used to to import dashboards directly from Grafana.net
 [grafana_net]
-url = https://grafana.net
+;url = https://grafana.net
 
 #################################### External image storage ##########################
 [external_image_storage]
 # Used for uploading images to public servers so they can be included in slack/email messages.
 # you can choose between (s3, webdav or internal)
-provider = s3
+;provider = s3
 
 [external_image_storage.s3]
-bucket_url =
-access_key =
-secret_key =
+;bucket_url =
+;access_key =
+;secret_key =
 
 [external_image_storage.webdav]
-url =
-username =
-password =
+;url =
+;username =
+;password =

+ 1 - 0
docker/blocks/postgres/fig

@@ -3,5 +3,6 @@ postgrestest:
   environment:
     POSTGRES_USER: grafana
     POSTGRES_PASSWORD: password
+    POSTGRES_DATABASE: grafana
   ports:
     - "5432:5432"

+ 1 - 1
docs/sources/installation/configuration.md

@@ -466,7 +466,7 @@ Enable metrics reporting. defaults true. Available via HTTP API `/api/metrics`.
 
 ### interval_seconds
 
-Flush/Write interval when sending metrics to external TSDB. Defaults to 60s.
+Flush/Write interval when sending metrics to external TSDB. Defaults to 10s.
 
 ## [metrics.graphite]
 Include this section if you want to send internal Grafana metrics to Graphite.

+ 2 - 30
pkg/cmd/grafana-cli/main.go

@@ -8,39 +8,11 @@ import (
 	"github.com/codegangsta/cli"
 	"github.com/grafana/grafana/pkg/cmd/grafana-cli/commands"
 	"github.com/grafana/grafana/pkg/cmd/grafana-cli/logger"
+	"github.com/grafana/grafana/pkg/cmd/grafana-cli/utils"
 )
 
 var version = "master"
 
-func getGrafanaPluginDir() string {
-	currentOS := runtime.GOOS
-	defaultNix := "/var/lib/grafana/plugins"
-
-	if currentOS == "windows" {
-		return "../data/plugins"
-	}
-
-	pwd, err := os.Getwd()
-
-	if err != nil {
-		logger.Error("Could not get current path. using default")
-		return defaultNix
-	}
-
-	if isDevenvironment(pwd) {
-		return "../data/plugins"
-	}
-
-	return defaultNix
-}
-
-func isDevenvironment(pwd string) bool {
-	// if ../conf/defaults.ini exists, grafana is not installed as package
-	// that its in development environment.
-	_, err := os.Stat("../conf/defaults.ini")
-	return err == nil
-}
-
 func main() {
 	setupLogging()
 
@@ -54,7 +26,7 @@ func main() {
 		cli.StringFlag{
 			Name:   "pluginsDir",
 			Usage:  "path to the grafana plugin directory",
-			Value:  getGrafanaPluginDir(),
+			Value:  utils.GetGrafanaPluginDir(runtime.GOOS),
 			EnvVar: "GF_PLUGIN_DIR",
 		},
 		cli.StringFlag{

+ 46 - 0
pkg/cmd/grafana-cli/utils/grafana_path.go

@@ -0,0 +1,46 @@
+package utils
+
+import (
+	"os"
+
+	"github.com/grafana/grafana/pkg/cmd/grafana-cli/logger"
+)
+
+func GetGrafanaPluginDir(currentOS string) string {
+	//currentOS := runtime.GOOS
+
+	if currentOS == "windows" {
+		return returnOsDefault(currentOS)
+	}
+
+	pwd, err := os.Getwd()
+
+	if err != nil {
+		logger.Error("Could not get current path. using default")
+		return returnOsDefault(currentOS)
+	}
+
+	if isDevenvironment(pwd) {
+		return "../data/plugins"
+	}
+
+	return returnOsDefault(currentOS)
+}
+
+func isDevenvironment(pwd string) bool {
+	// if ../conf/defaults.ini exists, grafana is not installed as package
+	// that its in development environment.
+	_, err := os.Stat("../conf/defaults.ini")
+	return err == nil
+}
+
+func returnOsDefault(currentOs string) string {
+	switch currentOs {
+	case "windows":
+		return "../data/plugins"
+	case "darwin":
+		return "/usr/local/var/lib/grafana/plugins"
+	default: //"linux"
+		return "/var/lib/grafana/plugins"
+	}
+}

+ 8 - 3
pkg/metrics/graphite.go

@@ -24,20 +24,25 @@ func CreateGraphitePublisher() (*GraphitePublisher, error) {
 		return nil, nil
 	}
 
+	address := graphiteSection.Key("address").String()
+	if address == "" {
+		return nil, nil
+	}
+
 	publisher := &GraphitePublisher{}
 	publisher.prevCounts = make(map[string]int64)
 	publisher.protocol = "tcp"
-	publisher.address = graphiteSection.Key("address").MustString("localhost:2003")
+	publisher.prefix = graphiteSection.Key("prefix").MustString("prod.grafana.%(instance_name)s")
+	publisher.address = address
 
 	safeInstanceName := strings.Replace(setting.InstanceName, ".", "_", -1)
 	prefix := graphiteSection.Key("prefix").Value()
 
 	if prefix == "" {
-		prefix = "service.grafana.%(instance_name)s."
+		prefix = "prod.grafana.%(instance_name)s."
 	}
 
 	publisher.prefix = strings.Replace(prefix, "%(instance_name)s", safeInstanceName, -1)
-
 	return publisher, nil
 }
 

+ 26 - 6
pkg/metrics/graphite_test.go

@@ -19,7 +19,7 @@ func TestGraphitePublisher(t *testing.T) {
 		So(err, ShouldBeNil)
 
 		sec, err := setting.Cfg.NewSection("metrics.graphite")
-		sec.NewKey("prefix", "service.grafana.%(instance_name)s.")
+		sec.NewKey("prefix", "prod.grafana.%(instance_name)s.")
 		sec.NewKey("address", "localhost:2001")
 
 		So(err, ShouldBeNil)
@@ -30,11 +30,11 @@ func TestGraphitePublisher(t *testing.T) {
 		So(err, ShouldBeNil)
 		So(publisher, ShouldNotBeNil)
 
-		So(publisher.prefix, ShouldEqual, "service.grafana.hostname_with_dots_com.")
+		So(publisher.prefix, ShouldEqual, "prod.grafana.hostname_with_dots_com.")
 		So(publisher.address, ShouldEqual, "localhost:2001")
 	})
 
-	Convey("Test graphite publisher default values", t, func() {
+	Convey("Test graphite publisher default prefix", t, func() {
 		var err error
 		err = setting.NewConfigContext(&setting.CommandLineArgs{
 			HomePath: "../../",
@@ -42,7 +42,10 @@ func TestGraphitePublisher(t *testing.T) {
 
 		So(err, ShouldBeNil)
 
-		_, err = setting.Cfg.NewSection("metrics.graphite")
+		sec, err := setting.Cfg.NewSection("metrics.graphite")
+		sec.NewKey("address", "localhost:2001")
+
+		So(err, ShouldBeNil)
 
 		setting.InstanceName = "hostname.with.dots.com"
 		publisher, err := CreateGraphitePublisher()
@@ -50,7 +53,24 @@ func TestGraphitePublisher(t *testing.T) {
 		So(err, ShouldBeNil)
 		So(publisher, ShouldNotBeNil)
 
-		So(publisher.prefix, ShouldEqual, "service.grafana.hostname_with_dots_com.")
-		So(publisher.address, ShouldEqual, "localhost:2003")
+		So(publisher.prefix, ShouldEqual, "prod.grafana.hostname_with_dots_com.")
+		So(publisher.address, ShouldEqual, "localhost:2001")
+	})
+
+	Convey("Test graphite publisher default values", t, func() {
+		var err error
+		err = setting.NewConfigContext(&setting.CommandLineArgs{
+			HomePath: "../../",
+		})
+
+		So(err, ShouldBeNil)
+
+		_, err = setting.Cfg.NewSection("metrics.graphite")
+
+		setting.InstanceName = "hostname.with.dots.com"
+		publisher, err := CreateGraphitePublisher()
+
+		So(err, ShouldBeNil)
+		So(publisher, ShouldBeNil)
 	})
 }

+ 6 - 2
public/app/core/controllers/inspect_ctrl.js

@@ -7,7 +7,7 @@ define([
 function (angular, _, $, coreModule) {
   'use strict';
 
-  coreModule.default.controller('InspectCtrl', function($scope) {
+  coreModule.default.controller('InspectCtrl', function($scope, $sanitize) {
     var model = $scope.inspector;
 
     function getParametersFromQueryString(queryString) {
@@ -32,7 +32,11 @@ function (angular, _, $, coreModule) {
       if (_.isString(model.error.data)) {
         $scope.response = $("<div>" + model.error.data + "</div>").text();
       } else if (model.error.data) {
-        $scope.response = angular.toJson(model.error.data, true);
+        if (model.error.data.response) {
+          $scope.response = $sanitize(model.error.data.response);
+        } else {
+          $scope.response = angular.toJson(model.error.data, true);
+        }
       } else if (model.error.message) {
         $scope.message = model.error.message;
       }

+ 2 - 1
public/app/core/services/backend_srv.ts

@@ -138,7 +138,8 @@ export class BackendSrv {
       //populate error obj on Internal Error
       if (_.isString(err.data) && err.status === 500) {
         err.data = {
-          error: err.statusText
+          error: err.statusText,
+          response: err.data,
         };
       }
 

+ 2 - 2
public/app/plugins/datasource/influxdb/partials/config.html

@@ -14,11 +14,11 @@
 	<div class="gf-form-inline">
 		<div class="gf-form max-width-15">
 			<span class="gf-form-label width-7">User</span>
-			<input type="text" class="gf-form-input" ng-model='ctrl.current.user' placeholder="" required></input>
+			<input type="text" class="gf-form-input" ng-model='ctrl.current.user' placeholder=""></input>
 		</div>
 		<div class="gf-form max-width-15">
 			<span class="gf-form-label width-7">Password</span>
-			<input type="password" class="gf-form-input" ng-model='ctrl.current.password' placeholder="" required></input>
+			<input type="password" class="gf-form-input" ng-model='ctrl.current.password' placeholder=""></input>
 		</div>
 	</div>
 </div>

+ 0 - 5
public/app/plugins/datasource/opentsdb/datasource.js

@@ -129,11 +129,6 @@ function (angular, _, dateMath) {
       };
 
       this._addCredentialOptions(options);
-
-      // In case the backend is 3rd-party hosted and does not suport OPTIONS, urlencoded requests
-      // go as POST rather than OPTIONS+POST
-      options.headers = { 'Content-Type': 'application/x-www-form-urlencoded' };
-
       return backendSrv.datasourceRequest(options);
     };
 

+ 5 - 2
public/app/plugins/panel/graph/graph.js

@@ -258,11 +258,14 @@ function (angular, $, moment, _, kbn, GraphTooltip, thresholdManExports) {
           function callPlot(incrementRenderCounter) {
             try {
               $.plot(elem, sortedSeries, options);
-              delete ctrl.error;
-              delete ctrl.inspector;
+              if (ctrl.renderError) {
+                delete ctrl.error;
+                delete ctrl.inspector;
+              }
             } catch (e) {
               console.log('flotcharts error', e);
               ctrl.error = e.message || "Render Error";
+              ctrl.renderError = true;
               ctrl.inspector = {error: ctrl.error};
             }