get_metric_data_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package cloudwatch
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/aws/aws-sdk-go/aws"
  6. "github.com/aws/aws-sdk-go/service/cloudwatch"
  7. "github.com/grafana/grafana/pkg/components/null"
  8. "github.com/grafana/grafana/pkg/tsdb"
  9. . "github.com/smartystreets/goconvey/convey"
  10. )
  11. func TestCloudWatchGetMetricData(t *testing.T) {
  12. Convey("CloudWatchGetMetricData", t, func() {
  13. Convey("can parse cloudwatch GetMetricData query", func() {
  14. queries := map[string]*CloudWatchQuery{
  15. "id1": {
  16. RefId: "A",
  17. Region: "us-east-1",
  18. Namespace: "AWS/EC2",
  19. MetricName: "CPUUtilization",
  20. Dimensions: []*cloudwatch.Dimension{
  21. {
  22. Name: aws.String("InstanceId"),
  23. Value: aws.String("i-12345678"),
  24. },
  25. },
  26. Statistics: []*string{aws.String("Average")},
  27. Period: 300,
  28. Id: "id1",
  29. Expression: "",
  30. ReturnData: true,
  31. },
  32. "id2": {
  33. RefId: "B",
  34. Region: "us-east-1",
  35. Statistics: []*string{aws.String("Average")},
  36. Id: "id2",
  37. Expression: "id1 * 2",
  38. ReturnData: true,
  39. },
  40. }
  41. queryContext := &tsdb.TsdbQuery{
  42. TimeRange: tsdb.NewFakeTimeRange("5m", "now", time.Now()),
  43. }
  44. res, err := parseGetMetricDataQuery(queries, queryContext)
  45. So(err, ShouldBeNil)
  46. for _, v := range res.MetricDataQueries {
  47. if *v.Id == "id1" {
  48. So(*v.MetricStat.Metric.Namespace, ShouldEqual, "AWS/EC2")
  49. So(*v.MetricStat.Metric.MetricName, ShouldEqual, "CPUUtilization")
  50. So(*v.MetricStat.Metric.Dimensions[0].Name, ShouldEqual, "InstanceId")
  51. So(*v.MetricStat.Metric.Dimensions[0].Value, ShouldEqual, "i-12345678")
  52. So(*v.MetricStat.Period, ShouldEqual, 300)
  53. So(*v.MetricStat.Stat, ShouldEqual, "Average")
  54. So(*v.Id, ShouldEqual, "id1")
  55. So(*v.ReturnData, ShouldEqual, true)
  56. } else {
  57. So(*v.Id, ShouldEqual, "id2")
  58. So(*v.Expression, ShouldEqual, "id1 * 2")
  59. So(*v.ReturnData, ShouldEqual, true)
  60. }
  61. }
  62. })
  63. Convey("can parse cloudwatch response", func() {
  64. timestamp := time.Unix(0, 0)
  65. resp := map[string]*cloudwatch.MetricDataResult{
  66. "label": {
  67. Id: aws.String("id1"),
  68. Label: aws.String("label"),
  69. Timestamps: []*time.Time{
  70. aws.Time(timestamp),
  71. aws.Time(timestamp.Add(60 * time.Second)),
  72. aws.Time(timestamp.Add(180 * time.Second)),
  73. },
  74. Values: []*float64{
  75. aws.Float64(10),
  76. aws.Float64(20),
  77. aws.Float64(30),
  78. },
  79. StatusCode: aws.String("Complete"),
  80. },
  81. }
  82. query := &CloudWatchQuery{
  83. RefId: "refId1",
  84. Region: "us-east-1",
  85. Namespace: "AWS/ApplicationELB",
  86. MetricName: "TargetResponseTime",
  87. Dimensions: []*cloudwatch.Dimension{
  88. {
  89. Name: aws.String("LoadBalancer"),
  90. Value: aws.String("lb"),
  91. },
  92. {
  93. Name: aws.String("TargetGroup"),
  94. Value: aws.String("tg"),
  95. },
  96. },
  97. Statistics: []*string{aws.String("Average")},
  98. Period: 60,
  99. Alias: "{{namespace}}_{{metric}}_{{stat}}",
  100. }
  101. queryRes, err := parseGetMetricDataResponse(resp, query)
  102. So(err, ShouldBeNil)
  103. So(queryRes.RefId, ShouldEqual, "refId1")
  104. So(queryRes.Series[0].Name, ShouldEqual, "AWS/ApplicationELB_TargetResponseTime_Average")
  105. So(queryRes.Series[0].Tags["LoadBalancer"], ShouldEqual, "lb")
  106. So(queryRes.Series[0].Tags["TargetGroup"], ShouldEqual, "tg")
  107. So(queryRes.Series[0].Points[0][0].String(), ShouldEqual, null.FloatFrom(10.0).String())
  108. So(queryRes.Series[0].Points[1][0].String(), ShouldEqual, null.FloatFrom(20.0).String())
  109. So(queryRes.Series[0].Points[2][0].String(), ShouldEqual, null.FloatFromPtr(nil).String())
  110. So(queryRes.Series[0].Points[3][0].String(), ShouldEqual, null.FloatFrom(30.0).String())
  111. })
  112. })
  113. }