Odpowiedzi na błędy

Standardowe odpowiedzi na błędy

Jeśli żądanie do interfejsu Real Time Reporting API zostanie zrealizowane, interfejs API zwraca kod stanu 200. Jeśli w żądaniu wystąpi błąd, interfejs API zwraca w odpowiedzi kod stanu HTTP, stan i przyczynę odpowiednio do typu błędu. Poza tym treść odpowiedzi zawiera szczegółowy opis przyczyny błędu. Oto przykładowa odpowiedź o błędzie:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "invalidParameter",
    "message": "Invalid value '-1' for max-results. Value must be within the range: [1, 1000]",
    "locationType": "parameter",
    "location": "max-results"
   }
  ],
  "code": 400,
  "message": "Invalid value '-1' for max-results. Value must be within the range: [1, 1000]"
 }
}

Tabela błędów

Kod Przyczyna Opis Zalecane działanie
400 invalidParameter Wskazuje, że parametr żądania ma nieprawidłową wartość. Pola locationType i location w odpowiedzi o błędzie zawierają informacje o tym, która wartość jest nieprawidłowa. Nie ponawiaj próby bez rozwiązania problemu. Musisz podać prawidłową wartość parametru określonego w odpowiedzi o błędzie.
400 badRequest Wskazuje, że zapytanie było nieprawidłowe. Przykład: brak identyfikatora elementu nadrzędnego albo żądana kombinacja wymiarów lub danych była nieprawidłowa. Nie ponawiaj próby bez rozwiązania problemu. Aby zapytanie do interfejsu API działało, musisz je najpierw zmienić.
401 invalidCredentials Wskazuje, że token uwierzytelniania jest nieprawidłowy lub wygasł. Nie ponawiaj próby bez rozwiązania problemu. Musisz uzyskać nowy token uwierzytelniania.
403 insufficientPermissions Wskazuje, że użytkownik nie ma wystarczających uprawnień do encji określonej w zapytaniu. Nie ponawiaj próby bez rozwiązania problemu. Aby wykonać operację na określonym elemencie, musisz mieć wystarczające uprawnienia.
403 dailyLimitExceeded Wskazuje, że użytkownik przekroczył limit dzienny (na projekt lub na wyświetlenie (profil). Nie ponawiaj próby bez rozwiązania problemu. Dzienny limit został wykorzystany. Zobacz Limity i ograniczenia interfejsu API.
403 userRateLimitExceeded Oznacza to, że został przekroczony limit zapytań na 100 sekund na użytkownika. Wartość domyślna ustawiona w Konsoli interfejsów API Google to 100 zapytań na 100 sekund na użytkownika. W Konsoli interfejsów API Google możesz zwiększyć ten limit do maksymalnie 1000. Spróbuj ponownie, korzystając z wykładniczego ponowienia. Musisz zmniejszyć częstotliwość wysyłania żądań.
403 rateLimitExceeded Wskazuje, że limit liczby zapytań na 100 sekund został przekroczony. Spróbuj ponownie, korzystając z wykładniczego ponowienia. Musisz zmniejszyć częstotliwość wysyłania żądań.
403 quotaExceeded Wskazuje, że osiągnięto maksymalną liczbę 10 żądań równoczesnych na widok (profil) w interfejsie API podstawowego raportowania. Spróbuj ponownie, korzystając z wykładniczego ponowienia. Musisz poczekać na zrealizowanie co najmniej jednego żądania w toku dla tego widoku (profilu).
500 internalServerError Wystąpił nieoczekiwany błąd wewnętrzny serwera. Nie ponawiaj tego zapytania więcej niż raz.
503 backendError Serwer zwrócił błąd. Nie ponawiaj tego zapytania więcej niż raz.

Obsługa odpowiedzi 500 i 503

Błąd 500 lub 503 może wystąpić podczas dużego obciążenia lub w przypadku bardziej złożonych żądań. W przypadku większych żądań spróbuj poprosić o dane z krótszego okresu. Rozważ też wdrożenie wykładniczego ponowienia. Częstotliwość tych błędów może zależeć od widoku (profilu) i ilości danych raportowania powiązanych z tym widokiem. Zapytanie, które powoduje błąd 500 lub 503 w jednym widoku danych (profilu), nie musi oznaczać błędu dla tego samego zapytania w innym widoku (profilu).

Wdrażanie wykładniczego ponawiania

Wykładnicze ponawianie to proces, w którym klient okresowo ponawia próbę nieudanego żądania przez dłuższy czas. Jest to standardowa strategia obsługi błędów w aplikacjach sieciowych. Interfejs Real Time Reporting API zaprojektowano z myślą o tym, że klienty, które ponawiają nieudane żądania, robią to z użyciem wykładniczego ponowienia. Poza tym, że jest ono „wymagane”, korzystanie z niego zwiększa wydajność wykorzystania przepustowości, zmniejsza liczbę żądań wymaganych do uzyskania pomyślnej odpowiedzi i maksymalizuje przepustowość żądań w równoczesnych środowiskach.

Proces implementacji prostego, wykładniczego ponowienia jest opisany poniżej.

  1. Wyślij żądanie do interfejsu API
  2. otrzyma odpowiedź o błędzie zawierającą kod błędu umożliwiającego ponawianie próby;
  3. Zaczekaj 1 s i random_number_milliseconds s
  4. Ponów prośbę
  5. otrzyma odpowiedź o błędzie zawierającą kod błędu umożliwiającego ponawianie próby;
  6. Zaczekaj 2 s i random_number_milliseconds s
  7. Ponów prośbę
  8. otrzyma odpowiedź o błędzie zawierającą kod błędu umożliwiającego ponawianie próby;
  9. Zaczekaj 4 s i random_number_milliseconds s
  10. Ponów prośbę
  11. otrzyma odpowiedź o błędzie zawierającą kod błędu umożliwiającego ponawianie próby;
  12. Odczekaj 8 s + random_number_milliseconds s
  13. Ponów prośbę
  14. otrzyma odpowiedź o błędzie zawierającą kod błędu umożliwiającego ponawianie próby;
  15. Odczekaj 16 s + random_number_milliseconds s
  16. Ponów prośbę
  17. Jeśli błąd nadal występuje, zatrzymaj go i zarejestruj.

W powyższym procesie random_number_milliseconds jest losową liczbą milisekund równą lub mniejszą od 1000. Jest to konieczne, aby uniknąć pewnych błędów blokady w niektórych równoczesnych implementacjach. Po każdym oczekiwaniu trzeba ponownie określić właściwość random_number_milliseconds.

Uwaga: czas oczekiwania wynosi zawsze (2 ^ n) + random_number_milliseconds, gdzie n to monotonicznie rosnąca liczba całkowita, początkowo zdefiniowana jako 0. Wartość n zwiększa się o 1 z każdą iteracją (każde żądanie).

Algorytm kończy działanie, gdy wartość n wynosi 5. Ogranicza się go tylko po to, aby uniemożliwić klientom nieskończone ponawianie prób w nieskończoność, przez co powoduje całkowite opóźnienie (około 32 sekundy) przed uznaniem żądania za „nieodwracalny błąd”.

Poniższy kod w Pythonie to implementacja powyższego procesu usuwania błędów, które wystąpiły w metodzie 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."