Risposte di errore

Risposte di errore standard

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

Se si verifica un errore con una richiesta, l'API restituisce una richiesta HTTP codice di stato e motivo della risposta in base al tipo di errore. Inoltre, il corpo della risposta contiene una descrizione dettagliata della causa dell'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 può cambiare in qualsiasi momento. pertanto le applicazioni non dovrebbero dipendere dal testo della descrizione.

Implementazione del backoff esponenziale

Backoff esponenziale è il processo con cui un client prova periodicamente a inviare una richiesta non riuscita sempre più a lungo. È una strategia di gestione degli errori standard per le applicazioni di rete. L'API Tag Manager è progettata con l'aspettativa che i client che scelgono di ritentare le richieste non riuscite utilizzando il backoff esponenziale. Oltre ad essere "obbligatorio", il backoff esponenziale aumenta l'efficienza dell'utilizzo della larghezza di banda, riduce il numero di richieste necessarie per avere una buona e massimizza la velocità effettiva delle richieste in ambienti cloud-native.

Il flusso per l'implementazione del backoff esponenziale semplice è il seguente.

  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 ricevere un errore, interrompi e registra l'errore.

Nel flusso riportato sopra, random_number_milliseconds è un metodo numero 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 monotonico inizialmente definito pari a 0. La variabile n viene incrementata di 1 per ogni iterazione (ogni richiesta).

L'algoritmo è impostato per terminare quando n è 5. Questo tetto è solo per impedire ai client di riprovare all'infinito comporta un ritardo totale di circa 32 secondi prima che una richiesta è considerato "un errore irreversibile".

Il seguente codice Python è un'implementazione della versione precedente flusso 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."