tutorial

  1. Studi Kasus: Health Check Monitoring via Prometheus

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:

Timestamporderapi_health_statusStatus
2024-06-21 12:01:001UP
2024-06-21 12:02:001UP
2024-06-21 12:03:000DOWN
2024-06-21 12:04:001UP
2024-06-21 12:05:001UP

Step 6: Simulasi Insiden Health Check DOWN

Untuk menguji ketahanan monitoring & alerting:

  1. Ubah function checkDBConnection() agar selalu false.
  2. Setelah beberapa interval, nilai metric akan turun ke 0.
  3. Alert Prometheus akan firing.
  4. 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!

comments powered by Disqus