🧠 Observability AI Explain API
שירות זה מספק שכבת AI רשמית שמתרגמת הקשרי התראות (Context) להסבר קצר בשפה טבעית, כולל שורש הבעיה, פעולות מומלצות ואותות תומכים. השירות נפרס כחלק מה־webserver (AioHTTP) תחת הנתיב POST /api/ai/explain ומשמש את לוח ה-Observability דרך המשתנה OBS_AI_EXPLAIN_URL.
TL;DR: הלקוח שולח
contextמסונן → השירות מפעיל את Claude Sonnet → מחזיר JSON תקין בלבד. במקרה של כשל, הלקוח חוזר לפתרון ההיוריסטי הקיים.
🔐 אימות ובקרות
כותרת חובה (אם הוגדר טוקן):
Authorization: Bearer ${OBS_AI_EXPLAIN_TOKEN}Timeout שרת:
OBS_AI_EXPLAIN_TIMEOUT(ברירת מחדל 10 שניות, גבול SLA 8–10 שניות)PII Masking: ההקשר כבר מסונן בצד ה־Dashboard, אך השירות מבצע Masking נוסף (סיסמאות, טוקנים, מזהים ארוכים).
ניטור:
emit_event("ai_explain_request_success|failure", …)כוללduration_ms,alert_uid,provider.
📥 בקשה (POST /api/ai/explain)
{
"context": {
"alert_uid": "12345-abcde",
"alert_name": "High Latency on /checkout",
"severity": "critical",
"summary": "Response time > 3s for 5m",
"timestamp": "2025-12-07T09:30:00Z",
"endpoint": "/api/checkout",
"metadata": {
"region": "us-east-1",
"log_excerpt": "Error: Connection timeout..."
},
"auto_actions": [],
"quick_fixes": [],
"graph": {
"metric": "latency",
"spike_value": 5000
}
},
"expected_sections": ["root_cause", "actions", "signals"]
}
context– אובייקט חובה. כל ערך שאינו מילון יגרור400.expected_sections– אופציונלי. כיום נתמכיםroot_cause,actions,signals. שדות לא מוכרים מתעלמים.
📤 תגובה מוצלחת (200 OK)
{
"alert_uid": "12345-abcde",
"alert_name": "High Latency on /checkout",
"severity": "critical",
"root_cause": "נראה שהעומס נובע מנעילות בבסיס הנתונים לאחר deploy ב-09:25.",
"actions": [
"בדוק שאילתות ארוכות ב-RDS סביב 09:25.",
"שקול Rollback לגרסה האחרונה אם בוצעה מיגרציה."
],
"signals": [
"latency spike במקביל לעלייה ב-error logs",
"חריגה של 3 שניות לאורך 5 דקות"
],
"provider": "claude-sonnet-4.5",
"model": "claude-sonnet-4-5-20250929",
"generated_at": "2025-12-07T09:32:11Z",
"cached": false
}
תמיד יוחזר JSON תקין. אם Claude החזיר ערכים חסרים, השירות ממלא fallback מבוסס הקשר (אותן פונקציות היוריסטיות מהדשבורד).
❗ קודי שגיאה
סטטוס |
|
מתי זה קורה? |
טיפול מומלץ |
|---|---|---|---|
400 |
|
גוף לא חוקי או |
תקן את הקריאה מצד הלקוח |
401 |
|
חסר/שגוי |
ודא ש- |
502 |
|
Claude החזיר שגיאה או JSON שבור |
הלקוח ייפול ל־fallback |
503 |
|
חסר |
השלם הגדרה/Secret |
504 |
|
הבקשה חרגה מ- |
הלקוח יציג fallback |
כל השגיאות מחזירות גוף JSON בסיסי: {"error": "...", "message": "..."}.
⚙️ קונפיגורציה נדרשת
משתנה |
תפקיד |
ברירת מחדל |
|---|---|---|
|
מפתח API של Claude Sonnet |
— |
|
כתובת השירות (בדרך כלל |
ריק (מבטל AI) |
|
Bearer token הדדי בין Dashboard ↔︎ שירות |
ריק (ללא אימות) |
|
Timeout גם ללקוח וגם לשירות |
|
|
שם הדגם המדויק (למשל |
Sonnet 4.5 יציב |
|
מגבלת טוקנים לתשובת Claude |
|
חשוב: אם החיבור לשירות נפל, הדשבורד ימשיך לספק הסבר יוריסטי כך שה-UX לא נשבר.
🧪 בדיקות
tests/unit/services/test_ai_explain_service.py– בודק Masking, fallback ותקינות פלט.tests/test_webserver_ai_explain_endpoint.py– בודק אימות Bearer, החזרת JSON והידרדרות לשגיאות.
להפעלת בדיקות ממוקדות:
pytest tests/unit/services/test_ai_explain_service.py tests/test_webserver_ai_explain_endpoint.py
📝 טיפים לפריסה
חשוף את ה־webserver (AioHTTP) דרך פורט ייעודי או behind-ingress.
קבע את
OBS_AI_EXPLAIN_URLבצד ה-WebApp כדי שיפנה לשירות.אחסן את
OBS_AI_EXPLAIN_TOKENוגם אתANTHROPIC_API_KEYב-Secret Manager (Render/Heroku/K8s).נטר את האירועים
ai_explain_request_*ב-Observability כדי לוודא SLA < 10 שניות.