Saltar al contenido principal

Guía de Monitoreo y Métricas

Métricas de Prometheus, Dashboards de Grafana y Alertas

OmniSGW de Omnitouch Network Services


Tabla de Contenidos

  1. Descripción General
  2. Exportador de Métricas
  3. Métricas Disponibles
  4. Configuración de Prometheus
  5. Dashboards de Grafana
  6. Reglas de Alerta
  7. 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

  1. Abrir Grafana: http://localhost:3000
  2. Configuración → Fuentes de Datos
  3. Agregar → Prometheus
  4. 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:

  1. Reiniciar el proceso SGW-C
  2. Verificar que la IP/puerto de métricas no esté bloqueado por el firewall
  3. Verificar la configuración de la dirección de enlace
  4. 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:

  1. Verificar que la interfaz esté configurada
  2. Verificar que la interfaz esté activa
  3. 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:

  1. Reducir el intervalo de sondeo de métricas
  2. Limitar el número de muestras de métricas
  3. Implementar política de retención de métricas
  4. 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