aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Gameserver

Server monitoring voor gameservers met Grafana en Prometheus

Een degelijke server monitoring-opstelling is de verzekeringspolis van het draaien van een gameserver: je ziet de CPU pieken, de RAM vollopen of een proces crashen voordat spelers ook maar lag merken. In deze gids laat ik je zien hoe je een Linux-gameserver (Metin2, Minecraft, CS, een Discord-bot-host — maakt niet uit) volledig observeerbaar maakt met het trio Prometheus + node_exporter + Grafana. Het is allemaal open source en draait allemaal op één VPS.

Waarom Prometheus + Grafana?

De rollen van dit duo zijn netjes gescheiden:

  • Prometheus — de time-series-database en collector. Het "scrapet" op vaste intervallen de targets (exporters) die je definieert, slaat de metrics op en maakt ze opvraagbaar.
  • node_exporter — de officiële exporter van Prometheus; hij publiceert CPU-, RAM-, schijf-, netwerk- en load-metrics van het besturingssysteem op een HTTP-endpoint.
  • Grafana — de visualisatielaag. Je koppelt Prometheus als databron en bouwt dashboards en alerts.

De data stroomt één kant op: node_exporter → Prometheus → Grafana. Deze architectuur blijft hetzelfde als je opschaalt: je installeert een exporter op elke nieuwe machine en voegt die als target toe in Prometheus.

node_exporter installeren

node_exporter is één enkele statische binary zonder afhankelijkheden. Laten we de officiële release downloaden en als systemd-service draaien:

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

Maak vervolgens een systemd-unitbestand aan:

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

Verifiëren: curl http://localhost:9100/metrics moet een lange lijst met metrics teruggeven. node_exporter luistert standaard op poort 9100.

Prometheus opzetten en targets definiëren

Je kunt Prometheus op dezelfde manier als binary downloaden of met Docker draaien. Het hart is het configuratiebestand prometheus.yml, waarin je je scrape-targets definieert:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']
        labels:
          instance: 'metin2-vps-1'

scrape_interval bepaalt hoe vaak data wordt verzameld; 15 seconden is voldoende resolutie voor de meeste gameservers. Heb je meerdere machines, voeg dan nieuwe ip:9100-regels toe onder targets. Prometheus met Docker opstarten is de meest praktische route:

docker run -d --name prometheus -p 9090:9090 \
  -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

Controleer dat je target als UP verschijnt op http://server-ip:9090/targets.

Spelersaantallen en eigen game-metrics

node_exporter geeft je systeem-metrics, maar kan de vraag "hoeveel spelers zijn er online?" niet beantwoorden. Er zijn twee praktische aanpakken:

  • proces-metrics — met process-exporter volg je afzonderlijk het CPU- en geheugengebruik van de gameserverprocessen (bijv. de channel/game-processen van Metin2). Als één kanaal plots RAM opvreet, zie je het meteen.
  • eigen exporter — het spelersaantal staat meestal in een database of in de eigen API van de server. Een klein script kan waarden naar de Pushgateway van Prometheus pushen, of je gebruikt de textfile collector.

De textfile-collector-methode is de eenvoudigste: start node_exporter met --collector.textfile.directory=/var/lib/node_exporter, en laat een cron-script de metric naar een .prom-bestand schrijven:

#!/bin/bash
# het aantal online spelers uit MySQL lezen
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

Een atomische mv voorkomt dat node_exporter een half geschreven bestand inleest. Nu kun je de metric game_players_online in Grafana grafisch weergeven.

Grafana-dashboard en alerts

Na het installeren van Grafana (Docker: grafana/grafana, poort 3000) is de eerste stap Prometheus als databron toevoegen onder Connections → Data sources; zet de URL op http://prometheus:9090 of het IP van je server. In plaats van een dashboard vanaf nul te bouwen is een kant-en-klare importeren het snelst: voor node_exporter brengt het community-dashboard ID 1860 (Node Exporter Full) tientallen panels voor CPU, RAM, schijf en netwerk.

De echte waarde zit in de alerts. Een paar praktische PromQL-expressies:

  • CPU-gebruik: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) — waarschuw boven de 90%.
  • Vrije RAM-ratio: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes — waarschuw onder de 10%.
  • Schijfvulling: node_filesystem_avail_bytes op de root-partitie onder een kritieke drempel.

In Grafana maak je een Alert rule vanuit een panel, definieer je de drempel en route je de notificatie naar een Discord-webhook, e-mail of Telegram. Zo trilt je telefoon om 3 uur 's nachts als de server uitvalt — in plaats van wakker te worden van spelersklachten.

Beveiligingsnotitie

Stel de poorten van de exporters en Prometheus (9100, 9090) nooit bloot aan het publieke internet. Ze bevatten geen authenticatie en lekken informatie over je systeem. De juiste aanpak: beperk deze poorten in de firewall (bijv. ufw) tot je interne netwerk of vertrouwde IP's, en zet ze voor verkeer tussen machines achter een VPN (WireGuard) of een reverse proxy met basic auth. Zet ook poort 3000 van Grafana achter een TLS-reverse-proxy (Nginx/Caddy) — dat is de schoonste opstelling.

Veelgestelde vragen

Kunnen Prometheus en de gameserver op dezelfde VPS draaien?

Ja, op kleine tot middelgrote schaal is dat prima. Prometheus en node_exporter zijn erg licht. Houd alleen de retentieperiode (zeg 15 dagen) en het scrape-interval redelijk; maandenlang data per seconde opslaan verspilt schijfruimte voor niets.

Hoe monitor ik meerdere gameservers?

Installeer node_exporter op elke machine, verzamel ze allemaal onder targets in één prometheus.yml, en geef elk een betekenisvol instance-label. In Grafana bekijk je ze allemaal vanaf één dashboard door de instance te selecteren.

Moet ik iets anders dan Grafana-alerting gebruiken?

Grafana-alerts zijn voldoende voor de meeste gevallen. Wil je complexere silencing/groepering-regels, voeg dan Prometheus' eigen component Alertmanager toe; de twee werken ook samen.

Stop met je gameserver blind besturen. Wil je dat ik je server echt observeerbaar maak met een Prometheus + Grafana-monitoringopstelling, procesmonitoring en alerts die in Discord binnenkomen? Neem contact op — ik regel alles, van installatie tot dashboards.

Bu kategorideki tüm yazılar →

Devamı için