Standardowe odpowiedzi na błędy
Jeśli żądanie do interfejsu API podstawowego raportowania zostanie zrealizowane, interfejs API zwróci 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 Core Reporting API został zaprojektowany 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.
- Wyślij żądanie do interfejsu API
- otrzyma odpowiedź o błędzie zawierającą kod błędu umożliwiającego ponawianie próby;
- Zaczekaj 1 s i
random_number_milliseconds
s - Ponów prośbę
- otrzyma odpowiedź o błędzie zawierającą kod błędu umożliwiającego ponawianie próby;
- Zaczekaj 2 s i
random_number_milliseconds
s - Ponów prośbę
- otrzyma odpowiedź o błędzie zawierającą kod błędu umożliwiającego ponawianie próby;
- Zaczekaj 4 s i
random_number_milliseconds
s - Ponów prośbę
- otrzyma odpowiedź o błędzie zawierającą kod błędu umożliwiającego ponawianie próby;
- Odczekaj 8 s +
random_number_milliseconds
s - Ponów prośbę
- otrzyma odpowiedź o błędzie zawierającą kod błędu umożliwiającego ponawianie próby;
- Odczekaj 16 s +
random_number_milliseconds
s - Ponów prośbę
- 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."