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

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

אם הבקשה של 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) מתואר בהמשך.

  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 הוא מספר אקראי של אלפיות שנייה שקטן מ-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."