Une bonne configuration de monitoring serveur est l'assurance-vie d'un serveur de jeu : vous voyez le CPU saturer, la RAM se remplir ou un processus planter avant même que les joueurs ne ressentent le lag. Dans ce guide, je vous montre comment rendre un serveur de jeu Linux (Metin2, Minecraft, CS, un hébergement de bot Discord — peu importe) totalement observable grâce au trio Prometheus + node_exporter + Grafana. Tout est open source et tout tourne sur un seul VPS.
Pourquoi Prometheus + Grafana ?
Les rôles de ce duo sont nettement séparés :
- Prometheus — la base de données de séries temporelles et le collecteur. Il « scrape » à intervalles réguliers les cibles (exporters) que vous définissez, stocke les métriques et les rend interrogeables.
- node_exporter — l'exporter officiel de Prometheus ; il publie les métriques CPU, RAM, disque, réseau et charge du système sur un endpoint HTTP.
- Grafana — la couche de visualisation. Vous connectez Prometheus comme source de données et créez des tableaux de bord et des alertes.
Les données circulent dans un seul sens : node_exporter → Prometheus → Grafana. Cette architecture reste identique quand vous montez en charge : vous installez un exporter sur chaque nouvelle machine et l'ajoutez comme cible dans Prometheus.
Installer node_exporter
node_exporter est un binaire statique unique, sans dépendances. Téléchargeons la version officielle et lançons-la comme service systemd :
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xzf node_exporter-1.8.2.linux-amd64.tar.gz
sudo cp node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
sudo useradd --no-create-home --shell /usr/sbin/nologin node_exporter
Créez ensuite un fichier d'unité systemd :
sudo tee /etc/systemd/system/node_exporter.service >/dev/null <<'EOF'
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
Vérification : curl http://localhost:9100/metrics doit renvoyer une longue liste de métriques. node_exporter écoute par défaut sur le port 9100.
Installer Prometheus et définir les cibles
Vous pouvez télécharger Prometheus en binaire de la même façon ou le lancer avec Docker. Son cœur est le fichier de configuration prometheus.yml, où vous définissez vos cibles de scrape :
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
labels:
instance: 'metin2-vps-1'
scrape_interval définit la fréquence de collecte ; 15 secondes offrent une résolution suffisante pour la plupart des serveurs de jeu. Si vous avez plusieurs machines, ajoutez de nouvelles lignes ip:9100 sous targets. Lancer Prometheus avec Docker est l'option la plus pratique :
docker run -d --name prometheus -p 9090:9090 \
-v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
Vérifiez que votre cible apparaît comme UP à l'adresse http://ip-serveur:9090/targets.
Nombre de joueurs et métriques de jeu personnalisées
node_exporter vous donne les métriques système mais ne peut pas répondre à « combien de joueurs sont en ligne ? ». Il existe deux approches pratiques :
- métriques de processus — avec
process-exporter, vous suivez individuellement la consommation CPU et mémoire des processus du serveur de jeu (par ex. les processus channel/game de Metin2). Si un canal se met soudain à dévorer la RAM, vous le voyez aussitôt. - exporter personnalisé — le nombre de joueurs réside généralement dans une base de données ou dans l'API du serveur. Un petit script peut pousser des valeurs vers le Pushgateway de Prometheus, ou vous pouvez utiliser le
textfile collector.
La méthode du textfile collector est la plus simple : démarrez node_exporter avec --collector.textfile.directory=/var/lib/node_exporter, puis un script cron écrit la métrique dans un fichier .prom :
#!/bin/bash
# lire le nombre de joueurs en ligne depuis MySQL
COUNT=$(mysql -N -e "SELECT COUNT(*) FROM player_online;" game_db)
echo "game_players_online ${COUNT}" > /var/lib/node_exporter/players.prom.$$
mv /var/lib/node_exporter/players.prom.$$ /var/lib/node_exporter/players.prom
L'usage d'un mv atomique empêche node_exporter de lire un fichier écrit à moitié. Vous pouvez désormais grapher la métrique game_players_online dans Grafana.
Tableau de bord Grafana et alertes
Après avoir installé Grafana (Docker : grafana/grafana, port 3000), la première étape consiste à ajouter Prometheus comme source de données sous Connections → Data sources ; indiquez l'URL http://prometheus:9090 ou l'IP de votre serveur. Plutôt que de construire un tableau de bord de zéro, en importer un tout prêt est le plus rapide : pour node_exporter, le tableau de bord communautaire ID 1860 (Node Exporter Full) apporte des dizaines de panneaux pour le CPU, la RAM, le disque et le réseau.
La vraie valeur réside dans les alertes. Quelques expressions PromQL pratiques :
- Utilisation CPU :
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)— alerte au-delà de 90 %. - Ratio de RAM libre :
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes— alerte sous 10 %. - Remplissage du disque :
node_filesystem_avail_bytessur la partition racine passant sous un seuil critique.
Dans Grafana, vous créez une Alert rule à partir d'un panneau, définissez le seuil et routez la notification vers un webhook Discord, un e-mail ou Telegram. Ainsi votre téléphone vibre à 3 h du matin quand le serveur tombe — au lieu de vous réveiller sous les plaintes des joueurs.
Note de sécurité
N'exposez jamais les ports des exporters et de Prometheus (9100, 9090) à l'internet public. Ils ne comportent aucune authentification et divulguent des informations sur votre système. La bonne approche : restreindre ces ports dans le pare-feu (par ex. ufw) à votre réseau interne ou à des IP de confiance, et pour le trafic inter-machines, les placer derrière un VPN (WireGuard) ou un reverse proxy avec authentification basique. Mettez aussi le port 3000 de Grafana derrière un reverse proxy TLS (Nginx/Caddy) — c'est la configuration la plus propre.
Questions fréquentes
Prometheus et le serveur de jeu peuvent-ils tourner sur le même VPS ?
Oui, à petite ou moyenne échelle, aucun problème. Prometheus et node_exporter sont très légers. Gardez simplement une durée de rétention (disons 15 jours) et un intervalle de scrape raisonnables ; stocker des mois de données à la seconde gaspille du disque pour rien.
Comment surveiller plusieurs serveurs de jeu ?
Installez node_exporter sur chaque machine, regroupez-les toutes sous targets dans un seul prometheus.yml, et donnez à chacune un label instance parlant. Dans Grafana, vous les surveillez toutes depuis un seul tableau de bord en sélectionnant l'instance.
Dois-je utiliser autre chose que l'alerting de Grafana ?
Les alertes de Grafana suffisent pour la plupart des cas. Si vous voulez des règles de regroupement/silence plus complexes, ajoutez le composant Alertmanager propre à Prometheus ; les deux fonctionnent aussi ensemble.
Cessez de piloter votre serveur de jeu à l'aveugle. Vous voulez que je rende votre serveur réellement observable avec une configuration de monitoring Prometheus + Grafana, le suivi des processus et des alertes envoyées dans Discord ? Contactez-moi — je m'occupe de tout, de l'installation aux tableaux de bord.