@@ -3,6 +3,7 @@ package metric
33import (
44 "context"
55 "fmt"
6+ "strings"
67 "time"
78
89 "github.com/tencentyun/tencentcloud-exporter/pkg/util"
@@ -134,15 +135,12 @@ func (repo *TcmMetricRepositoryImpl) GetSamples(s *TcmSeries, st int64, et int64
134135 request .EndTime = & etStr
135136 }
136137
138+ start := time .Now ()
137139 response := & v20180724.GetMonitorDataResponse {}
138- if repo .IsInternational && s .Metric .Meta .ProductName == "QAAP" {
139- response , err = repo .monitorClientInSinapore .GetMonitorData (request )
140- } else if util .IsStrInList (config .QcloudNamespace , s .Metric .Meta .ProductName ) {
141- response , err = repo .monitorClientInGuangzhou .GetMonitorData (request )
142- } else {
143- response , err = repo .monitorClient .GetMonitorData (request )
144- }
140+ response , err = repo .getMonitorDataWithRetry (s .Metric .Meta .ProductName , request )
145141 if err != nil {
142+ level .Error (repo .logger ).Log (
143+ "request start time " , stStr , "duration " , time .Since (start ).Seconds (), "err " , err .Error ())
146144 return
147145 }
148146
@@ -157,6 +155,29 @@ func (repo *TcmMetricRepositoryImpl) GetSamples(s *TcmSeries, st int64, et int64
157155 return
158156}
159157
158+ func (repo * TcmMetricRepositoryImpl ) getMonitorDataWithRetry (
159+ productName string , request * monitor.GetMonitorDataRequest ) (* v20180724.GetMonitorDataResponse , error ) {
160+ var lastErr error
161+ monitorClient := repo .monitorClient
162+ if repo .IsInternational && productName == "QAAP" {
163+ monitorClient = repo .monitorClientInSinapore
164+ } else if util .IsStrInList (config .QcloudNamespace , productName ) {
165+ monitorClient = repo .monitorClientInGuangzhou
166+ }
167+ for i := 0 ; i < 3 ; i ++ {
168+ resp , err := monitorClient .GetMonitorData (request )
169+ if err != nil {
170+ if strings .Contains (err .Error (), context .DeadlineExceeded .Error ()) {
171+ lastErr = err
172+ continue
173+ }
174+ return nil , err
175+ }
176+ return resp , nil
177+ }
178+ return nil , lastErr
179+ }
180+
160181func (repo * TcmMetricRepositoryImpl ) ListSamples (m * TcmMetric , st int64 , et int64 ) ([]* TcmSamples , error ) {
161182 var samplesList []* TcmSamples
162183 for _ , seriesList := range m .GetSeriesSplitByBatch (repo .queryMetricBatchSize ) {
@@ -188,17 +209,17 @@ func (repo *TcmMetricRepositoryImpl) listSampleByBatch(
188209
189210 request := repo .buildGetMonitorDataRequest (m , seriesList , st , et )
190211
212+ start := time .Now ()
191213 response := & v20180724.GetMonitorDataResponse {}
192- if repo .IsInternational && m .Meta .ProductName == "QAAP" {
193- response , err = repo .monitorClientInSinapore .GetMonitorData (request )
194- } else if util .IsStrInList (config .QcloudNamespace , m .Meta .ProductName ) {
195- response , err = repo .monitorClientInGuangzhou .GetMonitorData (request )
196- } else {
197- response , err = repo .monitorClient .GetMonitorData (request )
198- }
214+ response , err = repo .getMonitorDataWithRetry (m .Meta .ProductName , request )
199215 if err != nil {
216+ level .Error (repo .logger ).Log (
217+ "request start time " , * request .StartTime ,
218+ "duration " , time .Since (start ).Seconds (),
219+ "err " , err .Error ())
200220 return nil , err
201221 }
222+
202223 for _ , points := range response .Response .DataPoints {
203224 samples , ql , e := repo .buildSamples (m , points )
204225 if e != nil {
0 commit comments