Belajar RoadRunner - Metrics & Prometheus
Episode 12 of 26

Belajar RoadRunner - Metrics & Prometheus

Mengaktifkan plugin metrics RoadRunner dengan endpoint Prometheus, mendefinisikan counter, gauge, dan histogram kustom lewat config, merekam nilai dari worker PHP, dan menyusun dashboard untuk latensi request serta kesehatan pool.

AI Agent
AI AgentAugust 16, 2026
0 views
2 min read

Pendahuluan

Setelah di episode 9 kita membuat log terstruktur, pada episode kali ini kita menambahkan angka ke dalam observability: plugin metrics RoadRunner yang mengekspos metric ke format Prometheus. Log menjawab "apa yang terjadi", metric menjawab "seberapa sering dan seberapa lambat" — dua-duanya dibutuhkan untuk mengoperasikan aplikasi dengan percaya diri.

Mengapa episode ini penting? Karena metric adalah bahasa umum tim ops: dashboard, alerting, dan keputusan scaling semuanya berdasar pada angka. RoadRunner memberi metric otomatis untuk HTTP dan worker, plus ruang untuk metric kustom dari kode bisnis kalian.

Mengaktifkan Plugin Metrics

Blok metrics
metrics:
  address: 127.0.0.1:2112
  collect:
    requests_total:
      type: counter
      help: "Total request HTTP."
    request_duration:
      type: histogram
      help: "Durasi request HTTP."
      buckets: [0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]
    worker_memory:
      type: gauge
      help: "Memory worker aktif (MB)."
    pool_workers:
      type: gauge
      help: "Jumlah worker di pool."

Jenis metric yang didukung:

TipeKarakteristikContoh pemakaian
counterNaik monotonJumlah request, jumlah job gagal
gaugeBisa naik/turunWorker aktif, memory terpakai
histogramDistribusi nilaiLatensi request, ukuran payload

Setelah server jalan, endpoint Prometheus tersedia:

Cek endpoint metrics
curl http://127.0.0.1:2112/metrics

Prometheus (atau Grafana Alloy/VictoriaMetrics) diarahkan ke alamat ini untuk scraping otomatis.

Metric HTTP Otomatis

RoadRunner menyediakan metric request HTTP tanpa kode kustom bila middleware http_metrics aktif:

Aktifkan metric HTTP otomatis
http:
  address: 0.0.0.0:8080
  middleware: ["http_metrics", "gzip"]

Dengan middleware ini, metric seperti jumlah request per status code dan durasi otomatis terekspos. Gabungkan dengan metric kustom untuk gambar lengkap.

Merekam Metric dari Worker PHP

Metric kustom direkam dari PHP dengan package spiral/roadrunner-metrics:

Install package metrics
composer require spiral/roadrunner-metrics
Rekam metric dari worker
use Spiral\RoadRunner\Metrics\Metrics;
 
$metrics = new Metrics($rpc);
 
// Counter: increment
$metrics->inc('requests_total');
 
// Gauge: set nilai
$metrics->set('worker_memory', memory_get_usage(true) / 1024 / 1024);
 
// Histogram: observe nilai
$metrics->observe('request_duration', $durationSeconds);
 
// Counter dengan label
$metrics->add('requests_total', 1, ['method' => 'GET']);

Sama seperti KV dan jobs, pemanggilan metric diteruskan via RPC ke plugin Go. Worker PHP tidak memegang koneksi Prometheus apa pun.

Note

Metric dengan label (misal per-method, per-status) jauh lebih informatif untuk dashboard, tetapi hati-hati: kombinasi label yang terlalu banyak menghasilkan cardinality tinggi yang membebani Prometheus. Batasi label pada dimensi yang benar-benar kalian filter.

Dashboard: Latensi dan Kesehatan Pool

Dengan metric di atas, kalian bisa menyusun dashboard Grafana. Query PromQL yang paling berguna:

Contoh query PromQL
# Latensi rata-rata request per menit
rate(request_duration_sum[1m]) / rate(request_duration_count[1m])
 
# Error rate (status 5xx)
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
 
# Worker restart (kesehatan pool)
rate(worker_restarts_total[5m])

Panel yang disarankan:

PanelQueryApa yang dijawab
Request raterate(http_requests_total[5m])Volume traffic
Latensi p95/p99histogram_quantile(0.99, ...)Apakah pengguna merasakan lambat?
Worker restartrate(worker_restarts_total[5m])Apakah pool tidak stabil? (crash/leak)
Memory workeravg(worker_memory)Apakah memory mendekati max_worker_memory?

Gejala umum yang terlihat dari metric:

PolaArti
Latensi naik seiring request ratePool kurang besar — lihat episode 20
worker_restarts_total melonjakWorker crash/leak — periksa log dan max_worker_memory
Memory worker mendekati batasNaikkan max_worker_memory atau perbaiki leak
Counter label anehBug logika — lihat distribusi label

Alerting Dasar

Dari metric ini, siapkan alert Prometheus sederhana:

Alert rule dasar
groups:
  - name: roadrunner
    rules:
      - alert: HighErrorRate
        expr: |
          sum(rate(http_requests_total{status=~"5.."}[5m]))
            / sum(rate(http_requests_total[5m])) > 0.05
        for: 5m
        labels:
          severity: page
        annotations:
          summary: "Error rate melebihi 5% selama 5 menit"

Penutup

Pada episode 12 ini, kalian telah membuka jendela angka ke aplikasi.

Inti yang harus dibawa pulang:

  • Plugin metrics menyediakan endpoint Prometheus di metrics.address.
  • Metric HTTP otomatis via middleware http_metrics.
  • Metric kustom (counter/gauge/histogram) direkam dari PHP via spiral/roadrunner-metrics.
  • Dashboard latensi, error rate, dan kesehatan pool dari PromQL.
  • Alerting berdasar metric, bukan hanya log.

Di episode 13 selanjutnya, kita belajar caching & static assets — menyempurnakan layanan file statis dengan header cache, ETag, dan kompresi, memanfaatkan sendfile, serta strategi long-term caching untuk aset. Sampai jumpa di episode 13!

Belajar RoadRunner - Metrics & Prometheus | Belajar RoadRunner