in cli_tools/common/utils/logging/service/logger.go [285:357]
func (l *Logger) sendLogToServerWithRetry(logExtension *ComputeImageToolsLogExtension, maxRetry int) logResult {
logMutex.Lock()
defer logMutex.Unlock()
for i := 0; i < maxRetry; i++ {
// Before sending a new request, wait for a while if server asked to do so
if nextRequestWaitMillis > 0 {
nextRequestWaitMillis = 0
time.Sleep(time.Duration(nextRequestWaitMillis) * time.Millisecond)
}
logRequestJSON, err := l.constructLogRequest(logExtension)
if err != nil {
fmt.Println("Failed to log to server: failed to prepare json log data.")
return failedOnCreateRequestJSON
}
if !serverLogEnabled {
return serverLogDisabled
}
req, err := http.NewRequest("POST", l.ServerURL, bytes.NewBuffer(logRequestJSON))
if err != nil {
fmt.Println("Failed to create log request: ", err)
return failedOnCreateRequest
}
req.Header.Set("Content-Type", "application/json")
resp, err := httpClient.Do(req)
if err != nil {
fmt.Println("Failed to log to server: ", err)
continue
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
var lr logResponse
if err = json.Unmarshal(body, &lr); err != nil {
fmt.Println("Failed to parse log response: ", err, "\nResponse: ", string(body))
return failedToParseResponse
}
// Honor "NextRequestWaitMillis" from server for traffic control. However, wait no more than 5s to prevent a long
// stuck
if lr.NextRequestWaitMillis > 0 {
nextRequestWaitMillis = lr.NextRequestWaitMillis
if nextRequestWaitMillis > 5000 {
nextRequestWaitMillis = 5000
}
}
// Honor "ResponseAction" from server to control retrying
if len(lr.LogResponseDetails) > 0 {
action := lr.LogResponseDetails[0].ResponseAction
if action == deleteRequest || action == responseActionUnknown {
// Log success or unknown status, just return
return logResult(action)
} else if action == retryRequestLater {
// Retry as server asked
continue
}
// Return if client failed to receive a defined response action
fmt.Println("Failed to log to server: undefined response action: ", action)
return failedOnUndefinedResponse
}
// If no response details are present but successfully response is parsed, return success
return logResult(deleteRequest)
}
fmt.Println("Failed to log to server after retrying")
return failedAfterRetry
}