@@ -39,69 +39,58 @@ func GetStartTimeEndTime(period time.Duration, latency time.Duration) (time.Time
3939// to obtain statistical data.
4040func GetListMetricsOutput (namespace string , regionName string , svcCloudwatch cloudwatchiface.ClientAPI ) ([]cloudwatch.Metric , error ) {
4141 var metricsTotal []cloudwatch.Metric
42- init := true
4342 var nextToken * string
4443
45- for init || nextToken != nil {
46- init = false
47- listMetricsInput := & cloudwatch.ListMetricsInput {
48- NextToken : nextToken ,
49- }
50- if namespace != "*" {
51- listMetricsInput .Namespace = & namespace
52- }
53- reqListMetrics := svcCloudwatch .ListMetricsRequest (listMetricsInput )
54-
55- // List metrics of a given namespace for each region
56- listMetricsOutput , err := reqListMetrics .Send (context .TODO ())
57- if err != nil {
58- return nil , errors .Wrap (err , "ListMetricsRequest failed, skipping region " + regionName )
59- }
60- metricsTotal = append (metricsTotal , listMetricsOutput .Metrics ... )
61- nextToken = listMetricsOutput .NextToken
44+ listMetricsInput := & cloudwatch.ListMetricsInput {
45+ NextToken : nextToken ,
46+ }
47+ if namespace != "*" {
48+ listMetricsInput .Namespace = & namespace
6249 }
6350
64- return metricsTotal , nil
65- }
66-
67- func getMetricDataPerRegion (metricDataQueries []cloudwatch.MetricDataQuery , nextToken * string , svc cloudwatchiface.ClientAPI , startTime time.Time , endTime time.Time ) (* cloudwatch.GetMetricDataOutput , error ) {
68- getMetricDataInput := & cloudwatch.GetMetricDataInput {
69- NextToken : nextToken ,
70- StartTime : & startTime ,
71- EndTime : & endTime ,
72- MetricDataQueries : metricDataQueries ,
51+ // List metrics of a given namespace for each region
52+ req := svcCloudwatch .ListMetricsRequest (listMetricsInput )
53+ paginator := cloudwatch .NewListMetricsPaginator (req )
54+ for paginator .Next (context .TODO ()) {
55+ page := paginator .CurrentPage ()
56+ metricsTotal = append (metricsTotal , page .Metrics ... )
7357 }
7458
75- reqGetMetricData := svc .GetMetricDataRequest (getMetricDataInput )
76- getMetricDataResponse , err := reqGetMetricData .Send (context .TODO ())
77- if err != nil {
78- return nil , errors .Wrap (err , "Error GetMetricDataInput" )
59+ if err := paginator .Err (); err != nil {
60+ return metricsTotal , errors .Wrap (err , "error ListMetrics with Paginator, skipping region " + regionName )
7961 }
80- return getMetricDataResponse . GetMetricDataOutput , nil
62+ return metricsTotal , nil
8163}
8264
8365// GetMetricDataResults function uses MetricDataQueries to get metric data output.
8466func GetMetricDataResults (metricDataQueries []cloudwatch.MetricDataQuery , svc cloudwatchiface.ClientAPI , startTime time.Time , endTime time.Time ) ([]cloudwatch.MetricDataResult , error ) {
85- init := true
8667 maxQuerySize := 100
8768 getMetricDataOutput := & cloudwatch.GetMetricDataOutput {NextToken : nil }
88- for init || getMetricDataOutput .NextToken != nil {
89- init = false
90- // Split metricDataQueries into smaller slices that length no longer than 100.
91- // 100 is defined in maxQuerySize.
92- // To avoid ValidationError: The collection MetricDataQueries must not have a size greater than 100.
93- for i := 0 ; i < len (metricDataQueries ); i += maxQuerySize {
94- metricDataQueriesPartial := metricDataQueries [i :int (math .Min (float64 (i + maxQuerySize ), float64 (len (metricDataQueries ))))]
95- if len (metricDataQueriesPartial ) == 0 {
96- return getMetricDataOutput .MetricDataResults , nil
97- }
9869
99- output , err := getMetricDataPerRegion (metricDataQueriesPartial , getMetricDataOutput .NextToken , svc , startTime , endTime )
100- if err != nil {
101- return getMetricDataOutput .MetricDataResults , errors .Wrap (err , "getMetricDataPerRegion failed" )
102- }
70+ // Split metricDataQueries into smaller slices that length no longer than 100.
71+ // 100 is defined in maxQuerySize.
72+ // To avoid ValidationError: The collection MetricDataQueries must not have a size greater than 100.
73+ for i := 0 ; i < len (metricDataQueries ); i += maxQuerySize {
74+ metricDataQueriesPartial := metricDataQueries [i :int (math .Min (float64 (i + maxQuerySize ), float64 (len (metricDataQueries ))))]
75+ if len (metricDataQueriesPartial ) == 0 {
76+ return getMetricDataOutput .MetricDataResults , nil
77+ }
78+
79+ getMetricDataInput := & cloudwatch.GetMetricDataInput {
80+ StartTime : & startTime ,
81+ EndTime : & endTime ,
82+ MetricDataQueries : metricDataQueriesPartial ,
83+ }
84+
85+ req := svc .GetMetricDataRequest (getMetricDataInput )
86+ paginator := cloudwatch .NewGetMetricDataPaginator (req )
87+ for paginator .Next (context .TODO ()) {
88+ page := paginator .CurrentPage ()
89+ getMetricDataOutput .MetricDataResults = append (getMetricDataOutput .MetricDataResults , page .MetricDataResults ... )
90+ }
10391
104- getMetricDataOutput .MetricDataResults = append (getMetricDataOutput .MetricDataResults , output .MetricDataResults ... )
92+ if err := paginator .Err (); err != nil {
93+ return getMetricDataOutput .MetricDataResults , errors .Wrap (err , "error GetMetricData with Paginator" )
10594 }
10695 }
10796 return getMetricDataOutput .MetricDataResults , nil
0 commit comments