תגובות לשגיאות רגילות
אם הבקשה של Management API מבוצעת בהצלחה, ה-API יחזיר קוד הסטטוס 200
. אם מתרחשת שגיאה בבקשה, ה-API יחזיר בתשובה קוד סטטוס, סטטוס וסיבה של HTTP, בהתאם לסוג השגיאה.
בנוסף, גוף התגובה מכיל תיאור מפורט של הגורם לשגיאה. דוגמה לתגובת שגיאה:
{
"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]"
}
}
טבלת שגיאות
קוד | הסיבה | תיאור | מה מומלץ לעשות? |
---|---|---|---|
400 | invalidParameter |
מציין שלפרמטר של הבקשה יש ערך לא חוקי. השדות locationType ו-location בתגובת השגיאה מספקים מידע על הערך הלא חוקי. |
אין לנסות שוב ללא תיקון הבעיה. צריך לספק ערך חוקי לפרמטר שצוין בתגובת השגיאה. |
400 | badRequest |
מציין שהשאילתה לא הייתה חוקית. למשל, מזהה ההורה היה חסר או שהשילוב של המאפיינים או המדדים המבוקש לא היה חוקי. | אין לנסות שוב ללא תיקון הבעיה. עליכם לבצע שינויים בשאילתת ה-API כדי שהיא תפעל. |
401 | invalidCredentials |
מציין שאסימון האימות לא חוקי או שתוקפו פג. | אין לנסות שוב ללא תיקון הבעיה. עליך לקבל אסימון אימות חדש. |
403 | insufficientPermissions |
מציין שלמשתמש אין הרשאות מספיקות לישות שצוינה בשאילתה. | אין לנסות שוב ללא תיקון הבעיה. צריך לקבל את ההרשאות המתאימות כדי לבצע את הפעולה בישות שצוינה. |
403 | dailyLimitExceeded |
מציין שהמשתמש חרג מהמכסה היומית (לכל פרויקט או לכל תצוגה מפורטת (פרופיל)). | אין לנסות שוב ללא תיקון הבעיה. ניצלת את המכסה היומית שלך. מידע נוסף זמין בקטע מגבלות ומכסות של ממשקי API. |
403 | userRateLimitExceeded |
מציין שחרגת מהמגבלה של שאילתות ל-100 שניות לכל משתמש. ערך ברירת המחדל שמוגדר ב-Google API Console הוא 100 שאילתות לכל 100 שניות לכל משתמש. אפשר להגדיל את המגבלה הזו במסוף Google API ל-1,000 לכל היותר. | אפשר לנסות שוב באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff). עליך להאט את קצב שליחת הבקשות. |
403 | rateLimitExceeded |
מעיד על כך שחרגתם מהגבלת הקצב של שאילתות לכל 100 שניות של הפרויקט. | אפשר לנסות שוב באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff). עליך להאט את קצב שליחת הבקשות. |
403 | quotaExceeded |
מציין שהגעתם ל-10 בקשות בו-זמנית לכל צפייה (פרופיל) ב-Core Reporting API. | אפשר לנסות שוב באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff). עליך להמתין לפחות בקשה אחת פעילה כדי שהתצוגה המפורטת הזו (הפרופיל) תושלם. |
500 | internalServerError |
אירעה שגיאת שרת פנימית לא צפויה. | אין לנסות לשלוח את השאילתה הזו שוב יותר מפעם אחת. |
503 | backendError |
השרת החזיר שגיאה. | אין לנסות לשלוח את השאילתה הזו שוב יותר מפעם אחת. |
טיפול ב-500 או 503 תשובות
השגיאה 500
או 503
עלולה לגרום לעומס כבד או לבקשות גדולות יותר ומורכבות. בבקשות גדולות יותר, כדאי לבקש נתונים לפרק זמן קצר יותר. כדאי גם להטמיע השהיה מעריכית לפני ניסיון חוזר (exponential backoff).
התדירות של השגיאות האלה יכולה להיות תלויה בתצוגה המפורטת (פרופיל) ובכמות נתוני הדיווח שמשויכים לתצוגה המפורטת הזו. שאילתה שגורמת לשגיאה 500
או 503
לצפייה אחת (פרופיל) לא בהכרח תגרום לשגיאה באותה שאילתה עם תצוגה (פרופיל) שונה.
הטמעת השהיה מעריכית לפני ניסיון חוזר (exponential backoff)
השהיה מעריכית לפני ניסיון חוזר (exponential backoff) היא התהליך שבו לקוח מנסה מדי פעם לבצע ניסיון חוזר של בקשה שנכשלה לאורך זמן שגדל. זוהי אסטרטגיה סטנדרטית לטיפול בשגיאות באפליקציות רשת. ה-Management API מתוכנן מתוך הציפייה שלקוחות שבוחרים לנסות שוב בקשות שנכשלו עושים זאת באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff). מלבד האפשרות 'חובה', השימוש בהשהיה מעריכית לפני ניסיון חוזר (exponential backoff) מגדיל את יעילות השימוש ברוחב הפס, מצמצם את מספר הבקשות שנדרשות לקבלת תשובה מוצלחת ומגדיל את תפוקת הבקשות בסביבות בו-זמניות.
התהליך ליישום השהיה מעריכית פשוטה לפני ניסיון חוזר (exponential backoff) מתואר בהמשך.
- שליחת בקשה ל-API
- התקבלה תגובה של שגיאה עם קוד שגיאה של ניסיון חוזר
- צריך להמתין שנייה אחת +
random_number_milliseconds
שניות - ניסיון נוסף לשליחת הבקשה
- התקבלה תגובה של שגיאה עם קוד שגיאה של ניסיון חוזר
- צריך להמתין 2 שניות +
random_number_milliseconds
שניות - ניסיון נוסף לשליחת הבקשה
- התקבלה תגובה של שגיאה עם קוד שגיאה של ניסיון חוזר
- המתנה של 4 שניות +
random_number_milliseconds
שניות - ניסיון נוסף לשליחת הבקשה
- התקבלה תגובה של שגיאה עם קוד שגיאה של ניסיון חוזר
- צריך להמתין 8 שניות +
random_number_milliseconds
שניות - ניסיון נוסף לשליחת הבקשה
- התקבלה תגובה של שגיאה עם קוד שגיאה של ניסיון חוזר
- צריך להמתין 16 שניות +
random_number_milliseconds
שניות - ניסיון נוסף לשליחת הבקשה
- אם עדיין מופיעה הודעת שגיאה, מפסיקים ורושמים את השגיאה.
בתהליך שלמעלה, random_number_milliseconds
הוא מספר אקראי של אלפיות שנייה שקטן מ-1,000 או שווה לו. כך ניתן למנוע שגיאות נעילה מסוימות בהטמעות מסוימות בו-זמנית.
אחרי כל המתנה צריך להגדיר מחדש את random_number_milliseconds
.
הערה: זמן ההמתנה הוא תמיד ( 2 ^ n) + random_number_milliseconds
, כאשר n הוא מספר שלם שגדל באופן מונוטוני שמוגדר בהתחלה כ-0. n גדל ב-1 בכל איטרציה (כל בקשה).
האלגוריתם מוגדר לסיום כש-n הוא 5. התקרה הזו קיימת רק כדי למנוע מלקוחות לבצע ניסיונות חוזרים ללא הגבלה, והיא גורמת לעיכוב כולל של כ-32 שניות לפני שהבקשה נחשבת ל "שגיאה שחוזרת על עצמה".
קוד Python הבא הוא יישום של התהליך שלמעלה לשחזור משגיאות שמתרחשות בשיטה בשם 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."