Cómo monitorear tu servidor de MU Online con Grafana y Prometheus
Instala Prometheus y Grafana para monitorear CPU, memoria, MySQL y jugadores en línea de tu servidor de MU Online en tiempo real, con dashboards listos y alertas automáticas antes de que los jugadores sientan el problema.
Administrar un servidor de MU Online sin monitoreo es como pilotar a ciegas: solo descubres que MySQL se trabó, que la CPU se disparó o que el GameServer se cayó cuando los jugadores ya se están quejando en Discord. Prometheus y Grafana forman el dúo estándar de la industria para observabilidad — el
Administrar un servidor de MU Online sin monitoreo es como pilotar a ciegas: solo descubres que MySQL se trabó, que la CPU se disparó o que el GameServer se cayó cuando los jugadores ya se están quejando en Discord. Prometheus y Grafana forman el dúo estándar de la industria para observabilidad — el primero recolecta métricas de CPU, memoria, disco, red y base de datos a lo largo del tiempo, y el segundo transforma esos datos en dashboards visuales y alertas automáticas. Este tutorial cubre la instalación de ambos, la configuración de exporters para MySQL y sistema operativo, la creación de un exporter personalizado para jugadores en línea, dashboards listos y alertas que avisan a tu equipo antes de que el jugador perciba el problema.
Por qué monitorear de forma proactiva
La mayoría de los administradores de servidores privados solo reaccionan después del problema — un pico de lag, una caída del GameServer, un disco lleno que traba MySQL. Con métricas históricas, identificas patrones (por ejemplo, MySQL siempre se atasca a las 21h cuando la población de jugadores llega al pico) y actúas antes de que la queja aparezca en Discord. El monitoreo también es evidencia concreta para justificar upgrades de hardware o la migración a un dedicado, en lugar de decisiones basadas en "impresión".
Visión general de la arquitectura
| Componente | Función |
|---|---|
| Prometheus | Recolecta y almacena métricas en series temporales |
| Node Exporter | Expone métricas del sistema operativo (CPU, RAM, disco, red) |
| MySQL Exporter | Expone métricas de MySQL (queries/s, conexiones, slow queries) |
| Exporter personalizado | Expone jugadores en línea, cuentas activas, guerra de castillo en curso |
| Grafana | Visualiza las métricas en dashboards y dispara alertas visuales |
| Alertmanager | Envía notificaciones (Discord, correo, Telegram) basadas en reglas |
Requisitos previos
- Servidor Linux (o WSL/dedicado Windows con adaptaciones) con acceso root/sudo.
- Servidor de MU Online ya funcionando (mira el tutorial de creación de servidor).
- Docker instalado (recomendado, simplifica la instalación de todo el stack).
- Acceso de lectura a MySQL para el exporter de base de datos.
Paso 1 — Instalar Prometheus y Grafana vía Docker Compose
La forma más simple de levantar todo el stack es con Docker Compose, aislando cada servicio en su propio contenedor.
version: "3.8"
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana
ports:
- "3000:3000"
node_exporter:
image: prom/node-exporter
ports:
- "9100:9100"
mysqld_exporter:
image: prom/mysqld-exporter
environment:
- DATA_SOURCE_NAME=exporter:senha@(mysql-host:3306)/
ports:
- "9104:9104"
docker compose up -d
Paso 2 — Configurar Prometheus para recolectar los exporters
Edita el prometheus.yml agregando cada objetivo (target) que Prometheus debe consultar periódicamente:
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['node_exporter:9100']
- job_name: 'mysql'
static_configs:
- targets: ['mysqld_exporter:9104']
- job_name: 'mu_online'
static_configs:
- targets: ['mu_exporter:9200']
Reinicia el contenedor de Prometheus y confirma en http://ip-del-servidor:9090/targets que todos los objetivos aparecen como UP.
Paso 3 — Crear un usuario MySQL dedicado al exporter
Nunca uses la cuenta root de MySQL en el exporter. Crea un usuario con permisos mínimos de lectura de métricas:
CREATE USER 'exporter'@'%' IDENTIFIED BY 'senha_forte' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
Paso 4 — Armar un exporter personalizado para jugadores en línea
No existe un exporter oficial para métricas específicas de MU Online, pero es simple armar un script periódico que consulta la base de datos (tabla de cuentas conectadas o conteo vía ConnectServer) y expone el resultado en formato Prometheus:
from prometheus_client import Gauge, start_http_server
import mysql.connector
import time
jogadores_online = Gauge('mu_jogadores_online', 'Jugadores conectados en este momento')
def coletar():
conn = mysql.connector.connect(host="localhost", user="exporter", password="senha_forte", database="MuOnline")
cursor = conn.cursor()
cursor.execute("SELECT COUNT(*) FROM MEMB_STAT WHERE ConnectStat = 1")
jogadores_online.set(cursor.fetchone()[0])
conn.close()
if __name__ == "__main__":
start_http_server(9200)
while True:
coletar()
time.sleep(30)
Paso 5 — Conectar Grafana a Prometheus
Accede a http://ip-del-servidor:3000 (login predeterminado admin/admin la primera vez), ve a Data Sources y agrega Prometheus con la URL http://prometheus:9090. Guarda y prueba la conexión antes de seguir con los dashboards.
Paso 6 — Importar dashboards listos
La comunidad de Grafana ofrece dashboards listos para Node Exporter (ID 1860) y MySQL Exporter (ID 7362), que importas directamente por el ID en la pantalla de Import Dashboard. Para las métricas personalizadas de MU Online, arma un panel simple con un gráfico de línea usando la métrica mu_jogadores_online a lo largo del tiempo.
| Panel | Métrica | Tipo de gráfico sugerido |
|---|---|---|
| Jugadores en línea | mu_jogadores_online | Línea, últimas 24h |
| CPU del servidor | node_cpu_seconds_total | Línea, con promedios móviles |
| Conexiones MySQL | mysql_global_status_threads_connected | Línea |
| Slow queries | mysql_global_status_slow_queries | Contador/barra |
| Uso de disco | node_filesystem_avail_bytes | Gauge |
Paso 7 — Configurar alertas con Alertmanager
Crea reglas de alerta en Prometheus para condiciones críticas, como CPU por encima de 90% durante 5 minutos o caída en el número de jugadores en línea (indicio de GameServer fuera de línea):
groups:
- name: mu_alerts
rules:
- alert: CPUAlta
expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
for: 5m
labels:
severity: critical
annotations:
summary: "CPU por encima de 90% durante 5 minutos"
- alert: ServidorForaDoAr
expr: mu_jogadores_online == 0
for: 3m
labels:
severity: critical
annotations:
summary: "Ningún jugador en línea — posible GameServer fuera de línea"
Configura el Alertmanager con un webhook de Discord para recibir estas notificaciones automáticamente en el canal del equipo de administración.
Paso 8 — Definir retención y backup de las métricas
Configura la retención de Prometheus (predeterminada 15 días) según el espacio en disco disponible, e incluye el volumen de datos de Prometheus y Grafana en la rutina de backup del servidor, para no perder el historial en caso de falla de disco.
Errores comunes y soluciones
| Síntoma | Causa probable | Solución |
|---|---|---|
| El target aparece como DOWN en Prometheus | El exporter no está corriendo o el puerto está bloqueado | Verificar contenedor/servicio y reglas de firewall |
| Dashboard de Grafana sin datos | Data source mal configurado | Revisar la URL de Prometheus en Data Sources |
| El exporter de MySQL falla al conectar | Usuario/contraseña o permisos incorrectos | Recrear el usuario exporter con el GRANT correcto |
| La alerta no llega a Discord | Webhook del Alertmanager mal configurado | Probar el webhook manualmente con curl |
| Métrica de jugadores en línea siempre en cero | Query personalizada incorrecta para el esquema del emulador | Ajustar la query según la tabla real de sesiones |
Lista de verificación de monitoreo
- Prometheus, Grafana y exporters corriendo vía Docker Compose.
- Todos los targets con estado UP en Prometheus.
- Usuario MySQL dedicado al exporter, con permisos mínimos.
- Exporter personalizado de jugadores en línea funcionando.
- Dashboards importados y mostrando datos reales.
- Reglas de alerta configuradas para CPU, disco y caída de jugadores.
- Alertmanager integrado al Discord del equipo.
- Retención de datos y backup del stack de monitoreo definidos.
Con el monitoreo activo, el siguiente paso natural es cruzar estas métricas con el proceso de respuesta a incidentes de tu equipo — saber que el disco se está llenando no sirve de nada si nadie es notificado a tiempo para actuar; revisa también el tutorial de creación de servidor de MU Online para garantizar que la infraestructura base soporta este nivel de observabilidad.
Preguntas frecuentes
¿Necesito saber programar para configurar Grafana y Prometheus?
No es necesario programar, pero ayuda entender conceptos básicos de YAML (archivos de configuración) y línea de comandos de Linux. La mayor parte del trabajo es editar archivos de configuración e importar dashboards listos de la comunidad, sin escribir código.
¿Grafana y Prometheus consumen muchos recursos del servidor?
Consumen recursos moderados — generalmente menos del 5% de CPU y algunos cientos de MB de RAM en un servidor de porte medio. Vale la pena correrlos en una VM o contenedor separado del GameServer para no competir por recursos en el pico de jugadores.
¿Puedo monitorear el número de jugadores en línea de MU Online directamente?
Sí, con un exporter personalizado (script que lee el conteo de conexiones del ConnectServer o consulta la base de datos) que expone esa métrica en el formato que Prometheus entiende. No existe un exporter oficial listo, pero es simple de armar con un script periódico.
¿Cuál es la diferencia entre Prometheus y Grafana?
Prometheus recolecta y almacena las métricas a lo largo del tiempo (series temporales); Grafana es la capa visual que lee esas métricas y arma los dashboards y alertas. Necesitas los dos: uno sin el otro solo resuelve la mitad del problema.
¿Cómo recibo una alerta en Discord cuando el servidor se caiga?
Configura el Alertmanager (componente del ecosistema Prometheus) con un webhook de Discord, y crea reglas de alerta en Prometheus para condiciones como 'GameServer fuera de línea' o 'CPU por encima de 90% durante 5 minutos'. El Alertmanager envía la notificación automáticamente al canal configurado.