cloudwatch.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package cloudwatch
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "io/ioutil"
  6. "time"
  7. "github.com/aws/aws-sdk-go/aws"
  8. "github.com/aws/aws-sdk-go/service/cloudwatch"
  9. "github.com/aws/aws-sdk-go/service/ec2"
  10. "github.com/grafana/grafana/pkg/middleware"
  11. )
  12. type actionHandler func(*cwRequest, *middleware.Context)
  13. var actionHandlers map[string]actionHandler
  14. type cwRequest struct {
  15. Region string `json:"region"`
  16. Action string `json:"action"`
  17. Body []byte `json:"-"`
  18. }
  19. func init() {
  20. actionHandlers = map[string]actionHandler{
  21. "GetMetricStatistics": handleGetMetricStatistics,
  22. "ListMetrics": handleListMetrics,
  23. "DescribeInstances": handleDescribeInstances,
  24. "__GetRegions": handleGetRegions,
  25. "__GetNamespaces": handleGetNamespaces,
  26. "__GetMetrics": handleGetMetrics,
  27. }
  28. }
  29. func handleGetMetricStatistics(req *cwRequest, c *middleware.Context) {
  30. svc := cloudwatch.New(&aws.Config{Region: aws.String(req.Region)})
  31. reqParam := &struct {
  32. Parameters struct {
  33. Namespace string `json:"namespace"`
  34. MetricName string `json:"metricName"`
  35. Dimensions []*cloudwatch.Dimension `json:"dimensions"`
  36. Statistics []*string `json:"statistics"`
  37. StartTime int64 `json:"startTime"`
  38. EndTime int64 `json:"endTime"`
  39. Period int64 `json:"period"`
  40. } `json:"parameters"`
  41. }{}
  42. json.Unmarshal(req.Body, reqParam)
  43. params := &cloudwatch.GetMetricStatisticsInput{
  44. Namespace: aws.String(reqParam.Parameters.Namespace),
  45. MetricName: aws.String(reqParam.Parameters.MetricName),
  46. Dimensions: reqParam.Parameters.Dimensions,
  47. Statistics: reqParam.Parameters.Statistics,
  48. StartTime: aws.Time(time.Unix(reqParam.Parameters.StartTime, 0)),
  49. EndTime: aws.Time(time.Unix(reqParam.Parameters.EndTime, 0)),
  50. Period: aws.Int64(reqParam.Parameters.Period),
  51. }
  52. resp, err := svc.GetMetricStatistics(params)
  53. if err != nil {
  54. c.JsonApiErr(500, "Unable to call AWS API", err)
  55. return
  56. }
  57. c.JSON(200, resp)
  58. }
  59. func handleListMetrics(req *cwRequest, c *middleware.Context) {
  60. svc := cloudwatch.New(&aws.Config{Region: aws.String(req.Region)})
  61. reqParam := &struct {
  62. Parameters struct {
  63. Namespace string `json:"namespace"`
  64. MetricName string `json:"metricName"`
  65. Dimensions []*cloudwatch.DimensionFilter `json:"dimensions"`
  66. } `json:"parameters"`
  67. }{}
  68. json.Unmarshal(req.Body, reqParam)
  69. params := &cloudwatch.ListMetricsInput{
  70. Namespace: aws.String(reqParam.Parameters.Namespace),
  71. MetricName: aws.String(reqParam.Parameters.MetricName),
  72. Dimensions: reqParam.Parameters.Dimensions,
  73. }
  74. resp, err := svc.ListMetrics(params)
  75. if err != nil {
  76. c.JsonApiErr(500, "Unable to call AWS API", err)
  77. return
  78. }
  79. c.JSON(200, resp)
  80. }
  81. func handleDescribeInstances(req *cwRequest, c *middleware.Context) {
  82. svc := ec2.New(&aws.Config{Region: aws.String(req.Region)})
  83. reqParam := &struct {
  84. Parameters struct {
  85. Filters []*ec2.Filter `json:"filters"`
  86. InstanceIds []*string `json:"instanceIds"`
  87. } `json:"parameters"`
  88. }{}
  89. json.Unmarshal(req.Body, reqParam)
  90. params := &ec2.DescribeInstancesInput{}
  91. if len(reqParam.Parameters.Filters) > 0 {
  92. params.Filters = reqParam.Parameters.Filters
  93. }
  94. if len(reqParam.Parameters.InstanceIds) > 0 {
  95. params.InstanceIDs = reqParam.Parameters.InstanceIds
  96. }
  97. resp, err := svc.DescribeInstances(params)
  98. if err != nil {
  99. c.JsonApiErr(500, "Unable to call AWS API", err)
  100. return
  101. }
  102. c.JSON(200, resp)
  103. }
  104. func HandleRequest(c *middleware.Context) {
  105. var req cwRequest
  106. req.Body, _ = ioutil.ReadAll(c.Req.Request.Body)
  107. json.Unmarshal(req.Body, &req)
  108. if handler, found := actionHandlers[req.Action]; !found {
  109. c.JsonApiErr(500, "Unexpected AWS Action", errors.New(req.Action))
  110. return
  111. } else {
  112. handler(&req, c)
  113. }
  114. }