O maior portal de MU Online do Brasil — desde 2003
Tutorial Avançado Infra

Como montar um dashboard de métricas em tempo real para seu servidor de MU Online

Construa um dashboard de métricas em tempo real para monitorar players online, uptime, uso de CPU/RAM, queries lentas e economia do servidor de MU Online, usando coleta periódica, banco de séries temporais e visualização em painel web.

BR Bruno · Atualizado em 15 mai 2024 · ⏱ 17 min de leitura
Resposta rápida

Administrar um servidor de MU Online "no escuro" — sem visibilidade de quantos jogadores estão online agora, se o banco está sob estresse, ou se a economia está inflacionando — é like pilotar sem painel de instrumentos. Um dashboard de métricas em tempo real transforma decisões de operação (quando e

Administrar um servidor de MU Online "no escuro" — sem visibilidade de quantos jogadores estão online agora, se o banco está sob estresse, ou se a economia está inflacionando — é like pilotar sem painel de instrumentos. Um dashboard de métricas em tempo real transforma decisões de operação (quando escalar hardware, quando revisar uma taxa de drop, quando investigar lag) de "achismo" em dado concreto. Este tutorial percorre a construção de um dashboard completo: da coleta de métricas de sistema e de jogo, passando pelo armazenamento em série temporal, até a visualização em painel web e os alertas automáticos.

O que vale a pena medir

Antes de escolher ferramenta, defina o que o dashboard precisa responder. Um conjunto sólido de métricas para servidor de MU cobre três camadas:

CamadaMétricasFrequência sugerida
InfraestruturaCPU, RAM, disco, rede, uptime dos serviços5-15 segundos
Servidor de jogoPlayers online, conexões no ConnectServer, latência média15-30 segundos
Economia/jogoZen em circulação, itens Excellent dropados/hora, resets/dia5-15 minutos

Métricas de infraestrutura e de servidor de jogo pedem alta frequência porque mudam rápido; métricas de economia são agregadas e mudam devagar, então coletar a cada minuto já satura a necessidade.

Pré-requisitos

  • Servidor de MU já rodando e configurado.
  • Acesso ao banco de dados do emulador (MSSQL ou MySQL, conforme o emulador).
  • Uma máquina/VM (ou o próprio host) para rodar o stack de monitoramento.
  • Conhecimento básico de scripting (PowerShell, Python ou Node.js) para os coletores.

Passo 1 — Escolher o stack de monitoramento

Duas rotas comuns:

  • Stack pronta (Prometheus + Grafana): Prometheus coleta e armazena séries temporais; Grafana visualiza. Curva de aprendizado maior, mas extremamente extensível e com alertas nativos.
  • Painel próprio leve: um script coletor grava métricas periodicamente em uma tabela SQL, e uma página web simples (PHP/Node) consulta e exibe via gráficos (Chart.js). Mais rápido de montar, menos flexível a longo prazo.

Para servidores pequenos/médios, comece com o painel próprio; migre para Prometheus/Grafana quando o volume de métricas justificar.

Passo 2 — Criar a tabela de séries temporais (rota própria)

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
);

Essa tabela cresce rápido se coletada a cada poucos segundos — planeje uma rotina de limpeza (ex.: manter granularidade fina por 7 dias e agregar em médias horárias depois).

Passo 3 — Escrever o coletor de infraestrutura

Um coletor simples em PowerShell (Windows) que grava CPU e RAM a 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
}

Rode como serviço/tarefa agendada para garantir que a coleta sobreviva a reinicializações.

Passo 4 — Escrever o coletor de métricas de jogo

Consulte a tabela de contas/personagens conectados do próprio banco do emulador (o nome da coluna/tabela varia por emulador — geralmente algo como MEMB_STAT ou uma flag de conexão em Character):

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

Grave esse valor junto com a economia agregada (soma de Zen, contagem de Excellent dropados na última hora via log de itens, se seu emulador registra esse log).

Passo 5 — Montar a visualização (painel web)

Uma página simples consultando a tabela metrics_snapshot e renderizando com 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) }]
      }
    });
  });

Monte painéis separados para: online ao longo do dia, CPU/RAM, e economia (Zen em circulação, drops de Excellent).

Passo 6 — Adicionar healthcheck e alertas

Configure um script que testa a porta do ConnectServer/GameServer a cada minuto e dispara um webhook para Discord se a checagem falhar 3 vezes seguidas (evitando alerta falso por instabilidade momentânea de rede):

$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 fora do ar!"} | ConvertTo-Json) -ContentType 'application/json'
        }
    } else { $falhas = 0 }
    Start-Sleep -Seconds 60
}

Passo 7 — Monitorar queries lentas do banco

Habilite o log de queries lentas do seu SGBD (slow query log no MySQL, Query Store no SQL Server) e some ao dashboard um painel com as queries mais lentas da última hora. Isso costuma revelar gargalos antes que virem lag perceptível pelos jogadores, especialmente em picos de horário nobre.

Passo 8 — Definir retenção e agregação de dados

Sem uma política de retenção, a tabela de métricas cresce indefinidamente. Um esquema razoável: manter granularidade de 15 segundos por 48h, agregar em médias de 5 minutos por 30 dias, e agregar em médias diárias indefinidamente para análise histórica de longo prazo.

Passo 9 — Restringir acesso a dados sensíveis

Separe o dashboard em duas camadas: uma pública (ou semipública, no site) com métricas agregadas (online total, uptime, season atual) para transparência com a comunidade, e uma administrativa autenticada com detalhes sensíveis (IPs, contas específicas, logs individuais).

Erros comuns e soluções

SintomaCausa provávelSolução
Tabela de métricas cresce descontroladamenteSem política de retenção/agregaçãoImplemente limpeza e agregação periódica
Dashboard trava ou fica lentoConsultas pesadas direto na tabela brutaUse views agregadas ou cache de curto prazo
Alertas falsos de queda do servidorChecagem única sem tolerância a falha de redeExija N falhas consecutivas antes de alertar
Coleta impacta performance do GameServerFrequência de coleta agressiva demaisReduza frequência de métricas pesadas (economia)
Dados sensíveis expostos publicamentePainel único sem separação de acessoSepare painel público (agregado) do administrativo

Checklist de implantação

  • Métricas de infraestrutura, jogo e economia definidas e priorizadas.
  • Tabela/stack de séries temporais criada com plano de retenção.
  • Coletores de sistema e de jogo rodando como serviço persistente.
  • Painel de visualização montado com gráficos das métricas-chave.
  • Healthcheck com alerta via webhook configurado e testado.
  • Monitoramento de queries lentas habilitado no banco.
  • Separação entre painel público (agregado) e administrativo (detalhado).

Com o dashboard no ar, você passa a decidir escalonamento de hardware, ajustes de economia e janelas de manutenção com dado real em vez de intuição — o próximo passo é revisar a configuração base do servidor descrita no tutorial de criação de servidor à luz dos números que o dashboard está revelando.

Perguntas frequentes

Preciso de Grafana ou dá para fazer um dashboard mais simples?

Grafana é a opção mais robusta e gratuita, mas para servidores pequenos um painel web próprio consultando o banco a cada poucos segundos (via AJAX/polling) já resolve. A escolha depende de quanto tempo você quer investir em manutenção da ferramenta.

Coletar métricas a cada segundo sobrecarrega o servidor?

Coleta a cada 1 segundo em métricas pesadas (como contagem de personagens online via query completa) pode sim gerar carga desnecessária. O recomendado é coletar métricas de sistema (CPU/RAM) a cada 5-15s e métricas de jogo a cada 30-60s.

Como monitorar queries lentas do banco de dados?

A maioria dos SGBDs (MySQL/MSSQL) tem um log de queries lentas nativo (slow query log no MySQL, Query Store no SQL Server) que pode ser habilitado e depois consumido pelo seu dashboard ou por ferramentas como o Percona Toolkit.

Dá para alertar automaticamente quando o servidor cair?

Sim. Configure um healthcheck que testa a porta do GameServer/ConnectServer periodicamente e dispare um webhook (Discord, Telegram) quando a checagem falhar N vezes seguidas, evitando alertas falsos por uma única falha de rede.

O dashboard expõe dados sensíveis se for público?

Pode expor, se você incluir dados de jogadores individuais (IP, e-mail) sem anonimização. Mantenha o dashboard público limitado a métricas agregadas (online total, uptime, economia geral) e restrinja dados detalhados a um painel administrativo autenticado.

BR
Editor de eventos, mapas e itens

Bruno é especialista em eventos, mapas, bosses e economia de itens do MU Online. Documenta cada detalhe com base em jogo real.

Continue lendo

Artigos relacionados