1. מבוא
בשיעור ה-Lab הזה תשתמשו ב-Gemini, שותף מבוסס-AI ב-Google Cloud, כדי לפתור בעיה בהטמעה של Cloud Function. לשם כך תנתחו יומני שגיאות, תזהו את שורש הבעיה ותמצאו דרך לפתור אותה.
מה עושים...
- תשתמשו בטרמינל Cloud Shell וב-ה-CLI של gcloud כדי להגדיר את הסביבה, כולל הפעלת Google APIs הרלוונטיים ויצירת פונקציה של Cloud Functions מקוד שסופק
- תשתמשו בסיכום יומנים של Cloud Logging כדי ליצור סיכומי יומנים, כדי להבין את המידע שתועד.
- תתכתבו עם Gemini כדי לקבל עזרה בפתרון הבעיה.
מה תלמדו...
- איך משתמשים ב-Gemini עם Google Cloud Observability כדי לפתור בעיות.
- איך למצוא ולהבין יומני Cloud Functions בעזרת Gemini.
מה צריך להכין…
- דפדפן האינטרנט Chrome
- פרויקט ב-Google Cloud שהחיוב בו מופעל
- חשבון Google עם הרשאות גישה לפרויקט שמאפשרות לכם להפעיל ממשקי API ולשנות משאבים
השיעור Lab הזה מיועד למהנדסי DevOps ופלטפורמות ולמפתחי תוכנה בכל הרמות, כולל מתחילים. ההתמקדות שלנו תהיה בהתנסות מעשית ביכולות של Gemini בפתרון בעיות.
2. הגדרה
בקטע הזה מפורט כל מה שצריך לעשות כדי להתחיל את שיעור ה-Lab.
הגדרת הסביבה
1. מתחברים אל Cloud Console בכתובת https://console.cloud.google.com.
2. בוחרים פרויקט ב-Google Cloud שמתכננים לעבוד איתו בשיעור ה-Lab הזה.

3. פותחים את הדף Cloud Functions במסוף. אפשר לעשות את זה על ידי בחירה באפשרות Cloud Functions בתפריט הניווט (הסמל ☰ בפינה הימנית העליונה בחלון המסוף).

אפשר גם לחפש את המונח cloud functions באזור החיפוש במסוף:

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

לוחצים על ENABLE (הפעלה) כדי להמשיך.
4. מגדירים את המאפיינים הבסיסיים של פונקציית Cloud Functions החדשה.
- הגדרת השם ל-"
codelab-cf" - בוחרים באפשרות Allow unauthenticated invocations (מתן הרשאה להפעלות לא מאומתות).

כדי להשלים את השלב, לוחצים על הלחצן 'הבא' בפינה הימנית התחתונה של החלון:

אחרי שלוחצים על NEXT(הבא), יכול להיות שתתבקשו להפעיל ממשקי Google API נוספים. כמו בשלב 4, לוחצים על ENABLE (הפעלה).

הגדרת זמן הריצה והקוד של פונקציית Cloud Functions
ב-CodeLab הזה משתמשים ב-Python כשפת תכנות. אל דאגה אם אתם לא מכירים את Python. כדי להשלים את ה-CodeLab הזה לא צריך ידע ב-Python.
5. בוחרים ב-Python 3.11 כזמן הריצה של הפונקציה

שימו לב: שינוי זמן הריצה משנה את קוד המקור שמוצג בעורך המובנה.
6. מעתיקים את הקוד שבהמשך אל עורך הקוד המוטבע כדי לשנות את הדוגמה של המדריך למתחילים שנוצר אוטומטית.
from google.cloud import storage
import json
import re
client = storage.Client()
def get_object_list(request):
if request.args and 'path' in request.args:
path = request.args['path']
else:
return '{}'
parsed = re.search('gs:\/\/([a-zA-Z0-9_-]{3,63})\/([-a-zA-Z0-9_\+.\/]*)', path)
bucket, prefix = parsed.group(1), parsed.group(2)
blobs = client.list_blobs(bucket, prefix=prefix, delimiter='/')
objects = []
if (blobs):
for blob in blobs:
objects.append(blob.name)
return json.dumps(objects)
הקוד הזה קורא את המאפיין path מבקשת ה-GET, מנתח את הנתיב כדי לאחזר את שם הקטגוריה ושולח קריאה ל-Google Cloud Storage API כדי לקבל רשימה של אובייקטים שמאוחסנים בנתיב הזה. הפונקציה (get_object_list) מקבלת בקשה שהיא אובייקט Flask כארגומנט קלט ומחזירה את שמות האובייקטים כמערך JSON.
7. בוחרים את הקובץ requirements.txt מרשימת הקבצים שנותרו בכלי לעריכה בתוך הדף. כדי להחליף את רשימת התלויות הנוכחית ברשימה החדשה, מעתיקים את הקוד שלמטה אל עורך מוטבע.
google-cloud-storage
8. כדי לפרוס את Cloud Function, לוחצים על DEPLOY (פריסה) בפינה הימנית התחתונה.

יכול להיות שתצטרכו להמתין כמה דקות עד שתהליך הפריסה יסתיים. אם פעלתם לפי הוראות ההגדרה, סביר להניח שהפריסה תדווח כפריסה שנכשלה.
3. זיהוי ופתרון הבעיה
בקטע הזה תשתמשו בתכונה 'הסברים על יומנים' ובסיוע נוסף של Gemini כדי לזהות את הבעיה ואת הדרך לפתור אותה.
1. הפריסה נכשלת. תוצג הודעת שגיאה עם מידע נוסף ואפשרות לראות את יומני הפריסה. לוחצים על VIEW LOGS (הצגת יומנים) כדי לראות את היומנים של הפריסה.

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

2. בודקים את היומנים בכרטיסייה שנפתחה. שימו לב שסיכומי היומן נראים כמו כמה שורות של מחסנית הקריאות של החריגה. הסיבה לכך היא ש-Cloud Function לוכדת טקסט שמודפס ל-stdout או ל-stderr וכותבת כל שורה כרשומה נפרדת ביומן. בשאר השורות ביומן מסוכם מידע על קוד שגיאת היציאה, וגם מידע נוסף שדווח על ידי Cloud Functions ו-Cloud Run APIs.

אפשר ללחוץ על כל אחת מהשורות כדי לראות מידע נוסף על יומן מסוים. היומנים המורחבים כוללים רכיבי ממשק משתמש נוספים. בלחיצה על הרכיבים האלה אפשר להעתיק את כל המידע על היומן, להרחיב את כל השדות כדי להציג את כל הנתונים של רשומת היומן ולהסביר את רשומת היומן באמצעות Gemini.
4. ה-callstack של החריגה לא מאוד אינפורמטיבי. בודקים את הרישומים כדי למצוא את הסוף של יומן מעקב המחסנית של החריג. זו השורה שבה כתוב "Container called exit(1)". בסיכום היומן הבא כתוב:
functions_framework.exceptions.MissingTargetException: File /workspace/main.py is expected to contain...
נראה שזה מועמד טוב לבדיקה. לוחצים על השורה כדי להרחיב את רשומת היומן. לאחר מכן לוחצים על הלחצן הסבר על רשומת היומן הזו כדי לראות מידע נוסף על היומן שנבחר.

אם לא השתמשתם ב-Gemini בפרויקט הזה בעבר, תתבקשו להפעיל API נדרש. אם מופיעה בקשה להפעלת ה-API, לוחצים על ENABLE (הפעלה) כדי להמשיך.

הערה: לפעמים יכול להיות שתקבלו שגיאה כשאתם מזינים הנחיה ל-Gemini. במקרה כזה, צריך לחזור על הפעולה של ההנחיה עוד פעם כדי לקבל את התשובה. לדוגמה, לוחצים שוב על הלחצן הסבר על רשומה ביומן.
5. קוראים את ההסבר ש-Gemini מספק. אם ההסבר שקיבלתם לא מספיק או לא ברור, אתם יכולים להנחות את Gemini לספק מידע נוסף באמצעות אחת מההנחיות הבאות או לנסח שאלה משלכם
אפשר לקבל מידע נוסף על היומן הזה?
אפשר לקבל מידע נוסף על השגיאה?
6. אחר כך מבקשים מ-Gemini הצעות לפתרון הבעיה. לדוגמה, יש לך שאלה ל-Gemini?
איך פותרים את הבעיה הזו?
תציע פתרון לתיקון השגיאה הזו
תציע פתרון לתיקון השגיאה הזו
התשובה של Gemini עשויה להשתנות בהתאם להקשר הנוכחי, וגם בהתאם לניסוח ולפורמט של ההנחיה. מצופה ש-Gemini ימליץ לוודא שלקוד המקור של Cloud Function יש פונקציה בשם hello_http.
7. כרגע מוצגת הכרטיסייה שבה מופיעים יומני Cloud Functions. בוחרים את הכרטיסייה הקודמת שבה מוצג דף הפריסה של Cloud Function עם השגיאה ולוחצים על EDIT (עריכה).

8. מוודאים שהאימות עדיין מוגדר לAllow unauthenticated invocations (התרת הפעלות לא מאומתות) ומעדכנים את הבחירה אם צריך.

9. בתחתית המסך, לוחצים על 'הבא' כדי לראות את העורך המוטבע. פועלים לפי ההמלצה של Gemini ומשנים את שם הפונקציה מ-get_order_list ל-hello_http.
אחרי שמסיימים לערוך, לוחצים על DEPLOY (פריסה).
יכול להיות שתצטרכו להמתין כמה דקות עד שתהליך הפריסה יסתיים. מוודאים שהפריסה מסתיימת בהצלחה ושלא מופיעות הודעות שגיאה.
שימו לב: יכול להיות שעד שתהליך הפריסה יסתיים, עדיין תופיע ב-Console הודעת השגיאה האחרונה.
10. כדי לוודא שהפונקציה של Cloud Functions פועלת, שולחים את בקשת ה-HTTPS הבאה באמצעות curl. אפשר להשתמש ב-Cloud Shell או לעשות זאת מכל טרמינל שמותקנים בו curl ו-CLI של gcloud, על ידי הפעלת הפקודה הבאה מטרמינל Cloud Shell.
curl -m 70 -X GET \
https://us-central1-${GOOGLE_CLOUD_PROJECT}.cloudfunctions.net/\
codelab-cf?path=gs://cloud-samples-data/generative-ai/image/ \
-H "Authorization: bearer $(gcloud auth print-identity-token)"
שימו לב: כדי להריץ את הפקודה הזו ממסוף, תצטרכו לבצע אימות באמצעות ה-CLI של gcloud ולהגדיר את הערך של מזהה הפרויקט למשתנה הסביבה GOOGLE_CLOUD_PROJECT.
בונוס
השם של הפונקציה hello_http הוגדר כנקודת כניסה שמוגדרת כברירת מחדל לפונקציית Cloud Functions שמופעלת על ידי HTTP, כשזמן הריצה של Python נבחר. פתרון חלופי הוא להשאיר את get_order_list כשם הפונקציה בקוד המקור ולעדכן את שדה נקודת הכניסה של Cloud Function שנמצא מעל Inline Editor משמאל לשדה Runtime:

שינוי נקודת הכניסה מ-hello_http ל-get_order_list יפתור את הבעיה שקשורה לפריסה.
4. הסרת המשאבים
כדי לנקות, אפשר לסגור את הפרויקט או למחוק את מופע Cloud Functions. אפשר למחוק פונקציות ב-Cloud Functions באמצעות המסוף או באמצעות פקודת ה-CLI כמו בדוגמה הבאה:
gcloud functions delete codelab-cf --region=us-central1
5. מעולה!
כל הכבוד – השתמשתם בהצלחה ב-Gemini כדי לפתור את הבעיה באפליקציה, ועכשיו אתם מבינים איך הוא יכול לעזור לכם להבין את היומנים ולקבל תשובות לשאלות לגבי Google Cloud.