שימוש ב-Stackdriver Logging וב-Stackdriver Trace ל-Cloud Functions

1. מבוא

ב-codelab הזה תלמדו איך להשתמש בכלי הרישום ביומן ובכלי המעקב שזמינים לכל המפתחים שעובדים עם Cloud Functions. הכלים האלה מגיעים עם כל Cloud Function שאתם פורסים בכל השפות הנתמכות, והם אמורים לעזור לכם להיות יותר פרודוקטיביים כשאתם כותבים ומפעילים את הקוד חסר השרתים.

5815064fec87444b.png

תשתמשו ב-Cloud Function שמופעל על ידי HTTP, אבל כל מה שתלמדו רלוונטי גם לשפות אחרות ול-Cloud Functions שמופעלות על ידי אירועים אחרים.

2. הגדרה ודרישות

הגדרת סביבה בקצב אישי

  1. נכנסים אל Cloud Console ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. (אם עדיין אין לכם חשבון Gmail או G Suite, אתם צריכים ליצור חשבון).

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

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

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

Cloud Shell

אפשר להשתמש ב-Cloud Functions, וביכולות הרישום והמעקב שלו, מרחוק מהמחשב הנייד, אבל אנחנו נשתמש ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud.

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

  1. כדי להפעיל את Cloud Shell ממסוף Cloud, פשוט לוחצים על הפעלת Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (הקצאת המשאבים והחיבור לסביבה אמורים להימשך רק כמה רגעים).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

אחרי שמתחברים ל-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? כדאי לבדוק באיזה מזהה השתמשתם בשלבי ההגדרה, או לחפש אותו בלוח הבקרה של Cloud Console:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

ב-Cloud Shell מוגדרים גם כמה משתני סביבה כברירת מחדל, שיכולים להיות שימושיים כשמריצים פקודות בעתיד.

echo $GOOGLE_CLOUD_PROJECT

פלט הפקודה

<PROJECT_ID>
  1. לבסוף, מגדירים את אזור ברירת המחדל ואת הגדרת הפרויקט.
gcloud config set compute/zone us-central1-f

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

3. פריסת פונקציה פשוטה של Cloud Functions

כדי שיהיה משהו לעקוב אחריו, יוצרים פונקציה של Cloud Functions עם הטקסט Hello, World. בתפריט הימני של מסוף Google Cloud, לוחצים על Cloud Functions ואז על Create Function.

3c13aa20af602aa7.png

מזינים את השם hello-monitor לפונקציה של Cloud Functions החדשה.

fa6816c96d6d5b94.png

משאירים את כל הגדרות ברירת המחדל של קוד המקור. (אבל אתם יכולים לבחור שפה או זמן ריצה אחרים אם אתם רוצים).

7aadf164450484e.png

לסיום, לוחצים על יצירה.

dc74cd21000d6c91.png

הפונקציה של Cloud Functions אמורה להופיע עם סימן וי ירוק לידה, מה שאומר שהיא מוכנה להפעלה.

5363a34eb001d5ed.png

4. בדיקת הפונקציה של Cloud Functions ושליחת תנועה באמצעות מחולל עומסים

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

קודם כל, מריצים את הפקודה הבאה ב-Cloud Shell:

$ gcloud functions describe hello-monitor

הפונקציה הזו אמורה להחזיר תיאור של Cloud Function, כולל כתובת URL של httpsTrigger, שהיא נקודת הקצה של HTTP(S) להפעלת Cloud Function. היא אמורה להיראות כך: https://<region>-<project-id>.cloudfunctions.net/hello-monitor

הפעלת הפונקציה של Cloud Functions צריכה להיות פשוטה עכשיו כמו שימוש בפקודה curl בכתובת ה-URL הזו.

$ curl https://<region>-<project-id>.cloudfunctions.net/hello-monitor
Hello World!

עכשיו משתמשים ב-Vegeta, כלי פשוט לבדיקת עומסים של HTTP. כדי להתקין אותו, פשוט מקלידים את הפקודה הבאה ב-Cloud Shell :

$ go get -u github.com/tsenart/vegeta

כדי לשלוח עומס תנועה קל לפונקציה של Cloud Functions (חמש בקשות בשנייה למשך כמה דקות), משתמשים בפקודה הבאה:

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

5. ניווט ביומנים

בתצוגת הפרטים של Cloud Function, לוחצים על View Logs (הצגת יומנים).

b24157fd3376e6a8.png

הפעולה הזו תוביל אתכם לקטע Stackdriver Logging בפרויקט, שבו מוצגים רק היומנים של Cloud Function.

5a36fa75d2fb0165.png

כל הבקשות לפונקציה של Cloud Functions צריכות להחזיר קוד סטטוס 200.

כשצופים ביומנים, אפשר לבצע את הפעולות הבאות:

  • מסננים לפי רמת היומן (במקרה שלכם, כל היומנים הם ברמה debug).
  • בוחרים מסגרת זמן ספציפית (יחסית או מוחלטת).
  • מפעילים את הזרמת היומן (עם Play 751a4600016f34a7.pngבחלק העליון של המסך).
  • מעתיקים קישור לרשומה ביומן (כדי לשתף עם חברי הצוות).
  • הצגת רשומה ביומן בהקשר של משאב.
  • הצמדת רשומה ביומן (כסימן ויזואלי).
  • ייצוא יומנים ל-BigQuery, ל-Cloud Storage או ל-Pub/Sub (או פשוט הורדה שלהם כקובצי JSON או CSV).

6. עדכון הפונקציה

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

aaee3159bbe395d3.png 7ed347101da5eca0.png

כלי מפורט נוסף למעקב אחרי זמן האחזור וקריאות ה-RPC הוא Stackdriver Trace, אבל לפני שתוכלו להשתמש בו, תצטרכו לבצע כמה שינויים ב-Cloud Functions. בצע את הפעולות הבאות:

  1. מוסיפים את חבילת node-emoji שמצילה חיים כתלות.
  2. מעדכנים את קוד הפונקציה כדי להשתמש במודול node-emoji ומוסיפים השהיה.
  3. מוסיפים משתנה סביבה כדי להפעיל את Stackdriver Trace ל-Cloud Functions.

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

39b0f8f98b18a6c0.png

עורכים את הקובץ package.json כדי להוסיף תלות לחבילה node-emoji.

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "node-emoji": "^1.8.1"
  }
}

עורכים את הפונקציה בפועל על ידי שינוי התוכן של index.js לתוכן הבא:

const emoji = require('node-emoji');

exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';

  // add some latency, functions are too quick!
  setTimeout(function() {
     message += emoji.random().emoji;  
     res.status(200).send(message);
  }, (3 * 100));  // 300ms
  
};

הפעולה הזו מוסיפה אמוג'י אקראי להודעה שמוחזרת על ידי Cloud Function אחרי שהיא מושהית למשך 300 מילישניות.

לבסוף, מוסיפים משתנה סביבה של Cloud Functions בשם GOOGLE_CLOUD_TRACE_ENABLED ומגדירים אותו לערך true באופן הבא:

9205bd277b76aa21.png

לוחצים על שמירה.

חוזרים ל-Cloud Shell ומריצים שוב את הפקודה ליצירת עומס על הפונקציה החדשה שפרסתם ב-Cloud Functions:

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

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

7. מעקב אחרי הפונקציה המעודכנת של Cloud Functions

בתפריט הימני, עוברים אל Trace list (רשימת מעקב) בקטע Stackdriver Trace.

576373f38cad6f8.png

המסך אמור להיראות כמו בצילום המסך הבא:

44a36b758b49f88f.png

אחרי שתעשו את זה, יהיה ברור שההשהיה שנוצרה ב-Cloud Function נמדדת ב-300 אלפיות השנייה.

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

5815064fec87444b.png

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

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

מכיוון שפרסתם פונקציה של Cloud Functions אחת, בתרשים מוצגות רק GET בקשות ב-URI‏ hello-monitor, אבל אפשר לסנן את העקבות לפי שיטת HTTP‏ (GET‏, POST‏, DELETE), לפי סטטוס HTTP‏ (2XX‏, 3XX) או באמצעות מסנן הבקשות.

בתפריט הימני, עוברים אל סקירה כללית:

e920cfca2a50899e.png

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

ef5a45647967d275.png

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

5bd34e9d13b47fb6.png

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

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

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

8. הגיע הזמן למחוק את המשאבים

הגענו לסוף ה-Codelab.

הכלים של Cloud Functions ו-Stackdriver הם פלטפורמות בלי שרת (serverless) שלא כרוכות בעלויות כשלא משתמשים בהן, אבל מומלץ למחוק את פונקציה של Cloud Functions כדי לשמור על סביבת ענן נקייה. פשוט בוחרים באפשרות hello-monitor בסקירה כללית בקטע Cloud Functions ולוחצים על מחיקה.

aceb633cf70a4a27.png

9. מה השלב הבא?

הנה כמה מקורות מידע נוספים:

/