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

ניקח את הבלוג הזה כדוגמא: הבלוג הזה, אם לא שמתם לב לפי כתובת הדומיין, רץ על הפלטפורמה החינמית ("הובי") של הֶרוֹקוּ (heroku - ראו כאן את הפרטים על התוכנית החינמית). בפלטפורמה הזו, ברגע שלא נשלחת כל בקשה לאפליקציה במשך יותר מחמש דקות (לא בטוח שזה המספר, אבל משהו כזה) האפליקציה נכנסת לתרדמת.. עד שתישלח אליה בקשה, ואז היא מתעוררת - אבל התהליך של ההתעוררות לוקח כמובן זמן, מה שגורם שאם לדוגמא ירצה מישהו להיכנס לאתר הזה כשהוא כבוי, הוא ייכנס לקישור, יחכה עשר-עשרים שניות ואז זה יעבוד.

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

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

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

יש כמה מקומות שנותנים שירותים בדיוק בשביל זה, אפשר למנות כאן את האתר cron-job (כשמו כן הוא..) שנותן להגדיר כתובת, ושולח אליה בקשות לפי ההגדרה שמכניסים לו (יש שם המון וריאציות להגדרה). האתר הזה נחמד, הבעיה שלפעמים הוא צובר עומס של לוגים ומסרב להמשיך לבצע את הבקשות. אם אין לוגים, יירד מאוד הענין בבקשות.

שימוש בגוגל סקריפט:

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

בגוגל סקריפט אפשר לשלוח בקשות לכתובות, אפשר לשלוח בקשות POST או GET, כדי לקבל או להעלות קבצים ובערך כל האפשרויות הרגילות של fetch. אפשר כמובן להתנהל עם כל פרטי התשובה (response) ולנתח אותם.

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

function fetch() {
  var blogcall = UrlFetchApp.fetch('blog-url', {
    validateHttpsCertificates: false,
    followRedirects: true,
    muteHttpExceptions: true,
  });
  var wikicall = UrlFetchApp.fetch('wiki-url', {
    validateHttpsCertificates: false,
    followRedirects: true,
    muteHttpExceptions: true,
  });
  var blogres = blogcall.getResponseCode();
  var wikires = wikicall.getResponseCode();
  if ((blogres !== 200) | (wikires !== 200)) {
    var body = `the response of google apps scripts request was: blog - ${blogres}, wiki - ${wikires}. check the status quickly!`;
    var subject = 'something wrong in heroku apps';
    GmailApp.sendEmail('me@gmail.com', subject, body);
    Logger.log('something failed. email send succesfuly');
  } else {
    Logger.log(`blog is ${blogres}, wiki is ${wikires}.`);
  }
}

הפקודה של fetch בגוגל סקריפט קצת שונה, צריך קודם להסביר לגוגל סקריפט שמדובר באפליקציית גוגל שאחראית על ה-fetch'ים - UrlFetchApp. לאחר מכן כמובן ה-URL (כאן בדוגמא אין כלום) ופרמטרים שימנעו תקלות לא רצויות בתגובה.
כדי לעשות לעצמי יותר קל, הכנסתי את הפקודות של הסטטוס בתגובה - לתוך משתנים - שורות 12 ו-13.
לאחר מכן הסקריפט בודק - אם אחת מהתשובות היתה לא תואמת ל-200, נשלח אליי אימייל (GmailApp.sendEmail, הפרמטרים מוכנסים מראש במשתנים ואז פשוט מכניסים את שם המשתנה במקום לכתוב באריכות) עם התקלה.
אם הכל עבר בסדר (else) - מבוצע לוגינג - עם הסטטוסים של התגובות.

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

אז מה 'למדנו' כאן? דבר ראשון fetch בגוגל סקריפט. וגם נגיעה קטנה ב-Gmail בגוגל סקריפט. קישורים לדוקו להלן 👇


אם הייתם צריכים לכתוב את הקוד הזה מאפס, לדוגמא, הייתם צריכים ללמוד את התיעוד של הפונקציות הבאות:


אם יש לכם איזו שאלה ❔✨ או כל תגובה 💬, הארה 💡 והערה ❕ שהיא על הפוסט - אשמח מאוד! אם תכתבו אותה בהערות כאן למטה
פשוט להתחבר עם חשבון גיטהב ולהגיב 🎉