Guía de Monitoreo y Métricas
Métricas de Prometheus, Dashboards de Grafana y Alertas
OmniSGW de Omnitouch Network Services
Tabla de Contenidos
- Descripción General
- Exportador de Métricas
- Métricas Disponibles
- Configuración de Prometheus
- Dashboards de Grafana
- Reglas de Alerta
- Solución de Problemas
Descripción General
OmniSGW expone métricas compatibles con Prometheus para un monitoreo integral de las operaciones de red, gestión de sesiones y salud del sistema.
Arquitectura de Métricas
Exportador de Métricas
Accediendo a las Métricas
Las métricas se exponen en el punto final HTTP configurado:
# Punto final por defecto (si está configurado)
curl http://127.0.0.40:42068/metrics
# Exportar a archivo
curl http://127.0.0.40:42068/metrics > metrics.txt
# Monitoreo en tiempo real
watch -n 5 'curl -s http://127.0.0.40:42068/metrics | head -30'
Para la configuración del punto final de métricas (dirección de enlace, puerto e intervalo de sondeo), consulte la Guía de Configuración.
Formato de Métricas
Las métricas están en formato de texto de Prometheus:
# HELP teid_registry_count Total number of allocated TEIDs
# TYPE teid_registry_count gauge
teid_registry_count 1234
# HELP s11_inbound_messages_total Total number of inbound S11 messages
# TYPE s11_inbound_messages_total counter
s11_inbound_messages_total{message_type="create_session_request"} 5432
s11_inbound_messages_total{message_type="delete_session_request"} 5100
s11_inbound_messages_total{message_type="modify_bearer_request"} 12000
Métricas Disponibles
Métricas de Gestión de Sesiones
Sesiones Activas:
teid_registry_count
├── Descripción: Asignaciones de TEID S11/S5S8 activas
├── Tipo: Gauge
├── Rango: 0 a capacidad máxima licenciada
└── Ejemplo: 1234 (1234 sesiones activas)
seid_registry_count
├── Descripción: Sesiones PFCP activas (por par SGW-U)
├── Tipo: Gauge
├── Etiquetas: peer_ip
└── Ejemplo: seid_registry_count{peer_ip="10.0.0.30"} 1234
active_ue_sessions
├── Descripción: Total de sesiones UE activas
├── Tipo: Gauge
└── Ejemplo: 5000
active_bearers
├── Descripción: Total de portadores activos (por defecto + dedicados)
├── Tipo: Gauge
└── Ejemplo: 5500 (1 por defecto + 0.1 dedicados por sesión)
charging_id_registry_count
├── Descripción: IDs de carga activos
├── Tipo: Gauge
└── Ejemplo: 5000
Contadores de Mensajes
S11 (Interfaz MME):
s11_inbound_messages_total
├── Tipo: Counter (en aumento)
├── Etiquetas: message_type
├── Valores:
│ ├── create_session_request
│ ├── delete_session_request
│ ├── modify_bearer_request
│ ├── create_bearer_request
│ ├── delete_bearer_request
│ ├── release_access_bearers_request
│ ├── downlink_data_notification
│ └── echo_request
└── Ejemplo: s11_inbound_messages_total{message_type="create_session_request"} 5432
S5/S8 (Interfaz PGW):
s5s8_inbound_messages_total
├── Tipo: Counter
├── Etiquetas: message_type
├── Valores: (mismos que los tipos de solicitud S11)
└── Ejemplo: s5s8_inbound_messages_total{message_type="create_session_request"} 4500
Sxa (Interfaz SGW-U):
sxa_inbound_messages_total
├── Tipo: Counter
├── Etiquetas: message_type
├── Valores:
│ ├── session_establishment_request
│ ├── session_modification_request
│ ├── session_deletion_request
│ ├── session_report_request
│ ├── association_setup_request
│ └── heartbeat_request
└── Ejemplo: sxa_inbound_messages_total{message_type="session_report_request"} 67000
Métricas de Rendimiento
Latencia de Mensajes:
s11_inbound_duration_seconds
├── Tipo: Histogram (con cubos)
├── Descripción: Tiempo de procesamiento de mensajes S11
├── Percentiles: _count, _sum, _bucket
└── Ejemplo: s11_inbound_duration_seconds_bucket{le="0.1"} 5000
s5s8_inbound_duration_seconds
├── Tipo: Histogram
├── Descripción: Tiempo de procesamiento de mensajes S5/S8
sxa_inbound_duration_seconds
├── Tipo: Histogram
├── Descripción: Tiempo de procesamiento de mensajes Sxa
Asociación PFCP:
pfcp_association_status
├── Tipo: Gauge
├── Valores: 1 (asociado) o 0 (no asociado)
├── Etiquetas: peer_ip, node_id
└── Ejemplo: pfcp_association_status{peer_ip="10.0.0.30"} 1
pfcp_heartbeat_latency_ms
├── Tipo: Gauge
├── Descripción: Tiempo de ida y vuelta del heartbeat
├── Etiquetas: peer_ip
└── Ejemplo: pfcp_heartbeat_latency_ms{peer_ip="10.0.0.30"} 15
Métricas de Error
Errores de Protocolo:
s11_inbound_errors_total
├── Tipo: Counter
├── Etiquetas: error_type
├── Valores:
│ ├── parse_error
│ ├── validation_error
│ ├── timeout
│ └── other
└── Ejemplo: s11_inbound_errors_total{error_type="timeout"} 12
s5s8_inbound_errors_total
├── Tipo: Counter
├── Descripción: Errores S5/S8
sxa_inbound_errors_total
├── Tipo: Counter
├── Descripción: Errores Sxa
Fallos en la Creación de Sesiones:
create_session_response_cause
├── Tipo: Counter
├── Etiquetas: cause_code
├─��� Valores: (códigos de causa 3GPP)
├── Ejemplos:
│ ├── cause_code="0": Éxito
│ ├── cause_code="16": No hay recursos disponibles
│ ├── cause_code="25": Error de semántica
│ └── cause_code="49": No hay regla coincidente
Configuración de Prometheus
Instalación
# Descargar Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar xzf prometheus-2.45.0.linux-amd64.tar.gz
cd prometheus-2.45.0.linux-amd64
Archivo de Configuración
prometheus.yml:
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
monitor: 'sgw-c-prod'
scrape_configs:
- job_name: 'sgw-c'
static_configs:
- targets: ['127.0.0.40:42068']
labels:
instance: 'sgw-c-prod-01'
- job_name: 'sgw-c-backup'
static_configs:
- targets: ['127.0.0.41:42068']
labels:
instance: 'sgw-c-prod-02'
alerting:
alertmanagers:
- static_configs:
- targets: ['127.0.0.50:9093']
Iniciando Prometheus
./prometheus --config.file=prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus \
--web.console.libraries=consoles \
--web.console.templates=console_templates
Accediendo a Prometheus
http://localhost:9090
Dashboards de Grafana
Instalación
# Docker (más fácil)
docker run -d \
--name=grafana \
-p 3000:3000 \
-e GF_SECURITY_ADMIN_PASSWORD=admin \
grafana/grafana
Agregando Fuente de Datos
- Abrir Grafana: http://localhost:3000
- Configuración → Fuentes de Datos
- Agregar → Prometheus
- URL: http://prometheus:9090
Dashboard: Resumen de Sesiones
Paneles:
Fila 1:
├── Sesiones Activas (Gauge)
├── Portadores Activos (Gauge)
├── Mensajes S11/sec (Gráfico)
└── Mensajes S5/S8/sec (Gráfico)
Fila 2:
├── Mensajes Sxa/sec (Gráfico)
├── Latencia S11 p95 (Gráfico)
├── Latencia S5/S8 p95 (Gráfico)
└── Latencia Sxa p95 (Gráfico)
Fila 3:
├── Errores S11/min (Gráfico)
├── Errores S5/S8/min (Gráfico)
├── Errores Sxa/min (Gráfico)
└── Asociaciones PFCP (Estado)
Dashboard: Salud de la Interfaz
Paneles:
Fila 1:
├── Estado del Par S11 (Estado)
├── Estado del Par S5/S8 (Estado)
├── Estado del Par SGW-U (Lista de estados)
└── Carga del Sistema (Gauge)
Fila 2:
├── Tasa de Mensajes S11 (Gráfico)
├── Tasa de Mensajes S5/S8 (Gráfico)
├── Tasa de Mensajes Sxa (Gráfico)
└── Tasa de Errores (Gráfico)
Fila 3:
├── Histograma de Latencia de Mensajes (Mapa de Calor)
├── Tasa de Creación de Sesiones (Gráfico)
├── Tasa de Terminación de Sesiones (Gráfico)
└── Tasa de Creación de Portadores (Gráfico)
Dashboard: Planificación de Capacidad
Paneles:
Fila 1:
├── Sesiones vs Capacidad (Gauge + Umbral)
├── Portadores vs Capacidad (Gauge + Umbral)
├── Distribución de Sesiones PFCP (Gráfico de Barras)
└── Sesiones por APN (Gráfico Circular)
Fila 2:
├── Tendencia de Crecimiento de Sesiones (Gráfico)
├── Tendencia de Crecimiento de Portadores (Gráfico)
├── Hora de Máxima Sesión (Mapa de Calor)
└── Distribución de Duración de Sesiones (Histograma)
Ejemplos de Consultas de Dashboard
Sesiones Activas:
teid_registry_count
Tasa de Creación de Sesiones:
rate(s11_inbound_messages_total{message_type="create_session_request"}[5m])
Latencia S11 (percentil 95):
histogram_quantile(0.95, rate(s11_inbound_duration_seconds_bucket[5m]))
Tasa de Errores:
rate(s11_inbound_errors_total[5m]) +
rate(s5s8_inbound_errors_total[5m]) +
rate(sxa_inbound_errors_total[5m])
Estado de Asociación PFCP:
pfcp_association_status{peer_ip=~"10.0.0.3[0-2]"}
Reglas de Alerta
Archivo de Reglas de Alerta
sgw-c-alerts.yml:
groups:
- name: sgw-c-alerts
interval: 30s
rules:
# Alertas de capacidad de sesión
- alert: SGWCapacityHigh
expr: (teid_registry_count / 100000) > 0.8
for: 5m
annotations:
summary: "Capacidad de sesión SGW por encima del 80%"
description: "Sesiones: {{ $value }} de 100000"
# Alertas de salud de la interfaz
- alert: S11PeerDown
expr: absent(s11_inbound_messages_total) > 0
for: 2m
annotations:
summary: "Interfaz S11 inalcanzable"
- alert: PGWPeerDown
expr: create_session_response_cause{cause_code="49"} > 100
for: 2m
annotations:
summary: "Par PGW-C inalcanzable"
- alert: SGWUAssociationDown
expr: pfcp_association_status == 0
for: 1m
annotations:
summary: "Asociación SGW-U perdida"
description: "Par: {{ $labels.peer_ip }}"
# Alertas de latencia de mensajes
- alert: S11LatencyHigh
expr: histogram_quantile(0.95, rate(s11_inbound_duration_seconds_bucket[5m])) > 1
for: 5m
annotations:
summary: "Latencia S11 por encima de 1 segundo"
description: "p95: {{ $value }}s"
- alert: S5S8LatencyHigh
expr: histogram_quantile(0.95, rate(s5s8_inbound_duration_seconds_bucket[5m])) > 1
for: 5m
annotations:
summary: "Latencia S5/S8 por encima de 1 segundo"
# Alertas de tasa de errores
- alert: S11ErrorRate
expr: rate(s11_inbound_errors_total[5m]) > 10
for: 3m
annotations:
summary: "Alta tasa de errores S11"
description: "{{ $value }} errores/seg"
- alert: SessionEstablishmentFailure
expr: rate(create_session_response_cause{cause_code!="0"}[5m]) > 20
for: 3m
annotations:
summary: "Alta tasa de fallos en la creación de sesiones"
description: "{{ $value }} fallos/seg"
Configurando AlertManager
alertmanager.yml:
global:
resolve_timeout: 5m
route:
receiver: 'sgw-alerts'
group_by: ['alertname', 'instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 12h
receivers:
- name: 'sgw-alerts'
webhook_configs:
- url: 'http://slack-webhook-url'
email_configs:
- to: 'noc@example.com'
from: 'sgw-alerts@example.com'
smarthost: 'smtp.example.com:587'
Ejemplos de Notificaciones de Alerta
Integración con Slack:
🚨 Capacidad SGW Alta
Severidad: Advertencia
Sesiones Activas: 85,000 / 100,000 (85%)
Hora: 2025-12-10 15:30:00 UTC
Acción: Monitorear para aumento de capacidad
Integración por Correo Electrónico:
Asunto: [ALERTA] Par S11 Inalcanzable
La interfaz S11 de SGW-C no ha recibido mensajes durante 2 minutos.
Esto puede indicar:
- Problema de conectividad de red MME
- Reinicio de SGW-C requerido
- Configuración del puerto S11 cambiada
Acción Inmediata Requerida: Verificar estado de S11
Solución de Problemas
Métricas No Aparecen
Problema: Punto final de métricas vacío o 404
Diagnóstico:
# Verificar que el punto final de métricas sea accesible
curl -v http://127.0.0.40:42068/metrics
# Verificar registros para errores del exportador de métricas
tail -f /var/log/sgw_c/sgw_c.log | grep -i metric
# Verificar configuración
cat config/runtime.exs | grep metrics
Soluciones:
- Reiniciar el proceso SGW-C
- Verificar que la IP/puerto de métricas no esté bloqueado por el firewall
- Verificar la configuración de la dirección de enlace
- Asegurarse de que haya suficiente memoria para la recolección de métricas
Métricas Faltantes para Interfaz Específica
Problema: Métricas S11 muestran pero faltan S5/S8 o Sxa
Diagnóstico:
- Verificar que la interfaz esté configurada
- Verificar que la interfaz esté activa
- Monitorear registros para errores de conexión
Solución:
- Verificar la alcanzabilidad del par
- Verificar la vinculación de la interfaz
- Revisar la configuración
Alto Uso de Memoria
Problema: Exportador de métricas consumiendo memoria excesiva
Diagnóstico:
# Verificar memoria del proceso
ps aux | grep sgw_c | grep -v grep | awk '{print $6}'
# Monitorear crecimiento a lo largo del tiempo
watch -n 5 'ps aux | grep sgw_c'
Soluciones:
- Reducir el intervalo de sondeo de métricas
- Limitar el número de muestras de métricas
- Implementar política de retención de métricas
- Escalar a múltiples instancias
Mejores Prácticas
Recolección de Métricas
- Intervalo de Sondeo: 15-30 segundos para equilibrio
- Retención: 15-30 días de almacenamiento de métricas
- Agregación: Pre-agregar métricas de alta cardinalidad
- Muestreo: Usar percentiles para latencia, no valores brutos
Diseño de Dashboard
- Contexto: Incluir rango de tiempo, instancia, información del par
- Capas: Resumen → Detalle �� Depuración
- Alertas: Umbrales visuales en gráficos de capacidad
- Correlación: Vincular métricas relacionadas
Estrategia de Alertas
- Jerarquía: Crítico → Advertencia → Información
- Escalación: Notificar al responsable para alertas críticas
- Ajuste de Umbrales: Línea base y luego +20% para advertencia
- Pruebas Regulares: Probar rutas de alerta mensualmente
Guía de Monitoreo - Métricas y Observabilidad de OmniSGW
Desarrollado por Omnitouch Network Services
Versión de Documentación: 1.0
Última Actualización: 2025-12-10