Cara Monitoring Server FiveM dengan Prometheus dan Grafana
Tutorial monitoring server FiveM: exporter host, database, dan FXServer, aturan alert dasar, serta dashboard Grafana untuk melihat masalah sebelum pemain mengeluh.
Kebanyakan owner server FiveM baru tahu ada masalah setelah pemain ramai mengeluh di Discord: server mati tengah malam, RAM penuh pelan-pelan, atau CPU melonjak setiap jam ramai. Dengan monitoring, kamu bisa melihat masalah itu lebih dulu, lengkap dengan grafik kapan mulainya.
Panduan ini menyiapkan stack monitoring yang umum dipakai di dunia server Linux: Prometheus untuk mengumpulkan metrik, Grafana untuk dashboard, dan beberapa exporter untuk server, database, serta FXServer. Contoh memakai Ubuntu 24.04, tapi langkahnya mirip di distro lain.
Arsitektur yang akan kita bangun
- node_exporter: metrik host (CPU, RAM, disk, jaringan, steal time).
- mysqld_exporter: metrik MariaDB/MySQL (koneksi, query lambat, throughput).
- Exporter FiveM sederhana: script kecil yang membaca endpoint HTTP FXServer dan mengubahnya menjadi metrik Prometheus, misalnya jumlah pemain dan status server.
- Prometheus: mengambil (scrape) metrik dari exporter setiap beberapa detik dan menyimpannya.
- Grafana: membaca Prometheus dan menampilkan dashboard serta alert.
Idealnya Prometheus dan Grafana berjalan di mesin terpisah dari server FiveM, misalnya VPS kecil. Dengan begitu, kalau server FiveM mati total, sistem monitoring tetap bisa memberi tahu kamu. Untuk server kecil, menjalankan semuanya di satu mesin masih bisa, asalkan kamu tahu batasannya.
Langkah 1: install node_exporter di server FiveM
Paket dari repositori Ubuntu paling mudah dipasang:
sudo apt update
sudo apt install prometheus-node-exporter
systemctl status prometheus-node-exporter
curl -s http://127.0.0.1:9100/metrics | headVersi di repositori distro bisa sedikit tertinggal. Kalau butuh versi terbaru, ambil binary dari rilis resmi node_exporter.
Langkah 2: install mysqld_exporter
Buat user database khusus monitoring dengan hak terbatas:
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'password-kuat' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;Lalu pasang exporter dan simpan kredensial di file konfigurasi. Cara konfigurasi kredensial berbeda antar versi exporter, jadi ikuti README mysqld_exporter sesuai versi yang kamu pasang. Secara default exporter ini mendengarkan di port 9104.
sudo apt install prometheus-mysqld-exporter
curl -s http://127.0.0.1:9104/metrics | grep mysql_upNilai mysql_up 1 berarti exporter berhasil terhubung ke database.
Langkah 3: exporter FiveM sederhana
FXServer menyediakan endpoint HTTP di port game (default 30120) yang dipakai server list, seperti /info.json, /dynamic.json, dan /players.json. Kita bisa membacanya dari localhost dan menerjemahkannya ke format teks Prometheus. Isi dan ketersediaan endpoint bisa dipengaruhi konfigurasi server, jadi cek dulu di server kamu:
curl -s http://127.0.0.1:30120/dynamic.json
curl -s http://127.0.0.1:30120/players.json | head -c 300Kalau keduanya mengembalikan JSON, buat exporter kecil dengan Node.js (tanpa dependency tambahan, karena Node 18+ sudah punya fetch):
// /opt/fivem-exporter/index.mjs
import { createServer } from "node:http";
const TARGET = process.env.FIVEM_URL || "http://127.0.0.1:30120";
const PORT = Number(process.env.PORT) || 9184;
async function getJson(path) {
const res = await fetch(TARGET + path, { signal: AbortSignal.timeout(3000) });
if (!res.ok) throw new Error(path + " HTTP " + res.status);
return res.json();
}
async function metrics() {
const start = Date.now();
try {
const [dyn, players] = await Promise.all([getJson("/dynamic.json"), getJson("/players.json")]);
const pings = players.map((p) => p.ping).filter((n) => Number.isFinite(n));
const avgPing = pings.length ? pings.reduce((a, b) => a + b, 0) / pings.length : 0;
return [
"fivem_up 1",
`fivem_players ${players.length}`,
`fivem_max_players ${Number(dyn.sv_maxclients) || 0}`,
`fivem_players_avg_ping_ms ${avgPing.toFixed(1)}`,
`fivem_scrape_duration_seconds ${(Date.now() - start) / 1000}`,
];
} catch {
return ["fivem_up 0", `fivem_scrape_duration_seconds ${(Date.now() - start) / 1000}`];
}
}
createServer(async (req, res) => {
if (req.url !== "/metrics") { res.writeHead(404).end(); return; }
res.writeHead(200, { "Content-Type": "text/plain; version=0.0.4" });
res.end((await metrics()).join("\n") + "\n");
}).listen(PORT, "0.0.0.0");Jalankan sebagai service systemd:
sudo tee /etc/systemd/system/fivem-exporter.service >/dev/null <<'EOF'
[Unit]
Description=FiveM Prometheus exporter
After=network.target
[Service]
ExecStart=/usr/bin/node /opt/fivem-exporter/index.mjs
Restart=always
User=nobody
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now fivem-exporter
curl -s http://127.0.0.1:9184/metricsExporter ini sengaja minimal. Ia memberi sinyal paling berguna untuk alert: apakah server merespons, dan berapa pemain yang online. Untuk metrik performa per resource, kamu tetap butuh profiler bawaan FiveM; lihat cara menggunakan resmon dan profiler FiveM.
Langkah 4: amankan port exporter
Exporter tidak punya autentikasi. Jangan biarkan port 9100, 9104, dan 9184 terbuka ke internet. Izinkan hanya IP server Prometheus:
# ganti 203.0.113.10 dengan IP server monitoring kamu
sudo ufw allow from 203.0.113.10 to any port 9100,9104,9184 proto tcpPastikan aturan UFW ini tidak mengganggu port game. Port FiveM yang harus tetap terbuka adalah 30120 TCP/UDP, dan 40120 TCP untuk txAdmin (sebaiknya dibatasi ke IP admin).
Langkah 5: install Prometheus
Di server monitoring:
sudo apt install prometheusEdit /etc/prometheus/prometheus.yml dan tambahkan target:
global:
scrape_interval: 15s
rule_files:
- /etc/prometheus/fivem-rules.yml
scrape_configs:
- job_name: node
static_configs:
- targets: ["IP_SERVER_FIVEM:9100"]
- job_name: mysql
static_configs:
- targets: ["IP_SERVER_FIVEM:9104"]
- job_name: fivem
static_configs:
- targets: ["IP_SERVER_FIVEM:9184"]Buka antarmuka Prometheus di port 9090, menu Status → Targets. Semua target harus berstatus UP.
Langkah 6: aturan alert dasar
Buat /etc/prometheus/fivem-rules.yml:
groups:
- name: fivem
rules:
- alert: FiveMDown
expr: fivem_up == 0
for: 2m
annotations:
summary: "FXServer tidak merespons selama 2 menit"
- alert: HostMemoryHigh
expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 0.9
for: 10m
annotations:
summary: "RAM terpakai di atas 90% selama 10 menit"
- alert: DiskAlmostFull
expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) < 0.1
for: 15m
annotations:
summary: "Sisa disk root di bawah 10%"
- alert: MySQLDown
expr: mysql_up == 0
for: 1m
annotations:
summary: "Database tidak bisa dihubungi"Validasi dan muat ulang:
promtool check rules /etc/prometheus/fivem-rules.yml
sudo systemctl reload prometheusAmbang di atas hanya titik awal. Setelah beberapa minggu, sesuaikan dengan pola server kamu supaya alert tidak terlalu sering berbunyi tanpa alasan.
Langkah 7: Grafana dan dashboard
Install Grafana dari repositori resmi Grafana, lalu buka port 3000, login, dan tambahkan Prometheus sebagai data source (http://localhost:9090 kalau satu mesin).
Untuk metrik host, kamu bisa mengimpor dashboard komunitas "Node Exporter Full" dari galeri dashboard Grafana. Untuk FiveM, buat panel sendiri dengan query seperti:
| Panel | Query PromQL |
|---|---|
| Pemain online | fivem_players |
| Okupansi slot (%) | 100 * fivem_players / fivem_max_players |
| Rata-rata ping pemain | fivem_players_avg_ping_ms |
| CPU terpakai (%) | 100 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 |
| Steal time (%) | avg(rate(node_cpu_seconds_total{mode="steal"}[5m])) * 100 |
| Query database/detik | rate(mysql_global_status_queries[5m]) |
Menaruh jumlah pemain dan CPU di dashboard yang sama sangat membantu. Kamu bisa melihat apakah lonjakan CPU mengikuti jumlah pemain (beban wajar), atau muncul tanpa kenaikan pemain (sering kali tanda resource bermasalah atau proses lain seperti backup).
Kirim notifikasi ke Discord melalui fitur alerting Grafana dengan contact point bertipe Discord dan URL webhook dari channel staf kamu.
Bagaimana dengan hitch warning?
Peringatan server thread hitch warning muncul di log console, bukan sebagai metrik. Kalau ingin menghitungnya, kirim log FXServer ke sistem log seperti Grafana Loki, lalu buat query yang menghitung baris berisi "hitch warning" per menit. Untuk memahami penyebab dan cara mengatasinya, baca cara mengatasi FiveM server hitch warning.
Cara membaca data monitoring
- RAM naik terus tanpa turun: kemungkinan ada resource yang menyimpan data tanpa pernah dibersihkan. Cek dengan restart resource satu per satu di server staging.
- Steal time tinggi saat jam ramai: CPU sedang dibagi dengan tenant lain di host yang sama. Lihat perbandingan VPS, VDS, dan dedicated untuk FiveM.
- Disk naik cepat: biasanya log atau backup lokal yang tidak dirotasi. Lihat panduan backup dan restore database FiveM.
- Query database melonjak: cari resource yang melakukan query di dalam loop. Tips lainnya ada di cara optimasi server FiveM.
Kesimpulan
Dengan node_exporter, mysqld_exporter, exporter FiveM kecil, Prometheus, dan Grafana, kamu punya gambaran lengkap tentang kondisi server dan alert sebelum pemain mengeluh. Mulai dari empat alert dasar di atas, lalu tambah panel dan alert sesuai masalah yang benar-benar muncul di server kamu.
Ingin menjalankan FXServer dan stack monitoring dengan root penuh di core yang tidak dibagi? Lihat Hosting FiveM Noctis. Untuk server monitoring terpisah, Cloud VPS kecil sudah cukup.