תגובות שגיאה רגילות
אם בקשת ליבה של Reporting 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 Console ל-1,000 לכל היותר. | אפשר לנסות שוב להשתמש בהשהיה מעריכית השהיה. יש להאט את קצב השליחה של הבקשות. |
403 | rateLimitExceeded |
מציין שחרגתם מקצב הקצב של השאילתה לכל 100 שניות. | אפשר לנסות שוב להשתמש בהשהיה מעריכית השהיה. יש להאט את קצב השליחה של הבקשות. |
403 | quotaExceeded |
מציין שהושג 10 הבקשות המקבילות לכל תצוגה מפורטת (פרופיל) ב-Core Reporting API. | אפשר לנסות שוב להשתמש בהשהיה מעריכית השהיה. יש להמתין להשלמת בקשה אחת לפחות להשלמת התצוגה (פרופיל) הזה. |
500 | internalServerError |
אירעה שגיאה פנימית לא צפויה בשרת. | אין לנסות יותר את השאילתה הזו יותר מפעם אחת. |
503 | backendError |
השרת החזיר שגיאה. | אין לנסות יותר את השאילתה הזו יותר מפעם אחת. |
טיפול בתשובות 500 או 503
שגיאה של 500
או 503
עלולה לגרום לעומס רב או לבקשות מורכבות יותר. בבקשות גדולות יותר, כדאי לבקש נתונים למשך תקופת זמן קצרה יותר. כדאי גם ליישם השהיה מעריכית השהיה.
התדירות של השגיאות האלה עשויה להיות תלויה בתצוגה (פרופיל) ובכמות של נתוני הדיווח שמשויכים לתצוגה המפורטת הזו. שאילתה שגורמת לשגיאה 500
או 503
לתצוגה מפורטת אחת (פרופיל) לא בהכרח גורמת לשגיאה עבור אותה שאילתה עם תצוגה מפורטת אחרת (פרופיל).
יישום השהיה מעריכית השהיה
השהיה מעריכית מושהית היא התהליך שבמסגרתו לקוח מנסה מדי פעם לשלוח שוב ושוב בקשה שנכשלה, למשך זמן ארוך יותר. זוהי אסטרטגיה סטנדרטית לטיפול בשגיאות עבור אפליקציות רשת. ה-Core Reporting API מבוסס על ציפייה שלקוחות שמנסים לנסות שוב את הבקשות שנכשלו מקבלים אותן אחרי השהיה מעריכית. מלבד השימוש ב- "required" , שימוש בהשהיה מעריכית מייעל את השימוש ברוחב פס, מפחית את מספר הבקשות שנדרשות כדי לקבל תגובה מוצלחת, ומגדיל את קצב הבקשות בבקשות בסביבות בו-זמנית.
כך מיושמים השהיה מעריכית פשוטה של ביצוע מעריכי:
- הגשת בקשה ל-API
- התקבלה הודעת שגיאה עם קוד שגיאה שניתן לנסות שוב
- המתנה של שנייה אחת +
random_number_milliseconds
שניות - ניסיון חוזר
- התקבלה הודעת שגיאה עם קוד שגיאה שניתן לנסות שוב
- יש להמתין 2 שניות +
random_number_milliseconds
שניות - ניסיון חוזר
- התקבלה הודעת שגיאה עם קוד שגיאה שניתן לנסות שוב
- יש להמתין 4 שניות +
random_number_milliseconds
שניות - ניסיון חוזר
- התקבלה הודעת שגיאה עם קוד שגיאה שניתן לנסות שוב
- המתנה של 8 שניות +
random_number_milliseconds
שניות - ניסיון חוזר
- התקבלה הודעת שגיאה עם קוד שגיאה שניתן לנסות שוב
- המתנה של 16 שניות +
random_number_milliseconds
שניות - ניסיון חוזר
- אם עדיין מופיעה שגיאה, מפסיקים את השגיאה ומתעדים אותה.
בתהליך שלמעלה, random_number_milliseconds
הוא מספר אקראי
של אלפיות שנייה הקטן מ-1000 או שווה לו. הפעולה הזו נדרשת
כדי להימנע משגיאות נעילה מסוימות בהטמעות מסוימות בו-זמנית.
יש להגדיר מחדש את 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."