70. Studi Kasus: Health Check Monitoring via Prometheus
Penulis: Bagus Pratama – Senior DevOps Engineer
Salah satu tantangan umum ketika menangani sistem terdistribusi adalah memastikan semua service berjalan baik setiap waktu. Monitoring menjadi wajib, dan “health check” adalah aspek krusial agar kita bisa segera mengetahui jika ada service yang gagal berfungsi. Dalam tulisan kali ini, saya akan membagikan studi kasus implementasi health check monitoring menggunakan Prometheus—dari pengenalan, desain, implementasi hingga simulasi insiden, lengkap dengan contoh kode dan diagram.
Mengapa Prometheus?
Prometheus telah menjadi de-facto standard untuk monitoring dan alerting di banyak perusahaan teknologi. Ia memiliki ekosistem yang besar, integrasi dengan banyak service, dan sangat cocok dipakai untuk time-series monitoring, termasuk memonitor endpoint health check via custom metrics maupun standar metrics.
Studi Kasus: Monitoring “Order API Service”
Bayangkan Anda memiliki sebuah service bernama order-api yang digunakan oleh aplikasi e-commerce untuk menangani proses pesanan. Service ini berjalan pada Kubernetes cluster. Untuk memastikan service tetap sehat, setiap menit Prometheus melakukan scraping terhadap /healthz endpoint dari order-api.
Kita ingin mendapatkan visibilitas sebagai berikut:
- Status UP/DOWN health check (biner).
- Waktu response health check.
- Alert bila health check gagal lebih dari satu kali dalam 5 menit berturut-turut.
Desain High Level
Mari kita visualisasikan alur sistem monitoring ini dengan diagram:
flowchart TD
subgraph Service Layer
A[order-api /healthz endpoint]
end
subgraph Monitoring Layer
B[Prometheus Scraper]
C[Grafana Dashboard]
D[Alertmanager]
end
A -- expose metrics --> B
B -- store & query --> C
B -- trigger alert --> D
Step 1: Menambahkan Health Check Endpoint
Health check bisa sederhana, misalnya pada aplikasi Node.js Express:
// app.js (Node.js/Express)
const express = require('express');
const app = express();
app.get('/healthz', (req, res) => {
// Cek dependencies penting (misal: koneksi DB)
let dbHealthy = checkDBConnection();
if(dbHealthy) {
res.status(200).json({ status: 'ok' });
} else {
res.status(500).json({ status: 'error' });
}
});
// Utility dummy
function checkDBConnection() {
// Simulasi hasil random (sehat atau tidak)
return Math.random() > 0.05;
}
Step 2: Ekspor Health Status sebagai Prometheus Metric
Dengan bantuan library prom-client (untuk Node.js), custom metric bisa ditambahkan:
// Monitoring integration
const client = require('prom-client');
const register = new client.Registry();
const healthGauge = new client.Gauge({
name: 'orderapi_health_status',
help: 'Current health check status: 1=UP, 0=DOWN'
});
register.registerMetric(healthGauge);
app.get('/healthz', async (req, res) => {
let status = checkDBConnection() ? 1 : 0;
healthGauge.set(status);
res.status(status ? 200 : 500).json({ status: status ? 'ok' : 'error' });
});
app.get('/metrics', async (req, res) => {
res.set('Content-Type', register.contentType);
res.end(await register.metrics());
});
Sekarang, endpoint /metrics mengekspos metrik Prometheus berikut:
# HELP orderapi_health_status Current health check status: 1=UP, 0=DOWN
# TYPE orderapi_health_status gauge
orderapi_health_status 1
Step 3: Scraping via Prometheus
Tambahkan konfigurasi static job di file prometheus.yml:
scrape_configs:
- job_name: 'order-api-health'
metrics_path: /metrics
static_configs:
- targets: ['order-api.prod.svc.cluster.local:3000']
Dengan ini, Prometheus akan melakukan scraping /metrics setiap interval (default 15 detik).
Step 4: Membangun Alert di Prometheus
Tambahkan alert rule, misal pada alerts.yml:
groups:
- name: order-api.rules
rules:
- alert: OrderAPIHealthDown
expr: orderapi_health_status == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Order API Health Check DOWN"
description: "order-api tidak healthy selama 5 menit berturut-turut"
Alert ini akan firing jika status health turun (0) selama lebih dari 5 menit.
Step 5: Menampilkan Status di Grafana
Query sederhana di Grafana:
orderapi_health_status
Table di bawah ini adalah simulasi hasil monitoring yang ditampilkan Grafana:
| Timestamp | orderapi_health_status | Status |
|---|---|---|
| 2024-06-21 12:01:00 | 1 | UP |
| 2024-06-21 12:02:00 | 1 | UP |
| 2024-06-21 12:03:00 | 0 | DOWN |
| 2024-06-21 12:04:00 | 1 | UP |
| 2024-06-21 12:05:00 | 1 | UP |
Step 6: Simulasi Insiden Health Check DOWN
Untuk menguji ketahanan monitoring & alerting:
- Ubah function
checkDBConnection()agar selalufalse. - Setelah beberapa interval, nilai metric akan turun ke 0.
- Alert Prometheus akan firing.
- Alertmanager mengirimkan notifikasi ke channel ops (misal Slack/Email).
Diagram sequence response insiden:
sequenceDiagram
participant Service as order-api
participant Prometheus
participant Alertmanager
participant DevOps
Service->>Prometheus: Expose metrics (health 0)
Prometheus->>Prometheus: Evaluate alert rules
Prometheus->>Alertmanager: Fire alert (OrderAPIHealthDown)
Alertmanager->>DevOps: Notify via Slack/Email
DevOps->>Service: Investigasi & recover
Observasi dan Best Practice
1. Pilih Health Check yang Tepat
Pastikan health check menyentuh dependensi utama (DB, Redis, Storage, dsb), bukan sekadar return 200 OK tanpa validasi real.
2. Monitoring Response Time
Metrics lain seperti duration health check penting:
const healthLatency = new client.Gauge({ name: 'orderapi_health_latency', help: 'Health check duration in ms' });
register.registerMetric(healthLatency);
app.get('/healthz', async (req, res) => {
let t0 = Date.now();
// (...ceks kesehatan...)
healthLatency.set(Date.now() - t0);
// ...
});
3. Recovery Workflow
Alert harus actionable (tidak spammy) dan DevOps wajib punya SOP recovery cepat.
Kesimpulan
Monitoring health check dengan Prometheus bukan sekadar memenuhi “checklist compliance,” tapi merupakan fondasi untuk menjaga reliability di production. Dengan proses ini—dari expose endpoint hingga alerting—tim engineering dapat bereaksi cepat sebelum pelanggan terdampak.
Studi kasus ini hanyalah baseline. Di implementasi nyata, pertimbangkan security endpoint, tuning scrapes, multi-instance, serta alerting yang cerdas (misal, auto-remediation). Semoga sharing ini berguna untuk produksi Anda!
Bagaimana praktik health check monitoring di tim Anda? Sampaikan pendapat di kolom komentar!