dataproxy_cloudwatch.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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/aws/aws-sdk-go/service/ec2"
  11. "github.com/grafana/grafana/pkg/middleware"
  12. )
  13. func ProxyCloudWatchDataSourceRequest(c *middleware.Context) {
  14. body, _ := ioutil.ReadAll(c.Req.Request.Body)
  15. reqInfo := &struct {
  16. Region string `json:"region"`
  17. Service string `json:"service"`
  18. Action string `json:"action"`
  19. }{}
  20. json.Unmarshal([]byte(body), reqInfo)
  21. switch reqInfo.Service {
  22. case "CloudWatch":
  23. svc := cloudwatch.New(&aws.Config{Region: aws.String(reqInfo.Region)})
  24. switch reqInfo.Action {
  25. case "GetMetricStatistics":
  26. reqParam := &struct {
  27. Parameters struct {
  28. Namespace string `json:"Namespace"`
  29. MetricName string `json:"MetricName"`
  30. Dimensions []map[string]string `json:"Dimensions"`
  31. Statistics []string `json:"Statistics"`
  32. StartTime int64 `json:"StartTime"`
  33. EndTime int64 `json:"EndTime"`
  34. Period int64 `json:"Period"`
  35. } `json:"parameters"`
  36. }{}
  37. json.Unmarshal([]byte(body), reqParam)
  38. statistics := make([]*string, 0)
  39. for k := range reqParam.Parameters.Statistics {
  40. statistics = append(statistics, &reqParam.Parameters.Statistics[k])
  41. }
  42. dimensions := make([]*cloudwatch.Dimension, 0)
  43. for _, d := range reqParam.Parameters.Dimensions {
  44. dimensions = append(dimensions, &cloudwatch.Dimension{
  45. Name: aws.String(d["Name"]),
  46. Value: aws.String(d["Value"]),
  47. })
  48. }
  49. params := &cloudwatch.GetMetricStatisticsInput{
  50. Namespace: aws.String(reqParam.Parameters.Namespace),
  51. MetricName: aws.String(reqParam.Parameters.MetricName),
  52. Dimensions: dimensions,
  53. Statistics: statistics,
  54. StartTime: aws.Time(time.Unix(reqParam.Parameters.StartTime, 0)),
  55. EndTime: aws.Time(time.Unix(reqParam.Parameters.EndTime, 0)),
  56. Period: aws.Int64(reqParam.Parameters.Period),
  57. }
  58. resp, err := svc.GetMetricStatistics(params)
  59. if err != nil {
  60. c.JsonApiErr(500, "Unable to call AWS API", err)
  61. return
  62. }
  63. respJson, _ := json.Marshal(resp)
  64. fmt.Fprint(c.RW(), string(respJson))
  65. case "ListMetrics":
  66. reqParam := &struct {
  67. Parameters struct {
  68. Namespace string `json:"Namespace"`
  69. MetricName string `json:"MetricName"`
  70. Dimensions []map[string]string `json:"Dimensions"`
  71. } `json:"parameters"`
  72. }{}
  73. json.Unmarshal([]byte(body), reqParam)
  74. dimensions := make([]*cloudwatch.DimensionFilter, 0)
  75. for _, d := range reqParam.Parameters.Dimensions {
  76. dimensions = append(dimensions, &cloudwatch.DimensionFilter{
  77. Name: aws.String(d["Name"]),
  78. Value: aws.String(d["Value"]),
  79. })
  80. }
  81. params := &cloudwatch.ListMetricsInput{
  82. Namespace: aws.String(reqParam.Parameters.Namespace),
  83. MetricName: aws.String(reqParam.Parameters.MetricName),
  84. Dimensions: dimensions,
  85. }
  86. resp, err := svc.ListMetrics(params)
  87. if err != nil {
  88. c.JsonApiErr(500, "Unable to call AWS API", err)
  89. return
  90. }
  91. respJson, _ := json.Marshal(resp)
  92. fmt.Fprint(c.RW(), string(respJson))
  93. default:
  94. c.JsonApiErr(500, "Unexpected CloudWatch action", errors.New(reqInfo.Action))
  95. }
  96. case "EC2":
  97. svc := ec2.New(&aws.Config{Region: aws.String(reqInfo.Region)})
  98. switch reqInfo.Action {
  99. case "DescribeInstances":
  100. reqParam := &struct {
  101. Parameters struct {
  102. Filters []*ec2.Filter `json:"Filters"`
  103. InstanceIds []*string `json:"InstanceIds"`
  104. } `json:"parameters"`
  105. }{}
  106. json.Unmarshal([]byte(body), reqParam)
  107. params := &ec2.DescribeInstancesInput{}
  108. if len(reqParam.Parameters.Filters) > 0 {
  109. params.Filters = reqParam.Parameters.Filters
  110. }
  111. if len(reqParam.Parameters.InstanceIds) > 0 {
  112. params.InstanceIDs = reqParam.Parameters.InstanceIds
  113. }
  114. resp, err := svc.DescribeInstances(params)
  115. if err != nil {
  116. c.JsonApiErr(500, "Unable to call AWS API", err)
  117. return
  118. }
  119. respJson, _ := json.Marshal(resp)
  120. fmt.Fprint(c.RW(), string(respJson))
  121. default:
  122. c.JsonApiErr(500, "Unexpected EC2 action", errors.New(reqInfo.Action))
  123. }
  124. default:
  125. c.JsonApiErr(500, "Unexpected service", errors.New(reqInfo.Service))
  126. }
  127. }