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

תשתמשו ב-Cloud Function שמופעל על ידי HTTP, אבל כל מה שתלמדו רלוונטי גם לשפות אחרות ול-Cloud Functions שמופעלות על ידי אירועים אחרים.
2. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים אל Cloud Console ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. (אם עדיין אין לכם חשבון Gmail או G Suite, אתם צריכים ליצור חשבון).
חשוב לזכור את מזהה הפרויקט, שהוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם שלמעלה כבר תפוס ולא יתאים לכם, מצטערים!). בהמשך ה-codelab הזה נתייחס אליו כאל PROJECT_ID.
- לאחר מכן, תצטרכו להפעיל את החיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.
העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. חשוב לפעול לפי ההוראות בקטע 'ניקוי' כדי להשבית את המשאבים, וכך לא תחויבו אחרי שתסיימו את המדריך הזה. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.
Cloud Shell
אפשר להשתמש ב-Cloud Functions, וביכולות הרישום והמעקב שלו, מרחוק מהמחשב הנייד, אבל אנחנו נשתמש ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud.
המכונה הווירטואלית הזו מבוססת על Debian, וטעונים בה כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. כלומר, כל מה שצריך כדי לבצע את ההוראות במאמר הזה הוא דפדפן (כן, זה עובד ב-Chromebook).
- כדי להפעיל את Cloud Shell ממסוף Cloud, פשוט לוחצים על הפעלת 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? כדאי לבדוק באיזה מזהה השתמשתם בשלבי ההגדרה, או לחפש אותו בלוח הבקרה של Cloud Console:
ב-Cloud Shell מוגדרים גם כמה משתני סביבה כברירת מחדל, שיכולים להיות שימושיים כשמריצים פקודות בעתיד.
echo $GOOGLE_CLOUD_PROJECT
פלט הפקודה
<PROJECT_ID>
- לבסוף, מגדירים את אזור ברירת המחדל ואת הגדרת הפרויקט.
gcloud config set compute/zone us-central1-f
אפשר לבחור מתוך מגוון אזורים שונים. מידע נוסף זמין במאמר בנושא אזורים ותחומים.
3. פריסת פונקציה פשוטה של Cloud Functions
כדי שיהיה משהו לעקוב אחריו, יוצרים פונקציה של Cloud Functions עם הטקסט Hello, World. בתפריט הימני של מסוף Google Cloud, לוחצים על Cloud Functions ואז על Create Function.

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

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

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

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

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 (הצגת יומנים).

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

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

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

עורכים את הקובץ 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 באופן הבא:

לוחצים על שמירה.
חוזרים ל-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.

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

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

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

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

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

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


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

9. מה השלב הבא?
הנה כמה מקורות מידע נוספים:
/