دليل مقاييس Prometheus والمراقبة
نظرة عامة
تقوم OmniTAS بتصدير مقاييس تشغيلية شاملة بتنسيق Prometheus للمراقبة والتنبيه والرؤية. يغطي هذا الدليل جميع المقاييس المتاحة، واستخداماتها، واستكشاف الأخطاء، وأفضل الممارسات للمراقبة.
نقطة نهاية المقاييس
جميع المقاييس متاحة على: http://<tas-ip>:8080/metrics
هام: تكوين وحدة زمنية للمقياس
تستخدم جميع مقاييس المدة في هذا النظام duration_unit: false في إعلانات Histogram الخاصة بها. هذا أمر حاسم لأن:
- تقوم مكتبة Prometheus Elixir بالكشف تلقائيًا عن أسماء المقاييس التي تنتهي بـ
_milliseconds - بشكل افتراضي، تقوم بتحويل وحدات الوقت الأصلية في Erlang إلى ميلي ثانية تلقائيًا
- يقوم كودنا بالفعل بتحويل الوقت إلى ميلي ثانية باستخدام
System.convert_time_unit/3 - بدون
duration_unit: false، ستقوم المكتبة بتحويل الميلي ثانية إلى نانو ثانية (تقسيمها على ~1,000,000)
مثال:
# تكوين صحيح
Histogram.declare(
name: :http_dialplan_request_duration_milliseconds,
help: "مدة طلبات HTTP dialplan بالميلي ثانية",
labels: [:call_type],
buckets: [100, 250, 500, 750, 1000, 1500, 2000, 3000, 5000],
duration_unit: false # مطلوب لمنع التحويل المزدوج
)
# قياس الوقت بشكل صحيح
start_time = System.monotonic_time()
# ... القيام بالعمل ...
end_time = System.monotonic_time()
duration_ms = System.convert_time_unit(end_time - start_time, :native, :millisecond)
Histogram.observe([name: :http_dialplan_request_duration_milliseconds], duration_ms)
مرجع المقياس الكامل
مقاييس Diameter
diameter_response_duration_milliseconds
النوع: Histogram
التسميات: application (ro, sh)، command (ccr, cca، إلخ)، result (success, error, timeout)
الأقسام: 10، 50، 100، 250، 500، 1000، 2500، 5000، 10000 مللي ثانية
الوصف: مدة طلبات Diameter بالميلي ثانية
الاستخدام:
# متوسط زمن استجابة Diameter
rate(diameter_response_duration_milliseconds_sum[5m]) /
rate(diameter_response_duration_milliseconds_count[5m])
# P95 زمن تأخير Diameter
histogram_quantile(0.95, rate(diameter_response_duration_milliseconds_bucket[5m]))
تنبيه عند:
- P95 > 1000 مللي ثانية - استجابات Diameter بطيئة
diameter_requests_total
النوع: Counter
التسميات: application (ro, sh)، command (ccr, udr، إلخ)
الوصف: العدد الإجمالي لطلبات Diameter المرسلة
الاستخدام:
# معدل الطلبات
rate(diameter_requests_total[5m])
diameter_responses_total
النوع: Counter
التسميات: application (ro, sh)، command (ccr, udr، إلخ)، result_code (2001، 3002، 5xxx، إلخ)
الوصف: العدد الإجمالي لاستجابات Diameter المستلمة
الاستخدام:
# معدل النجاح
rate(diameter_responses_total{result_code="2001"}[5m]) /
rate(diameter_responses_total[5m]) * 100
diameter_peer_state
النوع: Gauge
التسميات: peer_host، peer_realm، application (ro, sh)
الوصف: حالة نظراء Diameter (1=موجود، 0=غير موجود)
فترة التحديث: كل 10 ثوانٍ
الاستخدام:
# تحقق من النظراء غير المتصلين
diameter_peer_state == 0
تنبيه عند:
- أي نظير غير متصل لأكثر من دقيقة واحدة
مقاييس توليد Dialplan
1. مقاييس طلب HTTP
http_dialplan_request_duration_milliseconds
النوع: Histogram
التسميات: call_type (mt، mo، emergency، unknown)
الوصف: مدة طلب HTTP من النهاية إلى النهاية من لحظة استلام طلب HTTP dialplan إلى لحظة إرسال الاستجابة. يشمل ذلك جميع المعالجة: تحليل المعلمات، التفويض، عمليات Diameter (Sh/Ro)، عمليات HLR (SS7 MAP)، وتوليد XML.
الاستخدام:
# متوسط زمن طلب HTTP من النهاية إلى النهاية
rate(http_dialplan_request_duration_milliseconds_sum[5m]) /
rate(http_dialplan_request_duration_milliseconds_count[5m])
# P95 حسب نوع المكالمة
histogram_quantile(0.95,
rate(http_dialplan_request_duration_milliseconds_bucket[5m])
) by (call_type)
# مقارنة أداء MT مقابل MO
histogram_quantile(0.95,
rate(http_dialplan_request_duration_milliseconds_bucket{call_type="mt"}[5m])
)
vs
histogram_quantile(0.95,
rate(http_dialplan_request_duration_milliseconds_bucket{call_type="mo"}[5m])
)
تنبيه عند:
- P95 > 2000 مللي ثانية - أوقات استجابة HTTP بطيئة
- P95 > 3000 مللي ثانية - مشكلة أداء حرجة
- P99 > 5000 مللي ثانية - تدهور أداء شديد
- أي طلبات تظهر
call_type="unknown"- فشل في اكتشاف نوع المكالمة
رؤى:
- هذه هي أهم مقياس لفهم زمن التأخير الذي يواجهه المستخدم
- القيم النموذجية: P50: 100-500 مللي ثانية، P95: 500-2000 مللي ثانية، P99: 1000-3000 مللي ثانية
- تشمل جميع أوقات المكونات (Sh + HLR + OCS + المعالجة)
- إذا كانت هذه بطيئة، تحقق من مقاييس المكونات (subscriber_data، hlr_data، ocs_authorization)
- النطاق المتوقع: 100 مللي ثانية (مكالمات محلية سريعة) إلى 5000 مللي ثانية (بطيئة مع إعادة المحاولة/مهل)
ملاحظات هامة:
- تحل محل المقياس الأقدم
dialplan_generation_duration_millisecondsالذي كان يقيس فقط توليد XML - يعكس بدقة ما تعاني منه FreeSWITCH/SBC
- استخدم هذا لمراقبة SLA وتخطيط السعة
2. مقاييس بيانات المشتركين
subscriber_data_duration_milliseconds
النوع: Histogram
التسميات: result (success، error)
الوصف: الوقت المستغرق لاسترجاع بيانات المشترك من واجهة Sh (HSS)
الاستخدام:
# متوسط زمن البحث في Sh
rate(subscriber_data_duration_milliseconds_sum[5m]) /
rate(subscriber_data_duration_milliseconds_count[5m])
# زمن البحث في Sh في النسبة المئوية 95
histogram_quantile(0.95,
rate(subscriber_data_duration_milliseconds_bucket[5m])
)
تنبيه عند:
- P95 > 100 مللي ثانية - استجابات HSS بطيئة
- P95 > 500 مللي ثانية - مشكلة أداء حرجة في HSS
subscriber_data_lookups_total
النوع: Counter
التسميات: result (success، error)
الوصف: العدد الإجمالي لعمليات البحث عن بيانات المشتركين
الاستخدام:
# معدل البحث في Sh
rate(subscriber_data_lookups_total[5m])
# معدل أخطاء Sh
rate(subscriber_data_lookups_total{result="error"}[5m])
# نسبة معدل نجاح Sh
(rate(subscriber_data_lookups_total{result="success"}[5m]) /
rate(subscriber_data_lookups_total[5m])) * 100
تنبيه عند:
- معدل الخطأ > 5% - مشاكل في الاتصال بـ HSS
- معدل الخطأ > 20% - فشل حرجة في HSS
2. مقاييس بيانات HLR
hlr_data_duration_milliseconds
النوع: Histogram
التسميات: result (success، error)
الوصف: الوقت المستغرق لاسترجاع بيانات HLR عبر SS7 MAP
الاستخدام:
# متوسط زمن البحث في HLR
rate(hlr_data_duration_milliseconds_sum[5m]) /
rate(hlr_data_duration_milliseconds_count[5m])
# زمن البحث في HLR في النسبة المئوية 95
histogram_quantile(0.95,
rate(hlr_data_duration_milliseconds_bucket[5m])
)
تنبيه عند:
- P95 > 500 مللي ثانية - استجابات SS7 MAP بطيئة
- P95 > 2000 مللي ثانية - مشكلة حرجة في SS7 MAP
hlr_lookups_total
النوع: Counter
التسميات: result_type (msrn، forwarding، error، unknown)
الوصف: إجمالي عمليات البحث في HLR حسب نوع النتيجة
الاستخدام:
# معدل البحث في HLR حسب النوع
rate(hlr_lookups_total[5m])
# معدل اكتشاف MSRN (المشتركين المتجولين)
rate(hlr_lookups_total{result_type="msrn"}[5m])
# معدل اكتشاف إعادة توجيه المكالمات
rate(hlr_lookups_total{result_type="forwarding"}[5m])
# معدل أخطاء HLR
rate(hlr_lookups_total{result_type="error"}[5m])
تنبيه عند:
- معدل الخطأ > 10% - مشاكل في SS7 MAP
- انخفاض مفاجئ في معدل MSRN - مشكلة محتملة في التجوال
رؤى:
- يشير معدل MSRN المرتفع إلى وجود العديد من المشتركين المتجولين
- يشير معدل إعادة التوجيه المرتفع إلى وجود العديد من المكالمات المعاد توجيهها
- قارن مع حجم المكالمات لنسبة التجوال
3. مقاييس تفويض OCS
ocs_authorization_duration_milliseconds
النوع: Histogram
التسميات: result (success، error)
الوصف: الوقت المستغرق لتفويض OCS
الاستخدام:
# متوسط زمن تفويض OCS
rate(ocs_authorization_duration_milliseconds_sum[5m]) /
rate(ocs_authorization_duration_milliseconds_count[5m])
# زمن تفويض OCS في النسبة المئوية 95
histogram_quantile(0.95,
rate(ocs_authorization_duration_milliseconds_bucket[5m])
)
تنبيه عند:
- P95 > 1000 مللي ثانية - استجابات OCS بطيئة
- P95 > 5000 مللي ثانية - مشكلة حرجة في أداء OCS
ocs_authorization_attempts_total
النوع: Counter
التسميات: result (success، error)، skipped (yes، no)
الوصف: العدد الإجمالي لمحاولات تفويض OCS
الاستخدام:
# معدل تفويض OCS
rate(ocs_authorization_attempts_total{skipped="no"}[5m])
# معدل أخطاء OCS
rate(ocs_authorization_attempts_total{result="error",skipped="no"}[5m])
# معدل تخطي OCS (حالات الطوارئ، البريد الصوتي، إلخ)
rate(ocs_authorization_attempts_total{skipped="yes"}[5m])
# نسبة معدل نجاح OCS
(rate(ocs_authorization_attempts_total{result="success",skipped="no"}[5m]) /
rate(ocs_authorization_attempts_total{skipped="no"}[5m])) * 100
تنبيه عند:
- معدل الخطأ > 5% - مشاكل في الاتصال بـ OCS
- معدل النجاح < 95% - OCS يرفض الكثير من المكالمات
رؤى:
- يشير معدل التخطي المرتفع إلى وجود العديد من المكالمات الطارئة/المجانية
- تشير ارتفاعات معدل الخطأ إلى انقطاع OCS
- قارن معدل النجاح بتوقعات الأعمال
4. مقاييس معالجة المكالمات
call_param_errors_total
النوع: Counter
التسميات: error_type (parse_failed، missing_required_params)
الوصف: أخطاء تحليل معلمات المكالمات
الاستخدام:
# معدل أخطاء المعلمات
rate(call_param_errors_total[5m])
# الأخطاء حسب النوع
rate(call_param_errors_total[5m]) by (error_type)
تنبيه عند:
- أي أخطاء > 0 - تشير إلى طلبات معلمات مكالمات غير صحيحة
- أخطاء > 1% من حجم المكالمات - مشكلة حرجة
authorization_decisions_total
النوع: Counter
التسميات: disposition (mt، mo، emergency، unauthorized)، result (success، error)
الوصف: قرارات التفويض حسب نوع المكالمة
الاستخدام:
# معدل التفويض حسب الحالة
rate(authorization_decisions_total[5m]) by (disposition)
# معدل المكالمات MT
rate(authorization_decisions_total{disposition="mt"}[5m])
# معدل المكالمات MO
rate(authorization_decisions_total{disposition="mo"}[5m])
# معدل المكالم��ت الطارئة
rate(authorization_decisions_total{disposition="emergency"}[5m])
# معدل المكالمات غير المصرح بها
rate(authorization_decisions_total{disposition="unauthorized"}[5m])
تنبيه عند:
- معدل غير المصرح به > 1% - هجوم محتمل أو تكوين خاطئ
- ارتفاع مفاجئ في المكالمات الطارئة - حدث طارئ محتمل
- تغيير غير متوقع في نسبة MT/MO - مشكلة محتملة
رؤى:
- تشير نسبة MT/MO إلى أنماط الحركة
- يشير معدل المكالمات الطارئة إلى استخدام الخدمة
- يشير معدل غير المصرح به إلى الوضع الأمني
freeswitch_variable_set_duration_milliseconds
النوع: Histogram
التسميات: batch_size (1، 5، 10، 25، 50، 100)
الوصف: الوقت المستغرق لتعيين متغيرات Dialplan
الاستخدام:
# متوسط زمن تعيين المتغيرات
rate(freeswitch_variable_set_duration_milliseconds_sum[5m]) /
rate(freeswitch_variable_set_duration_milliseconds_count[5m])
# زمن تعيين المتغيرات حسب حجم الدفعة
histogram_quantile(0.95,
rate(freeswitch_variable_set_duration_milliseconds_bucket[5m])
) by (batch_size)
تنبيه عند:
- P95 > 100 مللي ثانية - أداء تعيين المتغيرات بطيء
- اتجاه متزايد - مشكلة محتملة في أداء النظام
5. مقاييس معالجة الوحدات
dialplan_module_duration_milliseconds
النوع: Histogram
التسميات: module (MT، MO، Emergency، CallParams، إلخ)، call_type
الوصف: زمن المعالجة لكل وحدة من وحدات dialplan
الاستخدام:
# زمن المعالجة حسب الوحدة
histogram_quantile(0.95,
rate(dialplan_module_duration_milliseconds_bucket[5m])
) by (module)
# زمن معالجة وحدة MT
histogram_quantile(0.95,
rate(dialplan_module_duration_milliseconds_bucket{module="MT"}[5m])
)
تنبيه عند:
- أي وحدة P95 > 500 مللي ثانية - مشكلة في الأداء
- اتجاه متزايد في أي وحدة - تسرب أو مشكلة محتملة
رؤى:
- تحديد أي وحدة هي الأبطأ
- تحسين أبطأ الوحدات أولاً
- قارن أوقات الوحدات عبر أنواع المكالمات
6. مقاييس حجم المكالمات
call_attempts_total
النوع: Counter
التسميات: call_type (mt، mo، emergency، unauthorized)، result (success، rejected)
الوصف: العدد الإجمالي لمحاولات المكالمات
الاستخدام:
# معدل محاولات المكالمات
rate(call_attempts_total[5m])
# معدل النجاح حسب نوع المكالمة
(rate(call_attempts_total{result="success"}[5m]) /
rate(call_attempts_total[5m])) * 100 by (call_type)
# معدل المكالمات المرفوضة
rate(call_attempts_total{result="rejected"}[5m])
تنبيه عند:
- معدل الرفض > 5% - مشكلة محتملة
- انخفاض مفاجئ في حجم المكالمات - انقطاع الخدمة
- ارتفاع مفاجئ في حجم المكالمات - هجوم محتمل
active_calls
النوع: Gauge
التسميات: call_type (mt، mo، emergency)
الوصف: المكالمات النشطة حاليًا
الاستخدام:
# المكالمات النشطة الحالية
active_calls
# المكالمات النشطة حسب النوع
active_calls by (call_type)
# ذروة المكالمات النشطة (الساعة الماضية)
max_over_time(active_calls[1h])
تنبيه عند:
- المكالمات النشطة > السعة - حمل زائد
- المكالمات النشطة = 0 ��فترة طويلة - الخدمة متوقفة
7. مقاييس المحاكاة
call_simulations_total
النوع: Counter
التسميات: call_type (mt، mo، emergency، unauthorized)، source (web، api)
الوصف: عمليات محاكاة المكالمات التي تم تشغيلها
الاستخدام:
# معدل المحاكاة
rate(call_simulations_total[5m])
# المحاكاة حسب النوع
rate(call_simulations_total[5m]) by (call_type)
رؤى:
- تتبع استخدام أدوات التشخيص
- تحديد المستخدمين الثقيلين
- الربط مع أنشطة استكشاف الأخطاء
8. مقاييس SS7 MAP
ss7_map_http_duration_milliseconds
النوع: Histogram
التسميات: operation (sri، prn)، result (success، error، timeout)
الأقسام: 10، 50، 100، 250، 500، 1000، 2500، 5000، 10000 مللي ثانية
الوصف: مدة طلبات SS7 MAP HTTP بالميلي ثانية
الاستخدام:
# معدل أخطاء SS7 MAP
rate(ss7_map_operations_total{result="error"}[5m]) /
rate(ss7_map_operations_total[5m]) * 100
تنبيه عند:
- P95 > 500 مللي ثانية - استجابات SS7 MAP بطيئة
- معدل الخطأ > 50% - مشكلة حرجة في SS7 MAP
ss7_map_operations_total
النوع: Counter
التسميات: operation (sri، prn)، result (success، error)
الوصف: العدد الإجمالي لعمليات SS7 MAP
9. مقاييس الشحن عبر الإنترنت
online_charging_events_total
النوع: Counter
التسميات: event_type (authorize، answer، reauth، hangup)، result (success، nocredit، error، timeout)
الوصف: العدد الإجمالي لفعاليات الشحن عبر الإنترنت
الاستخدام:
# فشل ائتمان OCS
rate(online_charging_events_total{result="nocredit"}[5m])
تنبيه عند:
- ارتفاع معدل فشل الائتمان
10. مقاييس حالة النظام
tracked_registrations
النوع: Gauge
الوصف: عدد التسجيلات النشطة حاليًا في SIP (من قاعدة بيانات تسجيل FreeSWITCH Sofia)
فترة التحديث: كل 10 ثوانٍ
ملاحظات:
- يتم تقليصها تلقائيًا عند انتهاء التسجيلات (تدير FreeSWITCH انتهاء الصلاحية)
tracked_call_sessions
النوع: Gauge
الوصف: عدد جلسات المكالمات المتعقبة حاليًا في ETS
فترة التحديث: كل 10 ثوانٍ
11. مقاييس طلب HTTP
http_requests_total
النوع: Counter
التسميات: endpoint (dialplan، call_event، directory، voicemail، sms_ccr، metrics)، status_code (200، 400، 500، إلخ)
الوصف: العدد الإجمالي لطلبات HTTP حسب نقطة النهاية
الاستخدام:
# معدل أخطاء HTTP
rate(http_requests_total{status_code=~"5.."}[5m]) /
rate(http_requests_total[5m]) * 100
تنبيه عند:
- معدل خطأ HTTP 5xx > 10%
12. مقاييس رفض المكالمات
call_rejections_total
النوع: Counter
التسميات: call_type (mo، mt، emergency، unknown)، reason (nocredit، unauthorized، parse_failed، missing_params، hlr_error، إلخ)
الوصف: العدد الإجمالي لرفض المكالمات حسب السبب
الاستخدام:
# معدل رفض المكالمات حسب السبب
sum by (reason) (rate(call_rejections_total[5m]))
تنبيه عند:
- معدل الرفض > 1/ثانية - الحاجة إلى التحقيق
13. مقاييس اتصال Socket الأحداث
event_socket_connected
النوع: Gauge
التسميات: connection_type (main، log_listener)
الوصف: حالة اتصال Socket الأحداث (1=متصل، 0=غير متصل)
فترة التحديث: في الوقت الحقيقي عند تغييرات حالة الاتصال
الاستخدام:
# حالة اتصال Socket الأحداث
event_socket_connected
تنبيه عند:
- الاتصال غير متصل لأكثر من 30 ثانية
event_socket_reconnections_total
النوع: Counter
التسميات: connection_type (main، log_listener)، result (attempting، success، failed)
الوصف: العدد الإجمالي لمحاولات إعادة الاتصال بـ Socket الأحداث
تكامل لوحة معلومات Grafana
يمكن تصور المقاييس في Grafana باستخدام مصدر بيانات Prometheus. الألواح الموصى بها:
لوحة المعلومات 1: حجم المكالمات
- مقياس المكالمات النشطة
- معدل محاولات المكالمات حسب النوع (MO/MT/طوارئ)
- معدل رفض المكالمات
لوحة المعلومات 2: أداء Diameter
- خريطة زمن الاستجابة
- معدلات الطلب/الاستجابة
- جدول حالة النظراء
- معدل ال��طأ حسب رمز النتيجة
لوحة المعلومات 3: صحة الشحن عبر الإنترنت
- معدل نجاح تفويض الائتمان
- معدل أحداث "لا ائتمان"
- معدل مهلات OCS
لوحة المعلومات 4: أداء النظام
- زمن تأخير توليد dialplan (P50/P95/P99)
- أوقات استجابة SS7 MAP
- توافر النظام بشكل عام
تخطيط لوحة معلومات Grafana الموصى به
الصف 1: حجم المكالمات
- معدل محاولات المكالمات (حسب النوع)
- مقياس المكالمات النشطة
- نسبة معدل النجاح
الصف 2: الأداء
- P95 زمن طلب HTTP dialplan (حسب نوع المكالمة) - المقياس الرئيسي
- P95 زمن البحث في Sh
- P95 زمن البحث في HLR
- P95 زمن تفويض OCS
- P95 زمن معالجة وحدة dialplan (حسب الوحدة)
الصف 3: معدلات النجاح
- معدل نجاح البحث في Sh
- معدل نجاح البحث في HLR
- معدل نجاح تفويض OCS
- معدل نجاح محاولات المكالمات
الصف 4: أداء الوحدات
- P95 زمن المعالجة حسب الوحدة
- عدد المكالمات لكل وحدة
الصف 5: الأ��طاء
- أخطاء المعلمات
- محاولات غير مصرح بها
- أخطاء Sh
- أخطاء HLR
- أخطاء OCS
التنبيهات الحرجة
الأولوية 1 (صفحة على الفور):
# توقف dialplan بالكامل
rate(call_attempts_total[5m]) == 0
# توقف HSS بالكامل
rate(subscriber_data_lookups_total{result="error"}[5m]) /
rate(subscriber_data_lookups_total[5m]) > 0.9
# توقف OCS بالكامل
rate(ocs_authorization_attempts_total{result="error"}[5m]) /
rate(ocs_authorization_attempts_total[5m]) > 0.9
الأولوية 2 (تنبيه):
# توليد dialplan بطيء
histogram_quantile(0.95,
rate(dialplan_generation_duration_milliseconds_bucket[5m])
) > 1000
# معدل أخطاء HSS مرتفع
rate(subscriber_data_lookups_total{result="error"}[5m]) /
rate(subscriber_data_lookups_total[5m]) > 0.2
# معدل أخطاء OCS مرتفع
rate(ocs_authorization_attempts_total{result="error"}[5m]) /
rate(ocs_authorization_attempts_total[5m]) > 0.1
الأولوية 3 (تحذير):
# زمن تأخير HSS مرتفع
histogram_quantile(0.95,
rate(subscriber_data_duration_milliseconds_bucket[5m])
) > 100
# زمن تأخير OCS مرتفع
histogram_quantile(0.95,
rate(ocs_authorization_duration_milliseconds_bucket[5m])
) > 1000
# معدل خطأ معتدل
rate(call_attempts_total{result="rejected"}[5m]) /
rate(call_attempts_total[5m]) > 0.05
أمثلة التنبيه
نظير Diameter غير متصل
alert: DiameterPeerDown
expr: diameter_peer_state == 0
for: 1m
annotations:
summary: "نظير Diameter {{ $labels.peer_host }} غير متصل"
زمن تأخير Diameter مرتفع
alert: HighDiameterLatency
expr: histogram_quantile(0.95, rate(diameter_response_duration_milliseconds_bucket[5m])) > 1000
for: 5m
annotations:
summary: "زمن تأخير P95 في Diameter فوق 1 ثانية"
فشل ائتمان OCS
alert: HighOCSCreditFailures
expr: rate(online_charging_events_total{result="nocredit"}[5m]) > 0.1
for: 2m
annotations:
summary: "معدل مرتفع من فشل ائتمان OCS"
أخطاء بوابة SS7 MAP
alert: SS7MapErrors
expr: rate(ss7_map_operations_total{result="error"}[5m]) / rate(ss7_map_operations_total[5m]) > 0.5
for: 3m
annotations:
summary: "معدل خطأ SS7 MAP فوق 50%"
Socket الأحداث غير متصل
alert: EventSocketDown
expr: event_socket_connected == 0
for: 30s
annotations:
summary: "Socket الأحداث {{ $labels.connection_type }} غير متصل"
معدل رفض المكالمات مرتفع
alert: HighCallRejectionRate
expr: rate(call_rejections_total[5m]) > 1
for: 2m
annotations:
summary: "معدل رفض المكالمات مرتفع: {{ $value }} رفضات/ثانية"
معدل خطأ HTTP مرتفع
alert: HighHTTPErrorRate
expr: rate(http_requests_total{status_code=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.1
for: 3m
annotations:
summary: "معدل خطأ HTTP 5xx فوق 10%"
استكشاف الأخطاء باستخدام المقاييس
المشكلة: تظهر المقاييس قيم غير واقعية (نانو ثانية بدلاً من ميلي ثانية)
الأعراض:
- قيم Histogram
_sumصغيرة للغاية (مثل 0.000315 بدلاً من 315) - جميع الطلبات تظهر في القسم الأدنى (< 5 مللي ثانية) عندما ينبغي أن تكون أبطأ
- تبدو القيم أصغر بـ 1,000,000 مرة مما هو متوقع
السبب الجذري:
تقوم مكتبة Prometheus Elixir تلقائيًا بتحويل وحدات الوقت عندما تنتهي أسماء المقاييس بـ _milliseconds، _seconds، إلخ. إذا لم يتم تعيين duration_unit: false، ستقوم المكتبة بتحويل الميلي ثانية التي تم تحويلها بالفعل إلى نانو ثانية.
التحقيق:
- تحقق من إعلان المقياس في lib/metrics.ex
- تحقق من وجود
duration_unit: false:Histogram.declare(
name: :some_duration_milliseconds,
help: "...",
buckets: [...],
duration_unit: false # يجب أن تكون موجودة!
) - تحقق من أن كود القياس يستخدم تحويل الوقت الصحيح:
start = System.monotonic_time()
# ... العمل ...
duration_ms = System.convert_time_unit(
System.monotonic_time() - start,
:native,
:millisecond
)
Histogram.observe([name: :some_duration_milliseconds], duration_ms)
الحل:
- أضف
duration_unit: falseإلى إعلان histogram - أعد تشغيل التطبيق (مطلوب لإعادة تحميل إعلانات المقاييس)
- تحقق من أن المقاييس تظهر قيمًا واقعية بعد الإصلاح
مثال على الإصلاح:
# قبل (خطأ - سيظهر نانو ثواني)
Histogram.declare(
name: :http_dialplan_request_duration_milliseconds,
buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500]
)
# بعد (صح��ح - سيظهر ميلي ثانية)
Histogram.declare(
name: :http_dialplan_request_duration_milliseconds,
buckets: [100, 250, 500, 750, 1000, 1500, 2000, 3000, 5000],
duration_unit: false
)
المشكلة: يظهر نوع المكالمة كـ "unknown"
الأعراض:
- تظهر جميع المقاييس
call_type="unknown"بدلاً منmt،mo، أوemergency - لا يمكن التمييز بين الأداء بين أنواع المكالمات
السبب الجذري: فشل استخراج نوع المكالمة أو عدم تمريره بشكل صحيح عبر خط معالجة البيانات.
التحقيق:
- تحقق من السجلات لرسائل "طلب HTTP dialplan" - يجب أن تظهر النوع الصحيح للمكالمة
- تحقق من أن
process_call/1تعيد{xml, call_type}tuple، وليس فقطxml - تحقق من أن
fsapi_conn/1يستخرج نوع المكالمة من tuple:{xml, call_type} = process_call(body)
الحل: تأكد من أن خط معالجة dialplan يمرر نوع المكالمة بشكل صحيح عبر جميع الوظائف.
المشكلة: المكالمات بطيئة
التحقيق:
- تحقق من P95 لـ
http_dialplan_request_duration_milliseconds- ابدأ هنا - إذا كانت مرتفعة، تحقق من أوقات المكونات:
- تحقق من
subscriber_data_duration_millisecondsلتأخيرات Sh - تحقق من
hlr_data_duration_millisecondsلتأخيرات HLR - تحقق من
ocs_authorization_duration_millisecondsلتأخيرات OCS - تحقق من
dialplan_module_duration_millisecondsلتأخيرات محددة للوحدات
- تحقق من
- تحقق مما إذا كانت
call_type="unknown"- تشير إلى فشل في اكتشاف نوع المكالمة - قارن أوقات المعالجة لـ MT و MO و Emergency
- اربط مع سجلات النظام للحصول على رسائل خطأ تفصيلية
الحل: تحسين أبطأ مكون
المشكلة: فشل المكالمات
التحقيق:
- تحقق من معدل
call_attempts_total{result="rejected"} - تحقق من
subscriber_data_lookups_total{result="error"}لمشاكل Sh - تحقق من
hlr_lookups_total{result_type="error"}لمشاكل HLR - تحقق من
ocs_authorization_attempts_total{result="error"}لمشاكل OCS - تحقق من
authorization_decisions_total{disposition="unauthorized"}لمشاكل التفويض
الحل: إصلاح المكون الفاشل
المشكلة: حمل مرتفع
التحقيق:
- تحقق من القيمة الحالية لـ
active_calls - تحقق من معدل
call_attempts_total - تحقق مما إذا كان المعدل يتطابق مع حركة المرور المتوقعة
- قارن نسبة MT و MO
- تحقق من الأنماط غير العادية (ارتفاعات، نمو ثابت)
الحل: زيادة السعة أو التحقيق في حركة المرور غير العادية
المشكلة: مشاكل التجوال
التحقيق:
- تحقق من معدل
hlr_lookups_total{result_type="msrn"} - تحقق من
hlr_data_duration_millisecondsللتأخيرات - استخدم أداة بحث HLR لمشتركين محددين
- تحقق مما إذا كان يتم استرجاع MSRN بشكل صحيح
الحل: إصلاح الاتصال أو التكوين الخاص بـ HLR
معايير الأداء
القيم النموذجية (نظام مضبوط جيدًا)
- طلب HTTP dialplan (من النهاية إلى النهاية): P50: 100-500 مللي ثانية، P95: 500-2000 مللي ثانية، P99: 1000-3000 مللي ثانية
- زمن البحث في Sh: P50: 15 مللي ثانية، P95: 50 مللي ثانية، P99: 100 مللي ثانية
- زمن البحث في HLR: P50: 100 مللي ثانية، P95: 300 مللي ثانية، P99: 800 مللي ثانية
- زمن تفويض OCS: P50: 150 مللي ثانية، P95: 500 مللي ثانية، P99: 1500 مللي ثانية
- معالجة وحدة dialplan: P50: 1-5 مللي ثانية، P95: 10-25 مللي ثانية، P99: 50 مللي ثانية
- معدل نجاح Sh: > 99%
- معدل نجاح HLR: > 95% (الأقل هو المعتاد بسبب المشتركين غير المتصلين)
- معدل نجاح OCS: > 98%
- معدل نجاح المكالمات: > 99%
ملاحظة: زمن طلب HTTP dialplan هو مجموع جميع أوقات المكونات بالإضافة إلى التحميل. يجب أن يساوي تقريبًا: زمن البحث في Sh + زمن البحث في HLR + زمن تفويض OCS + زمن معالجة وحدة dialplan + التحميل/التحليل الشبكي. الحد الأدنى للوقت المتوقع هو ~100 مللي ثانية (عندما يكون البحث في Sh فقط مطلوبًا)، والحد الأقصى للوقت النموذجي هو ~2000 مللي ثانية (مع جميع عمليات البحث وإعادة المحاولة).
تخطيط السعة
راقب هذه الاتجاهات:
- النمو في معدل
call_attempts_total - النمو في ذروة
active_calls - استقرار أو تحسين P95 latencies
- استقرار أو تحسين معدلات النجاح
خطط للتوسع عندما:
- تقترب المكالمات النشطة من 80% من السعة
- تنمو P95 latencies على الرغم من الحمل الثابت
- تنخفض معدلات النجاح على الرغم من استقرار الأنظمة الخارجية
التكامل مع السجلات
قم بربط المقاييس بالسجلات:
- معدل خطأ مرتفع في المقاييس → ابحث في السجلات عن رسائل ERROR
- أوقات استجابة بطيئة → ابحث في السجلات عن رسائل WARNING حول المهلات
- مشاكل مكالمات محددة → ابحث في السجلات بواسطة معرف المكالمة أو رقم الهاتف
- استخدم أداة المحاكاة لإعادة الإنتاج واستكشاف الأخطاء
أفضل الممارسات
- قم بإعداد لوحات المعلومات قبل حدوث المشكلات
- حدد عتبات التنبيه بناءً على معاييرك الأساسية
- اختبر التنبيهات باستخدام محاكي المك��لمات
- راجع المقاييس أسبوعيًا لتحديد الاتجاهات
- قم بربط المقاييس بالأحداث التجارية (الحملات، الانقطاعات، إلخ.)
- استخدم المقاييس لتبرير استثمارات البنية التحتية
- شارك لوحات المعلومات مع فريق العمليات
- وثق إجراءات استجابة التنبيه الخاصة بك
التكوين
يتم تمكين جمع المقاييس تلقائيًا عند بدء التطبيق. يتم عرض نقطة نهاية المقاييس على نفس المنفذ مثل واجهة برمجة التطبيقات (الافتراضي: 8080).
لتكوين Prometheus لجمع المقاييس، أضف هذه الوظيفة إلى prometheus.yml:
scrape_configs:
- job_name: 'omnitas'
static_configs:
- targets: ['<tas-ip>:8080']
metrics_path: '/metrics'
scrape_interval: 10s
كثافة المقاييس
تم تصميم المقاييس بكثافة محكومة لتجنب إرهاق Prometheus:
- تسميات النظراء: محدودة فقط للنظراء المكونين
- أنواع المكالمات: مجموعة ثابتة (mo، mt، emergency، unauthorized)
- رموز النتائج: محدودة فقط إلى رموز النتائج الفعلية التي تم تلقيها من Diameter/OCS
- العمليات: مجموعة ثابتة لكل واجهة (sri/prn لـ MAP، ccr/cca لـ Diameter)
إجمالي تقدير السلاسل الزمنية: ~200-500 اعتمادًا على عدد النظراء المكونين ورموز النتائج النشطة.
احتفاظ بالمقاييس
فترات الاحتفاظ الموصى بها:
- المقاييس الخام: 30 يومًا (دقة عالية)
- التجميعات لمدة 5 دقائق: 90 يومًا
- التجميعات لمدة ساعة: سنة واحدة
- التجميعات اليومية: 5 سنوات
يدعم هذا:
- استكشاف الأخطاء في الوقت الحقيقي (المقاييس الخام)
- التحليل الأسبوعي/الشهري (التجميعات لمدة 5 دقائق/ساعة)
- تخطيط السعة (التجميعات اليومية)
- المقارنة التاريخية (التجميعات السنوية)