איך להודיע ללקוח באופן אוטומטי כשיש תקלה בשימוש בAPI
-
אני בונה מערכת ללקוח, ואני מחפש דרך שהמערכת תידע את הלקוח אם קרתה תקלה?
לדוגמא, APIKEY או סיסמא לא נכונה, צינתוקים שלא פעלו וכו' הוא הרי לא יבדוק לוגים כל יום. -
@עידו אני משתמש בוובהוק שניתן להגדיר בגוגל צ'אט, ותופס שגיאות וכדו' ושולח לצ'אט, זה נוח לכל הצדדים, ואתה רואה התראה במייל.
כמובן שלדברים רציניים יש דברים טובים יותר כמו sentry (אני משתמש בו היום כמעט לכל ממשק וובי שאני כותב, מנרמל את איתור שגיאות בדפדפן בצד לקוח)
-
@אביי-ורבא תודה
אבל זה מצריך קוד מיוחד מגוגל לא? -
@עידו לא, רק קריאה GET לכתובת ספציפית עם מפתח ספציפי, ואובייקט הודעה,
אבל כעת אני נזכר שיכול להיות שאפשר להגדיר וובהוק רק בקבוצות בצ'אטים ארגוניים
-
@אביי-ורבא על מה מקובל לידע את הלקוח? אני מניח שלא על כל שגיאה של המסד נתונים. או צינתוק שלא הצליח.
-
@עידו למה ליידע את הלקוח? מה יהיה לו מהידע הזה? תיידע ישירות את מי שאמור לטפל בזה...
אני עשיתי אצלי סקריפט שבודק כל דקה האם יש חיבור לשרת, ואת ניצול כל המשאבים (ראם/מעבדים/זיכרון וכו') וכן בודק את החיבור לmysql שזה בעצם מכסה את רוב רובם של סוגי השגיאות מצד השרת (לא מצד הקוד עצמו)
ואם יש שגיאה כלשהיא הוא שולח לי מייל עם השגיאה
הרי ללקוח אין מה לעשות עם הודעה שהחיבור למסד נכשל, לא?
פעם אחת ראיתי באמצע הלילה שיש לי יותר ממאה מיילים על תקלה בשרת...
וזה באמת הציל אותי, כי אם לא לא הייתי יודע שיש תקלה אלא רק ע"י שיחות זועמות מהלקוחות...
-
@שמואל-ש
אפשר לקבל את הסקריפט? -
@לעזור-לכולם כתב באיך להודיע ללקוח באופן אוטומטי כשיש תקלה בשימוש בAPI:
@שמואל-ש
אפשר לקבל את הסקריפט?בכייף
הרבה בעזרת GPT...<?php include 'functions.php'; function log_message($message) { $logFile = __DIR__ . '/server_monitor.log'; date_default_timezone_set('Asia/Jerusalem'); file_put_contents($logFile, date('Y-m-d H:i:s') . ' - ' . $message . PHP_EOL, FILE_APPEND); } function send_mail($subject, $body) { emailSend("aaaaa@gmail.com", "", "זהירות!!! השרת לא תקין!", "$subject\n\n$body", ""); } // 1. זיכרון RAM $meminfo = file_get_contents('/proc/meminfo'); preg_match('/MemTotal:\s+(\d+)/', $meminfo, $total); preg_match('/MemAvailable:\s+(\d+)/', $meminfo, $available); $ram_total = (int)$total[1]; $ram_available = (int)$available[1]; $ram_used = $ram_total - $ram_available; // 2. שימוש במעבד function get_cpu_usage_per_core() { $stat1 = file('/proc/stat'); sleep(1); // המתנה קצרה למדידה מדויקת $stat2 = file('/proc/stat'); $cpus = []; foreach ($stat1 as $i => $line) { if (strpos($line, 'cpu') !== 0 || strpos($line, 'cpu ') === 0) continue; $parts1 = preg_split('/\s+/', trim($line)); $parts2 = preg_split('/\s+/', trim($stat2[$i])); $total1 = array_sum(array_slice($parts1, 1)); $idle1 = $parts1[4]; $total2 = array_sum(array_slice($parts2, 1)); $idle2 = $parts2[4]; $total_diff = $total2 - $total1; $idle_diff = $idle2 - $idle1; $usage = 100 * (1 - $idle_diff / $total_diff); $cpus[] = round($usage, 2); } return $cpus; } $cpu_usages = get_cpu_usage_per_core(); $cpu_count = count($cpu_usages); $cpu_average = array_sum($cpu_usages) / $cpu_count; // 3. דיסק $disk_total = disk_total_space("/"); $disk_free = disk_free_space("/"); $disk_used = $disk_total - $disk_free; log_message("*************"); // 4. בדיקת MySQL $mysql_ok = true; try { $dbname = 'sql'; $serverName = "localhost"; $username = "name"; $pw = "pass"; $pdo = new PDO("mysql:host=$serverName;charset=utf8;dbname=$dbname", "$username", "$pw"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->query('SELECT 1'); } catch (Exception $e) { $mysql_ok = false; log_message("שגיאת mysql: " . $e->getMessage()); send_mail("שגיאת חיבור לmysql", $e->getMessage()); } // 5. בדיקה כללית $ram_used_in_gb = round($ram_used / 1024 / 1024, 2); $ram_total_in_gb = round($ram_total / 1024 / 1024, 2); log_message("ראם בשימוש: {$ram_used_in_gb} GB / {$ram_total_in_gb} GB"); log_message("מעבדים בשימוש: " . implode('% | ', $cpu_usages) . '%'); log_message("ממוצע שימוש במעבדים: " . round($cpu_average, 2) . "%"); log_message("זיכרון דיסק בשימוש: " . formatBytes($disk_used) . " / " . formatBytes($disk_total)); log_message("mysql חיבור ל: " . ($mysql_ok ? "OK" : "FAILED")); $start_con = time(); $conn = shell_exec("curl -s -o /dev/null -w \"%{http_code}\" 'https://****.co.il'"); $end_con = time(); $conn_time = ($end_con - $start_con); log_message("חיבור לשרת : $conn TIME: $conn_time"); log_message("*************\n----------"); // 6. שליחת מייל אם משהו לא תקין if ($ram_available < 200000) { // פחות מ-200MB send_mail("אין מספיק ראם זמין", "Only " . round($ram_available / 1024, 2) . " MB RAM available"); } if (min($cpu_usages) >= 90) { // אם כל המעבדים מעל 90% send_mail("שימוש מעבדים גבוה", "All CPU cores are over 90% usage.\nPer core: " . implode('% | ', $cpu_usages)); } if ($disk_free < 8 * 1024 * 1024 * 1024) { // פחות מ־8GB send_mail("זיכרון דיסק מלא", "Only " . round(($disk_free / $disk_total) * 100, 2) . "% disk space free"); } if ($conn != '200' || $conn_time > 7) { send_mail("לא ניתן להתחבר לשרת", "PING ZAKENU: $conn TIME: $conn_time"); } // פונקציה לעיצוב function formatBytes($bytes, $precision = 2) { $units = ['B', 'KB', 'MB', 'GB', 'TB']; $bytes = max($bytes, 0); $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); $pow = min($pow, count($units) - 1); $bytes /= pow(1024, $pow); return round($bytes, $precision) . ' ' . $units[$pow]; }חלק מהקוד בפרוייקט היה צריך להתחבר לשרת חיצוני לכן את הקריאת chrl לבדיקת תקינות החיבור
אגב על קריסת השרת עצמו אין לי בדיקה, אבל בחברת שרתים רגילה (למעט קונטבו למשל) זה לא קורה -
@שמואל-ש אף אחד לא אמור לטפל... לפחות לא אני... אני מכין מערכת ומעביר הלאה, לא מכיר יותר אא"כ יש בעיה אמיתית בקוד (לא באמת, אבל לא מתכוון להשתגע על כל קריה או בעיה בחיבור בצד שלו). זה שרת שלו קו שלו ומאזינים שלו. לא התחתנתי איתם...
-
@עידו כתב באיך להודיע ללקוח באופן אוטומטי כשיש תקלה בשימוש בAPI:
זה שרת שלו
אם זה שרת שלו אז זה שלו, אצלי זה על שרת שלי ולכן תקלות בשרת קשורות אלי
-
@עידו אתה יכול להגדיר בקוד שבמקרה של שגיאה שולח בקשה לגוגל סקריפט, שהוא שולח מייל לבעל הקו על פרטי השגיאה
-
@פלמנמוני יפה, רעיון