Monitoring Stack: Grafana + Prometheus
Prometheus mengumpulkan metrics, Grafana memvisualisasikannya. Ini adalah monitoring stack paling populer di industri.
Prometheus
Pull-based metrics collector. Prometheus scrape endpoint /metrics dari aplikasi secara berkala.
# prometheus.yml
scrape_configs:
- job_name: "api-server"
scrape_interval: 15s
static_configs:
- targets: ["api:3000"]
- job_name: "postgres"
static_configs:
- targets: ["postgres-exporter:9187"]
Metric Types
- Counter — Hanya naik: total requests, total errors
- Gauge — Naik/turun: active connections, memory usage
- Histogram — Distribusi: request duration (p50, p95, p99)
- Summary — Mirip histogram, computed client-side
Instrument App
import { Counter, Histogram, register } from "prom-client";
const httpRequests = new Counter({
name: "http_requests_total",
help: "Total HTTP requests",
labelNames: ["method", "path", "status"],
});
const httpDuration = new Histogram({
name: "http_request_duration_seconds",
help: "HTTP request duration",
labelNames: ["method", "path"],
buckets: [0.01, 0.05, 0.1, 0.5, 1, 5],
});
// Middleware
app.use((req, res, next) => {
const end = httpDuration.startTimer({ method: req.method, path: req.path });
res.on("finish", () => {
httpRequests.inc({ method: req.method, path: req.path, status: res.statusCode });
end();
});
next();
});
// Expose /metrics endpoint
app.get("/metrics", async (req, res) => {
res.set("Content-Type", register.contentType);
res.end(await register.metrics());
});
Grafana Dashboard
Query PromQL di Grafana untuk membuat dashboard:
# Request rate per detik
rate(http_requests_total[5m])
# Error rate
rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m])
# P95 latency
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))