תגובות שגיאה

תגובות שגיאה רגילות

אם בקשת ליבה של 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" , שימוש בהשהיה מעריכית מייעל את השימוש ברוחב פס, מפחית את מספר הבקשות שנדרשות כדי לקבל תגובה מוצלחת, ומגדיל את קצב הבקשות בבקשות בסביבות בו-זמנית.

כך מיושמים השהיה מעריכית פשוטה של ביצוע מעריכי:

  1. הגשת בקשה ל-API
  2. התקבלה הודעת שגיאה עם קוד שגיאה שניתן לנסות שוב
  3. המתנה של שנייה אחת + random_number_milliseconds שניות
  4. ניסיון חוזר
  5. התקבלה הודעת שגיאה עם קוד שגיאה שניתן לנסות שוב
  6. יש להמתין 2 שניות + random_number_milliseconds שניות
  7. ניסיון חוזר
  8. התקבלה הודעת שגיאה עם קוד שגיאה שניתן לנסות שוב
  9. יש להמתין 4 שניות + random_number_milliseconds שניות
  10. ניסיון חוזר
  11. התקבלה הודעת שגיאה עם קוד שגיאה שניתן לנסות שוב
  12. המתנה של 8 שניות + random_number_milliseconds שניות
  13. ניסיון חוזר
  14. התקבלה הודעת שגיאה עם קוד שגיאה שניתן לנסות שוב
  15. המתנה של 16 שניות + random_number_milliseconds שניות
  16. ניסיון חוזר
  17. אם עדיין מופיעה שגיאה, מפסיקים את השגיאה ומתעדים אותה.

בתהליך שלמעלה, 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."