Risposte di errore

Risposte di errore standard

Se una richiesta dell'API Tag Manager ha esito positivo, l'API restituisce un codice di stato HTTP 200 insieme ai dati richiesti nel corpo della risposta.

Se si verifica un errore con una richiesta, l'API restituisce nella risposta un codice di stato HTTP e il motivo, 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:

400 invalidParameter

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "accessNotConfigured",
    "message": "Access Not Configured. Please use Google Developers Console to activate the API for your project.",
   }
  ],
  "code": 403,
  "message": "Access Not Configured. Please use Google Developers Console to activate the API for your project."
 }
}

Nota: la descrizione potrebbe cambiare in qualsiasi momento, pertanto le applicazioni non dovrebbero dipendere dal testo della descrizione effettivo.

Implementazione del backoff esponenziale

Il backoff esponenziale è il processo con cui un client riprova periodicamente una richiesta non riuscita in un periodo di tempo crescente. È una strategia di gestione degli errori standard per le applicazioni di rete. L'API Tag Manager è progettata pensando che i client che scelgono di riprovare a eseguire le richieste non riuscite lo facciano utilizzando il backoff esponenziale. Oltre a essere "obbligatorio", l'uso del backoff esponenziale aumenta l'efficienza dell'utilizzo della larghezza di banda, riduce il numero di richieste necessarie per ottenere una risposta corretta e massimizza la velocità effettiva delle richieste in ambienti contemporanei.

Di seguito è illustrato il flusso per l'implementazione di un backoff esponenziale semplice.

  1. Effettua una richiesta all'API.
  2. Ricevi una risposta di errore con un codice di errore che è possibile riprovare.
  3. Attendi 1 secondo + random_number_milliseconds secondi.
  4. Riprova la richiesta.
  5. Ricevi una risposta di errore con un codice di errore che è possibile riprovare.
  6. Attendi 2 secondi + random_number_milliseconds secondi.
  7. Riprova la richiesta.
  8. Ricevi una risposta di errore con un codice di errore che è possibile riprovare.
  9. Attendi 4 secondi + random_number_milliseconds secondi.
  10. Riprova la richiesta.
  11. Ricevi una risposta di errore con un codice di errore che è possibile riprovare.
  12. Attendi 8 secondi + random_number_milliseconds secondi.
  13. Riprova la richiesta.
  14. Ricevi una risposta di errore con un codice di errore che è possibile riprovare.
  15. Attendi 16 secondi + random_number_milliseconds secondi.
  16. Riprova la richiesta.
  17. Se continui a visualizzare un errore, 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 con aumento monotonico inizialmente definito come 0. La variabile n viene incrementata di 1 per ogni iterazione (ogni richiesta).

L'algoritmo è impostato per terminare quando n è 5. Questo limite serve solo per impedire ai client di eseguire all'infinito nuovi tentativi 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 dagli errori che si verificano in un metodo chiamato makeRequest.

import random
import time
from apiclient.errors import HttpError

def makeRequestWithExponentialBackoff(tagmanager):
  """Wrapper to request Google Tag Manager data with exponential backoff.

  The makeRequest method accepts the tagmanager service object, makes API
  requests and returns the response. If any error occurs, the makeRequest
  method is retried using exponential backoff.

  Args:
    tagmanager: The tagmanager service object

  Returns:
    The API response from the makeRequest method.
  """
  for n in range(0, 5):
    try:
      return makeRequest(tagmanager)

    except HttpError, error:
      if error.resp.reason in ['userRateLimitExceeded', 'quotaExceeded']:
        time.sleep((2 ** n) + random.random())

  print "There has been an error, the request never succeeded."