Smart Observability v7 – Predictive Health & Adaptive Feedback

חיבור Grafana → Telegram (Webhook)

  • בחרו Channel/Chat לקבלת התראות.

  • הגדירו ב-ENV:

    • ALERT_TELEGRAM_BOT_TOKEN

    • ALERT_TELEGRAM_CHAT_ID

  • מערכת ההתראות תשלח הודעות קריטיות ישירות לטלגרם דרך alert_manager.py.

Grafana Annotations

  • הגדירו ב-ENV:

    • GRAFANA_URL (למשל: https://grafana.example.com)

    • GRAFANA_API_TOKEN (Bearer Token עם הרשאות כתיבה ל-Annotations)

  • בעת התראה קריטית נשלחת גם Annotation ל-/api/annotations עם טקסט: <name>: <summary>.

  • בעת Auto‑Remediation מתווסף Annotation נוסף עם הפעולה שבוצעה.

Adaptive Thresholds (ספים דינמיים)

  • המודול alert_manager.py שומר חלון נגלל של 3 שעות של דגימות בקשות (סטטוס/לטנציה).

  • אחת ל-5 דקות מתבצע חישוב סטטיסטי:

    • threshold = mean + 3*sigma עבור error rate (%) ו-latency (sec).

  • במקרה חריגה בחלון 5 דקות נשלחת התראה critical לטלגרם ולגרפנה, ונקרא מנגנון Auto‑Remediation.

  • המטריקות הבאות זמינות ב-/metrics:

    • adaptive_error_rate_threshold_percent

    • adaptive_latency_threshold_seconds

    • adaptive_current_error_rate_percent

    • adaptive_current_latency_avg_seconds

הפרדה בין שגיאות פנימיות לחיצוניות

  • כל קריאה ל-record_request_outcome מעבירה עכשיו פרמטר source עם ערך מפורש ("internal"/"external"). אם לא מעבירים, המערכת תנסה להצליב עם רשימת EXTERNAL_SERVICES.

  • רשימת ברירת המחדל נשמרת בקבוע _EXTERNAL_SERVICE_KEYWORDS בתוך metrics.py, וניתן להרחיב אותה דרך ה-ENV ALERT_EXTERNAL_SERVICES="uptimerobot,github api,...".

  • alert_manager מחשב את התראת High Error Rate רק על דגימות פנימיות. דגימות שמסומנות כ-External משפיעות רק על מדד נפרד (codebot_external_error_rate_percent) ועל התרעת WARNING חדשה בשם External Service Degraded.

  • כשמדובר בהתרעת High Error Rate פנימית, שדה source במטא-דאטה תמיד יהיה "internal" ואפשר לבדוק את הרכיב המדויק באמצעות component.

  • בהתרעות חיצוניות (source="external") מנגנון ה-Auto‑Remediation מדלג אוטומטית על הפעלת Restart ומתעד אירוע AUTO_REMEDIATION_SKIPPED במקום פעולה.

Predictive Health (v7)

  • קובץ: predictive_engine.py

  • המנוע שומר חלון נגלל של מדדים: error_rate_percent, latency_seconds, memory_usage_percent.

  • חיזוי מבוסס Exponential Smoothing (משוקלל אקספוננציאלית), עם נפילה לרגרסיה לינארית במקרה הצורך.

  • לולאת Feedback אדפטיבית: השוואת תחזיות לאירועים בפועל והטמעת הדיוק חזרה למודל (טיונינג של halflife).

  • אם החיזוי מראה שעוד בתוך 15 דקות יהיה חצייה של הסף האדפטיבי/קבוע – נוצרת תחזית אירוע (Predictive Incident) ונרשמת ב-data/predictions_log.json.

  • מופעלות פעולות מניעה (Preemptive Actions):

    • עליה בלטנציה → cache.clear_stale() (ניקוי עדין, נפילה ל-clear_all אם צריך)

    • עליה בזיכרון → gc.collect() + אזהרה בלוג

    • עליה ב-Error Rate → ניסיון restart מבוקר של worker יחיד (לוג בלבד בסביבת dev)

  • כל פעולה נרשמת בלוג כאירוע PREDICTIVE_ACTION_TRIGGERED.

  • ניקוי אוטומטי: תחזיות ישנות (מעל 24 שעות) נמחקות באופן אוטומטי מקובץ predictions_log.json.

SAFE_MODE ודילוג על פעולות מנע

  • כאשר SAFE_MODE=1 או DISABLE_PREEMPTIVE_ACTIONS=1 — פעולות המנע לא ירוצו, ויירשם אירוע PREDICTIVE_ACTION_SKIPPED.

  • ניקוי הקאש (clear_stale/clear_all) מוגבל בתקציב זמן (CACHE_CLEAR_BUDGET_SECONDS) כדי למנוע תקיעות במקרה ש-Redis אינו מגיב.

ChatOps

  • /predict – מציג תחזיות ל-3 שעות הקרובות, כולל חיווי מגמה: 🔴 עליה, 🟢 ירידה, ⚪ יציב.

  • /incidents – נוסף סעיף ”תחזיות פעילות“ המציג מספר תחזיות אחרונות.

  • /accuracy – מציג דיוק חיזוי נוכחי (%) ומספר אירועים שנמנעו (הערכה).

  • /observe -v – תצוגה מפורטת של Observability בזמן אמת, עם:

    • Uptime/Error Rate/Latency + ספים אדפטיביים (memory)

    • Alerts (DB/memory) לפי חלון window=5m|1h|24h, כולל de-dup מול Dispatch Log

    • Recent Errors (N≤5)

    • Cooling & Health (cooldown פעיל וסטטוס sinks)

  • /observe -vv – כולל גם רשימת N≤10 מזהי התראות האחרונות מה-DB.

הרשאות ChatOps ו-Rate Limit

  • פקודות רגישות (למשל: /errors, /triage, /rate_limit, /enable_backoff, /disable_backoff) מוגבלות למנהלים בלבד.

  • הגדירו אדמינים דרך ENV: ADMIN_USER_IDS="123,456".

  • ניתן להגביל הפעלה לצ’אטים ספציפיים דרך ENV: ALLOWED_CHAT_IDS="-100123,-100456".

  • Rate-limit עדין לפקודות רגישות: קירור ברירת מחדל 5 שניות בין הפעלות לאותו משתמש. ניתן לשינוי דרך SENSITIVE_COMMAND_COOLDOWN_SEC.

Grafana – ייבוא דשבורד לדוגמה

  • קובץ דשבורד לדוגמה קיים ב-docs/grafana_dashboard.json.

  • ייבוא ל-Grafana: Dashboards → Import → העלו את הקובץ ובחרו מקור נתונים Prometheus.

Grafana – Accuracy & Prevention Panels

  • מטריקות Prometheus:

    • predicted_incidents_total{metric="..."}

    • actual_incidents_total{metric="..."}

    • prediction_accuracy_percent (Gauge) – מציג את דיוק החיזוי ב-% לחלון אחרון (~24h)

    • prevented_incidents_total{metric="..."} – סך הערכות לאירועים שנמנעו בעקבות פעולות מניעה

  • פאנלים מומלצים ב-Grafana:

    • ”Prediction Accuracy (%)“ – SingleStat/Gauge על prediction_accuracy_percent

    • ”Prevented Incidents Timeline“ – גרף קצב לפי שעה: increase(prevented_incidents_total[1h])

    • ”Predicted vs Actual Incidents“ – השוואה בקצב: increase(predicted_incidents_total[1h]) מול increase(actual_incidents_total[1h])

תרשים זרימת Feedback Loop

Samples (status, latency) → Adaptive Thresholds (mean+3σ)
         ↓                              ↑
   Sliding Windows                Thresholds Snapshot
         ↓                              │
 Exponential Smoothing  ─────►  Prediction (horizon)
         │                              │
         ├─► Preemptive Actions         │
         │                              │
      Predictions Log ──────►  Compare with Incidents (24h)
                                   │
                                   ├─► Update Accuracy Gauge
                                   └─► Tune Halflife (↑ when noisy, ↓ when misses)

Auto‑Remediation (v5)

  • קובץ: remediation_manager.py

  • בהתראה קריטית המערכת:

    • מתעדת אירוע ל־data/incidents_log.json (JSON Lines)

    • מפעילה פעולה בהתאם לסוג:

      • High Error Rate → ניסיון restart לשירות (רישום בלבד בסביבה זו)

      • High Latency → ניקוי cache פנימי

      • DB Connection Errors → ניסיון פתיחה מחודשת ל‑MongoDB

    • כותבת AUTO_REMEDIATION_EXECUTED ללוג עם incident_id

    • מוסיפה Grafana Annotation עם פירוט הפעולה

  • אם ההתראה מסומנת עם source="external" (למשל תקלה ב-UptimeRobot), מתבצע skip מלא על פעולת התיקון ונרשם AUTO_REMEDIATION_SKIPPED כדי למנוע restarts מיותרים.

Incident Memory

  • היסטוריה נשמרת ב־data/incidents_log.json.

  • ממשקי צפייה:

    • ChatOps: /incidents – מציג 5 תקלות אחרונות

    • API: GET /incidents – מחזיר JSON של היסטוריית אירועים (limit)

Feedback Loop לאירועים חוזרים

  • אם אותה בעיה חוזרת תוך פחות מ־15 דקות:

    • מעלה את הסף האדפטיבי פי 1.2

    • מסמן recurring_issue: true בלוג

ChatOps – /observe

  • פקודה חדשה בבוט מציגה:

    • Uptime (ממחלקת metrics.get_uptime_percentage)

    • Error Rate (5m)

    • Active Users (אומדן)

    • Alerts (24h): סך הכל, ומתוכן קריטיות

הרחבות מצב מפורט

  • -v – הרחבה כולל מקורות והצלבת נתונים (DB/Memory), חלון window, וסיכומי sinks.

  • -vv – מוסיף 10 מזהי התראות אחרונות מה-DB (אם זמין).

Endpoints

  • /metrics – נתוני Prometheus

  • /alerts (GET) – JSON של ההתראות האחרונות לצרכי ChatOps/דשבורד

  • /incidents (GET) – JSON של היסטוריית התקלות (Incident Memory)

  • /alerts (POST) – Webhook של Alertmanager (קיים)

  • /predict (ChatOps) – סיכום תחזיות וטרנדים

קישורים לתיעוד ChatOps

טיפים

  • ודאו שאין דליפת סודות בלוגים/התראות (המודול מסנן מפתחות).

  • בצעו בדיקות בסביבת Staging לפני ייצור.