dataproxy_cloudwatch.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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 []*cloudwatch.Dimension `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. params := &cloudwatch.GetMetricStatisticsInput{
  39. Namespace: aws.String(reqParam.Parameters.Namespace),
  40. MetricName: aws.String(reqParam.Parameters.MetricName),
  41. Dimensions: reqParam.Parameters.Dimensions,
  42. Statistics: reqParam.Parameters.Statistics,
  43. StartTime: aws.Time(time.Unix(reqParam.Parameters.StartTime, 0)),
  44. EndTime: aws.Time(time.Unix(reqParam.Parameters.EndTime, 0)),
  45. Period: aws.Int64(reqParam.Parameters.Period),
  46. }
  47. resp, err := svc.GetMetricStatistics(params)
  48. if err != nil {
  49. c.JsonApiErr(500, "Unable to call AWS API", err)
  50. return
  51. }
  52. respJson, _ := json.Marshal(resp)
  53. fmt.Fprint(c.RW(), string(respJson))
  54. case "ListMetrics":
  55. reqParam := &struct {
  56. Parameters struct {
  57. Namespace string `json:"Namespace"`
  58. MetricName string `json:"MetricName"`
  59. Dimensions []*cloudwatch.DimensionFilter `json:"Dimensions"`
  60. } `json:"parameters"`
  61. }{}
  62. json.Unmarshal([]byte(body), reqParam)
  63. params := &cloudwatch.ListMetricsInput{
  64. Namespace: aws.String(reqParam.Parameters.Namespace),
  65. MetricName: aws.String(reqParam.Parameters.MetricName),
  66. Dimensions: reqParam.Parameters.Dimensions,
  67. }
  68. resp, err := svc.ListMetrics(params)
  69. if err != nil {
  70. c.JsonApiErr(500, "Unable to call AWS API", err)
  71. return
  72. }
  73. respJson, _ := json.Marshal(resp)
  74. fmt.Fprint(c.RW(), string(respJson))
  75. default:
  76. c.JsonApiErr(500, "Unexpected CloudWatch action", errors.New(reqInfo.Action))
  77. }
  78. case "EC2":
  79. svc := ec2.New(&aws.Config{Region: aws.String(reqInfo.Region)})
  80. switch reqInfo.Action {
  81. case "DescribeInstances":
  82. reqParam := &struct {
  83. Parameters struct {
  84. Filters []*ec2.Filter `json:"Filters"`
  85. InstanceIds []*string `json:"InstanceIds"`
  86. } `json:"parameters"`
  87. }{}
  88. json.Unmarshal([]byte(body), reqParam)
  89. params := &ec2.DescribeInstancesInput{}
  90. if len(reqParam.Parameters.Filters) > 0 {
  91. params.Filters = reqParam.Parameters.Filters
  92. }
  93. if len(reqParam.Parameters.InstanceIds) > 0 {
  94. params.InstanceIDs = reqParam.Parameters.InstanceIds
  95. }
  96. resp, err := svc.DescribeInstances(params)
  97. if err != nil {
  98. c.JsonApiErr(500, "Unable to call AWS API", err)
  99. return
  100. }
  101. respJson, _ := json.Marshal(resp)
  102. fmt.Fprint(c.RW(), string(respJson))
  103. default:
  104. c.JsonApiErr(500, "Unexpected EC2 action", errors.New(reqInfo.Action))
  105. }
  106. default:
  107. c.JsonApiErr(500, "Unexpected service", errors.New(reqInfo.Service))
  108. }
  109. }