אובזרווביליות (Observability)
מטרות
לוגים מובנים עם
eventו-error_code.קורלציה בין אירועים באמצעות
request_idו-trace_id.מטריקות: ספירות, זמני תגובה, מצב מערכת.
התראות: הגדרת ספים וזיהוי תקלות אוטומטי.
פרטיות: טשטוש מידע רגיש (Redaction) ודגימה (Sampling).
קהלי יעד
סוכני AI: לזיהוי דפוסים וביצוע פעולות תיקון (Remediation).
מפתחים: לדיבוג מהיר וניטור ביצועים.
תצורה
Structured logging באמצעות
structlog.OpenTelemetry (אופציונלי): אתחול אוטומטי עם OTLP Exporter.
משתני סביבה עיקריים:
OTEL_EXPORTER_OTLP_ENDPOINT: ברירת מחדלhttp://localhost:4317OTEL_EXPORTER_INSECURE:true/false(ברירת מחדלfalse)ENVIRONMENT/ENV: שם סביבה לדיווח resourceAPP_VERSION: גרסה לשיוך ל-service.version
מדיניות Fail‑Open:: אינסטרומנטציה ותיעוד חייבים להיות ”שקופים“ לפעולה העסקית. אם OTel/Prometheus אינם זמינים (ייבוא נכשל, חיבור חסום, או שגיאת תצורה) – המודולים עובדים במצב
no‑opללא חריגה המשביתה את האפליקציה. זה מאפשר להפעיל tracing/metrics בהדרגה ללא סיכון לזמינות.אינסטרומנטציה אוטומטית: - Flask (כשקיים אובייקט
app) - Requests - PyMongoעבור Flask האתחול קורה ב-
webapp/app.py. עבור תהליכים ללא Flask (למשל הבוט), האתחול קורה ב-main.pyללאflask_app.Prometheus דרך נקודת קצה
/metrics.Sentry לטיפול בשגיאות.
בחירת Backend ל־Traces
מומלץ להתחיל עם אחד מהבאים (כולם תומכים ב־OTLP):
Jaeger (פשוט לפריסה מקומית/דוקר)
Grafana Tempo (סקיילבל, מתאים לשילוב עם Grafana/Prometheus)
Grafana Cloud (שירות מנוהל)
הגדרת OTLP לסביבות
הגדירו משתני סביבה בכל סביבה:
# Staging
export ENVIRONMENT=staging
export APP_VERSION=1.2.3
export OTEL_EXPORTER_OTLP_ENDPOINT="http://tempo.staging.svc:4317"
export OTEL_EXPORTER_INSECURE=true
# Production
export ENVIRONMENT=production
export APP_VERSION=1.2.3
export OTEL_EXPORTER_OTLP_ENDPOINT="https://otlp.prod.example.com:4317"
export OTEL_EXPORTER_INSECURE=false
הערות:
ב־gRPC ברירת המחדל היא יציאה 4317.
כאשר עובדים מול TLS פרטי/מאולתר, ניתן להגדיר
OTEL_EXPORTER_INSECURE=true.ודאו פתיחת פיירוול/Ingress ליצוא ה־OTLP מהאפליקציה.
קישורים
🧠 Quick Fix חכם (Queue Delay + עומס/DB) – הנחיות למפתחים ולסוכני AI
Datasource של Jaeger ב‑Grafana מוגדר תחת
docker/grafana/provisioning/datasources/prometheus.yml
אינסטרומנטציה ידנית (Manual Instrumentation)
בנוסף לאינסטרומנטציה האוטומטית של Flask/Requests/PyMongo, ניתן להוסיף טרייסים ומטריקות ידניות עם הדקורטור @traced מתוך המודול observability_instrumentation.
מאפיינים:
בטוח להרצה בלי תלות ב־OpenTelemetry (No‑Op אם לא מותקן)
יוצר Span בשם קבוע שניתן להגדיר
מודד משך זמן ומסמן חריגות במטריקות (request.duration, errors.total, requests.active)
דוגמאות שימוש:
from observability_instrumentation import traced
@traced("bookmarks.toggle")
def toggle_bookmark(...):
# קוד הפונקציה
pass
@traced("batch.reindex")
async def reindex_all(...):
# קוד אסינכרוני
...
הערות:
הדקורטור פועל גם על פונקציות sync וגם על async.
כאשר מתרחשת חריגה, משך הפעולה נרשם פעם אחת בלבד עם המאפיין
error=True.עבור Flask, האינסטרומנטציה האוטומטית מוסיפה טרייסים ברמת הבקשה; שימוש ב־@traced מומלץ סביב פעולות עסקיות קריטיות בתוך הידלרים או שירותים.
דוקר קומפוז – הפעלה מהירה עם Jaeger
לריצה מקומית עם Tracing מלא (Jaeger + Grafana + Prometheus):
# הרצת שירותי ניטור + בוט
docker-compose --profile monitoring up jaeger grafana prometheus code-keeper-bot mongodb
# גישה ל-Jaeger UI
# http://localhost:16686
ברירת המחדל ב-Compose שולחת OTLP ל-http://jaeger:4317. ניתן לדרוס:
export OTEL_EXPORTER_OTLP_ENDPOINT="http://tempo.staging.svc:4317" # לדוגמה Tempo
export OTEL_EXPORTER_INSECURE=true
docker-compose up -d
Quick start – אימות ספאנים ב־Jaeger
הריצו את השירותים עם הפרופיל
monitoring(ראו פקודה לעיל).ודאו ש‑
OTEL_EXPORTER_OTLP_ENDPOINTמצביע ל‑http://jaeger:4317(ברירת המחדל ב‑Compose).פתחו את Jaeger ב‑
http://localhost:16686ובחרו את השירותcode-keeper-botאוcode-keeper-webapp.הריצו פעולות כבדות (חיפוש/הורדה/פעולות bulk) ואמתו הופעת spans עם שמות העסקיים מהדקורטור
@traced.
כיסוי דקורטור @traced
הוספנו כיסוי ידני במסלולים כבדים:
search.global(קיים)search.suggestions(קיים)files.list(קיים)files.download(חדש)files.bulk_favorite(חדש)files.bulk_unfavorite(חדש)files.bulk_tag(חדש)
אימות ב-Staging
בדקו שהטרייסים מגיעים:
הגדירו משתני סביבה בשירות:
ENVIRONMENT=staging APP_VERSION=1.2.3 OTEL_EXPORTER_OTLP_ENDPOINT=https://otlp.yourdomain:4317 OTEL_EXPORTER_INSECURE=false
שלחו מספר בקשות לנתיבים הכבדים (חיפוש, הורדה, bulk tag/fav).
ודאו הופעת השירותים
code-keeper-webappו-code-keeper-botב-Backend (Jaeger/Tempo).