Risposte di errore standard
Se una richiesta dell'API di reporting ha esito positivo, l'API restituisce un valore 200
.
Se si verifica un errore con una richiesta, l'API restituisce un codice di stato HTTP, uno stato e un motivo nella risposta in base al tipo di errore.
Inoltre, il corpo della risposta contiene una descrizione dettagliata
di ciò che ha causato l'errore. Ecco un esempio di risposta di errore:
{
"error": {
"code": 403,
"message": "User does not have sufficient permissions for this profile.",
"status": "PERMISSION_DENIED"
}
}
Tabella degli errori
Codice | Stato | Descrizione | Azione consigliata |
---|---|---|---|
400 | INVALID_ARGUMENT |
La richiesta non è valida. Un argomento richiesto potrebbe essere mancante, superare i limiti o avere un valore non valido. | Esamina il messaggio di errore per maggiori dettagli. Questo errore non andrà a buon fine se il client tenterà di nuovo. |
401 | UNAUTHENTICATED |
Il client non è autenticato correttamente. | Non riprovare senza aver risolto il problema. Devi ottenere un nuovo token di autenticazione. |
403 | PERMISSION_DENIED |
Indica la richiesta di dati a cui l'utente non ha accesso. | Non riprovare senza aver risolto il problema. Devi disporre di autorizzazioni sufficienti per eseguire l'operazione sull'entità specificata. |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-1d |
Indica che la quota di richieste al giorno per progetto è stata esaurita. | Non riprovare senza aver risolto il problema. Hai esaurito la quota giornaliera. |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100s |
Indica che la quota di richieste ogni 100 secondi per progetto è stata esaurita. | Riprova utilizzando il backoff esponenziale. Devi rallentare la velocità di invio delle richieste. |
429 | RESOURCE_EXHAUSTED GruppoValore predefinitoUSER-100s Analytics |
Indica che la quota di richieste ogni 100 secondi per utente per progetto è stata esaurita. | Riprova utilizzando il backoff esponenziale. Devi rallentare la velocità di invio delle richieste. |
429 | RESOURCE_EXHAUSTED DiscoveryGroupCLIENT_PROJECT-100s |
Indica che la quota di richieste di rilevamento ogni 100 secondi è stata esaurita. | La risposta del rilevamento non cambia di frequente; memorizza la risposta del rilevamento nella cache localmente o riprova utilizzando il backoff esponenziale. Devi rallentare la velocità con cui invii le richieste. |
500 | INTERNAL |
Si è verificato un errore interno imprevisto del server. | Non riprovare a eseguire questa query più di una volta. |
503 | BACKEND_ERROR |
Il server ha restituito un errore. | Non riprovare a eseguire questa query più di una volta. |
503 | UNAVAILABLE |
Il servizio non è riuscito a elaborare la richiesta. | Molto probabilmente si tratta di una condizione transitoria e può essere corretta riprovando con un backoff esponenziale. |
Implementazione del backoff esponenziale
Il backoff esponenziale è il processo con cui un client riprova periodicamente a una richiesta non riuscita in un periodo di tempo crescente. È una strategia standard di gestione degli errori per le applicazioni di rete. L'API di reporting è progettata in base all'aspettativa che i client che scelgono di riprovare a inviare le richieste non riuscite lo facciano utilizzando un backoff esponenziale. Oltre a essere "obbligatorio", l'utilizzo del backoff esponenziale aumenta l'efficienza dell'utilizzo della larghezza di banda, riduce il numero di richieste necessarie per ottenere una risposta di successo e ottimizza la velocità effettiva delle richieste in ambienti simultanei.
Il flusso per l'implementazione di un backoff esponenziale semplice è il seguente.
- invia una richiesta all'API
- Ricevi una risposta di errore con un codice di errore riprovabile
- Attendi 1 s +
random_number_milliseconds
secondi - Riprova la richiesta
- Ricevi una risposta di errore con un codice di errore riprovabile
- Attendi 2 s +
random_number_milliseconds
secondi - Riprova la richiesta
- Ricevi una risposta di errore con un codice di errore riprovabile
- Attendi 4 sec +
random_number_milliseconds
secondi - Riprova la richiesta
- Ricevi una risposta di errore con un codice di errore riprovabile
- Attendi 8 sec +
random_number_milliseconds
secondi - Riprova la richiesta
- Ricevi una risposta di errore con un codice di errore riprovabile
- Attendi 16 sec +
random_number_milliseconds
secondi - Riprova la richiesta
- Se l'errore persiste, interrompi e registra l'errore.
Nel flusso precedente, random_number_milliseconds
è un numero casuale di millisecondi inferiore o uguale a 1000. Questa operazione è necessaria per evitare determinati errori di blocco in alcune implementazioni simultanee.
random_number_milliseconds
deve essere ridefinito dopo ogni attesa.
Nota: l'attesa è sempre (2 ^ n) + random_number_milliseconds
, dove n è un numero intero crescente monotonico inizialmente definito come 0. n viene incrementato di 1 per ogni iterazione (ogni richiesta).
L'algoritmo è impostato per terminare quando n è 5. Questo limite serve solo a impedire ai client di riprovare all'infinito e genera un ritardo totale di circa 32 secondi prima che una richiesta venga considerata "un errore irreversibile".
Il seguente codice Python è un'implementazione del flusso precedente
per il ripristino da errori che si verificano in un metodo chiamato
makeRequest
.
import random import time from apiclient.errors import HttpError def makeRequestWithExponentialBackoff(analytics): """Wrapper to request Google Analytics data with exponential backoff. The makeRequest method accepts the analytics service object, makes API requests and returns the response. If any error occurs, the makeRequest method is retried using exponential backoff. Args: analytics: The analytics service object Returns: The API response from the makeRequest method. """ for n in range(0, 5): try: return makeRequest(analytics) except HttpError, error: if error.resp.reason in ['userRateLimitExceeded', 'quotaExceeded', 'internalServerError', 'backendError']: time.sleep((2 ** n) + random.random()) else: break print "There has been an error, the request never succeeded."