Guide des métriques et de la surveillance de Prometheus
Vue d'ensemble
OmniTAS exporte des métriques opérationnelles complètes au format Prometheus pour la surveillance, l'alerte et l'observabilité. Ce guide couvre toutes les métriques disponibles, leur utilisation, le dépannage et les meilleures pratiques de surveillance.
Point de terminaison des métriques
Toutes les métriques sont exposées à : http://<tas-ip>:8080/metrics
Important : Configuration de l'unité de temps des métriques
Toutes les métriques de durée dans ce système utilisent duration_unit: false dans leurs déclarations Histogram. Cela est critique car :
- La bibliothèque Elixir Prometheus détecte automatiquement les noms de métriques se terminant par
_milliseconds - Par défaut, elle convertit automatiquement les unités de temps Erlang natives en millisecondes
- Notre code convertit déjà le temps en millisecondes en utilisant
System.convert_time_unit/3 - Sans
duration_unit: false, la bibliothèque convertirait les millisecondes en nanosecondes (en divisant par ~1 000 000)
Exemple :
# Configuration correcte
Histogram.declare(
name: :http_dialplan_request_duration_milliseconds,
help: "Durée des requêtes HTTP du plan de numérotation en millisecondes",
labels: [:call_type],
buckets: [100, 250, 500, 750, 1000, 1500, 2000, 3000, 5000],
duration_unit: false # REQUIS pour éviter la double conversion
)
# Mesurer le temps correctement
start_time = System.monotonic_time()
# ... faire le travail ...
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)
Référence complète des métriques
Métriques Diameter
diameter_response_duration_milliseconds
Type : Histogram
Labels : application (ro, sh), command (ccr, cca, etc), result (success, error, timeout)
Buckets : 10, 50, 100, 250, 500, 1000, 2500, 5000, 10000 ms
Description : Durée des requêtes Diameter en millisecondes
Utilisation :
# Temps de réponse moyen Diameter
rate(diameter_response_duration_milliseconds_sum[5m]) /
rate(diameter_response_duration_milliseconds_count[5m])
# Latence Diameter P95
histogram_quantile(0.95, rate(diameter_response_duration_milliseconds_bucket[5m]))
Alerte lorsque :
- P95 > 1000ms - Réponses Diameter lentes
diameter_requests_total
Type : Counter
Labels : application (ro, sh), command (ccr, udr, etc)
Description : Nombre total de requêtes Diameter envoyées
Utilisation :
# Taux de requêtes
rate(diameter_requests_total[5m])
diameter_responses_total
Type : Counter
Labels : application (ro, sh), command (ccr, udr, etc), result_code (2001, 3002, 5xxx, etc)
Description : Nombre total de réponses Diameter reçues
Utilisation :
# Taux de succès
rate(diameter_responses_total{result_code="2001"}[5m]) /
rate(diameter_responses_total[5m]) * 100
diameter_peer_state
Type : Gauge
Labels : peer_host, peer_realm, application (ro, sh)
Description : État des pairs Diameter (1=up, 0=down)
Intervalle de mise à jour : Toutes les 10 secondes
Utilisation :
# Vérifier les pairs hors ligne
diameter_peer_state == 0
Alerte lorsque :
- Tout pair hors ligne pendant > 1 minute
Métriques de génération de plan de numérotation
1. Métriques de requêtes HTTP
http_dialplan_request_duration_milliseconds
Type : Histogram
Labels : call_type (mt, mo, emergency, unknown)
Description : Durée de la requête HTTP de bout en bout depuis la réception de la requête HTTP du plan de numérotation jusqu'à l'envoi de la réponse. Cela inclut tout le traitement : analyse des paramètres, autorisation, recherches Diameter (Sh/Ro), recherches HLR (SS7 MAP) et génération XML.
Utilisation :
# Temps moyen de requête HTTP de bout en bout
rate(http_dialplan_request_duration_milliseconds_sum[5m]) /
rate(http_dialplan_request_duration_milliseconds_count[5m])
# P95 par type d'appel
histogram_quantile(0.95,
rate(http_dialplan_request_duration_milliseconds_bucket[5m])
) by (call_type)
# Comparer les performances MT vs 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])
)
Alerte lorsque :
- P95 > 2000ms - Temps de réponse HTTP lents
- P95 > 3000ms - Problème de performance critique
- P99 > 5000ms - Dégradation sévère des performances
- Toute requête affichant
call_type="unknown"- Échec de la détection du type d'appel
Aperçus :
- C'est la métrique la plus importante pour comprendre la latence côté utilisateur
- Valeurs typiques : P50 : 100-500ms, P95 : 500-2000ms, P99 : 1000-3000ms
- Inclut tous les temps de composant (Sh + HLR + OCS + traitement)
- Si cela est lent, approfondir les métriques des composants (subscriber_data, hlr_data, ocs_authorization)
- Plage attendue : 100ms (appels locaux rapides) à 5000ms (lents avec réessais/délai)
Notes importantes :
- Remplace l'ancienne métrique
dialplan_generation_duration_millisecondsqui mesurait uniquement la génération XML - Reflète avec précision ce que FreeSWITCH/SBC expérimente
- Utilisez ceci pour la surveillance SLA et la planification de capacité
2. Métriques de données d'abonnés
subscriber_data_duration_milliseconds
Type : Histogram
Labels : result (success, error)
Description : Temps pris pour récupérer les données d'abonnés à partir de l'interface Sh (HSS)
Utilisation :
# Temps moyen de recherche Sh
rate(subscriber_data_duration_milliseconds_sum[5m]) /
rate(subscriber_data_duration_milliseconds_count[5m])
# Temps de recherche Sh au 95e percentile
histogram_quantile(0.95,
rate(subscriber_data_duration_milliseconds_bucket[5m])
)
Alerte lorsque :
- P95 > 100ms - Réponses HSS lentes
- P95 > 500ms - Problème de performance HSS critique
subscriber_data_lookups_total
Type : Counter
Labels : result (success, error)
Description : Nombre total de recherches de données d'abonnés
Utilisation :
# Taux de recherche Sh
rate(subscriber_data_lookups_total[5m])
# Taux d'erreur Sh
rate(subscriber_data_lookups_total{result="error"}[5m])
# Pourcentage de taux de succès Sh
(rate(subscriber_data_lookups_total{result="success"}[5m]) /
rate(subscriber_data_lookups_total[5m])) * 100
Alerte lorsque :
- Taux d'erreur > 5% - Problèmes de connectivité HSS
- Taux d'erreur > 20% - Échec critique du HSS
2. Métriques de données HLR
hlr_data_duration_milliseconds
Type : Histogram
Labels : result (success, error)
Description : Temps pris pour récupérer les données HLR via SS7 MAP
Utilisation :
# Temps moyen de recherche HLR
rate(hlr_data_duration_milliseconds_sum[5m]) /
rate(hlr_data_duration_milliseconds_count[5m])
# Temps de recherche HLR au 95e percentile
histogram_quantile(0.95,
rate(hlr_data_duration_milliseconds_bucket[5m])
)
Alerte lorsque :
- P95 > 500ms - Réponses SS7 MAP lentes
- P95 > 2000ms - Problème critique SS7 MAP
hlr_lookups_total
Type : Counter
Labels : result_type (msrn, forwarding, error, unknown)
Description : Nombre total de recherches HLR par type de résultat
Utilisation :
# Taux de recherche HLR par type
rate(hlr_lookups_total[5m])
# Taux de découverte MSRN (abonnés en itinérance)
rate(hlr_lookups_total{result_type="msrn"}[5m])
# Taux de découverte de transfert d'appel
rate(hlr_lookups_total{result_type="forwarding"}[5m])
# Taux d'erreur HLR
rate(hlr_lookups_total{result_type="error"}[5m])
Alerte lorsque :
- Taux d'erreur > 10% - Problèmes SS7 MAP
- Chute soudaine du taux MSRN - Problème d'itinérance possible
Aperçus :
- Un taux MSRN élevé indique de nombreux abonnés en itinérance
- Un taux de transfert élevé indique de nombreux appels transférés
- Comparer au volume d'appels pour le pourcentage d'itinérance
3. Métriques d'autorisation OCS
ocs_authorization_duration_milliseconds
Type : Histogram
Labels : result (success, error)
Description : Temps pris pour l'autorisation OCS
Utilisation :
# Temps moyen d'auth OCS
rate(ocs_authorization_duration_milliseconds_sum[5m]) /
rate(ocs_authorization_duration_milliseconds_count[5m])
# Temps d'auth OCS au 95e percentile
histogram_quantile(0.95,
rate(ocs_authorization_duration_milliseconds_bucket[5m])
)
Alerte lorsque :
- P95 > 1000ms - Réponses OCS lentes
- P95 > 5000ms - Problème de performance OCS critique
ocs_authorization_attempts_total
Type : Counter
Labels : result (success, error), skipped (yes, no)
Description : Nombre total de tentatives d'autorisation OCS
Utilisation :
# Taux d'autorisation OCS
rate(ocs_authorization_attempts_total{skipped="no"}[5m])
# Taux d'erreur OCS
rate(ocs_authorization_attempts_total{result="error",skipped="no"}[5m])
# Taux de saut OCS (urgence, messagerie vocale, etc.)
rate(ocs_authorization_attempts_total{skipped="yes"}[5m])
# Pourcentage de taux de succès OCS
(rate(ocs_authorization_attempts_total{result="success",skipped="no"}[5m]) /
rate(ocs_authorization_attempts_total{skipped="no"}[5m])) * 100
Alerte lorsque :
- Taux d'erreur > 5% - Problèmes de connectivité OCS
- Taux de succès < 95% - OCS refusant trop d'appels
Aperçus :
- Un taux de saut élevé indique de nombreux appels d'urgence/gratuits
- Les pics de taux d'erreur indiquent des pannes OCS
- Comparer le taux de succès aux attentes commerciales
4. Métriques de traitement des appels
call_param_errors_total
Type : Counter
Labels : error_type (parse_failed, missing_required_params)
Description : Erreurs d'analyse des paramètres d'appel
Utilisation :
# Taux d'erreur de paramètre
rate(call_param_errors_total[5m])
# Erreurs par type
rate(call_param_errors_total[5m]) by (error_type)
Alerte lorsque :
- Toute erreur > 0 - Indique des requêtes de paramètres d'appel mal formées
- Erreurs > 1% du volume d'appels - Problème critique
authorization_decisions_total
Type : Counter
Labels : disposition (mt, mo, emergency, unauthorized), result (success, error)
Description : Décisions d'autorisation par type d'appel
Utilisation :
# Taux d'autorisation par disposition
rate(authorization_decisions_total[5m]) by (disposition)
# Taux d'appel MT
rate(authorization_decisions_total{disposition="mt"}[5m])
# Taux d'appel MO
rate(authorization_decisions_total{disposition="mo"}[5m])
# Taux d'appel d'urgence
rate(authorization_decisions_total{disposition="emergency"}[5m])
# Taux d'appel non autorisé
rate(authorization_decisions_total{disposition="unauthorized"}[5m])
Alerte lorsque :
- Taux non autorisé > 1% - Possible attaque ou mauvaise configuration
- Pic soudain d'appels d'urgence - Événement d'urgence possible
- Changement inattendu dans le ratio MT/MO - Problème possible
Aperçus :
- Le ratio MT/MO indique les modèles de trafic
- Le taux d'appels d'urgence indique l'utilisation du service
- Le taux non autorisé indique la posture de sécurité
freeswitch_variable_set_duration_milliseconds
Type : Histogram
Labels : batch_size (1, 5, 10, 25, 50, 100)
Description : Temps pour définir les variables de plan de numérotation
Utilisation :
# Temps moyen de définition de variable
rate(freeswitch_variable_set_duration_milliseconds_sum[5m]) /
rate(freeswitch_variable_set_duration_milliseconds_count[5m])
# Temps de définition de variable par taille de lot
histogram_quantile(0.95,
rate(freeswitch_variable_set_duration_milliseconds_bucket[5m])
) by (batch_size)
Alerte lorsque :
- P95 > 100ms - Performance de définition de variable lente
- Tendance croissante - Problème de performance système possible
5. Métriques de traitement de module
dialplan_module_duration_milliseconds
Type : Histogram
Labels : module (MT, MO, Emergency, CallParams, etc.), call_type
Description : Temps de traitement pour chaque module de plan de numérotation
Utilisation :
# Temps de traitement par module
histogram_quantile(0.95,
rate(dialplan_module_duration_milliseconds_bucket[5m])
) by (module)
# Temps de traitement du module MT
histogram_quantile(0.95,
rate(dialplan_module_duration_milliseconds_bucket{module="MT"}[5m])
)
Alerte lorsque :
- Tout module P95 > 500ms - Problème de performance
- Tendance croissante dans tout module - Fuite ou problème potentiel
Aperçus :
- Identifier quel module est le plus lent
- Optimiser d'abord les modules les plus lents
- Comparer les temps des modules selon les types d'appels
6. Métriques de volume d'appels
call_attempts_total
Type : Counter
Labels : call_type (mt, mo, emergency, unauthorized), result (success, rejected)
Description : Total des tentatives d'appel
Utilisation :
# Taux de tentative d'appel
rate(call_attempts_total[5m])
# Taux de succès par type d'appel
(rate(call_attempts_total{result="success"}[5m]) /
rate(call_attempts_total[5m])) * 100 by (call_type)
# Taux d'appels rejetés
rate(call_attempts_total{result="rejected"}[5m])
Alerte lorsque :
- Taux de rejet > 5% - Problème possible
- Chute soudaine du volume d'appels - Panne de service
- Pic soudain du volume d'appels - Possible attaque
active_calls
Type : Gauge
Labels : call_type (mt, mo, emergency)
Description : Appels actuellement actifs
Utilisation :
# Appels actifs actuels
active_calls
# Appels actifs par type
active_calls by (call_type)
# Pic d'appels actifs (dernière heure)
max_over_time(active_calls[1h])
Alerte lorsque :
- Appels actifs > capacité - Surcharge
- Appels actifs = 0 pendant une période prolongée - Service hors ligne
7. Métriques de simulation
call_simulations_total
Type : Counter
Labels : call_type (mt, mo, emergency, unauthorized), source (web, api)
Description : Simulations d'appels exécutées
Utilisation :
# Taux de simulation
rate(call_simulations_total[5m])
# Simulations par type
rate(call_simulations_total[5m]) by (call_type)
Aperçus :
- Suivre l'utilisation des outils de diagnostic
- Identifier les utilisateurs lourds
- Corréler avec l'activité de dépannage
8. Métriques SS7 MAP
ss7_map_http_duration_milliseconds
Type : Histogram
Labels : operation (sri, prn), result (success, error, timeout)
Buckets : 10, 50, 100, 250, 500, 1000, 2500, 5000, 10000 ms
Description : Durée des requêtes HTTP SS7 MAP en millisecondes
Utilisation :
# Taux d'erreur SS7 MAP
rate(ss7_map_operations_total{result="error"}[5m]) /
rate(ss7_map_operations_total[5m]) * 100
Alerte lorsque :
- P95 > 500ms - Réponses SS7 MAP lentes
- Taux d'erreur > 50% - Problème critique SS7 MAP
ss7_map_operations_total
Type : Counter
Labels : operation (sri, prn), result (success, error)
Description : Nombre total d'opérations SS7 MAP
9. Métriques de facturation en ligne
online_charging_events_total
Type : Counter
Labels : event_type (authorize, answer, reauth, hangup), result (success, nocredit, error, timeout)
Description : Nombre total d'événements de facturation en ligne
Utilisation :
# Échecs de crédit OCS
rate(online_charging_events_total{result="nocredit"}[5m])
Alerte lorsque :
- Taux élevé d'échecs de crédit
10. Métriques d'état du système
tracked_registrations
Type : Gauge
Description : Nombre d'enregistrements SIP actuellement actifs (à partir de la base de données d'enregistrement Sofia de FreeSWITCH)
Intervalle de mise à jour : Toutes les 10 secondes
Notes :
- Se décrémente automatiquement lorsque les enregistrements expirent (FreeSWITCH gère l'expiration)
tracked_call_sessions
Type : Gauge
Description : Nombre de sessions d'appels actuellement suivies dans ETS
Intervalle de mise à jour : Toutes les 10 secondes
11. Métriques de requêtes HTTP
http_requests_total
Type : Counter
Labels : endpoint (dialplan, call_event, directory, voicemail, sms_ccr, metrics), status_code (200, 400, 500, etc)
Description : Nombre total de requêtes HTTP par point de terminaison
Utilisation :
# Taux d'erreur HTTP
rate(http_requests_total{status_code=~"5.."}[5m]) /
rate(http_requests_total[5m]) * 100
Alerte lorsque :
- Taux d'erreur HTTP 5xx > 10%
12. Métriques de rejet d'appels
call_rejections_total
Type : Counter
Labels : call_type (mo, mt, emergency, unknown), reason (nocredit, unauthorized, parse_failed, missing_params, hlr_error, etc)
Description : Nombre total de rejets d'appels par raison
Utilisation :
# Taux de rejet d'appels par raison
sum by (reason) (rate(call_rejections_total[5m]))
Alerte lorsque :
- Taux de rejet > 1/sec - Enquête nécessaire
13. Métriques de connexion de socket d'événements
event_socket_connected
Type : Gauge
Labels : connection_type (main, log_listener)
Description : État de la connexion de socket d'événements (1=connecté, 0=déconnecté)
Intervalle de mise à jour : Temps réel sur les changements d'état de connexion
Utilisation :
# Statut de connexion de socket d'événements
event_socket_connected
Alerte lorsque :
- Connexion hors ligne pendant > 30 secondes
event_socket_reconnections_total
Type : Counter
Labels : connection_type (main, log_listener), result (attempting, success, failed)
Description : Nombre total de tentatives de reconnexion de socket d'événements
Intégration du tableau de bord Grafana
Les métriques peuvent être visualisées dans Grafana en utilisant la source de données Prometheus. Panneaux recommandés :
Tableau de bord 1 : Volume d'appels
- Jauge des appels actifs
- Taux de tentatives d'appels par type (MO/MT/Urgent)
- Taux de rejet d'appels
Tableau de bord 2 : Performance Diameter
- Carte thermique du temps de réponse
- Taux de requêtes/réponses
- Tableau d'état des pairs
- Taux d'erreur par code de résultat
Tableau de bord 3 : Santé de la facturation en ligne
- Taux de succès d'autorisation de crédit
- Taux d'événements "Pas de crédit"
- Taux de délai d'OCS
Tableau de bord 4 : Performance du système
- Latence de génération de plan de numérotation (P50/P95/P99)
- Temps de réponse SS7 MAP
- Disponibilité globale du système
Mise en page recommandée du tableau de bord Grafana
Ligne 1 : Volume d'appels
- Taux de tentatives d'appels (par type)
- Jauge des appels actifs
- Pourcentage de taux de succès
Ligne 2 : Performance
- Temps de requête HTTP P95 du plan de numérotation (par type d'appel) - MÉTRIQUE PRINCIPALE
- Temps de recherche Sh P95
- Temps de recherche HLR P95
- Temps d'autorisation OCS P95
- Temps de traitement du module de plan de numérotation P95 (par module)
Ligne 3 : Taux de succès
- Taux de succès de recherche Sh
- Taux de succès de recherche HLR
- Taux de succès d'autorisation OCS
- Taux de succès des tentatives d'appels
Ligne 4 : Performance des modules
- Temps de traitement P95 par module
- Comptes d'appels par module
Ligne 5 : Erreurs
- Erreurs de paramètres
- Tentatives non autorisées
- Erreurs Sh
- Erreurs HLR
- Erreurs OCS
Alertes critiques
Priorité 1 (Page immédiatement) :
# Plan de numérotation complètement hors ligne
rate(call_attempts_total[5m]) == 0
# HSS complètement hors ligne
rate(subscriber_data_lookups_total{result="error"}[5m]) /
rate(subscriber_data_lookups_total[5m]) > 0.9
# OCS complètement hors ligne
rate(ocs_authorization_attempts_total{result="error"}[5m]) /
rate(ocs_authorization_attempts_total[5m]) > 0.9
Priorité 2 (Alerte) :
# Génération de plan de numérotation lente
histogram_quantile(0.95,
rate(dialplan_generation_duration_milliseconds_bucket[5m])
) > 1000
# Taux d'erreur HSS élevé
rate(subscriber_data_lookups_total{result="error"}[5m]) /
rate(subscriber_data_lookups_total[5m]) > 0.2
# Taux d'erreur OCS élevé
rate(ocs_authorization_attempts_total{result="error"}[5m]) /
rate(ocs_authorization_attempts_total[5m]) > 0.1
Priorité 3 (Avertissement) :
# Latence HSS élevée
histogram_quantile(0.95,
rate(subscriber_data_duration_milliseconds_bucket[5m])
) > 100
# Latence OCS élevée
histogram_quantile(0.95,
rate(ocs_authorization_duration_milliseconds_bucket[5m])
) > 1000
# Taux d'erreur modéré
rate(call_attempts_total{result="rejected"}[5m]) /
rate(call_attempts_total[5m]) > 0.05
Exemples d'alerte
Pair Diameter hors ligne
alert: DiameterPeerDown
expr: diameter_peer_state == 0
for: 1m
annotations:
summary: "Le pair Diameter {{ $labels.peer_host }} est hors ligne"
Latence Diameter élevée
alert: HighDiameterLatency
expr: histogram_quantile(0.95, rate(diameter_response_duration_milliseconds_bucket[5m])) > 1000
for: 5m
annotations:
summary: "Latence Diameter P95 au-dessus de 1s"
Échecs de crédit OCS
alert: HighOCSCreditFailures
expr: rate(online_charging_events_total{result="nocredit"}[5m]) > 0.1
for: 2m
annotations:
summary: "Taux élevé d'échecs de crédit OCS"
Erreurs de passerelle 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: "Taux d'erreur SS7 MAP au-dessus de 50%"
Socket d'événements déconnecté
alert: EventSocketDown
expr: event_socket_connected == 0
for: 30s
annotations:
summary: "Socket d'événements {{ $labels.connection_type }} déconnecté"
Taux de rejet d'appels élevé
alert: HighCallRejectionRate
expr: rate(call_rejections_total[5m]) > 1
for: 2m
annotations:
summary: "Taux de rejet d'appels élevé : {{ $value }} rejets/sec"
Taux d'erreur HTTP élevé
alert: HighHTTPErrorRate
expr: rate(http_requests_total{status_code=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.1
for: 3m
annotations:
summary: "Taux d'erreur HTTP 5xx au-dessus de 10%"
Dépannage avec les métriques
Problème : Les métriques affichent des valeurs irréalistes (nanosecondes au lieu de millisecondes)
Symptômes :
- Les valeurs
_sumde l'histogramme sont extrêmement petites (par exemple, 0.000315 au lieu de 315) - Toutes les requêtes apparaissant dans le plus bas seau (< 5ms) alors qu'elles devraient être plus lentes
- Les valeurs semblent être 1 000 000x plus petites que prévu
Cause racine :
La bibliothèque Elixir Prometheus convertit automatiquement les unités de temps lorsque les noms de métriques se terminent par _milliseconds, _seconds, etc. Si duration_unit: false n'est pas défini, la bibliothèque convertira vos millisecondes déjà converties en nanosecondes.
Enquête :
- Vérifiez la déclaration de métriques dans lib/metrics.ex
- Vérifiez que
duration_unit: falseest présent :Histogram.declare(
name: :some_duration_milliseconds,
help: "...",
buckets: [...],
duration_unit: false # Doit être présent !
) - Vérifiez que le code de mesure utilise la conversion de temps appropriée :
start = System.monotonic_time()
# ... travail ...
duration_ms = System.convert_time_unit(
System.monotonic_time() - start,
:native,
:millisecond
)
Histogram.observe([name: :some_duration_milliseconds], duration_ms)
Résolution :
- Ajoutez
duration_unit: falseà la déclaration de l'histogramme - Redémarrez l'application (nécessaire pour que les déclarations de métriques se rechargent)
- Vérifiez que les métriques affichent des valeurs réalistes après la correction
Exemple de correction :
# Avant (FAUX - affichera des nanosecondes)
Histogram.declare(
name: :http_dialplan_request_duration_milliseconds,
buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500]
)
# Après (CORRECT - affichera des millisecondes)
Histogram.declare(
name: :http_dialplan_request_duration_milliseconds,
buckets: [100, 250, 500, 750, 1000, 1500, 2000, 3000, 5000],
duration_unit: false
)
Problème : Le type d'appel apparaît comme "inconnu"
Symptômes :
- Toutes les métriques affichent
call_type="unknown"au lieu demt,moouemergency - Impossible de différencier les performances entre les types d'appels
Cause racine : L'extraction du type d'appel échoue ou n'est pas correctement transmise à travers le pipeline de traitement.
Enquête :
- Vérifiez les journaux pour les messages "requête HTTP du plan de numérotation" - ils devraient montrer le bon type d'appel
- Vérifiez que
process_call/1renvoie un tuple{xml, call_type}, pas seulementxml - Vérifiez que
fsapi_conn/1extrait le type d'appel du tuple :{xml, call_type} = process_call(body)
Résolution : Assurez-vous que le pipeline de traitement du plan de numérotation transmet correctement le type d'appel à travers toutes les fonctions.
Problème : Les appels sont lents
Enquête :
- Vérifiez P95 de
http_dialplan_request_duration_milliseconds- COMMENCEZ ICI - Si élevé, vérifiez les temps des composants :
- Vérifiez
subscriber_data_duration_millisecondspour les retards Sh - Vérifiez
hlr_data_duration_millisecondspour les retards HLR - Vérifiez
ocs_authorization_duration_millisecondspour les retards OCS - Vérifiez
dialplan_module_duration_millisecondspour les retards spécifiques aux modules
- Vérifiez
- Vérifiez si
call_type="unknown"- indique un échec de détection du type d'appel - Comparez les temps de traitement MT vs MO vs Urgent
- Corrélez avec les journaux système pour des messages d'erreur détaillés
Résolution : Optimisez le composant le plus lent
Problème : Les appels échouent
Enquête :
- Vérifiez le taux de
call_attempts_total{result="rejected"} - Vérifiez
subscriber_data_lookups_total{result="error"}pour les problèmes Sh - Vérifiez
hlr_lookups_total{result_type="error"}pour les problèmes HLR - Vérifiez
ocs_authorization_attempts_total{result="error"}pour les problèmes OCS - Vérifiez
authorization_decisions_total{disposition="unauthorized"}pour les problèmes d'auth
Résolution : Réparez le composant défaillant
Problème : Charge élevée
Enquête :
- Vérifiez la valeur actuelle de
active_calls - Vérifiez le taux de
call_attempts_total - Vérifiez si le taux correspond au trafic attendu
- Comparez le ratio MT/MO
- Vérifiez les modèles inhabituels (pics, croissance constante)
Résolution : Augmentez la capacité ou enquêtez sur un trafic inhabituel
Problème : Problèmes d'itinérance
Enquête :
- Vérifiez le taux de
hlr_lookups_total{result_type="msrn"} - Vérifiez
hlr_data_duration_millisecondspour les retards - Utilisez l'outil de recherche HLR pour des abonnés spécifiques
- Vérifiez si le MSRN est récupéré correctement
Résolution : Réparez la connectivité ou la configuration HLR
Bases de référence de performance
Valeurs typiques (système bien réglé)
- Requête HTTP du plan de numérotation (de bout en bout) : P50 : 100-500ms, P95 : 500-2000ms, P99 : 1000-3000ms
- Temps de recherche Sh : P50 : 15ms, P95 : 50ms, P99 : 100ms
- Temps de recherche HLR : P50 : 100ms, P95 : 300ms, P99 : 800ms
- Temps d'auth OCS : P50 : 150ms, P95 : 500ms, P99 : 1500ms
- Traitement du module de plan de numérotation : P50 : 1-5ms, P95 : 10-25ms, P99 : 50ms
- Taux de succès Sh : > 99%
- Taux de succès HLR : > 95% (plus bas est normal en raison des abonnés hors ligne)
- Taux de succès OCS : > 98%
- Taux de succès des appels : > 99%
Remarque : Le temps de requête HTTP du plan de numérotation est la somme de tous les temps de composants plus le surcoût. Il devrait à peu près égaler : recherche Sh + recherche HLR + auth OCS + traitement du module de plan de numérotation + surcoût réseau/analyse. Le temps minimum attendu est d'environ 100ms (lorsque seule la recherche Sh est nécessaire), le temps maximum typique est d'environ 2000ms (avec toutes les recherches et réessais).
Planification de capacité
Surveillez ces tendances :
- Croissance du taux de
call_attempts_total - Croissance du pic d'
active_calls - Latences P95 stables ou améliorées
- Taux de succès stables ou améliorés
Planifiez l'échelle lorsque :
- Les appels actifs approchent 80% de la capacité
- Les latences P95 augmentent malgré une charge stable
- Les taux de succès diminuent malgré des systèmes externes stables
Intégration avec la journalisation
Corrélez les métriques avec les journaux :
- Taux d'erreur élevé dans les métriques → Recherchez des messages ERROR dans les journaux
- Temps de réponse lents → Recherchez des messages WARNING dans les journaux concernant des délais d'attente
- Problèmes d'appels spécifiques → Recherchez dans les journaux par ID d'appel ou numéro de téléphone
- Utilisez l'outil de simulation pour reproduire et déboguer
Meilleures pratiques
- Configurez les tableaux de bord avant que les problèmes ne surviennent
- Définissez les seuils d'alerte en fonction de votre base de référence
- Testez les alertes en utilisant le simulateur d'appels
- Examinez les métriques chaque semaine pour identifier les tendances
- Corrélez les métriques avec des événements commerciaux (campagnes, pannes, etc.)
- Utilisez les métriques pour justifier les investissements en infrastructure
- Partagez les tableaux de bord avec l'équipe des opérations
- Documentez vos procédures de réponse aux alertes
Configuration
La collecte de métriques est automatiquement activée lorsque l'application démarre. Le point de terminaison des métriques est exposé sur le même port que l'API (par défaut : 8080).
Pour configurer Prometheus afin de récupérer les métriques, ajoutez ce travail à votre prometheus.yml :
scrape_configs:
- job_name: 'omnitas'
static_configs:
- targets: ['<tas-ip>:8080']
metrics_path: '/metrics'
scrape_interval: 10s
Cardinalité des métriques
Les métriques sont conçues avec une cardinalité contrôlée pour éviter de submerger Prometheus :
- Labels de pair : Limité aux pairs configurés uniquement
- Types d'appels : Ensemble fixe (mo, mt, emergency, unauthorized)
- Codes de résultat : Limité aux codes de résultat Diameter/OCS réels reçus
- Opérations : Ensemble fixe par interface (sri/prn pour MAP, ccr/cca pour Diameter)
Total estimé de séries temporelles : ~200-500 en fonction du nombre de pairs configurés et de codes de résultat actifs.
Rétention des métriques
Périodes de rétention recommandées :
- Métriques brutes : 30 jours (haute résolution)
- Agrégats de 5 minutes : 90 jours
- Agrégats de 1 heure : 1 an
- Agrégats quotidiens : 5 ans
Cela prend en charge :
- Dépannage en temps réel (métriques brutes)
- Analyse hebdomadaire/mensuelle (agrégats de 5 min/1 heure)
- Planification de capacité (agrégats quotidiens)
- Comparaison historique (agrégats annuels)