התראות: שגיאות מבוססות-רישום בנושאי Pub/Sub

1. מבוא

העדכון האחרון: 21 ביוני 2023

התראות על שגיאות שמתבססות על יומן לגבי זמינות

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

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

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

נושאים ב-Pub/Sub כערוץ התראות

אפשר להשתמש בנושא Pub/Sub כערוץ התראות של Google Cloud Monitoring כדי לשלוח התראות למינוי Pub/Sub. כך תוכלו לשלב את ההתראות של Cloud Monitoring עם מערכות אחרות, כולל שירותי התראות של צד שלישי.

כדי להשתמש בנושא Pub/Sub כערוץ התראות, קודם צריך ליצור נושא Pub/Sub ומינוי Pub/Sub. לאחר מכן, צריך ליצור ערוץ התראות ב-Cloud Monitoring שמשתמש בנושא Pub/Sub כיעד.

כשמופעלת התראה, Cloud Monitoring שולח הודעה לנושא Pub/Sub. לאחר מכן, האפליקציה הרשומה למינוי Pub/Sub יכולה לעבד את ההודעה ולנקוט פעולה מתאימה.

מה תפַתחו

ב-Codelab הזה תפרסו אפליקציה, תיצרו נושא Pub/Sub ותיצרו התראה מבוססת-יומן שבודקת אם יש שגיאות בחלק מסוים של האפליקציה ומשתמשת בנושא Pub/Sub כערוץ התראות.

מה תלמדו

  • איך יוצרים נושא Pub/Sub
  • איך יוצרים התראה שמבוססת על יומן

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

מה תצטרכו

  • חשבון Google Cloud עם הרשאות ל:
  • פריסת אפליקציות Cloud Run
  • יצירת נושאים ב-Pub/Sub
  • יצירת התראות

2. תהליך ההגדרה

בחירה או יצירה של פרויקט ב-Google Cloud

כדי לבחור פרויקט קיים, משתמשים בתפריט הנפתח:

b35bf95b8bf3d5d8.png

כדי ליצור פרויקט חדש ב-Google Cloud, פועלים לפי השלבים הבאים:

  1. עוברים אל Google Cloud Platform Console.
  2. לוחצים על הלחצן Create Project (יצירת פרויקט).
  3. מזינים שם לפרויקט.
  4. בוחרים חשבון לחיוב עבור הפרויקט.
  5. לוחצים על הלחצן יצירה.

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

הנה פרטים נוספים על כל שלב:

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

מידע נוסף זמין במאמרי העזרה של Google Cloud בנושא יצירת פרויקטים.

3. פריסת אפליקציית ה-API

מהי מטרת האפליקציה לדוגמה או ה-API?

האפליקציה שלנו היא אפליקציית Inventory API פשוטה שחושפת נקודת קצה ל-API בארכיטקטורת REST עם כמה פעולות להצגת פריטי המלאי ולקבלת מספר המלאי של פריט ספציפי.

אחרי שנפרוס את ה-API, בהנחה שהוא מתארח בכתובת https://<somehost>, נוכל לגשת לנקודות הקצה של ה-API באופן הבא:

https://<somehost>/inventory

יוצגו כל פריטי המוצרים עם רמות המלאי הזמינות.

https://<somehost>/inventory/{productid}

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

הנתונים שמוחזרים בתגובה הם בפורמט JSON.

הערה: אפליקציית ה-API הזו מיועדת למטרות הדגמה בלבד, והיא לא מייצגת הטמעה מאובטחת ויציבה של API. המטרה היא שיהיה לנו יישום מהיר זמין, כדי לבחון את המטרה העיקרית של שיעור ה-Lab, כלומר Google Cloud Operations.

דוגמה לנתונים ולבקשת API ותשובה

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

קוד זיהוי מוצר

רמת המלאי הזמין

I-1

10

I-2

20

I-3

30

למטה מוצגות דוגמאות לבקשות API ולתשובות:

בקשת API

תגובה מה-API

https://<somehost>/inventory

[ { "I-1": 10, "I-2": 20, "I-3": 30 }]

https://<somehost>/inventory/I-1

{ "productid": "I-1", "qty": 10}

https://<somehost>/inventory/I-2

{ "productid": "I-2", "qty": 20}

https://<somehost>/inventory/I-200

{ "productid": I-200, "qty": -1}

שכפול המאגר

אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-codelab הזה תשתמשו ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.

ב-GCP Console, לוחצים על סמל Cloud Shell בסרגל הכלים שבפינה הימנית העליונה:

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

המכונה הווירטואלית הזו כוללת את כל הכלים שדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את כל העבודה ב-Lab הזה רק באמצעות דפדפן.

הגדרת gcloud

ב-Cloud Shell, מגדירים את מזהה הפרויקט ושומרים אותו כמשתנה PROJECT_ID.

PROJECT_ID=[YOUR-PROJECT-ID]

gcloud config set project $PROJECT_ID

מריצים את הפקודה הבאה:

$ git clone https://github.com/rominirani/cloud-code-sample-repository.git

תיקייה בשם cloud-code-sample-repository תיווצר בתיקייה הזו.

(אופציונלי) הפעלת האפליקציה ב-Cloud Shell

כדי להריץ את האפליקציה באופן מקומי:

  1. בטרמינל, עוברים לגרסת Python של ה-API באמצעות הפקודה הבאה:

$ cd cloud-code-sample-repository

$ cd python-flask-api

  1. בטרמינל, מזינים את הפקודה הבאה (בזמן הכתיבה, Cloud Shell מגיע עם Python 3.9.x מותקן, ואנחנו נשתמש בגרסת ברירת המחדל. אם אתם מתכננים להריץ אותו באופן מקומי במחשב הנייד, אתם יכולים להשתמש ב-Python 3.8+‎:

$ python app.py

  1. כדי להפעיל את שרת Python באופן מקומי, מריצים את הפקודה הבאה.

1f798fbddfdc2c8e.png 46edf454cc70c5a6.png

לוחצים על 'תצוגה מקדימה ביציאה 8080'. 5. ייפתח חלון בדפדפן. תופיע שגיאת 404 וזה בסדר. משנים את כתובת ה-URL כך שיופיע בה רק ‎ /inventory אחרי שם המארח.

לדוגמה, במחשב שלי זה נראה כך:

https://8080-cs-557561579860-default.cs-asia-southeast1-yelo.cloudshell.dev/inventory

תוצג רשימת פריטי המלאי כמו שהוסבר קודם:

709d57ee2f0137e4.png

  1. עכשיו אפשר לעצור את השרת. לשם כך, עוברים אל Terminal ומקישים על Ctrl-C.

פריסת האפליקציה

עכשיו נפרס את אפליקציית ה-API הזו ב-Cloud Run. התהליך כלל שימוש בלקוח שורת הפקודה gcloud כדי להריץ את הפקודה לפריסת הקוד ב-Cloud Run.

בטרמינל, מריצים את הפקודה הבאה ב-gcloud:

$ gcloud run deploy --source .

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

  1. שם השירות (python-flask-api): אפשר להשתמש בשם ברירת המחדל הזה או לבחור שם אחר, למשל my-inventory-api.
  2. ‫API [run.googleapis.com] not enabled on project [613162942481]. רוצה להפעיל ולנסות שוב (הפעולה תימשך כמה דקות)? (y/N)? Y
  3. צריך לציין אזור: בוחרים באפשרות 31 ‏ (us-west-1)
  4. ‫API [artifactregistry.googleapis.com] not enabled on project [613162942481]. רוצה להפעיל ולנסות שוב (הפעולה תימשך כמה דקות)? (y/N)? Y
  5. כדי לבצע פריסה ממקור, צריך מאגר Docker ב-Artifact Registry לאחסון קונטיינרים שנבנו. מאגר בשם [cloud-run-source-deploy] באזור [us-west1] ייווצר.
  6. להמשיך (Y/n)? Y
  7. לאפשר הפעלות לא מאומתות ל-‎[my-inventory-api] (y/N)? Y

בסופו של דבר, התהליך הזה יתחיל את התהליך של לקיחת קוד המקור, יצירת קונטיינר ממנו, העלאה שלו ל-Artifact Registry ואז פריסה של שירות Cloud Run והגרסה שלו. חשוב להמתין בסבלנות עד שהתהליך יסתיים (יכול להימשך 3-4 דקות). בסיום התהליך תוצג כתובת ה-URL של השירות.

דוגמה להרצה:

87ba8dbf88e8cfa4.png

בדיקת האפליקציה

אחרי שפורסים את האפליקציה ב-Cloud Run, אפשר לגשת לאפליקציית ה-API באופן הבא:

  1. שימו לב לכתובת ה-URL של השירות מהשלב הקודם. לדוגמה, בהגדרה שלי, הוא מוצג כ- https://my-inventory-api-bt2r5243dq-uw.a.run.app. נקרא לזה <SERVICE_URL>.
  2. פותחים דפדפן וניגשים ל-3 כתובות ה-URL הבאות של נקודות הקצה (endpoints) של ה-API:
  3. <SERVICE_URL>/inventory
  4. <SERVICE_URL>/inventory/I-1
  5. <SERVICE_URL>/inventory/I-100

הפורמט צריך להיות זהה לפורמט שצוין בקטע הקודם עם דוגמה לבקשת API ולתגובת API.

קבלת פרטי שירות מ-Cloud Run

פרסנו את שירות ה-API שלנו ב-Cloud Run, סביבת מחשוב ללא שרת. אפשר להיכנס לשירות Cloud Run דרך מסוף Google Cloud בכל שלב.

בתפריט הראשי, עוברים אל Cloud Run. תוצג רשימת השירותים שפועלים ב-Cloud Run. השירות שפרסתם אמור להופיע. בהתאם לשם שבחרתם, אמור להופיע משהו כזה:

2633965c4bc957cc.png

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

33042ae64322ce07.png

שימו לב לכתובת ה-URL, שהיא רק כתובת ה-URL של השירות שאפשר להזין בדפדפן ולגשת ל-Inventory API שפרסנו זה עתה. כדאי לעיין במדדים ובפרטים נוספים.

נתחיל עכשיו עם חבילת התפעול של Google Cloud.

4. יצירת נושא Pub/Sub לקבלת התראות

כדי ליצור נושא ב-Pub/Sub, אפשר לפעול לפי השלבים הבאים במסוף Google Cloud:

  1. מחפשים Pub/Sub בתיבת החיפוש ועוברים אל Pub/Sub. 935028bd8f6328ef.png
  2. אם אתם לא בכרטיסייה נושאים, לוחצים עליה. 7fd8bf91386a88fd.png
  3. לוחצים על הלחצן Create Topic (יצירת נושא). cd9d197f9023c41b.png
  4. מזינים שם שקל לזכור לנושא.

173f313b4a3c4934.png

  1. לוחצים על הלחצן יצירה. ca9a02477da21a44.png
  2. מעתיקים את שם הנושא באמצעות לחצן סמל ההעתקה. תצטרכו אותו בקטע הבא.

20848252ee83df93.png

5. יצירת מדיניות התראות לגבי שגיאות

עיון ביומני השגיאות

כדי לראות את יומני השגיאות של האפליקציה:

לוחצים על הכרטיסייה Logging (רישום ביומן).

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

6605b68395185b89.png

מדמים כמה בקשות לא חוקיות לשירות המלאי על ידי ציון מזהי מוצרים שלא מופיעים ברשימה I-1, ‏ I-2 ו-I-3. לדוגמה, בקשה שגויה היא:

https://<SERVICE_URL>/inventory/I-999

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

יצירת מדיניות התראות מותאמת אישית על סמך יומן רישום לשגיאות

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

  1. בתיבת השאילתה, מוסיפים את הפרמטרים הבאים של השאילתה:

resource.type="cloud_run_revision"

textPayload =~ "WARNING in app: Received inventory request for incorrect productid"

הוא אמור להיראות כך:

f672154cfebf0051.png

  1. לוחצים על Run Query (הרצת שאילתה). לאחר מכן יוצגו כל הבקשות שהתקבלו ויופיעו אלה שבהן יש בעיה.

77c190e3a2fab6bf.png

  1. כדי להמיר את השאילתה שלמעלה להתראה, לוחצים על הלחצן Create alert (יצירת התראה) שמופיע ב-Logs Explorer ממש מתחת לשדה השאילתה, בצד שמאל:

4cd3fcf142189376.png

  1. יוצג טופס ליצירת מדיניות התראות שמבוססת על יומן.

b82446854bad87fc.png

  1. משתמשים בשאילתה הראשונית ליומנים כדי לכלול אותם בהתראה:

resource.type="cloud_run_revision"

textPayload =~ "WARNING in app: Received inventory request for incorrect productid"

764227db73ec3de6.png

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

bb3d96448ec998a1.png

  1. לבסוף, בקטע 'למי לשלוח התראות?', בוחרים את ערוץ ההתראות של Pub/Sub שיצרתם קודם:

3593c48c29d4b76c.png

  1. לוחצים על שמירה. כדי לראות ולנהל את מדיניות ההתראות, עוברים לדף התראות ובודקים את הקטע 'מדיניות': ca08ea380fb37c91.png

6. מזל טוב

הגדרתם בהצלחה את בדיקת הזמינות לשליחת התראות ל-Pub/Sub.