mirror of https://github.com/grafana/grafana
parent
1c6b7203cc
commit
00f76ecaf6
@ -0,0 +1,107 @@ |
||||
package api |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"errors" |
||||
"fmt" |
||||
"io/ioutil" |
||||
"time" |
||||
|
||||
"github.com/aws/aws-sdk-go/aws" |
||||
"github.com/aws/aws-sdk-go/service/cloudwatch" |
||||
"github.com/grafana/grafana/pkg/middleware" |
||||
) |
||||
|
||||
func ProxyCloudWatchDataSourceRequest(c *middleware.Context) { |
||||
body, _ := ioutil.ReadAll(c.Req.Request.Body) |
||||
|
||||
reqInfo := &struct { |
||||
Region string `json:"region"` |
||||
Service string `json:"service"` |
||||
Action string `json:"action"` |
||||
}{} |
||||
json.Unmarshal([]byte(body), reqInfo) |
||||
|
||||
svc := cloudwatch.New(&aws.Config{Region: aws.String(reqInfo.Region)}) |
||||
|
||||
switch reqInfo.Action { |
||||
case "GetMetricStatistics": |
||||
reqParam := &struct { |
||||
Parameters struct { |
||||
Namespace string `json:"Namespace"` |
||||
MetricName string `json:"MetricName"` |
||||
Dimensions []map[string]string `json:"Dimensions"` |
||||
Statistics []string `json:"Statistics"` |
||||
StartTime int64 `json:"StartTime"` |
||||
EndTime int64 `json:"EndTime"` |
||||
Period int64 `json:"Period"` |
||||
} `json:"parameters"` |
||||
}{} |
||||
json.Unmarshal([]byte(body), reqParam) |
||||
|
||||
statistics := make([]*string, 0) |
||||
for k := range reqParam.Parameters.Statistics { |
||||
statistics = append(statistics, &reqParam.Parameters.Statistics[k]) |
||||
} |
||||
dimensions := make([]*cloudwatch.Dimension, 0) |
||||
for _, d := range reqParam.Parameters.Dimensions { |
||||
dimensions = append(dimensions, &cloudwatch.Dimension{ |
||||
Name: aws.String(d["Name"]), |
||||
Value: aws.String(d["Value"]), |
||||
}) |
||||
} |
||||
|
||||
params := &cloudwatch.GetMetricStatisticsInput{ |
||||
Namespace: aws.String(reqParam.Parameters.Namespace), |
||||
MetricName: aws.String(reqParam.Parameters.MetricName), |
||||
Dimensions: dimensions, |
||||
Statistics: statistics, |
||||
StartTime: aws.Time(time.Unix(reqParam.Parameters.StartTime, 0)), |
||||
EndTime: aws.Time(time.Unix(reqParam.Parameters.EndTime, 0)), |
||||
Period: aws.Int64(reqParam.Parameters.Period), |
||||
} |
||||
|
||||
resp, err := svc.GetMetricStatistics(params) |
||||
if err != nil { |
||||
c.JsonApiErr(500, "Unable to call AWS API", err) |
||||
return |
||||
} |
||||
|
||||
respJson, _ := json.Marshal(resp) |
||||
fmt.Fprint(c.RW(), string(respJson)) |
||||
case "ListMetrics": |
||||
reqParam := &struct { |
||||
Parameters struct { |
||||
Namespace string `json:"Namespace"` |
||||
MetricName string `json:"MetricName"` |
||||
Dimensions []map[string]string `json:"Dimensions"` |
||||
} `json:"parameters"` |
||||
}{} |
||||
json.Unmarshal([]byte(body), reqParam) |
||||
|
||||
dimensions := make([]*cloudwatch.DimensionFilter, 0) |
||||
for _, d := range reqParam.Parameters.Dimensions { |
||||
dimensions = append(dimensions, &cloudwatch.DimensionFilter{ |
||||
Name: aws.String(d["Name"]), |
||||
Value: aws.String(d["Value"]), |
||||
}) |
||||
} |
||||
|
||||
params := &cloudwatch.ListMetricsInput{ |
||||
Namespace: aws.String(reqParam.Parameters.Namespace), |
||||
MetricName: aws.String(reqParam.Parameters.MetricName), |
||||
Dimensions: dimensions, |
||||
} |
||||
|
||||
resp, err := svc.ListMetrics(params) |
||||
if err != nil { |
||||
c.JsonApiErr(500, "Unable to call AWS API", err) |
||||
return |
||||
} |
||||
|
||||
respJson, _ := json.Marshal(resp) |
||||
fmt.Fprint(c.RW(), string(respJson)) |
||||
default: |
||||
c.JsonApiErr(500, "Unexpected CloudWatch action", errors.New(reqInfo.Action)) |
||||
} |
||||
} |
||||
Loading…
Reference in new issue