Como monitorar seu servidor de MU Online com Grafana e Prometheus
Instale Prometheus e Grafana para monitorar CPU, memória, MySQL e jogadores online do seu servidor de MU Online em tempo real, com dashboards prontos e alertas automáticos antes que os jogadores sintam o problema.
Administrar um servidor de MU Online sem monitoramento é como pilotar no escuro: você só descobre que o MySQL travou, que a CPU estourou ou que o GameServer caiu quando os jogadores já estão reclamando no Discord. Prometheus e Grafana formam a dupla padrão da indústria para observabilidade — o prime
Administrar um servidor de MU Online sem monitoramento é como pilotar no escuro: você só descobre que o MySQL travou, que a CPU estourou ou que o GameServer caiu quando os jogadores já estão reclamando no Discord. Prometheus e Grafana formam a dupla padrão da indústria para observabilidade — o primeiro coleta métricas de CPU, memória, disco, rede e banco de dados ao longo do tempo, e o segundo transforma esses dados em dashboards visuais e alertas automáticos. Este tutorial cobre a instalação de ambos, a configuração de exporters para MySQL e sistema operacional, a criação de um exporter customizado para jogadores online, dashboards prontos e alertas que avisam sua equipe antes que o jogador perceba o problema.
Por que monitorar de forma proativa
A maioria dos administradores de servidores privados só reage depois do problema — um pico de lag, uma queda do GameServer, um disco cheio que trava o MySQL. Com métricas históricas, você identifica padrões (por exemplo, o MySQL sempre engasga às 21h quando a população de jogadores atinge o pico) e age antes da reclamação aparecer no Discord. Monitoramento também é evidência concreta para justificar upgrades de hardware ou migração para dedicado, em vez de decisões baseadas em "impressão".
Visão geral da arquitetura
| Componente | Função |
|---|---|
| Prometheus | Coleta e armazena métricas em séries temporais |
| Node Exporter | Expõe métricas do sistema operacional (CPU, RAM, disco, rede) |
| MySQL Exporter | Expõe métricas do MySQL (queries/s, conexões, slow queries) |
| Exporter customizado | Expõe jogadores online, contas ativas, guerra de castelo em andamento |
| Grafana | Visualiza as métricas em dashboards e dispara alertas visuais |
| Alertmanager | Envia notificações (Discord, e-mail, Telegram) baseadas em regras |
Pré-requisitos
- Servidor Linux (ou WSL/dedicado Windows com adaptações) com acesso root/sudo.
- Servidor de MU Online já rodando (veja o tutorial de criação de servidor).
- Docker instalado (recomendado, simplifica a instalação de todo o stack).
- Acesso de leitura ao MySQL para o exporter de banco.
Passo 1 — Instalar Prometheus e Grafana via Docker Compose
A forma mais simples de subir o stack inteiro é com Docker Compose, isolando cada serviço em seu próprio container.
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
Passo 2 — Configurar o Prometheus para coletar os exporters
Edite o prometheus.yml adicionando cada alvo (target) que o Prometheus deve consultar periodicamente:
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']
Reinicie o container do Prometheus e confirme em http://ip-do-servidor:9090/targets que todos os alvos aparecem como UP.
Passo 3 — Criar um usuário MySQL dedicado ao exporter
Nunca use a conta root do MySQL no exporter. Crie um usuário com permissões mínimas de leitura de métricas:
CREATE USER 'exporter'@'%' IDENTIFIED BY 'senha_forte' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
Passo 4 — Montar um exporter customizado para jogadores online
Não existe um exporter oficial para métricas específicas do MU Online, mas é simples montar um script periódico que consulta o banco (tabela de contas conectadas ou contagem via ConnectServer) e expõe o resultado em formato Prometheus:
from prometheus_client import Gauge, start_http_server
import mysql.connector
import time
jogadores_online = Gauge('mu_jogadores_online', 'Jogadores conectados no 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)
Passo 5 — Conectar o Grafana ao Prometheus
Acesse http://ip-do-servidor:3000 (login padrão admin/admin na primeira vez), vá em Data Sources e adicione o Prometheus com a URL http://prometheus:9090. Salve e teste a conexão antes de seguir para os dashboards.
Passo 6 — Importar dashboards prontos
A comunidade Grafana disponibiliza dashboards prontos para Node Exporter (ID 1860) e MySQL Exporter (ID 7362), que você importa direto pelo ID na tela de Import Dashboard. Para as métricas customizadas do MU Online, monte um painel simples com um gráfico de linha usando a métrica mu_jogadores_online ao longo do tempo.
| Painel | Métrica | Tipo de gráfico sugerido |
|---|---|---|
| Jogadores online | mu_jogadores_online | Linha, últimas 24h |
| CPU do servidor | node_cpu_seconds_total | Linha, com médias móveis |
| Conexões MySQL | mysql_global_status_threads_connected | Linha |
| Slow queries | mysql_global_status_slow_queries | Contador/barra |
| Uso de disco | node_filesystem_avail_bytes | Gauge |
Passo 7 — Configurar alertas com Alertmanager
Crie regras de alerta no Prometheus para condições críticas, como CPU acima de 90% por 5 minutos ou queda no número de jogadores online (indício de GameServer fora do ar):
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 acima de 90% por 5 minutos"
- alert: ServidorForaDoAr
expr: mu_jogadores_online == 0
for: 3m
labels:
severity: critical
annotations:
summary: "Nenhum jogador online — possível GameServer fora do ar"
Configure o Alertmanager com um webhook do Discord para receber essas notificações automaticamente no canal da equipe de administração.
Passo 8 — Definir retenção e backup das métricas
Configure a retenção do Prometheus (padrão 15 dias) de acordo com o espaço em disco disponível, e inclua o volume de dados do Prometheus e Grafana na rotina de backup do servidor, para não perder o histórico em caso de falha de disco.
Erros comuns e soluções
| Sintoma | Causa provável | Solução |
|---|---|---|
| Target aparece como DOWN no Prometheus | Exporter não está rodando ou porta bloqueada | Verificar container/serviço e regras de firewall |
| Dashboard do Grafana sem dados | Data source mal configurado | Revisar URL do Prometheus em Data Sources |
| Exporter do MySQL falha ao conectar | Usuário/senha ou permissões incorretas | Recriar usuário exporter com GRANT correto |
| Alerta não chega no Discord | Webhook do Alertmanager mal configurado | Testar webhook manualmente com curl |
| Métrica de jogadores online sempre zero | Query customizada errada para o schema do emulador | Ajustar query conforme a tabela real de sessões |
Checklist de monitoramento
- Prometheus, Grafana e exporters rodando via Docker Compose.
- Targets todos com status UP no Prometheus.
- Usuário MySQL dedicado ao exporter, com permissões mínimas.
- Exporter customizado de jogadores online funcionando.
- Dashboards importados e exibindo dados reais.
- Regras de alerta configuradas para CPU, disco e queda de jogadores.
- Alertmanager integrado ao Discord da equipe.
- Retenção de dados e backup do stack de monitoramento definidos.
Com o monitoramento ativo, o próximo passo natural é cruzar essas métricas com o processo de resposta a incidentes da sua equipe — saber que o disco está enchendo não adianta se ninguém for notificado a tempo de agir; revise também o tutorial de criação de servidor de MU Online para garantir que a infraestrutura de base suporta esse nível de observabilidade.
Perguntas frequentes
Preciso saber programar para configurar Grafana e Prometheus?
Não é necessário programar, mas ajuda entender conceitos básicos de YAML (arquivos de configuração) e linha de comando Linux. A maior parte do trabalho é editar arquivos de configuração e importar dashboards prontos da comunidade, sem escrever código.
Grafana e Prometheus consomem muitos recursos do servidor?
Consomem recursos moderados — geralmente menos de 5% de CPU e algumas centenas de MB de RAM em um servidor de porte médio. Vale rodá-los em uma VM ou container separado do GameServer para não competir por recursos no pico de jogadores.
Consigo monitorar o número de jogadores online do MU Online diretamente?
Sim, com um exporter customizado (script que lê a contagem de conexões do ConnectServer ou consulta o banco de dados) que expõe essa métrica no formato que o Prometheus entende. Não existe um exporter oficial pronto, mas é simples de montar com um script periódico.
Qual a diferença entre Prometheus e Grafana?
Prometheus coleta e armazena as métricas ao longo do tempo (séries temporais); Grafana é a camada visual que lê essas métricas e monta os dashboards e alertas. Você precisa dos dois: um sem o outro só resolve metade do problema.
Como recebo um alerta no Discord quando o servidor cair?
Configure o Alertmanager (componente do ecossistema Prometheus) com um webhook do Discord, e crie regras de alerta no Prometheus para condições como 'GameServer fora do ar' ou 'CPU acima de 90% por 5 minutos'. O Alertmanager envia a notificação automaticamente para o canal configurado.