get_metric_data_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. So(*res.MetricDataQueries[0].MetricStat.Metric.Namespace, ShouldEqual, "AWS/EC2")
  47. So(*res.MetricDataQueries[0].MetricStat.Metric.MetricName, ShouldEqual, "CPUUtilization")
  48. So(*res.MetricDataQueries[0].MetricStat.Metric.Dimensions[0].Name, ShouldEqual, "InstanceId")
  49. So(*res.MetricDataQueries[0].MetricStat.Metric.Dimensions[0].Value, ShouldEqual, "i-12345678")
  50. So(*res.MetricDataQueries[0].MetricStat.Period, ShouldEqual, 300)
  51. So(*res.MetricDataQueries[0].MetricStat.Stat, ShouldEqual, "Average")
  52. So(*res.MetricDataQueries[0].Id, ShouldEqual, "id1")
  53. So(*res.MetricDataQueries[0].ReturnData, ShouldEqual, true)
  54. So(*res.MetricDataQueries[1].Id, ShouldEqual, "id2")
  55. So(*res.MetricDataQueries[1].Expression, ShouldEqual, "id1 * 2")
  56. So(*res.MetricDataQueries[1].ReturnData, ShouldEqual, true)
  57. })
  58. Convey("can parse cloudwatch response", func() {
  59. timestamp := time.Unix(0, 0)
  60. resp := map[string]*cloudwatch.MetricDataResult{
  61. "label": {
  62. Id: aws.String("id1"),
  63. Label: aws.String("label"),
  64. Timestamps: []*time.Time{
  65. aws.Time(timestamp),
  66. aws.Time(timestamp.Add(60 * time.Second)),
  67. aws.Time(timestamp.Add(180 * time.Second)),
  68. },
  69. Values: []*float64{
  70. aws.Float64(10),
  71. aws.Float64(20),
  72. aws.Float64(30),
  73. },
  74. StatusCode: aws.String("Complete"),
  75. },
  76. }
  77. query := &CloudWatchQuery{
  78. RefId: "refId1",
  79. Region: "us-east-1",
  80. Namespace: "AWS/ApplicationELB",
  81. MetricName: "TargetResponseTime",
  82. Dimensions: []*cloudwatch.Dimension{
  83. {
  84. Name: aws.String("LoadBalancer"),
  85. Value: aws.String("lb"),
  86. },
  87. {
  88. Name: aws.String("TargetGroup"),
  89. Value: aws.String("tg"),
  90. },
  91. },
  92. Statistics: []*string{aws.String("Average")},
  93. Period: 60,
  94. Alias: "{{namespace}}_{{metric}}_{{stat}}",
  95. }
  96. queryRes, err := parseGetMetricDataResponse(resp, query)
  97. So(err, ShouldBeNil)
  98. So(queryRes.RefId, ShouldEqual, "refId1")
  99. So(queryRes.Series[0].Name, ShouldEqual, "AWS/ApplicationELB_TargetResponseTime_Average")
  100. So(queryRes.Series[0].Tags["LoadBalancer"], ShouldEqual, "lb")
  101. So(queryRes.Series[0].Tags["TargetGroup"], ShouldEqual, "tg")
  102. So(queryRes.Series[0].Points[0][0].String(), ShouldEqual, null.FloatFrom(10.0).String())
  103. So(queryRes.Series[0].Points[1][0].String(), ShouldEqual, null.FloatFrom(20.0).String())
  104. So(queryRes.Series[0].Points[2][0].String(), ShouldEqual, null.FloatFromPtr(nil).String())
  105. So(queryRes.Series[0].Points[3][0].String(), ShouldEqual, null.FloatFrom(30.0).String())
  106. })
  107. })
  108. }