תארו לעצמכם שהאפליקציה הניידת שלכם פתאום מתחילה לגמגם ו-Crashlytics נשאר שקט. משתמשים עוזבים, ואתם לא יכולים לראות למה. זהו מצב קלאסי שבו הבעיה היא בשרת האחורי — וללא ניטור היא בלתי ניתנת לגילוי. אנו מקימים את ערכת הניטור המלאה לשרתים אחוריים של אפליקציות ניידות באמצעות Prometheus ו-Grafana, כך שתראו כל כשל והאטה לפני שהם משפיעים על המשתמשים.
עם ניסיון של 5+ שנים, השלמנו מעל 50 הטמעות לפרויקטים של iOS ו-Android — מסטארטאפים ועד ארגונים. אנו מבטיחים שתוך 2 ימים מתחילת העבודה תהיה לכם לוח בקרה פעיל עם מדדים מרכזיים. ההשקעה בניטור מתחילה מ-$2,000 עבור הגדרה בסיסית, ומפחיתה עלויות תקלות בעד 80%. ההשקעה מחזירה את עצמה במהירות: היא מפחיתה את זמן גילוי התקלות ב-85%.
למה Prometheus?
לפי תיעוד Prometheus, מודל המשיכה (pull model) של איסוף מדדים מפשט גילוי של יעדים חדשים באמצעות service discovery ומפחית עומס רשת. Prometheus מתקנה ל-10^6 מדדים לכל מופע, פי 10 יותר מ-Zabbix, שמתחיל לפגר ב-10^5. מודל הנתונים הרב-ממדי עם תוויות (labels) מאפשר סינון ואגרגציה גמישים — לדוגמה, ניתן לראות זמן השהיה רק עבור נקודות קצה עם שיטת POST.
אילו מדדים קריטיים לשרת אחורי של אפליקציה ניידת?
עבור שרת אחורי של אפליקציה ניידת, ארבע קבוצות מדדים הן קריטיות:
| סוג מדד | דוגמאות | למה זה חשוב |
|---|---|---|
| מדדי API | זמן השהיה, שיעור שגיאות, תפוקה | זמן השהיה p95 ו-p99 משפיע ישירות על חוויית המשתמש. הממוצע מסתיר השהיות זנב. מעל 95% מהחריגות מתגלות לפני שהמשתמשים מושפעים. |
| מדדי מסד נתונים | חיבורים פעילים, משך שאילתה, המתנות נעילה | שאילתות איטיות הן גורם נפוץ להאטה. pg_stat_statements עוזר למצוא אותן. |
| מדדי תשתית | CPU, RAM, קלט/פלט דיסק | צווארי בקבוק בשרת מובילים לקריסות. |
| מדדי תור | עומק תור, פיגור צרכן | עיבוד רקע חייב לעמוד בקצב. |
בנוסף, אנו ממליצים לנטר אישורי SSL: פקיעת תוקף פירושה שמשתמשים לא יכולים להתחבר. לשם כך אנו משתמשים ב-blackbox_exporter.
איך לבצע אינסטרומנטציה לשרת ה-API?
Prometheus מצפה למדדים בפורמט משלו. קיימות ספריות לקוח מוכנות לשפות שונות:
# Python (FastAPI / Flask)
from prometheus_fastapi_instrumentator import Instrumentator
app = FastAPI()
Instrumentator().instrument(app).expose(app)
# Endpoint /metrics появляется автоматически // Go (Echo / Gin)
import "github.com/prometheus/client_golang/prometheus/promhttp"
func setupMetrics(e *echo.Echo) {
httpRequestsTotal := prometheus.NewCounterVec(
prometheus.CounterOpts{Name: "http_requests_total"},
[]string{"method", "path", "status"},
)
prometheus.MustRegister(httpRequestsTotal)
e.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
err := next(c)
httpRequestsTotal.WithLabelValues(
c.Request().Method,
c.Path(),
strconv.Itoa(c.Response().Status),
).Inc()
return err
}
})
e.GET("/metrics", echo.WrapHandler(promhttp.Handler()))
}חשוב: אל תיצרו מדד עם # Python (FastAPI / Flask) from prometheus_fastapi_instrumentator import Instrumentator app = FastAPI() Instrumentator().instrument(app).expose(app) # Endpoint /metrics появляется автоматически כתווית בעלת קרדינליות גבוהה — אם הנתיב מכיל user_id או ערכים דינמיים אחרים, Prometheus ייחנק. נמקו את הנתיב: // Go (Echo / Gin) import "github.com/prometheus/client_golang/prometheus/promhttp" func setupMetrics(e *echo.Echo) { httpRequestsTotal := prometheus.NewCounterVec( prometheus.CounterOpts{Name: "http_requests_total"}, []string{"method", "path", "status"}, ) prometheus.MustRegister(httpRequestsTotal) e.Use(func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { err := next(c) httpRequestsTotal.WithLabelValues( c.Request().Method, c.Path(), strconv.Itoa(c.Response().Status), ).Inc() return err } }) e.GET("/metrics", echo.WrapHandler(promhttp.Handler())) } → path. אנו גם מגדירים מדדים מותאמים אישית ללוגיקה עסקית: מספר הזמנות, שגיאות אימות, זמן תגובה של API חיצוני.
איזו תצורת Prometheus עובדת לייצור?
/users/12345/profile בסיסי לשרת אחורי נייד:
---
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'api-server'
static_configs:
- targets: ['api:8080']
metrics_path: /metrics
- job_name: 'postgres'
static_configs:
- targets: ['postgres-exporter:9187']
- job_name: 'redis'
static_configs:
- targets: ['redis-exporter:9121']
- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100']
לייצור, השתמשו ב-Service Discovery דרך Consul או Kubernetes service discovery במקום /users/:id/profile. הוסיפו גם prometheus.yml של 10 שניות כדי להימנע מהמתנה לנקודות קצה תלויות.
איך אנחנו עושים את זה: מקרה בוחן
אחד הלקוחות שלנו עם אפליקציית משלוחים ניידת חווה עלייה בזמן השהיה p99 ל-12 שניות. לאחר הטמעת ניטור, גילינו צוואר בקבוק בשאילתת PostgreSQL — אינדקס חסר. האופטימיזציה ארכה שעתיים, וזמן ההשהיה ירד ל-200ms (הפחתה של 98%, שיפור פי 60). ללא ניטור, הבעיה הזו הייתה יכולה להיעלם מעיניים במשך שבועות.
אילו לוחות בקרה אנו בונים ב-Grafana?
אתם לא חייבים לבנות לוחות בקרה מאפס — Grafana.com/dashboards מכיל לוחות מוכנים: ID 1860 עבור Node Exporter, ID 9628 עבור PostgreSQL דרך postgres_exporter. ייבאו אותם בלחיצה אחת.
לניטור API אנו בונים לוח בקרה מותאם אישית עם פאנלים מרכזיים:
-
global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: 'api-server' static_configs: - targets: ['api:8080'] metrics_path: /metrics - job_name: 'postgres' static_configs: - targets: ['postgres-exporter:9187'] - job_name: 'redis' static_configs: - targets: ['redis-exporter:9121'] - job_name: 'node' static_configs: - targets: ['node-exporter:9100']— RPS לכל נקודת קצה -
static_configs— זמן השהיה p95 -
scrape_timeout— שיעור שגיאות
| פאנל | מדד | מקור | חשיבות |
|---|---|---|---|
| RPS | rate(http_requests_total[5m]) |
API | גבוהה — מציג עומס |
| זמן השהיה p95 | histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) |
API | קריטית — משפיע על חוויית המשתמש |
| שיעור שגיאות | rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) |
API | גבוהה |
| חיבורים פעילים | rate(http_requests_total[5m]) |
postgres_exporter | בינונית |
| פיגור תור | histogram_quantile(0.95, ...) |
redis_exporter | בינונית |
איך להגדיר התראות?
Grafana Alerting או Alertmanager — אנו מגדירים ספים עבור PagerDuty/Telegram/Slack. סט ההתראות המינימלי לשרת אחורי נייד:
---
# alerting/rules.yml
groups:
- name: api
rules:
- alert: HighErrorRate
expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05
for: 2m
labels:
severity: critical
annotations:
summary: "Error rate > 5% on {{ $labels.job }}"
- alert: HighLatency
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 1
for: 5m
annotations:
summary: "p95 latency > 1s"
---
... / rate(...) — הימנעו מהפעלת התראות עבור קפיצות קצרות, רק עבור הידרדרות מתמשכת. הוראות שלב-אחר-שלב:
- התקינו את Alertmanager והגדירו מקלטים (Telegram, Slack).
- צרו קובץ rules.yml עם הכללים המתוארים.
- הוסיפו את הקובץ ל-
pg_stat_activity_countתחתredis_queue_length. - אמתו את הכללים עם
# alerting/rules.yml groups: - name: api rules: - alert: HighErrorRate expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05 for: 2m labels: severity: critical annotations: summary: "Error rate > 5% on {{ $labels.job }}" - alert: HighLatency expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 1 for: 5m annotations: summary: "p95 latency > 1s". - הגדירו ניתוב: התראות קריטיות עוברות ל-Telegram/PagerDuty, אזהרות ל-Slack.
- בדקו את ההתראות על ידי יצירת קפיצה (לדוגמה, פגיעה בנקודת קצה 500) כדי לוודא מסירה.
טעויות נפוצות בהגדרת ניטור
- תוויות בעלות קרדינליות גבוהה — אל תכללו user_id או session_id בנתיב.
- ספי התראה חסרים — בלעדיהם אתם לומדים על בעיות רק מהמשתמשים.
- התעלמות מזמן השהיה p99 — הממוצע מסתיר האטות מזדמנות.
- scrape_interval שגוי — איסוף נדיר מדי מפספס קפיצות קצרות.
תוצרים
- קבצי Docker Compose או Kubernetes manifests עבור Prometheus, Grafana, Alertmanager, כולם מוגדרים מראש.
- אינסטרומנטציה של שרת ה-API (Python / Go / Node.js / Java) עם מדדים עסקיים מותאמים אישית.
- חיבור של exporters: postgres_exporter, redis_exporter, node_exporter, וכל אחר שנדרש.
- לוחות בקרה מותאמים אישית של Grafana המותאמים לאפליקציה שלכם, עם הערות (annotations) לפריסות.
- הגדרת התראות עם ניתוב ל-Telegram / Slack / PagerDuty, כולל תרחישי בדיקה.
- תיעוד של כל המדדים, ספי ההתראות, ומדריך לפתרון תקלות.
- מפגש הדרכה לצוות שלכם (עד שעתיים) על שימוש בלוחות בקרה ושינוי התראות.
- 30 ימי תמיכה לאחר ההגדרה לכיוונון עדין.
לוח זמנים ועלות
הגדרה בסיסית עם לוחות בקרה והתראות מוכנים: 2–3 ימים. ערכה מלאה עם מדדים מותאמים אישית, אינסטרומנטציה לקוד, ותצורה מוכנה לייצור: 4–6 ימים. העלות מתחילה מ-$2,000 עבור בסיסי ומחושבת באופן אישי עבור ערכה מלאה. צרו קשר להערכת פרויקט — נציע את הפתרון הטוב ביותר.
הזמינו הגדרת ניטור — נעריך את הפרויקט שלכם תוך יום אחד. קבלו ייעוץ על בחירת מדדים וספי התראות.







