במדריך הזה נסביר על Google Stackdriver, שמאפשר לכם לבצע את הפעולות הבאות באפליקציות שלכם ב-Google Cloud Platform:
- יוצרים תמונת מצב של ניפוי באגים באפליקציות שפועלות ב-App Engine, ב-Compute Engine וב-Container Engine.
- צפייה ביומני האפליקציות
- הגדרת מדדים, מעקב אחריהם וקבלת התראות.
- אפשר לעקוב אחרי הקריאות ל-API ולקבל פירוט של זמני התגובה וצווארי בקבוק פוטנציאליים בקוד.
- הוספת נקודות לרישום ביומן לאפליקציה שפועלת, בלי צורך לפרוס את האפליקציה. זו תכונה ייחודית (ומקווה שגם שימושית).
במדריך הזה נבצע את הפעולות הבאות מאפס:
- יצירת פרויקט ב-Google Cloud Platform (ב-App Engine ספציפית)
- הגדרת מאגר מקורות של פרויקט ב-Google Cloud Platform
- שימוש במקור של אפליקציית Python Guestbook רגילה שזמינה מ-Github
- פריסת הקוד
- איך אפשר לקבל תמונות מצב לניפוי באגים של האפליקציה הפועלת
- עיון ביומנים ובמעקב אחר קריאות לאפליקציות
- הוספת נקודות לרישום ביומן לאפליקציה שפועלת כרגע. התכונה הזו תוארה לראשונה בפוסט הזה בבלוג : Add Application Logs to an application with no restarts
בואו נתחיל.
התוכן הזה נוצר במקור על ידי Romin Irani ופורסם כאן.
הגדרת סביבה בקצב אישי
אם עדיין אין לכם חשבון Google (Gmail או Google Apps), אתם צריכים ליצור חשבון. נכנסים ל-Google Cloud Platform Console (console.cloud.google.com) ויוצרים פרויקט חדש:
חשוב לזכור את מזהה הפרויקט, שהוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם שמופיע למעלה כבר תפוס ולא יתאים לכם, מצטערים!). בהמשך ה-codelab הזה, נתייחס אליו כאל PROJECT_ID
.
בשלב הבא, תצטרכו להפעיל את החיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.
העלות של התרגיל הזה לא אמורה להיות גבוהה, אבל היא יכולה להיות גבוהה יותר אם תחליטו להשתמש ביותר משאבים או אם תשאירו אותם פועלים (ראו את הקטע 'ניקוי' בסוף המסמך הזה).
משתמשים חדשים ב-Google Cloud Platform זכאים לתקופת ניסיון בחינם בשווי 300$.
Google Cloud Shell
ב-codelab הזה נשתמש ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.
המכונה הווירטואלית הזו מבוססת על Debian, וטעונים בה כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. כלומר, כל מה שצריך בשביל ה-codelab הזה הוא דפדפן (כן, הוא עובד ב-Chromebook).
כדי להפעיל את Google Cloud Shell, פשוט לוחצים על הלחצן בפינה השמאלית העליונה במסוף למפתחים (הקצאת המשאבים והחיבור לסביבה אמורים להימשך רק כמה רגעים):
לאחר מכן מאשרים את התנאים וההגבלות ולוחצים על הקישור 'הפעלת Cloud Shell':
אחרי שמתחברים ל-Cloud Shell, אמור להופיע אימות שכבר בוצע ושהפרויקט כבר הוגדר ל-PROJECT_ID
:
gcloud auth list
פלט הפקודה
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
פלט הפקודה
[core] project = <PROJECT_ID>
אם מסיבה כלשהי הפרויקט לא מוגדר, פשוט מריצים את הפקודה הבאה :
gcloud config set project <PROJECT_ID>
מחפשים את PROJECT_ID
? כדאי לבדוק באיזה מזהה השתמשתם בשלבי ההגדרה, או לחפש אותו בלוח הבקרה של המסוף:
חשוב: בסיום, מגדירים את אזור ברירת המחדל ואת הגדרת הפרויקט:
gcloud config set compute/zone us-central1-f
אפשר לבחור מתוך מגוון אזורים שונים. מידע נוסף זמין במסמכי התיעוד בנושא אזורים ותחומים.
בדיקת ממשקי ה-API המופעלים של StackDriver
בהמשך מפורטים ממשקי ה-API שהופעלו בפרויקט. משתמשים בסרגל החיפוש כדי למצוא את מרכז הבקרה של ה-API, כמו שמוצג בהמשך.
בודקים אילו ממשקי API הופעלו בפרויקט :
כל פרויקט ב-Google Cloud Platform מציע אירוח פרטי של Git, אבל קודם צריך ליצור מאגר ברירת מחדל כדי לעבוד איתו. מנווטים אל Source Repositories באמצעות תיבת החיפוש במסוף :
לוחצים על CREATE REPOSITORY (יצירת מאגר) כדי ליצור מאגר קוד חדש בשם default:
באמצעות Cloud Shell, נשכפל את הספרייה הזו למופע Google Cloud Shell שלנו. לשם כך, ניצור קודם ספרייה במכונת Cloud Shell שלנו ונעבור אליה, כמו שמוצג בהמשך (פלט לדוגמה):
mkdir stackdriver-demo
cd stackdriver-demo/
עכשיו אפשר לשכפל את מאגר ברירת המחדל באמצעות פקודת gcloud כמו שמוצג בהמשך:
gcloud source repos clone default
זה הפלט שיוצג במסוף :
Cloning into '/home/gcp123_student/default'...
warning: You appear to have cloned an empty repository.
Project [qwiklabs-gcp-1234abc1234] repository [default] was cloned to [/home/gcp123_student/default].
נהדר! בואו נתעמק קצת יותר ב-git remotes שהוגדרו. זה לא בהכרח מה שקורה, אבל זה יכול לעזור לכם להבין טוב יותר מה קורה מאחורי הקלעים.
עוברים לספריית ברירת המחדל שנוצרה ומריצים את הפקודה git remote -v
כמו שמוצג בהמשך
cd default
git remote -v
זהו פלט המסוף שאתם אמורים לראות, משהו דומה לזה:
origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (fetch)
origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (push)
אפשר לראות שהקישור הזה מצביע על מאגר ה-Git שמשויך לפרויקט GCP שלנו.
משיכת אפליקציית ספר האורחים מ-GitHub
האפליקציה שבה נשתמש היא אפליקציית App Engine רגילה בשם Guestbook, והיא זמינה במאגר הרשמי של Google Cloud Platform ב-GitHub. האפליקציה הזו היא גם חלק מהתיעוד הרשמי לתחילת העבודה. הפרויקט ב-Github זמין בכתובת : https://github.com/GoogleCloudPlatform/appengine-guestbook-python
עכשיו נמשוך את הקוד הזה למופע Cloud Shell שלנו. הפקודה והפלט שלה מוצגים כאן :
git pull https://github.com/GoogleCloudPlatform/appengine-guestbook-python
זה הפלט שיוצג במסוף :
remote: Counting objects: 485, done. remote: Total 485 (delta 0), reused 0 (delta 0), pack-reused 485 Receiving objects: 100% (485/485), 436.42 KiB | 163.00 KiB/s, done. Resolving deltas: 100% (195/195), done. From https://github.com/GoogleCloudPlatform/appengine-guestbook-python * branch HEAD -> FETCH_HEAD
כל הקוד נמצא עכשיו באופן מקומי במופע Google Cloud Shell שלנו. אפשר לראות את הקבצים השונים שנמשכו מפרויקט Github.
דחיפת הקוד הנוכחי למאגר Git של הפרויקט באמצעות Cloud Shell
עכשיו נדחוף את הקוד הזה למאגר Git של פרויקט GCP, כדי שנוכל להגדיר נקודות עצירה, נקודות רישום ועוד לקוד שלנו. הערה: זה לא שלב חובה, כי אפשר לבצע אינטגרציה ישירות עם GitHub, עם המחשב המקומי ועם דרכים אחרות לקישור קוד המקור.
אבל למטרה שלנו כאן, אנחנו נדחוף את הקוד הזה למאגר Git של פרויקט GCP. הפעולה הזו מתבצעת באמצעות פקודת ה-git push הרגילה, כמו שמוצג בהמשך:
git push origin master
זה הפלט שיוצג במסוף :
Counting objects: 485, done. Compressing objects: 100% (280/280), done. Writing objects: 100% (485/485), 436.42 KiB | 0 bytes/s, done. Total 485 (delta 195), reused 485 (delta 195) remote: Storing objects: 100% (485/485), done. remote: Processing commits: 100% (152/152), done. To https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default * [new branch] master -> master
עכשיו, חוזרים אל GCP Cloud Console, ספציפית אל הקטע Development. לוחצים על Source Code (קוד מקור) ואמורים לראות את כל קובצי הפרויקט במאגר ברירת המחדל. פלט לדוגמה:
הכול מוכן עכשיו לפריסת אפליקציית פנקס האורחים של App Engine. כדי לפרוס את האפליקציה, מוודאים שאתם ב-Google Cloud Shell ובספריית ברירת המחדל, כמו שהיה עד עכשיו. משתמשים בפקודה gcloud app deploy
כמו בדוגמה הבאה:
gcloud app deploy --version 1
כשמתבקשים לבחור אזור, בוחרים באפשרות [1] us-east1.
זה הפלט שיוצג במסוף :
You are about to deploy the following services: — qwiklabs-gcp-1234abc1234/default/1 (from [/home/gcp123-student/default/app.yaml]) Deployed URL: [https://qwiklabs-gcp-1234abc1234.appspot.com] Do you want to continue (Y/n)? Y Beginning deployment of service [default]... File upload done. Updating service [default]...done. Deployed service [default] to https://qwiklabs-gcp-1234abc1234.appspot.com]
שימו לב שסיפקנו פרמטר גרסה לפקודה של פריסת האפליקציה. הגדרנו לו ערך של "1"
.
מאחר שאפליקציית ספר האורחים משתמשת ב-Google Cloud Datastore לצורך שמירת נתונים, צריך לעדכן את האינדקסים של Datastore. האינדקסים מצוינים בקובץ index.yaml
, ואנחנו פשוט משתמשים בפקודה gcloud datastore create-indexes
כמו בדוגמה הבאה:
gcloud datastore create-indexes index.yaml
זה הפלט שיוצג במסוף :
You are about to update the following configurations: — qwiklabs-gcp-1234abc1234/index From: [/home/gcp123_student/default/index.yaml] Do you want to continue (Y/n)? Y
יכול להיות שיעבור זמן עד שהאינדקסים של Datastore יתעדכנו. כדי לבדוק את הסטטוס, מחפשים את האפשרות Datastore indexes (אינדקסים של Datastore) ולוחצים על Indexes (אינדקסים). בזמן בניית האינדקסים, הסטטוס יופיע עם הערך 'יצירת אינדקס', כמו שמוצג בהמשך:
כדי לבדוק אם האפליקציה שלנו עם גרסה 1 נפרסה וזמינה, עוברים אל Compute (חישוב) ← App Engine ולוחצים על Versions (גרסאות) כמו שמוצג בהמשך:
עכשיו הכול אמור להיראות תקין, ואפשר לעיין בפרויקט בכתובת https://<PROJECT_ID>.appspot.com
. שוב, יכול להיות שיחלפו כמה דקות קצרות עד שהאינדקסים של מאגר הנתונים יהיו מוכנים, לכן אם האפליקציה מציגה שגיאה (לדוגמה: שגיאת שרת פנימית), כדאי לנסות שוב כמה דקות מאוחר יותר.
עכשיו נשתמש באפליקציה. נתחבר וניצור כמה רשומות בספר האורחים, כמו שמוצג בהמשך:
נהדר! עכשיו אפשר להתחיל להשתמש בתכונות של Stackdriver.
קודם נראה איך אפשר לצלם תמונות מצב של האפליקציה הפועלת. התמונות האלה שימושיות אם רוצים לנפות באגים בחלק מסוים של הקוד, לבדוק את המשתנים ועוד. כל זה קורה בזמן שהאפליקציה שלכם עדיין מוצגת. האפשרות הזו שימושית מאוד אם מקבלים דיווחים על בעיה באפליקציה ורוצים לנסות לנפות באגים ולראות מה קורה באפליקציה, לבדוק הרבה משתנים, לצלם את התמונה בתנאים מסוימים ועוד.
בואו נעשה את זה עכשיו לאפליקציית ספר האורחים. אם מישהו יבקש את דף הבית, נבקש תמונה של הדף, ובמיוחד נרצה לראות את רשימת הברכות שמופיעה כרגע ב-Datastore.
הקוד לכך מופיע בקובץ guestbook.py
. אנחנו רוצים להתחיל לבדוק את הקוד בזמן הריצה אחרי שהוא מאחזר את רשימת הברכות ממאגר הנתונים. הפעולה הזו מתבצעת בשורה 72. לכן אפשר להגדיר נקודת עצירה בשורה 74, כדי לדעת שהשורה 72 בוצעה.
כדי לעשות זאת, לוחצים על Debug בתצוגת הגרסה של AppEngine או עוברים אל Stackdriver → Debug . יוצג המסך שמופיע למטה. צריך לבחור את הקובץ (guestbook.py
) בצד ימין, ואז ללחוץ על מספר השורה כמו שמוצג.
תוצג הודעה שמודגשת בתיבה האדומה שלמעלה, שלפיה המערכת ממתינה להפעלת צילום תמונה. עכשיו, כל מה שצריך לעשות הוא להיכנס לדף שלנו בכתובת
https://<PROJECT_ID>.appspot.com
.
אחרי שתעשו את זה, תמונת המצב תופעל ותראו שהקטעים Variables (משתנים) ו-Call stack (מחסנית קריאות) מתמלאים כמו שמוצג בהמשך. בודקים איך המשתנים מוצגים, ואפשר להרחיב אותם כדי לראות את הערכים. זה מאוד שימושי.
לדוגמה, אם מרחיבים את המשתנה greetings, רואים שיש לו רשומות שמתאימות למספר הרשומות בספר האורחים שיצרתם.
תכונה שימושית מאוד היא האפשרות לצלם תמונת מצב מחדש בכל שלב. פשוט לוחצים על סמל המצלמה בכל שלב, והיא תמתין שוב לצילום התמונה כמו שמוצג למטה:
אפשר להשתמש בשדה Expressions (ביטויים) כמו שמוצג למטה כדי לעקוב אחרי משתנים ספציפיים. לדוגמה, נניח שיש לנו משתנה בשם greetings ואנחנו רוצים לבדוק את הערך שלו ברגע שנוצרת תמונת מצב. אפשר להוסיף את משתנה הברכה כמו שמוצג בצילום המסך שלמטה. כשהתמונה תצולם, היא תאוכלס בערכים שמוצגים.
אם רוצים שהתמונה תופעל רק בתנאי מסוים, אפשר להשתמש בשדה Condition (תנאי) כמו בדוגמה שלמטה. בדוגמה הזו, אנחנו אומרים שהתמונה צריכה להצטלם רק אם מספר הפעמים שהמשתמש אמר 'שלום' גדול מ-1. אתם יכולים להתנסות בזה אם אתם רוצים.
חשוב מאוד לוודא שהביצועים של אפליקציית האינטרנט שלכם עומדים בדרישות שהגדרתם. Stackdriver Trace הוא כלי חשוב שעוזר לכם להבין את זמן האחזור באפליקציות שלכם.
הוא מופעל כברירת מחדל לכל האפליקציות ב-App Engine, ומספק לנו פרטי ביצועים שימושיים מאוד לכל נקודות הקצה, יחד עם פירוט של קריאות שונות.
במקרה שלנו, נכנסנו לדף הבית ('/') וצפינו בערכים בפנקס האורחים או הוספנו ערכים. זה מספיק כדי שהכלי Trace יספק לנו מידע נוסף על זמן האחזור. פשוט עוברים אל Stackdriver Traces Overview ורואים צילום מסך כמו שמוצג למטה. שימו לב לעקבות האחרונים ולזמני האחזור שלהם.
אם נלחץ על אחד מהמעקבים, כלומר נלחץ על קישור ה-URI, יוצג המעקב המפורט כמו בדוגמה הבאה:
שימו לב איך המערכת מפרטת את זמן האחזור ומציינת אילו שיחות אורכות הכי הרבה זמן. מהתרשים שלמעלה אפשר לראות שהשאילתה של מאגר הנתונים אורכת זמן. אפשרות אחת שיכולה לעזור היא שמירת הנתונים במטמון כדי לצמצם את צוואר הבקבוק. שוב, הכול תלוי באפליקציה שלכם, והנתונים האלה יכולים לעזור לכם להבין אילו אזורים בנתוני המעקב של השיחות דורשים שינוי.
אפשר לעיין ביומני האפליקציות בכל שלב. לשם כך, עוברים אל Stackdriver Logging (כפי שמוצג בהמשך). יש כמה מסננים זמינים, החל משירותי GCP שונים → סוגי יומנים → רמת יומן → תאריך ועוד.
בצילום המסך שלמטה מוצגים היומנים של אפליקציית App Engine שלנו וגרסת ברירת המחדל 1.
לסיום, נציג תכונה שתעזור לכם להבין את האפשרויות שהיא מציעה. בדרך כלל, כמפתחים, אנחנו עושים כמיטב יכולתנו כדי להוסיף הצהרות יומן לקוד שלנו, פורסים את הקוד ואז מקווים שהיומן יספק לנו את כל המידע שאנחנו רוצים לדעת.
אבל אנחנו יודעים שזה לא מספיק, ורק כשמבצעים ניפוי באגים מבינים שאולי היה כדאי להוסיף עוד כמה הצהרות יומן פה ושם. בדרך כלל, תהליך העבודה הוא לשנות את הקוד, להוסיף את הצהרת היומן הנוספת, לפרוס מחדש ולעקוב.
זה בסדר, אבל מה אם היית יכול להוסיף את הצהרות היומן האלה (נקרא להן עכשיו נקודות יומן) לאפליקציה הפועלת שלך? כלומר, לא צריך לעצור את האפליקציה, לשנות את הקוד ולפרוס אותה מחדש. במקום זאת, אפשר לנהל את רשימת נקודות היומן מחוץ לאפליקציה באמצעות התמיכה בנקודות יומן.
עדיין מתוך Cloud Shell, נבדוק את הרשימה הנוכחית של נקודות הרישום שהגדרנו (שצריכה להיות 0). הפעולה הזו מתבצעת באמצעות הפקודה gcloud
, כמו שמוצג בהמשך:
gcloud debug logpoints list
זה הפלט שיוצג במסוף :
Debug target not specified. Using default target: default-1 Listed 0 items.
עכשיו נוסיף נקודת רישום ביומן לאפליקציה הפועלת. כדי להוסיף נקודת יומן, צריך לבצע את הפעולות הבאות:
- מזהים את קובץ קוד המקור ואת מספר השורה שבה רוצים להוסיף את נקודת היומן.
- מזהים את הודעת היומן. ההודעה ביומן יכולה להיות מקודדת או אפילו ביטוי.
בדוגמה שלנו, אנחנו הולכים להוסיף נקודת יומן לקובץ guestbook.py בשורה #74 באמצעות הפקודה logpoints create, כמו שמוצג בהמשך:
gcloud debug logpoints create guestbook.py:74 "Fetched greetings from Datastore. Count of greetings : {len(greetings)}"
זה הפלט שיוצג במסוף :
Debug target not specified. Using default target: default-1 — id: 53538243519d4-f9a0-bdbce location: guestbook.py:74 logLevel: INFO logMessageFormat: Fetched greetings from Datastore. Count of greetings : {len(greetings)} condition: None status: ACTIVE
צירפנו את filename:linenumber
ואת הודעת היומן שלמעלה. שימו לב שהודעת היומן שלנו מכילה גם ביטוי שידפיס את מספר הברכות שאוחזרו ממאגר הנתונים.
הפקודה חוזרת עם ההודעה שהוסף נקודת יומן. למטה מוצג צילום מסך מ-Cloud Shell:
עכשיו, אם מריצים את הפקודה של רשימת נקודות הרישום, יופיע הפלט הבא:
gcloud debug logpoints list
זה הפלט שיוצג במסוף :
Debug target not specified. Using default target: default-1 STATUS LOCATION CONDITION LOG_LEVEL LOG_MESSAGE_FORMAT ID ACTIVE guestbook.py:74 INFO Fetched greetings from Datastore. Count of greetings : {len(greetings)} 53538243519d4-f9a0-bdbce
כדי לראות את זה בפעולה, אפשר שוב להיכנס לדף הבית בכתובת https://<PROJECT_ID>.appspot.com
. הפעולה הזו תפעיל את הקוד, ובתורה את נקודת הרישום שלנו. חשוב לזכור שהפעולה הזו תתועד כברירת מחדל ביומני האפליקציות שלנו. לכן, כל מה שצריך לעשות הוא להיכנס שוב ל-Stackdriver Logging, כמו שמוצג בהמשך:
לוחצים על הבקשה הרלוונטית וזהו. בפרטים, תראו את נקודת הרישום שלנו מופעלת והודעת הרישום מוצגת.
אנחנו מקווים שנהניתם מההדרכה הזו. המאמר הזה מתייחס רק לחלק מהיכולות של פלטפורמת Stackdriver. יש עוד הרבה דברים לגלות. בבלוג של רומין אירני (המחבר המקורי של ה-codelab הזה) בכתובת https://rominirani.com/ אפשר למצוא מדריכים נוספים ל-Google Cloud Platform.
אפשר גם לעיין ב-codelab הזה שנקרא 'שימוש בניטור וברישום ביומן של Stackdriver כדי לקבל תמונה טובה יותר של תקינות האפליקציה'.
אם יש לכם משוב או שאתם רוצים לדווח על בעיות ב-codelab הזה, אתם יכולים להשתמש בקישור 'דיווח על באג' בפינה הימנית התחתונה של הדף.