Observability: Metrics, Logs, Traces
Tiga pilar observability:
- Metrics — Angka terukur seiring waktu (CPU usage, request count, response time)
- Logs — Event detail (sudah dibahas)
- Traces — Perjalanan satu request melalui seluruh sistem
Jenis Metrics
Counter — Angka yang hanya naik (total requests, errors)
Gauge — Angka yang bisa naik-turun (CPU%, memory, active connections)
Histogram — Distribusi nilai (response time percentiles)
Metrics Penting (Golden Signals)
- Latency — Berapa lama request diproses (p50, p95, p99)
- Traffic — Berapa request per detik
- Errors — Persentase request yang gagal
- Saturation — Seberapa penuh resource (CPU, memory, disk)
Prometheus & Grafana
# Prometheus: collect & store metrics
# Grafana: visualize metrics di dashboard
# prometheus.yml
scrape_configs:
- job_name: "my-app"
static_configs:
- targets: ["localhost:3000"]
metrics_path: /metrics
scrape_interval: 15s
Expose Metrics di Node.js
import { Counter, Histogram, register } from "prom-client";
const httpRequests = new Counter({
name: "http_requests_total",
help: "Total HTTP requests",
labelNames: ["method", "path", "status"],
});
const responseTime = new Histogram({
name: "http_response_time_seconds",
help: "Response time in seconds",
buckets: [0.01, 0.05, 0.1, 0.5, 1, 5],
});
// Middleware
app.use((req, res, next) => {
const end = responseTime.startTimer();
res.on("finish", () => {
httpRequests.inc({ method: req.method, path: req.path, status: res.statusCode });
end();
});
next();
});
app.get("/metrics", async (req, res) => {
res.set("Content-Type", register.contentType);
res.end(await register.metrics());
});