Aller au contenu principal

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 :

  1. La bibliothèque Elixir Prometheus détecte automatiquement les noms de métriques se terminant par _milliseconds
  2. Par défaut, elle convertit automatiquement les unités de temps Erlang natives en millisecondes
  3. Notre code convertit déjà le temps en millisecondes en utilisant System.convert_time_unit/3
  4. 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_milliseconds qui 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 _sum de 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 :

  1. Vérifiez la déclaration de métriques dans lib/metrics.ex
  2. Vérifiez que duration_unit: false est présent :
    Histogram.declare(
    name: :some_duration_milliseconds,
    help: "...",
    buckets: [...],
    duration_unit: false # Doit être présent !
    )
  3. 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 :

  1. Ajoutez duration_unit: false à la déclaration de l'histogramme
  2. Redémarrez l'application (nécessaire pour que les déclarations de métriques se rechargent)
  3. 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 de mt, mo ou emergency
  • 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 :

  1. Vérifiez les journaux pour les messages "requête HTTP du plan de numérotation" - ils devraient montrer le bon type d'appel
  2. Vérifiez que process_call/1 renvoie un tuple {xml, call_type}, pas seulement xml
  3. Vérifiez que fsapi_conn/1 extrait 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 :

  1. Vérifiez P95 de http_dialplan_request_duration_milliseconds - COMMENCEZ ICI
  2. Si élevé, vérifiez les temps des composants :
    • Vérifiez subscriber_data_duration_milliseconds pour les retards Sh
    • Vérifiez hlr_data_duration_milliseconds pour les retards HLR
    • Vérifiez ocs_authorization_duration_milliseconds pour les retards OCS
    • Vérifiez dialplan_module_duration_milliseconds pour les retards spécifiques aux modules
  3. Vérifiez si call_type="unknown" - indique un échec de détection du type d'appel
  4. Comparez les temps de traitement MT vs MO vs Urgent
  5. 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 :

  1. Vérifiez le taux de call_attempts_total{result="rejected"}
  2. Vérifiez subscriber_data_lookups_total{result="error"} pour les problèmes Sh
  3. Vérifiez hlr_lookups_total{result_type="error"} pour les problèmes HLR
  4. Vérifiez ocs_authorization_attempts_total{result="error"} pour les problèmes OCS
  5. 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 :

  1. Vérifiez la valeur actuelle de active_calls
  2. Vérifiez le taux de call_attempts_total
  3. Vérifiez si le taux correspond au trafic attendu
  4. Comparez le ratio MT/MO
  5. 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 :

  1. Vérifiez le taux de hlr_lookups_total{result_type="msrn"}
  2. Vérifiez hlr_data_duration_milliseconds pour les retards
  3. Utilisez l'outil de recherche HLR pour des abonnés spécifiques
  4. 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 :

  1. Taux d'erreur élevé dans les métriques → Recherchez des messages ERROR dans les journaux
  2. Temps de réponse lents → Recherchez des messages WARNING dans les journaux concernant des délais d'attente
  3. Problèmes d'appels spécifiques → Recherchez dans les journaux par ID d'appel ou numéro de téléphone
  4. Utilisez l'outil de simulation pour reproduire et déboguer

Meilleures pratiques

  1. Configurez les tableaux de bord avant que les problèmes ne surviennent
  2. Définissez les seuils d'alerte en fonction de votre base de référence
  3. Testez les alertes en utilisant le simulateur d'appels
  4. Examinez les métriques chaque semaine pour identifier les tendances
  5. Corrélez les métriques avec des événements commerciaux (campagnes, pannes, etc.)
  6. Utilisez les métriques pour justifier les investissements en infrastructure
  7. Partagez les tableaux de bord avec l'équipe des opérations
  8. 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)