Prechádzať zdrojové kódy

Merge branch 'support_aws_profiles' of https://github.com/peekeri/grafana into peekeri-support_aws_profiles

Torkel Ödegaard 10 rokov pred
rodič
commit
135ba68ff5

+ 27 - 6
pkg/api/cloudwatch/cloudwatch.go

@@ -7,6 +7,8 @@ import (
 	"time"
 
 	"github.com/aws/aws-sdk-go/aws"
+	"github.com/aws/aws-sdk-go/aws/credentials"
+	"github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds"
 	"github.com/aws/aws-sdk-go/service/cloudwatch"
 	"github.com/aws/aws-sdk-go/service/ec2"
 	"github.com/grafana/grafana/pkg/middleware"
@@ -17,9 +19,10 @@ type actionHandler func(*cwRequest, *middleware.Context)
 var actionHandlers map[string]actionHandler
 
 type cwRequest struct {
-	Region string `json:"region"`
-	Action string `json:"action"`
-	Body   []byte `json:"-"`
+	Region  string `json:"region"`
+	Profile string `json:"profile"`
+	Action  string `json:"action"`
+	Body    []byte `json:"-"`
 }
 
 func init() {
@@ -35,7 +38,16 @@ func init() {
 }
 
 func handleGetMetricStatistics(req *cwRequest, c *middleware.Context) {
-	svc := cloudwatch.New(&aws.Config{Region: aws.String(req.Region)})
+	creds := credentials.NewChainCredentials(
+		[]credentials.Provider{
+			&credentials.EnvProvider{},
+			&credentials.SharedCredentialsProvider{Filename: "", Profile: req.Profile},
+			&ec2rolecreds.EC2RoleProvider{ExpiryWindow: 5 * time.Minute},
+		})
+	svc := cloudwatch.New(&aws.Config{
+		Region:      aws.String(req.Region),
+		Credentials: creds,
+	})
 
 	reqParam := &struct {
 		Parameters struct {
@@ -70,7 +82,17 @@ func handleGetMetricStatistics(req *cwRequest, c *middleware.Context) {
 }
 
 func handleListMetrics(req *cwRequest, c *middleware.Context) {
-	svc := cloudwatch.New(&aws.Config{Region: aws.String(req.Region)})
+	creds := credentials.NewChainCredentials(
+		[]credentials.Provider{
+			&credentials.EnvProvider{},
+			&credentials.SharedCredentialsProvider{Filename: "", Profile: req.Profile},
+			&ec2rolecreds.EC2RoleProvider{ExpiryWindow: 5 * time.Minute},
+		})
+	svc := cloudwatch.New(&aws.Config{
+		Region:      aws.String(req.Region),
+		Credentials: creds,
+	})
+
 	reqParam := &struct {
 		Parameters struct {
 			Namespace  string                        `json:"namespace"`
@@ -78,7 +100,6 @@ func handleListMetrics(req *cwRequest, c *middleware.Context) {
 			Dimensions []*cloudwatch.DimensionFilter `json:"dimensions"`
 		} `json:"parameters"`
 	}{}
-
 	json.Unmarshal(req.Body, reqParam)
 
 	params := &cloudwatch.ListMetricsInput{

+ 3 - 0
public/app/plugins/datasource/cloudwatch/datasource.js

@@ -18,6 +18,7 @@ function (angular, _) {
       this.supportMetrics = true;
       this.proxyUrl = datasource.url;
       this.defaultRegion = datasource.jsonData.defaultRegion;
+      this.profile = datasource.jsonData.profile;
     }
 
     CloudWatchDatasource.prototype.query = function(options) {
@@ -73,6 +74,7 @@ function (angular, _) {
     CloudWatchDatasource.prototype.performTimeSeriesQuery = function(query, start, end) {
       return this.awsRequest({
         region: query.region,
+        profile: this.profile,
         action: 'GetMetricStatistics',
         parameters:  {
           namespace: query.namespace,
@@ -115,6 +117,7 @@ function (angular, _) {
     CloudWatchDatasource.prototype.getDimensionValues = function(region, namespace, metricName, dimensions) {
       var request = {
         region: templateSrv.replace(region),
+        profile: this.profile,
         action: 'ListMetrics',
         parameters: {
           namespace: templateSrv.replace(namespace),

+ 11 - 0
public/app/plugins/datasource/cloudwatch/partials/config.html

@@ -12,6 +12,17 @@
   </ul>
   <div class="clearfix"></div>
 </div>
+<div class="tight-form last">
+  <ul class="tight-form-list">
+    <li class="tight-form-item" style="width: 160px">
+      AWS Profile
+    </li>
+    <li>
+      <input type="text" class="tight-form-input input-xlarge" ng-model='current.jsonData.profile' placeholder="default" required></input>
+    </li>
+  </ul>
+  <div class="clearfix"></div>
+</div>
 
 <!-- <div class="tight&#45;form" ng&#45;show="current.jsonData.access === 'direct'"> -->
 <!--   <ul class="tight&#45;form&#45;list"> -->