שימוש ב-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_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZwci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

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

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

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_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01AScreen 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 Function חדש.

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 צריכות להחזיר קוד סטטוס 200.

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

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

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

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

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 מבצעת לאחר מכן.

5815064fec87444b.png

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

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

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

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

e920cfca2a50899e.png

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

ef5a45647967d275.png

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

5bd34e9d13b47fb6.png

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

2cc0e9a3212b91bb.png2e7b1ebf2f0a2b4f.png

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

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

זהו, סיימתם את ה-Codelab!

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

aceb633cf70a4a27.png

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

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

/