אין ויכוח שדשבורדים יעילים ומאפשרים שקיפות למדדי החברה אבל לעיתים מורכב לזהות שינויים בזמן אמת ויכול להיות לזה מחיר כבד.
כולנו מכירים את המשתמשים שמרעננים דשבורדים שוב ושוב באובססיביות לצד אנליסטים אשר מזהים בעיה או שינוי מגמה ראשוני אך רק באיחור של כמה ימים מתחילים להבין לעומק את מקור ההשפעה והשינוי. הדבר מייצר תחושת החמצה ולרב עולה לחברות הרבה מאוד כסף שלא לדבר על בזבוז זמן של צוותי ניתוח.
אנחנו ב-Travelier מאמינים בדמוקרטיזציה של דאטה. צוות ה-Data Engineering וה-BI אחראים לספק לאנליסטים ולמשתמשים העסקיים בכל הדומיינים וחברות הבת גישה מלאה לדאטה על מנת לקבל החלטות מדויקות ובזמן אמת. גילינו כי רוב המשתמשים ייגשו לדאטה בממוצע פעם ביום, לפעמים גם פעם ביום וחצי. הדבר מייצר פער של עד 36 שעות בגישה למידע ברגעי אמת. בנוסף, חברות הבת שלנו פרוסות בכל העולם כך שגם אזורי זמן יכולים להוות אתגר זיהוי.
לאור ההבנה כי יש פער בין שעת השינוי/בעיה לבין נקודת זיהוי הבעיה ע״י המשתמש, החלטנו להרחיב את ארגז הכלים שאנו מציעים למשתמשים שלנו, קרי עובדי החברה.
היה לנו חשוב לייצר עבורם כלי המאפשר לקבל מידע באופן מיידי לצד היכולת להיות פרואקטיביים, יעילים ולהגיב במהירות ברגע שאירוע קורה.
בבלוג הזה אשתף איך בנינו מערכת התראות מבוססת דאטה על ה DWH שלנו, המאפשרת הגדרה מהירה וקלה של התראות הנשלחות ישירות בסלאק של בעליי העניין הרלוונטים.
את הכלי בנינו בעזרת ה stack הטכנולוגי הקיים שלנו (Airflow, Python, BigQuery) ולהלן הפרמטרים שהגדרנו:
-
- קלות שימוש
- הגדרה וניהול של התראות בצורה קלה ב google sheet בעזרת ידע ב SQL בלבד ללא צורך בתמיכה של מפתחים
- רלוונטיות
- התראות לסביבת התקשורת הטבעית של היוזרים שלנו (AKA Slack) עם אפשרות להגדיר ערוץ ספציפי ביצירת ההתראה כך שיוזרים יירשמו רק להתראות הרלוונטיות להם
-
- כל המידע בסלאק בלי צורך להוריד קבצים או לעבור בלינק לדשבורד
- גמישות
- אין הגבלה על סוגי ההתראות, כל התראה שניתן לתרגם לשאילתא ניתנת למימוש, מערכי סף בהם שאילתא ללא תוצאות לא תשלח כהתראה ועד אנומליות בדאטה ובדיקות נכונות נתונים.
בבלוג הזה אנסה לשתף בקוד פרקטי שיעזור לכם לבנות כלי כזה בעצמכם, בקלות ומהירות עם ערך מיידי מובטח.
אז איך זה עובד?
לתיאור הארכיטקטורה אעבור לאנגלית למען הימנעות מתרגום קלוקל .
The system reads data received from the user through a google sheets file, uploads it to BigQuery, runs logic, outputs alerts to Slack and monitors it on a BI report.
- Google sheets file: Contains the alert configuration metadata, accessible by users to add/modify tests.
- BigQuery external table: BigQuery replication of the google sheets configuration file
- AirFlow DAG - the DAG generates 3 tasks:
- Queries the BQ external table, looks for tests that should be triggered on the next interval and pushes it to a table in BigQuery.
- Triggers a Python script which executes the tests logic as received by the user and sends alert to Slack if necessary.
- Save run statistics data to an audit table in BigQuery
- Reports to monitor alerts and track usage
אז איך זה נראה?
הרי התראה לדוגמא היישר מהסלאק והשיח המיידי בין בעלי העניין:
עוד כמה טיפים:
- תערבו בתהליך את המשתמשים, אנליטסים ויוזרים עסקיים. אצלנו מי שהובילה את היוזמה הייתה האנליסטית של הקבוצה שהגדירה את הצרכים של הכלי והתבססה על כאבים יומיומיים
- אספו פידבק ממשתמשים לאורך כל הדרך שיסייע לדייק את התוצר
- לא לוותר על ערוצים שונים בסלאק לפי קבוצות עניין. כשמשתמשים מקבלים יותר מידי הודעות לא רלוונטיות הם לא נשארים דרוכים להתראות אמת
- תבדקו התראות חדשות על דטה היסטורי, תראו שבחרתם לוגיקות מדוייקות או ערך סף נכון שיציפו רק את התוצאות הממוקדות שקוראות לפעולה
לסיכום
עם הרבה יוזמה וקצת קוד מערכת ההתראות שבנינו מביאה ערך חדש וגדול למשתמשים שלנו. הוספת התראה חדשה היא קלה ומהירה מתבצעת על ידי האנליסטים שלנו ללא עזרה של מפתחים.
הזדמנויות ובעיות חדשות שמתעוררות הופכות במהרה להתראות מניבות.
הצלחנו להוריד את הזמן לאיתור שינוי מממוצע של 28 שעות ל 35 דקות. מספק לראות את התקשורת המיידית בין בעלי העניין בסלאק על התראה שנשלחת והמהירות של הטיפול.
בהמשך נרצה לשפר את הויזואליזציה של התוצאות ואנחנו מתכננים למדוד את שביעות הרצון של המשתמשים שלנו בסקר וגם לשמוע מהם הצעות לשיפור.
בהמשך יש פירוט של מבנה קובץ ה metadata ושיתוף של הקוד מקווה שעזרנו לכל מי שירצה לפתח כלי כזה, מוזמנים גם לפנות ולהתייעץ.
ועכשיו נרד לפרטים:
שדות הקונפיגורציה בקובץ הגדרת ההתראות:
Values | Description | Column Name |
test indicator | test_id | |
slack user name to allow personal tagging | test_owner_name | |
slack user id | test_owner_id | |
SQL test code - the output (if exists) will be pushed to slack | query | |
{0,1} | Indicator for incremental type alerts | increment_test |
{day,hour} | Frequency interval value for alerts scheduling | frequency_interval |
integer | Units of time for frequency interval | frequency_units_of_time |
TIMESTAMP_ADD(TIMESTAMP, INTERVAL history_time_value day, day) | The time parameter value for increment alerts | history_time_value |
TIMESTAMP_ADD(TIMESTAMP, INTERVAL 1 history_units_of_time ) | The time units value for increment alerts | history_units_of_time |
alert active status | test_status | |
Optional, customize slack message | slack_message |
בניית טבלת stage לריצה בזמן אמת:
שליפה מטבלת ה meatadata של ההתראות ויצירת טבלת הטסטים להרצה בהתאם לנקודת זמן הריצה
פייתון סקריפט להרצת הטסטים:
הרצת כל טסט מטבלת הקונפיגורציות ושליחת ההתראה במידה וקיימת לערוץ הסלאק הרלוונטי. הסטטיסטיקות כמו משך זמן הריצה, שגיאות וכו׳ נרשמות לטבלת audit נפרדת.
לשם כך ניצור מחלקה בשם DataAlertsHandler:
במחלקה זו הפונקציה run_data_alerts תנהל את הפעולות השונות לצורך טעינת קונפיגורציות ההתראות, הרצתן ושליחת התראה במידת הצורך:
ראשית נטען את הקונפיגורציה המתאימה באמצעות הפונקציה load_test_configuration:
כחלק מהטעינת הקונפיגורציה, נפנה ל DWH שלנו בbigQuery לשם משיכת הקונפיגורציה באמצעות
נריץ את הבדיקות ובמידה ואותרה במהלך הרצת הבדיקה אנומליה, נוציא התראה מתאימה דרך ערוץ הסלאק הרלוונטי באמצעות קריאה לפונקציה הבאה:
לבסוף נכתוב לטבלת audit את תוצאות ההרצה (גם במידה ולא אותרו אנומליות):