Visual Rule Engine - מנוע כללים ויזואלי
הערה
פיצ’ר זה זמין רק למשתמשי אדמין (ADMIN_USER_IDS).
ראו Security Guide להגדרת הרשאות.
סקירה כללית
ה-Visual Rule Engine מאפשר ליצור כללים מורכבים להתראות (Alerts) בממשק גרפי, ללא צורך בכתיבת קוד. כל כלל מורכב מ:
תנאים (Conditions) - מתי הכלל יופעל
פעולות (Actions) - מה לעשות כשהכלל מתאים
מתי להשתמש:
סינון התראות רועשות (Suppress)
פתיחת Issue אוטומטי ב-GitHub עבור שגיאות חדשות
שליחת webhook לשירות חיצוני
ניתוב התראות לפי חומרה/סביבה/פרויקט
מה זה לא:
לא תחליף ל-Alertmanager rules (Prometheus)
לא מערכת Workflow מלאה
לא מנגנון Rate-limiting להתראות
זרימת ההחלטה
התרשים הבא מסביר מה קורה כשהתראה נכנסת למערכת:
graph TD
A[Alert Received] --> B{Enabled Rules exist?}
B -- No --> C[Send Alert - Default]
B -- Yes --> D{Evaluate Rules}
D --> E{Match Found?}
E -- No --> C
E -- Yes --> F{Action Type}
F -- Suppress --> G[🛑 Stop / Drop Alert]
F -- Send Alert --> C
F -- GitHub Issue --> H[📝 Create Issue]
F -- Webhook --> I[🌐 Call Webhook]
H --> C
I --> C
חשוב
הערכת כללים מתבצעת ב-internal_alerts.emit_internal_alert לפני שליחה ל-forwarders (Telegram/Slack).
פעולת suppress עוצרת את שליחת ההתראה לחלוטין.
UI Walkthrough
גישה למסך הכללים
היכנסו ל-WebApp כמשתמש אדמין
נווטו ל: Admin → Visual Rules (
/admin/rules)תראו את רשימת הכללים הקיימים
יצירת כלל חדש
לחצו על ”כלל חדש“
הזינו שם לכלל
הוסיפו תנאים (Conditions):
לחצו ”+ Add Condition“
בחרו שדה (Field)
בחרו אופרטור (Operator)
הזינו ערך (Value)
ליצירת תנאי מורכב, השתמשו ב-Groups:
AND - כל התנאים חייבים להתקיים
OR - לפחות תנאי אחד חייב להתקיים
NOT - הפיכת תנאי (בדיוק ילד אחד)
הוסיפו פעולות (Actions):
לחצו ”+ Add Action“
בחרו סוג פעולה
בדקו את הכלל עם כפתור ”Test“
שמרו עם כפתור ”Save“
הפעלה/כיבוי כלל
לחצו על מתג ה-Toggle ליד הכלל
כלל מכובה לא יוערך אבל נשמר
מחיקת כלל
לחצו על אייקון פח האשפה ליד הכלל
אשרו את המחיקה
מבנה הכלל (JSON Schema)
התרשים הבא מציג את היררכיית מבנה הכלל:
graph TD
Root[Rule Object] --> Conditions
Root --> Actions
Conditions --> G1[Group AND]
G1 --> C1[Condition: alert_type == sentry]
G1 --> C2[Condition: is_new_error == true]
Actions --> A1[Action: create_github_issue]
style G1 fill:#e1f5fe,stroke:#01579b
style C1 fill:#fff9c4,stroke:#fbc02d
style C2 fill:#fff9c4,stroke:#fbc02d
style A1 fill:#e8f5e9,stroke:#2e7d32
שדות הכלל
שדה |
סוג |
תיאור |
|---|---|---|
|
string |
מזהה ייחודי (נוצר אוטומטית) |
|
string |
שם הכלל (חובה) |
|
boolean |
האם הכלל פעיל |
|
object |
עץ התנאים |
|
array |
רשימת פעולות |
דוגמה 1: כלל פשוט (Suppress)
{
"name": "השתק התראות Info בסביבת פיתוח",
"conditions": {
"type": "condition",
"field": "environment",
"operator": "eq",
"value": "development"
},
"actions": [
{
"type": "suppress"
}
]
}
דוגמה 2: כלל עם Group (AND)
{
"name": "התראה על שגיאות קריטיות בפרודקשן",
"conditions": {
"type": "group",
"operator": "AND",
"children": [
{
"type": "condition",
"field": "severity",
"operator": "eq",
"value": "critical"
},
{
"type": "condition",
"field": "environment",
"operator": "eq",
"value": "production"
}
]
},
"actions": [
{
"type": "webhook",
"webhook_url": "https://hooks.slack.com/services/xxx"
}
]
}
דוגמה 3: OR עם NOT פנימי
{
"name": "התראה כשלא בשעות עבודה",
"conditions": {
"type": "group",
"operator": "OR",
"children": [
{
"type": "condition",
"field": "hour_of_day",
"operator": "lt",
"value": 8
},
{
"type": "condition",
"field": "hour_of_day",
"operator": "gt",
"value": 18
}
]
},
"actions": [
{
"type": "send_alert",
"channel": "telegram",
"severity": "warning"
}
]
}
דוגמה 4: GitHub Issue לשגיאות Sentry חדשות
{
"name": "פתיחת Issue בגיטהאב על שגיאת Sentry חדשה",
"conditions": {
"type": "group",
"operator": "AND",
"children": [
{
"type": "condition",
"field": "alert_type",
"operator": "eq",
"value": "sentry_issue"
},
{
"type": "condition",
"field": "is_new_error",
"operator": "eq",
"value": "True"
}
]
},
"actions": [
{
"type": "create_github_issue",
"severity": "warning",
"title_template": "[Sentry] {{summary}}"
}
]
}
הסבר:
Condition 1: בודק שמדובר בהתראת Sentry
Condition 2: בודק שזו שגיאה חדשה (
is_new_error == True)Action: יוצר Issue בגיטהאב עם כותרת דינמית
Templating: השימוש ב-
{{summary}}מחליף אוטומטית את התוכן בתיאור השגיאה
פעולות (Actions)
suppress
מה עושה: מסמן את ההתראה כ-”silenced“ ועוצר את שליחתה לכל הערוצים.
איפה זה עוצר: ב-internal_alerts.emit_internal_alert, לפני שליחה ל-Telegram/Slack.
{
"type": "suppress"
}
send_alert
מה עושה: שולח התראה מותאמת לערוץ ספציפי.
ערוצים נתמכים:
telegram/default- נתמך מלאslack- בתכנון
פרמטרים:
פרמטר |
סוג |
תיאור |
|---|---|---|
|
string |
ערוץ היעד ( |
|
string |
חומרה להודעה |
|
string |
תבנית הודעה עם placeholders |
Placeholders זמינים:
{{rule_name}}- שם הכלל{{summary}}- תקציר ההתראה{{severity}}- חומרה{{triggered_conditions}}- רשימת תנאים שהותאמו
{
"type": "send_alert",
"channel": "telegram",
"severity": "warning",
"message_template": "🔔 {{rule_name}}: {{summary}}"
}
create_github_issue
מה עושה: יוצר Issue חדש ב-GitHub Repository.
דרישות:
GITHUB_TOKENמוגדר עם הרשאתrepoGITHUB_REPOמוגדר (בפורמטowner/repo)
פרמטרים:
פרמטר |
סוג |
תיאור |
|---|---|---|
|
string |
תבנית כותרת (תומכת ב-placeholders) |
|
string |
Label שיתווסף ל-Issue |
התנהגות ”כבר קיים Issue“:
המערכת בודקת אם יש Issue פתוח עם אותה כותרת
אם קיים - לא נוצר Issue כפול
הבדיקה מבוססת על Title בלבד
{
"type": "create_github_issue",
"title_template": "[Alert] {{summary}}",
"severity": "critical"
}
webhook
מה עושה: שולח HTTP POST ל-URL חיצוני עם נתוני ההתראה.
Payload: נתוני ההתראה המלאים (alert_data) בפורמט JSON.
Timeouts: 10 שניות.
SSRF Guardrails:
רק
http://אוhttps://חסימת כתובות פנימיות (Private IPs, Loopback, Link-local)
בדיקת DNS resolution לכל הכתובות
Allowlist (אופציונלי):
ALLOWED_WEBHOOK_HOSTS- רשימת hostnames מדויקים (CSV)ALLOWED_WEBHOOK_SUFFIXES- סיומות דומיין (CSV, למשל.example.com)
{
"type": "webhook",
"webhook_url": "https://hooks.slack.com/services/T00/B00/xxxx"
}
אזהרה
אם מוגדרים ALLOWED_WEBHOOK_HOSTS או ALLOWED_WEBHOOK_SUFFIXES,
רק URLs שמתאימים ל-allowlist יישלחו. אחרים ייחסמו.
Evaluation Context - שדות זמינים
להלן רשימת כל השדות שזמינים לשימוש בתנאים:
שדות בסיסיים מההתראה
שדה |
סוג |
תיאור |
מקור |
|---|---|---|---|
|
string |
שם ההתראה |
|
|
string |
רמת חומרה (info/warning/critical/anomaly) |
|
|
string |
תיאור קצר |
|
|
string |
מקור ההתראה (sentry/internal/external) |
|
|
boolean |
האם ההתראה הושתקה |
|
שדות מ-details
שדה |
סוג |
תיאור |
|---|---|---|
|
string |
סוג התראה (sentry_issue, deployment_event, וכו«) |
|
string |
מזהה ה-Issue ב-Sentry |
|
string |
מזהה קצר (PROJECT-123) |
|
string |
שם הפרויקט |
|
string |
סביבה (production/staging/development) |
|
string |
חתימת השגיאה (לזיהוי חוזר) |
|
string |
Hash של החתימה |
|
boolean |
האם זו שגיאה חדשה |
|
string |
הודעת השגיאה |
|
string |
Stack trace מלא |
|
int |
מספר הופעות |
|
string |
מיקום השגיאה (פונקציה/קובץ) |
|
string |
פעולה (triggered/resolved) |
שדות מדדים
שדה |
סוג |
תיאור |
|---|---|---|
|
float |
שיעור שגיאות |
|
int |
בקשות לדקה |
|
int |
Latency ממוצע (ms) |
שדות זמן (מחושבים)
שדה |
סוג |
תיאור |
|---|---|---|
|
int (0-23) |
שעה נוכחית (UTC) |
|
int (0-6) |
יום בשבוע (0=ראשון, 6=שבת) |
אופרטורים
אופרטור |
תיאור |
דוגמה |
|---|---|---|
|
שווה |
|
|
לא שווה |
|
|
גדול מ- |
|
|
גדול או שווה ל- |
|
|
קטן מ- |
|
|
קטן או שווה ל- |
|
|
מכיל מחרוזת |
|
|
לא מכיל מחרוזת |
|
|
מתחיל ב- |
|
|
מסתיים ב- |
|
|
התאמת ביטוי רגולרי |
|
|
ברשימה |
|
|
לא ברשימה |
|
הערה
אופרטור regex מוגן מפני ReDoS:
אורך דפוס מקסימלי: 200 תווים
אורך קלט מקסימלי: 10,000 תווים
Timeout: 1 שנייה
זיהוי דפוסים מסוכנים (catastrophic backtracking)
אבטחה
הרשאות אדמין
רק משתמשים ב-
ADMIN_USER_IDSיכולים לגשת ל-API ולממשקבדיקת הרשאות מתבצעת בכל endpoint
הגדרת אדמינים:
export ADMIN_USER_IDS="123456789,987654321"
Webhook SSRF Protection
ברירת מחדל - חסימת כתובות פנימיות:
Private IPs (
10.x.x.x,192.168.x.x,172.16-31.x.x)Loopback (
127.0.0.1,::1)Link-local (
169.254.x.x)Multicast / Unspecified
Allowlist מפורש:
למקרים שנדרש שליטה מדויקת על יעדים:
# רשימת hostnames מדויקים
export ALLOWED_WEBHOOK_HOSTS="hooks.slack.com,api.pagerduty.com"
# או סיומות דומיין
export ALLOWED_WEBHOOK_SUFFIXES=".example.com,.mycompany.net"
אזהרה
כאשר מוגדר allowlist, רק URLs שמתאימים יישלחו. כתובות שלא ב-allowlist ייחסמו גם אם הן ציבוריות.
הסימולטור
הסימולטור מאפשר לבדוק כללים מבלי להפעיל אותם בפועל.
sequenceDiagram
participant User
participant Simulator
participant Engine
participant GitHub
Note over User, GitHub: 🧪 Simulation Mode
User->>Simulator: Send Rule + Test Data
Simulator->>Engine: Evaluate (Dry Run)
Engine-->>Simulator: Result: Would create Issue
Simulator-->>User: Show Green Light ✅
Note over User, GitHub: 🚀 Real Production
User->>Engine: Save Rule
Engine->>GitHub: Create Issue via API
מה בטוח לעשות בסימולטור:
לבדוק כל כלל
לשנות נתוני בדיקה
לראות אילו פעולות היו מתבצעות
מה לא קורה בסימולטור:
לא נפתח Issue בגיטהאב
לא נשלח webhook
לא נשלחת התראה
משתני סביבה
ראו משתני סביבה - רפרנס לרשימה המלאה.
משתנים עיקריים לפיצ’ר:
משתנה |
תיאור |
ברירת מחדל |
|---|---|---|
|
מזהי משתמשים עם הרשאות אדמין (CSV) |
”“ (ריק) |
|
Allowlist ל-webhooks (CSV) |
”“ (ריק) |
|
סיומות דומיין מורשות (CSV) |
”“ (ריק) |
|
טוקן GitHub ליצירת Issues |
|
|
ריפו ליצירת Issues ( |
|
|
לוגים מפורטים (לדיבוג) |
|
פתרון בעיות
”הכלל לא רץ“
אפשרות 1: אין כללים פעילים
ודאו שיש לפחות כלל אחד עם
enabled: trueבדקו ב-API:
GET /api/rules?enabled=true
אפשרות 2: המשתמש לא אדמין
ודאו שה-
user_idמופיע ב-ADMIN_USER_IDS
אפשרות 3: כשל ולידציה
הפעילו
RULES_VERBOSE_LOGGING=trueבדקו בלוגים שגיאות ולידציה
אפשרות 4: תנאים לא מתאימים
השתמשו בסימולטור עם נתוני הבדיקה
ודאו שהשדות קיימים ב-context
”webhook נחסם“
אפשרות 1: כתובת פנימית
webhooks לא יכולים לפנות ל-IPs פרטיים
השתמשו ב-URL ציבורי
אפשרות 2: לא ב-allowlist
אם הגדרתם
ALLOWED_WEBHOOK_HOSTSאוALLOWED_WEBHOOK_SUFFIXES, ודאו שה-URL מתאים
אפשרות 3: DNS resolution נכשל
ודאו שה-hostname קיים ונגיש
”is_new_error תמיד False“
אפשרות 1: אין מספיק שדות לשגיאה
הפרמטרים הבאים נדרשים לחישוב חתימה:
error_messageאוmessageculprit(מיקום השגיאה)
אפשרות 2: אין חתימה
ודאו שה-
error_signature_hashמחושבבדקו שפונקציית
enrich_alert_with_signatureרצה
אפשרות 3: השגיאה כבר נראתה
is_new_errorיהיהTrueרק בפעם הראשונהחתימות נשמרות ב-DB
”GitHub Issue לא נוצר“
אפשרות 1: חסר GITHUB_TOKEN
export GITHUB_TOKEN=ghp_xxxxxxxxxxxx
export GITHUB_REPO=owner/repo
אפשרות 2: הרשאות Token
נדרשת הרשאת
repoלפתיחת Issues
אפשרות 3: Issue כפול
המערכת בודקת Issues קיימים עם אותה כותרת
בדקו אם קיים Issue פתוח
Test Plan
צ’קליסט ידני לאימות הפיצ’ר:
בדיקה |
תוצאה צפויה |
|---|---|
יצירת כלל suppress לסביבת dev |
התראות מ-dev לא נשלחות |
יצירת כלל webhook ל-host מאושר |
webhook נשלח בהצלחה |
יצירת כלל webhook ל-host לא מאושר |
webhook נחסם עם log warning |
בדיקת כלל בסימולטור |
תוצאה ירוקה/אדומה ללא side effects |
יצירת כלל GitHub Issue |
Issue נפתח בריפו |
ניסיון גישה ללא הרשאת אדמין |
קבלת 403 Forbidden |
API Reference
Endpoint |
Method |
תיאור |
|---|---|---|
|
GET |
רשימת כללים |
|
POST |
יצירת כלל חדש |
|
GET |
קבלת כלל ספציפי |
|
PUT |
עדכון כלל |
|
DELETE |
מחיקת כלל |
|
POST |
הפעלה/כיבוי כלל |
|
GET |
שדות זמינים |
|
POST |
בדיקת כלל (סימולטור) |
קישורים
משתני סביבה - רפרנס - משתני סביבה
התראות (Alerts) - מערכת ההתראות
אובזרווביליות (Observability) - Observability Dashboard