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

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

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

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

כלי מפורט נוסף למעקב אחרי זמן האחזור וקריאות ה-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 מבצעת לאחר מכן.

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

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

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

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


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

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