שימוש בניפוי באגים ב-Google Stackdriver , Trace, Logging ו-Logpoints

המדריך הזה יעזור לכם לצאת לסיור ב-Google Stackdriver, שמאפשר לכם לבצע את הפעולות הבאות באפליקציות שלכם ב-Google Cloud Platform:

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

במדריך הזה נבצע את הפעולות הבאות מאפס:

  1. יצירה של פרויקט Google Cloud Platform (App Engine באופן ספציפי)
  2. הגדרת מאגר מקורות של פרויקט Google Cloud Platform
  3. איך להשתמש במקור הרגיל של אפליקציית Python לאורחים ב-GitHub
  4. פריסת הקוד
  5. איך אנחנו יכולים לקבל תמונות מצב של ניפוי באגים באפליקציה שפועלת?
  6. מעקב אחר רישום שיחות ויומני מעקב אחר אפליקציות
  7. הוספת נקודות רישום (logpoint) לאפליקציה הפועלת כרגע. התכונה הזו טופלה לראשונה בפוסט הזה בבלוג: הוספת יומני אפליקציות לאפליקציה ללא הפעלות מחדש

בואו נתחיל.

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

הגדרת סביבה בקצב עצמי

אם עדיין אין לכם חשבון Google (Gmail או Google Apps), עליכם ליצור חשבון. נכנסים למסוף ב-Google Cloud Platform (console.cloud.google.com) ויוצרים פרויקט חדש:

צילום מסך מ-2016-02-10 12:45:26.png

חשוב לזכור את מזהה הפרויקט הוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם הקודם כבר תפוס, והוא לא יעבוד בשבילך.) נתייחס אליו מאוחר יותר ב-codelab הזה בתור PROJECT_ID.

לאחר מכן, עליך להפעיל חיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.

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

משתמשים חדשים ב-Google Cloud Platform זכאים לתקופת ניסיון בחינם בשווי 300$.

Google Cloud Shell

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

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

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

playCloudShell.png

לאחר מכן מאשרים את התנאים וההגבלות ולוחצים על הקישור "Start Cloud Shell"

x.png

צילום מסך 2017-06-14 בשעה 22:13.43

לאחר החיבור למעטפת בענן, עליך לראות שכבר ביצעת אימות ושהפרויקט כבר מוגדר ל-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 שלך? בודקים באיזה מזהה השתמשתם בשלבי ההגדרה או מחפשים אותו במרכז השליטה של המסוף:

Project_ID.png

חשוב: לבסוף, מגדירים את אזור ברירת המחדל ותצורת הפרויקט:

gcloud config set compute/zone us-central1-f

אפשר לבחור מתוך מגוון אזורים. מידע נוסף זמין בתיעוד בנושא אזורים ואזורים.

לעיון בממשקי ה-API המופעלים ב-StackDriver

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

בודקים את ממשקי ה-API הספציפיים שהופעלו לפרויקט :

בכל פרויקט של Google Cloud Platform יש אירוח Git פרטי, אבל קודם אנחנו צריכים ליצור מאגר ברירת מחדל כדי לעבוד איתו. עוברים אל מאגרי המקורות באמצעות תיבת החיפוש של המסוף :

לוחצים על "Create REPOSITORY" כדי ליצור מאגר קוד חדש בשם "default"

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

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

דחיפת הקוד הנוכחי ל-Cloud Shell למאגר הפרויקטים של Git

עכשיו אפשר להעביר את הקוד הזה למאגר הנתונים של GCP Git כדי שנוכל להגדיר בו נקודות עצירה, נקודות יומן ועוד. שימו לב שהשלב הזה לא נחוץ כי אפשר לשלב אותו ישירות ב-GitHub, במחשב המקומי ובדרכים אחרות לקישור קוד המקור.

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

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 ובמיוחד לקטע הפיתוח. לוחצים על 'קוד מקור', ועבור מאגר ברירת המחדל אמורה להופיע כל קובצי הפרויקט. הפלט לדוגמה מוצג בהמשך:

עכשיו הכול מוכן לפרוס את אפליקציית האורח שלנו. כדי לפרוס את האפליקציה, יש לוודא שאתם נמצאים ב-Google Cloud Shell ובספריית ברירת המחדל. ניתן להשתמש בפקודה gcloud app deploy כפי שמוצג למטה:

gcloud app deploy --version 1

כשמוצגת הבקשה לבחור אזור, בוחרים באפשרות [1] us-איסט1.

זה הפלט שמופיע במסוף :

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 indexs" וללחוץ על אינדקסים. במהלך היצירה של האינדקסים, יופיע סטטוס עם הערך "הוספה לאינדקס" כפי שמוצג כאן:

כדי לבדוק אם האפליקציה שלנו עם גרסה 1 נפרסה וזמינה, עוברים אל Compute ← App Engine ולוחצים על 'גרסאות' כפי שמוצג בהמשך:

עכשיו הכול אמור להיראות טוב ואפשר לבדוק את הפרויקט בכתובת https://<PROJECT_ID>.appspot.com. שוב, ייתכן שיחלפו מספר דקות עד שאינדקסי הנתונים יהיו מוכנים, כך שאם האפליקציה מציגה שגיאה (לדוגמה: שגיאת שרת פנימית), כדאי לנסות שוב בעוד מספר דקות.

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

נהדר! עכשיו הכול מוכן ואפשר להתחיל לחקור את התכונות של Stackdriver.

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

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

הקוד לשם זה נמצא בקובץ guestbook.py. ובפרט, אנחנו מעוניינים להתחיל לבדוק את הקוד בזמן הריצה, לאחר שיאחזר את רשימת הודעות הפתיחה מחנות הנתונים. הדבר מתבצע בשורה #72. עכשיו אנחנו יכולים להוסיף נקודת עצירה (breakpoint) בשורה 74, כדי שתדעו שיציאה מס' 22 תבוטל.

כדי לעשות זאת, לוחצים על "Debug" מתצוגת הגרסה של AppEngine או עוברים אל Stackdriver ← ניפוי באגים . עכשיו יוצג המסך. מה שעליך לעשות הוא לבחור את הקובץ (guestbook.py) מימין, ולאחר מכן ללחוץ על מספר השורה כפי שהוא מופיע.

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

https://<PROJECT_ID>.appspot.com

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

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

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

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

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

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

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

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

אם אנחנו לוחצים על מאפיין מעקב כלשהו, כלומר, לוחצים על הקישור של ה-URI, הוא מציג את המעקב המפורט לפי ההוראות הבאות:

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

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

בצילום המסך שמוצג בהמשך מוצגים היומנים של אפליקציית App Engine וגרסת ברירת המחדל של גרסה 1.

log.png

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

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

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

עדיין מתוך Cloud Shell, נאפשר לנו לבדוק את הרשימה הנוכחית של נקודות הלו"ז (שמוגדרות כ-0). ניתן לעשות זאת באמצעות הפקודה gcloud, כפי שמוצג בהמשך:

gcloud debug logpoints list

זה הפלט שמופיע במסוף :

Debug target not specified. Using default target: default-1
Listed 0 items.

עכשיו אנחנו מתכוונים להוסיף נקודת רישום לאפליקציה הפעילה. כדי להוסיף נקודת רישום (logpoint), אנחנו צריכים לבצע את הפעולות הבאות:

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

במקרה שלנו, נוסיף נקודת רישום לקובץ hostbook.py שבשורה #74 באמצעות הפקודה reportpoint ליצירת אירוע, כפי שמוצג בהמשך:

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 מוצג למטה:

עכשיו, אם מפעילים את הפקודה של Logpoints list, יוצג הפלט הבא:

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 עוד פעם, כפי שמוצג בהמשך:

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

אנחנו מקווים שנהנית מהמדריך הזה. היא נוגעת רק בחלק מהיכולות שפלטפורמת Stackdriver מביאה לטבלה. יש עוד הרבה מה ללמוד. תוכלו לקרוא את הבלוג של Romin Irani'(המחבר המקורי של קוד Lab זה) בכתובת https://rominirani.com/ כדי לקבל מדריכים נוספים של Google Cloud Platform.

אתם יכולים גם לנסות את שיעור ה-Lab הזה שנקרא "באמצעות Stackdriver's ולהיכנס לחשבון כדי להבין טוב יותר את מצב הבריאות של האפליקציה&&39;

אם יש לך משוב או אם ברצונך לדווח על בעיות ב-Codelab הזה, יש להשתמש בקישור "יש למצוא באג&ציטוט; בפינה הימנית התחתונה בדף הזה.