dataproxy_cloudwatch.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package api
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "io/ioutil"
  7. "time"
  8. "github.com/aws/aws-sdk-go/aws"
  9. "github.com/aws/aws-sdk-go/service/cloudwatch"
  10. "github.com/grafana/grafana/pkg/middleware"
  11. )
  12. func ProxyCloudWatchDataSourceRequest(c *middleware.Context) {
  13. body, _ := ioutil.ReadAll(c.Req.Request.Body)
  14. reqInfo := &struct {
  15. Region string `json:"region"`
  16. Service string `json:"service"`
  17. Action string `json:"action"`
  18. }{}
  19. json.Unmarshal([]byte(body), reqInfo)
  20. svc := cloudwatch.New(&aws.Config{Region: aws.String(reqInfo.Region)})
  21. switch reqInfo.Action {
  22. case "GetMetricStatistics":
  23. reqParam := &struct {
  24. Parameters struct {
  25. Namespace string `json:"Namespace"`
  26. MetricName string `json:"MetricName"`
  27. Dimensions []map[string]string `json:"Dimensions"`
  28. Statistics []string `json:"Statistics"`
  29. StartTime int64 `json:"StartTime"`
  30. EndTime int64 `json:"EndTime"`
  31. Period int64 `json:"Period"`
  32. } `json:"parameters"`
  33. }{}
  34. json.Unmarshal([]byte(body), reqParam)
  35. statistics := make([]*string, 0)
  36. for k := range reqParam.Parameters.Statistics {
  37. statistics = append(statistics, &reqParam.Parameters.Statistics[k])
  38. }
  39. dimensions := make([]*cloudwatch.Dimension, 0)
  40. for _, d := range reqParam.Parameters.Dimensions {
  41. dimensions = append(dimensions, &cloudwatch.Dimension{
  42. Name: aws.String(d["Name"]),
  43. Value: aws.String(d["Value"]),
  44. })
  45. }
  46. params := &cloudwatch.GetMetricStatisticsInput{
  47. Namespace: aws.String(reqParam.Parameters.Namespace),
  48. MetricName: aws.String(reqParam.Parameters.MetricName),
  49. Dimensions: dimensions,
  50. Statistics: statistics,
  51. StartTime: aws.Time(time.Unix(reqParam.Parameters.StartTime, 0)),
  52. EndTime: aws.Time(time.Unix(reqParam.Parameters.EndTime, 0)),
  53. Period: aws.Int64(reqParam.Parameters.Period),
  54. }
  55. resp, err := svc.GetMetricStatistics(params)
  56. if err != nil {
  57. c.JsonApiErr(500, "Unable to call AWS API", err)
  58. return
  59. }
  60. respJson, _ := json.Marshal(resp)
  61. fmt.Fprint(c.RW(), string(respJson))
  62. case "ListMetrics":
  63. reqParam := &struct {
  64. Parameters struct {
  65. Namespace string `json:"Namespace"`
  66. MetricName string `json:"MetricName"`
  67. Dimensions []map[string]string `json:"Dimensions"`
  68. } `json:"parameters"`
  69. }{}
  70. json.Unmarshal([]byte(body), reqParam)
  71. dimensions := make([]*cloudwatch.DimensionFilter, 0)
  72. for _, d := range reqParam.Parameters.Dimensions {
  73. dimensions = append(dimensions, &cloudwatch.DimensionFilter{
  74. Name: aws.String(d["Name"]),
  75. Value: aws.String(d["Value"]),
  76. })
  77. }
  78. params := &cloudwatch.ListMetricsInput{
  79. Namespace: aws.String(reqParam.Parameters.Namespace),
  80. MetricName: aws.String(reqParam.Parameters.MetricName),
  81. Dimensions: dimensions,
  82. }
  83. resp, err := svc.ListMetrics(params)
  84. if err != nil {
  85. c.JsonApiErr(500, "Unable to call AWS API", err)
  86. return
  87. }
  88. respJson, _ := json.Marshal(resp)
  89. fmt.Fprint(c.RW(), string(respJson))
  90. default:
  91. c.JsonApiErr(500, "Unexpected CloudWatch action", errors.New(reqInfo.Action))
  92. }
  93. }