פתרון בעיות שקשורות לסימוני תכונות

במדריך הזה מפורטים שלבים לאבחון ולפתרון של בעיות נפוצות שקשורות לדגלים של תכונות ב-App Lifecycle Manager.

הערכה של SDK וזמן ריצה

ממשק OpenFeature API מתוכנן כך שיספק בטיחות מקסימלית, ולכן הוא אף פעם לא יציג שגיאה שתגרום לקריסת האפליקציה.

תסמין: הסימון מחזיר ערך ברירת מחדל בטוח

אם אי אפשר להגיע לשירות הדגלים, הספק לא זמין או שהדגל לא מוגדר בצורה נכונה, ה-SDK מחזיר את ערך ברירת המחדל הנדרש שצוין בקוד.

פתרון:

  1. מאמתים את החיבור בין ספק OpenFeature לבין נקודת הקצה saasconfig.googleapis.com.
  2. בודקים אם יש שגיאות אימות. מוודאים שלחשבון השירות יש את ההרשאה roles/saasconfig.viewer.
  3. מוודאים שFLAGD_SOURCE_PROVIDER_ID נכון.

תיאור הבעיה: תוצאות הערכה לא צפויות

אם דגל לא מחזיר את הווריאציה הצפויה:

פתרון:

  1. בודקים את התנאים של ה-CEL ואת הקשר ההערכה.
  2. אם חסר מאפיין חובה בהקשר במהלך בדיקת תנאי, מנוע ההערכה מדלג על הכלל הספציפי הזה.
  3. אם חסר מאפיין במהלך הקצאה מבוססת-אחוזים, ההערכה מחזירה INVALID_CONTEXT.

מעקב אחר השקות

כשעוקבים אחרי השקה של feature flag, צריך לוודא גם את מצב התזמור (האם ההשקה הושלמה?) וגם את תקינות האפליקציה (האם הקובץ הבינארי קלט את ה-feature flag?).

מצב תזמור ההשקה

המערכת עוקבת אחרי שיעור ההצלחה של הפעולות בזמן אמת.

השהיה אוטומטית

כדי למנוע מצב שבו הגדרה 'פגומה' תגיע לכל הצי, המערכת משהה אוטומטית את ההשקה אם שיעור הכשלים חורג מתקציב השגיאות (ברירת המחדל היא 10% לכל מיקום).

בדיקת נתוני הסיכום

משתמשים בפקודה describe כדי לראות את ספירת הכשלים המצטברת ולקבוע אם ההשקה היא PAUSED או FAILED.

gcloud beta app-lifecycle-manager rollouts describe ROLLOUT_ID --location=global

סינון עדכונים שנכשלו ביחידות

אחרי שמאשרים שיש כשלים, צריך למצוא את היחידות הספציפיות שלא עודכנו. אפשר להשתמש במסנן הזה כדי לבודד רק את העדכונים של דגלי התכונות שנכשלו באזור ספציפי:

gcloud beta app-lifecycle-manager unit-operations list \
    --location=LOCATION \
    --filter="state:UNIT_OPERATION_STATE_FAILED AND flag_update:*"

אבחון שורש הבעיה

לכל פעולה שנכשלה, אפשר לאחזר הודעת שגיאה מפורטת שסופקה על ידי מנוע ההפעלה. קוראים את השדה state_message.

gcloud beta app-lifecycle-manager unit-operations describe OPERATION_ID --location=LOCATION

יחידה חסרה הגדרות

הסבר על הצמדת יחידות

הצמדה מקפיאה את היחידה בגרסה הנוכחית שלה, ומונעת את העדכון שלה על ידי פריסות אוטומטיות או ידניות. יחידה מוצמדת מוחרגת באופן מפורש מפעולות השקה עד שתקופת ההצמדה שלה מסתיימת או עד שמבטלים את ההצמדה שלה באופן ידני.

חסרה הגדרה מיחידות מוצמדות

תרחיש קריטי מתרחש כשמצמידים יחידה במהלך השקת תכונה באמצעות דגל תכונה. הצמדה חוסמת את כל העדכונים, כלומר היחידה מדלגת על הפעולה FlagUpdate שנדרשת כדי לקבל את ההגדרה שלה.

תסמין: אחרי שמבטלים את הצמדת היחידה ומשדרגים אותה לקובץ בינארי שדורש דגלי תכונות, האפליקציה לא מצליחה לבצע אתחול או נכנסת ללולאת ניסיון חוזר אינסופית, מה שמוביל לבדיקות מוכנות שנכשלות ולהפעלות מחדש רצופות של הקונטיינר.

הגורם הבסיסי: הערכים של default_flag_revisions ב-UnitKind לא עודכנו בזמן שהיחידה הייתה מוצמדת, ולכן ליחידה לא היה מערך פעיל של הגדרות אישיות.

פקודות אבחון

1. הצגת רשימה של פעולות סימון שנכשלו

כדי למצוא יחידות שלא עודכנו, מסננים את פעולות היחידה לפי המצב UNIT_OPERATION_STATE_FAILED והסוג flag_update.

gcloud beta app-lifecycle-manager unit-operations list \
    --location="LOCATION" \
    --filter="state:UNIT_OPERATION_STATE_FAILED AND flag_update:*"

2. סינון ספציפי של השקות של סימון תכונות שנכשלו

כדי לזהות עדכונים של דגלים שנכשלו בכל המכשירים או ביחידה ספציפית, מוסיפים תנאי למצב UNIT_OPERATION_STATE_FAILED.

# Find all failed operations for a specific unit
gcloud beta app-lifecycle-manager unit-operations list \
    --location="LOCATION" \
    --filter="unit:UNIT_ID AND state:UNIT_OPERATION_STATE_FAILED"

3. בדיקת הסיבה לכשל

משתמשים בפקודה describe כדי לקרוא את state_message.

gcloud beta app-lifecycle-manager unit-operations describe "OPERATION_ID" --location="LOCATION"

4. בדיקת מצב היחידה

אפשר גם לבדוק ישירות את המצב הנוכחי של יחידה. אם הפעלת התכונה באמצעות דגל נכשלת כרגע או שהפעולה האחרונה הסתיימה בשגיאה, זה יופיע בסטטוס. תנאים עם סוג של operationError.

gcloud beta app-lifecycle-manager units describe "UNIT_ID" --location="LOCATION"

הפחתת סיכונים ידנית

החלת שינויים בסימון ברירת המחדל של UnitKind

אם חסרה הגדרה של יחידה כי היא הוצמדה במהלך השקות, אפשר לשחזר אותה על ידי איפוס ידני של היחידה לבסיס הנוכחי שמוגדר ב-UnitKind שלה.

  1. מבטלים את הצמדת היחידה (אם היא מוצמדת).
  2. שליפת תיקונים שמוגדרים כברירת מחדל מ-UnitKind ברמת ההורה.
  3. יוצרים FlagRelease חדש שמכיל את השינויים האלה.
  4. מפעילים ידנית פעולה של יחידת FlagUpdate כדי להחיל את גרסת השחזור.
# 1. Unpin
gcloud beta app-lifecycle-manager units update "UNIT_ID" \
    --location="LOCATION" \
    --maintenance-pinned-until-time=""

# 2. Retrieve default revisions
gcloud beta app-lifecycle-manager unit-kinds describe "UNIT_KIND_ID" \
    --location="global" \
    --format="value(defaultFlagRevisions)"

# 3. Create recovery release
gcloud beta app-lifecycle-manager flags releases create "recovery-release-1" \
    --location="global" \
    --unit-kind="UNIT_KIND_ID" \
    --revisions="REVISIONS"

# 4. Initiate manual update
gcloud beta app-lifecycle-manager unit-operations create "recovery-op" \
    --unit="UNIT_ID" \
    --flag-release="recovery-release-1" \
    --location="global"