• הרשמה
    • התחברות
    • חיפוש
    • דף הבית
    • אינדקס קישורים
    • פוסטים אחרונים
    • קבלת התראות מהדפדפן
    • משתמשים
    • חיפוש בהגדרות המתקדמות
    • חיפוש גוגל בפורום
    • ניהול המערכת
    • ניהול המערכת - שרת private

    איך להודיע ללקוח באופן אוטומטי כשיש תקלה בשימוש בAPI

    פורום מפתחים API
    5
    12
    67
    טוען פוסטים נוספים
    • מהישן לחדש
    • מהחדש לישן
    • הכי הרבה הצבעות
    תגובה
    • הגיבו כנושא
    התחברו בכדי לפרסם תגובה
    נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
    • א
      אביי ורבא @עידו נערך לאחרונה על ידי

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

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

      ע תגובה 1 תגובה אחרונה תגובה ציטוט 0
      • ע
        עידו @אביי ורבא נערך לאחרונה על ידי

        @אביי-ורבא תודה
        אבל זה מצריך קוד מיוחד מגוגל לא?

        א תגובה 1 תגובה אחרונה תגובה ציטוט 0
        • א
          אביי ורבא @עידו נערך לאחרונה על ידי

          @עידו לא, רק קריאה GET לכתובת ספציפית עם מפתח ספציפי, ואובייקט הודעה,

          אבל כעת אני נזכר שיכול להיות שאפשר להגדיר וובהוק רק בקבוצות בצ'אטים ארגוניים

          ע תגובה 1 תגובה אחרונה תגובה ציטוט 2
          • ע
            עידו @אביי ורבא נערך לאחרונה על ידי עידו

            @אביי-ורבא על מה מקובל לידע את הלקוח? אני מניח שלא על כל שגיאה של המסד נתונים. או צינתוק שלא הצליח.

            ש תגובה 1 תגובה אחרונה תגובה ציטוט 0
            • ש
              שמואל ש. @עידו נערך לאחרונה על ידי שמואל ש.

              @עידו למה ליידע את הלקוח? מה יהיה לו מהידע הזה? תיידע ישירות את מי שאמור לטפל בזה...

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


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

              ל ע 2 תגובות תגובה אחרונה תגובה ציטוט 2
              • ל
                לעזור לכולם @שמואל ש. נערך לאחרונה על ידי

                @שמואל-ש
                אפשר לקבל את הסקריפט?

                ש תגובה 1 תגובה אחרונה תגובה ציטוט 0
                • ש
                  שמואל ש. @לעזור לכולם נערך לאחרונה על ידי שמואל ש.

                  @לעזור-לכולם כתב באיך להודיע ללקוח באופן אוטומטי כשיש תקלה בשימוש ב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 לבדיקת תקינות החיבור
                  אגב על קריסת השרת עצמו אין לי בדיקה, אבל בחברת שרתים רגילה (למעט קונטבו למשל) זה לא קורה

                  תגובה 1 תגובה אחרונה תגובה ציטוט 1
                  • ע
                    עידו @שמואל ש. נערך לאחרונה על ידי

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

                    ש פ 2 תגובות תגובה אחרונה תגובה ציטוט 0
                    • ש
                      שמואל ש. @עידו נערך לאחרונה על ידי

                      @עידו כתב באיך להודיע ללקוח באופן אוטומטי כשיש תקלה בשימוש בAPI:

                      זה שרת שלו

                      אם זה שרת שלו אז זה שלו, אצלי זה על שרת שלי ולכן תקלות בשרת קשורות אלי

                      תגובה 1 תגובה אחרונה תגובה ציטוט 1
                      • פ
                        פלמנמוני @עידו נערך לאחרונה על ידי

                        @עידו אתה יכול להגדיר בקוד שבמקרה של שגיאה שולח בקשה לגוגל סקריפט, שהוא שולח מייל לבעל הקו על פרטי השגיאה

                        ע תגובה 1 תגובה אחרונה תגובה ציטוט 1
                        • ע
                          עידו @פלמנמוני נערך לאחרונה על ידי

                          @פלמנמוני יפה, רעיון

                          תגובה 1 תגובה אחרונה תגובה ציטוט 0
                          • פוסט ראשון
                            פוסט אחרון