← All posts FiveM

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 | head

Versi 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_up

Nilai 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 300

Kalau 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/metrics

Exporter 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 tcp

Pastikan 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 prometheus

Edit /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 prometheus

Ambang 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:

PanelQuery PromQL
Pemain onlinefivem_players
Okupansi slot (%)100 * fivem_players / fivem_max_players
Rata-rata ping pemainfivem_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/detikrate(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

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.

start here

Building something with Noctis?

Tell us what you need. A real person on our team reads every message.