El mayor portal de MU Online de Brasil — desde 2003
Tutorial Avanzado Infra

Cómo armar un dashboard de métricas en tiempo real para tu servidor de MU Online

Construye un dashboard de métricas en tiempo real para monitorear jugadores en línea, uptime, uso de CPU/RAM, queries lentas y economía del servidor de MU Online, usando recolección periódica, base de datos de series temporales y visualización en panel web.

BR Bruno · Actualizado el 15 may 2024 · ⏱ 17 min de lectura
Respuesta rápida

Administrar un servidor de MU Online "a ciegas" — sin visibilidad de cuántos jugadores están en línea ahora, si la base de datos está bajo estrés, o si la economía se está inflando — es como pilotar sin panel de instrumentos. Un dashboard de métricas en tiempo real transforma decisiones de operación

Administrar un servidor de MU Online "a ciegas" — sin visibilidad de cuántos jugadores están en línea ahora, si la base de datos está bajo estrés, o si la economía se está inflando — es como pilotar sin panel de instrumentos. Un dashboard de métricas en tiempo real transforma decisiones de operación (cuándo escalar el hardware, cuándo revisar una tasa de drop, cuándo investigar lag) de "corazonada" a dato concreto. Este tutorial recorre la construcción de un dashboard completo: desde la recolección de métricas de sistema y de juego, pasando por el almacenamiento en series temporales, hasta la visualización en panel web y las alertas automáticas.

Qué vale la pena medir

Antes de elegir la herramienta, define qué debe responder el dashboard. Un conjunto sólido de métricas para servidor de MU cubre tres capas:

CapaMétricasFrecuencia sugerida
InfraestructuraCPU, RAM, disco, red, uptime de los servicios5-15 segundos
Servidor de juegoJugadores en línea, conexiones en el ConnectServer, latencia promedio15-30 segundos
Economía/juegoZen en circulación, ítems Excellent dropeados/hora, resets/día5-15 minutos

Las métricas de infraestructura y de servidor de juego piden alta frecuencia porque cambian rápido; las métricas de economía son agregadas y cambian despacio, así que recolectar cada minuto ya satisface la necesidad.

Prerrequisitos

  • Servidor de MU ya funcionando y configurado.
  • Acceso a la base de datos del emulador (MSSQL o MySQL, según el emulador).
  • Una máquina/VM (o el propio host) para correr el stack de monitoreo.
  • Conocimiento básico de scripting (PowerShell, Python o Node.js) para los recolectores.

Paso 1 — Elegir el stack de monitoreo

Dos rutas comunes:

  • Stack lista (Prometheus + Grafana): Prometheus recolecta y almacena series temporales; Grafana visualiza. Curva de aprendizaje mayor, pero extremadamente extensible y con alertas nativas.
  • Panel propio ligero: un script recolector graba métricas periódicamente en una tabla SQL, y una página web simple (PHP/Node) consulta y muestra vía gráficos (Chart.js). Más rápido de armar, menos flexible a largo plazo.

Para servidores pequeños/medianos, empieza con el panel propio; migra a Prometheus/Grafana cuando el volumen de métricas lo justifique.

Paso 2 — Crear la tabla de series temporales (ruta propia)

CREATE TABLE metrics_snapshot (
    id INT IDENTITY PRIMARY KEY,
    captured_at DATETIME NOT NULL DEFAULT GETDATE(),
    players_online INT NOT NULL,
    cpu_percent DECIMAL(5,2),
    ram_percent DECIMAL(5,2),
    zen_total BIGINT,
    excellent_drops_last_hour INT
);

Esta tabla crece rápido si se recolecta cada pocos segundos — planifica una rutina de limpieza (ej.: mantener granularidad fina por 7 días y agregar en promedios horarios después).

Paso 3 — Escribir el recolector de infraestructura

Un recolector simple en PowerShell (Windows) que graba CPU y RAM cada 15 segundos:

while ($true) {
    $cpu = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue
    $ram = (Get-CimInstance Win32_OperatingSystem)
    $ramPercent = 100 - ($ram.FreePhysicalMemory / $ram.TotalVisibleMemorySize * 100)

    Invoke-Sqlcmd -Query "INSERT INTO metrics_snapshot (cpu_percent, ram_percent) VALUES ($cpu, $ramPercent)"
    Start-Sleep -Seconds 15
}

Ejecútalo como servicio/tarea programada para garantizar que la recolección sobreviva a reinicios.

Paso 4 — Escribir el recolector de métricas de juego

Consulta la tabla de cuentas/personajes conectados de la propia base de datos del emulador (el nombre de la columna/tabla varía según el emulador — generalmente algo como MEMB_STAT o una flag de conexión en Character):

SELECT COUNT(*) AS players_online FROM MEMB_STAT WHERE ConnectStat = 1;

Guarda ese valor junto con la economía agregada (suma de Zen, conteo de Excellent dropeados en la última hora vía log de ítems, si tu emulador registra ese log).

Paso 5 — Montar la visualización (panel web)

Una página simple consultando la tabla metrics_snapshot y renderizando con Chart.js:

fetch('/api/metrics?range=1h')
  .then(r => r.json())
  .then(data => {
    new Chart(document.getElementById('grafico-online'), {
      type: 'line',
      data: {
        labels: data.map(d => d.captured_at),
        datasets: [{ label: 'Players Online', data: data.map(d => d.players_online) }]
      }
    });
  });

Arma paneles separados para: online a lo largo del día, CPU/RAM, y economía (Zen en circulación, drops de Excellent).

Paso 6 — Agregar healthcheck y alertas

Configura un script que pruebe el puerto del ConnectServer/GameServer cada minuto y dispare un webhook a Discord si la verificación falla 3 veces seguidas (evitando alerta falsa por inestabilidad momentánea de red):

$falhas = 0
while ($true) {
    $ok = Test-NetConnection -ComputerName "127.0.0.1" -Port 44405 -InformationLevel Quiet
    if (-not $ok) {
        $falhas++
        if ($falhas -ge 3) {
            Invoke-RestMethod -Uri $webhookDiscord -Method Post -Body (@{content="⚠️ ¡GameServer fuera de línea!"} | ConvertTo-Json) -ContentType 'application/json'
        }
    } else { $falhas = 0 }
    Start-Sleep -Seconds 60
}

Paso 7 — Monitorear queries lentas de la base de datos

Habilita el log de queries lentas de tu SGBD (slow query log en MySQL, Query Store en SQL Server) y suma al dashboard un panel con las queries más lentas de la última hora. Esto suele revelar cuellos de botella antes de que se conviertan en lag perceptible para los jugadores, especialmente en picos de horario pico.

Paso 8 — Definir retención y agregación de datos

Sin una política de retención, la tabla de métricas crece indefinidamente. Un esquema razonable: mantener granularidad de 15 segundos por 48h, agregar en promedios de 5 minutos por 30 días, y agregar en promedios diarios indefinidamente para análisis histórico de largo plazo.

Paso 9 — Restringir acceso a datos sensibles

Separa el dashboard en dos capas: una pública (o semipública, en el sitio) con métricas agregadas (online total, uptime, season actual) para transparencia con la comunidad, y una administrativa autenticada con detalles sensibles (IPs, cuentas específicas, logs individuales).

Errores comunes y soluciones

SíntomaCausa probableSolución
La tabla de métricas crece descontroladamenteSin política de retención/agregaciónImplementa limpieza y agregación periódica
El dashboard se traba o queda lentoConsultas pesadas directo en la tabla brutaUsa vistas agregadas o caché de corto plazo
Alertas falsas de caída del servidorVerificación única sin tolerancia a falla de redExige N fallas consecutivas antes de alertar
La recolección impacta el rendimiento del GameServerFrecuencia de recolección demasiado agresivaReduce la frecuencia de métricas pesadas (economía)
Datos sensibles expuestos públicamentePanel único sin separación de accesoSepara panel público (agregado) del administrativo

Lista de verificación de implementación

  • Métricas de infraestructura, juego y economía definidas y priorizadas.
  • Tabla/stack de series temporales creada con plan de retención.
  • Recolectores de sistema y de juego corriendo como servicio persistente.
  • Panel de visualización armado con gráficos de las métricas clave.
  • Healthcheck con alerta vía webhook configurado y probado.
  • Monitoreo de queries lentas habilitado en la base de datos.
  • Separación entre panel público (agregado) y administrativo (detallado).

Con el dashboard en línea, pasas a decidir escalamiento de hardware, ajustes de economía y ventanas de mantenimiento con dato real en vez de intuición — el siguiente paso es revisar la configuración base del servidor descrita en el tutorial de creación de servidor a la luz de los números que el dashboard está revelando.

Preguntas frecuentes

¿Necesito Grafana o se puede hacer un dashboard más simple?

Grafana es la opción más robusta y gratuita, pero para servidores pequeños un panel web propio consultando la base de datos cada pocos segundos (vía AJAX/polling) ya resuelve el problema. La elección depende de cuánto tiempo quieras invertir en mantener la herramienta.

¿Recolectar métricas cada segundo sobrecarga el servidor?

Recolectar cada 1 segundo métricas pesadas (como el conteo de personajes en línea vía query completa) sí puede generar carga innecesaria. Lo recomendado es recolectar métricas de sistema (CPU/RAM) cada 5-15s y métricas de juego cada 30-60s.

¿Cómo monitorear queries lentas de la base de datos?

La mayoría de los SGBD (MySQL/MSSQL) tienen un log de queries lentas nativo (slow query log en MySQL, Query Store en SQL Server) que puede habilitarse y luego ser consumido por tu dashboard o por herramientas como Percona Toolkit.

¿Se puede alertar automáticamente cuando el servidor se caiga?

Sí. Configura un healthcheck que pruebe el puerto del GameServer/ConnectServer periódicamente y dispare un webhook (Discord, Telegram) cuando la verificación falle N veces seguidas, evitando alertas falsas por una única falla de red.

¿El dashboard expone datos sensibles si es público?

Puede exponerlos, si incluyes datos de jugadores individuales (IP, correo) sin anonimizar. Mantén el dashboard público limitado a métricas agregadas (online total, uptime, economía general) y restringe los datos detallados a un panel administrativo autenticado.

BR
Editor de eventos, mapas e ítems

Bruno es especialista en eventos, mapas, bosses y economía de ítems de MU Online. Documenta cada detalle basándose en el juego real.

Sigue leyendo

Artículos relacionados