get_metric_data_test.go 3.5 KB

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