L
Observability & Monitoring • Literally Web ID

Membangun Sistem Observability & Distributed Tracing Skala Enterprise dengan Prometheus dan Grafana

⏱️ 15 menit baca • 📅 20 Oct 2026 • 👁️ 4 views
Membangun Sistem Observability & Distributed Tracing Skala Enterprise dengan Prometheus dan Grafana

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur microservices modern, transisi dari monolit tradisional ke sistem terdistribusi membawa kompleksitas operasional yang masif. Ketika sebuah request HTTP masuk melalui layer CDN Cloudflare, melewati WAF, Nginx reverse proxy, mengalir ke aplikasi backend berbasis Go/Node.js/PHP-FPM, melakukan query ke klaster MariaDB/MySQL, serta berkoordinasi dengan Redis cache dan antrean RabbitMQ/Supervisor, melacak sumber latensi atau bottleneck menjadi pencarian jarum di tumpukan jerami.

Masalah utama dalam sistem skala enterprise bukan lagi sekadar "apakah server hidup atau mati", melainkan "mengapa request X mengalami latensi 1200ms padahal rata-rata hanya 45ms?". Pendekatan monitoring tradisional yang hanya mengandalkan uptime checks dan metrik tingkat sistem (CPU/RAM usage) gagal memberikan visibilitas end-to-end.

Sebelum vs Sesudah Implementasi

  • Sebelum Observability Terdistribusi: Tim SRE mengandalkan log grepping manual lintas server, menebak-nebak layanan mana yang mengalami timeout, dan baru mengetahui kegagalan sistem setelah komplain pengguna membanjiri saluran dukungan. Mean Time to Resolution (MTTR) bisa memakan waktu berjam-jam.
  • Sesudah Penerapan Prometheus & Grafana: Metrik dikumpulkan secara pull-based dengan efisiensi tinggi, distributed tracing merekam jejak penuh setiap request lintas layanan, dan alerting rules mendeteksi anomali latensi dalam hitungan detik sebelum berdampak massal ke pengguna akhir.

2. Konsep Inti & Deep Dive Arsitektur

Sistem observability enterprise dibangun di atas tiga pilar utama: Metrics, Logs, dan Traces. Prometheus berfokus pada metrics (deret waktu/time-series numerik), sementara OpenTelemetry menangani traces (perekaman jalur eksekusi request) dan metrics tambahan.

Alur Data dan Eksekusi (Under the Hood)

[Client Browser / App]
         │
         ▼ HTTP Request (Trace Context Injected)
[Cloudflare Edge / WAF]
         │
         ▼
[Nginx Reverse Proxy / Load Balancer]
         │
         ▼ gRPC / HTTP
[Golang / Node.js Backend Service]
 ├── Generates Trace Span (OpenTelemetry SDK)
 ├── Exposes /metrics (Prometheus Format)
 ├── Queries ──> [Redis Cache / MariaDB]
 └── Publishes ──> [Queue / RabbitMQ]
         │
         ├── (Scrape) ──> [Prometheus Server] ──> [Grafana Dashboard]
         └── (Export) ──> [Jaeger / Tempo]    ──┘
  1. Instrumentation: Aplikasi menyisipkan trace context (W3C Trace Context) pada header HTTP setiap request masuk.
  2. Scraping: Prometheus secara periodik melakukan pull endpoint /metrics dari target eksportir (Node Exporter, cAdvisor, Application Exporter).
  3. Storage & Visualization: Data time-series disimpan dalam database columnar Prometheus yang sangat optimal, divisualisasikan secara real-time melalui Grafana.

3. Perbandingan Komparatif / Analisis Pendekatan

Parameter Komparasi Prometheus + Grafana (Pull Model) StatsD + Graphite (Push Model) APM Komersial (Datadog / New Relic)
Model Pengumpulan Pull (Server menarik data) Push (Klien mengirim data) Hybrid (Agent lokal mengirim data)
Konsumsi Sumber Daya (Sistem) Sangat Efisien (RAM/CPU minimal) Menengah (I/O disk tinggi) Tinggi (Agent memakan memori besar)
Skalabilitas Tinggi (dengan Thanos/Cortex) Terbatas pada I/O disk Sangat Tinggi (Managed Service)
Biaya Operasional Rendah (Open Source) Rendah (Open Source) Sangat Tinggi (SaaS Pricing per GB)
Kustomisasi Dashboards Tanpa batas (Grafana ecosystem) Terbatas Bagus, namun tertutup dalam ekosistem

[!TIP] Gunakan model Pull (Prometheus) untuk infrastruktur cloud-native karena memudahkan manajemen kegagalan target tanpa membebani aplikasi dengan logika pengiriman metrik eksternal.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum memulai instalasi, pastikan environment produksi memenuhi spesifikasi minimum:

  • OS: Ubuntu 22.04 LTS / RHEL 9 (Minimum 4 vCPU, 8 GB RAM untuk server monitoring)
  • Network: Port 9090 (Prometheus), 3000 (Grafana), 9100 (Node Exporter) terbuka di internal firewall (UFW/Firewalld).
  • User & Permissions: Buat system user khusus untuk menjalankan layanan guna menjaga isolasi keamanan.
sudo groupadd --system prometheus
sudo useradd -s /sbin/nologin --system -g prometheus prometheus
sudo mkdir -p /var/lib/prometheus /etc/prometheus

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Instalasi dan Konfigurasi Prometheus

Unduh dan pasang binari Prometheus stabil terbaru.

VERSION="2.45.0"
wget https://github.com/prometheus/prometheus/releases/download/v${VERSION}/prometheus-${VERSION}.linux-amd64.tar.gz
tar xvf prometheus-${VERSION}.linux-amd64.tar.gz
sudo cp prometheus-${VERSION}.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-${VERSION}.linux-amd64/promtool /usr/local/bin/

Buat file konfigurasi /etc/prometheus/prometheus.yml:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['localhost:9093']

rule_files:
  - "/etc/prometheus/alert_rules.yml"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100']

  - job_name: 'backend_api'
    metrics_path: '/metrics'
    static_configs:
      - targets: ['10.0.1.50:8080', '10.0.1.51:8080']

Buat systemd service /etc/systemd/system/prometheus.service:

[Unit]
Description=Prometheus
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus/ \
  --web.console.libraries=/etc/prometheus/console_libraries \
  --web.console.templates=/etc/prometheus/consoles \
  --web.enable-lifecycle

[Install]
WantedBy=multi-user.target

Aktifkan layanan:

sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus

Langkah 2: Instalasi Node Exporter untuk Metrik Sistem

NODE_VER="1.6.0"
wget https://github.com/prometheus/node_exporter/releases/download/v${NODE_VER}/node_exporter-${NODE_VER}.linux-amd64.tar.gz
tar xvf node_exporter-${NODE_VER}.linux-amd64.tar.gz
sudo cp node_exporter-${NODE_VER}.linux-amd64/node_exporter /usr/local/bin/

Buat systemd service /etc/systemd/system/node_exporter.service:

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=nobody
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

Langkah 3: Instalasi dan Konfigurasi Grafana

Tambahkan repository resmi Grafana dan pasang paket:

sudo apt-get install -y apt-transport-https software-properties-common wget
sudo mkdir -p /etc/apt/keyrings/
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install grafana -y
sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl enable grafana-server

6. Bedah Kode & Penjelasan Detail Baris Kunci

  • scrape_interval: 15s: Mengatur frekuensi Prometheus menarik metrik dari target. Nilai 15 detik adalah standar industri yang menyeimbangkan antara kesegaran data (freshness) dan beban I/O penyimpanan TSDB.
  • --web.enable-lifecycle: Argumen CLI Prometheus yang mengizinkan reload konfigurasi secara dinamis via HTTP POST (curl -X POST http://localhost:9090/-/reload) tanpa perlu melakukan restart proses.
  • metrics_path: '/metrics': Menentukan jalur endpoint HTTP di aplikasi backend tempat eksporter merender metrik dalam format Plain Text standar Prometheus.

7. Skenario Produksi & Studi Kasus Dunia Nyata

[!IMPORTANT] Pada sistem dengan high concurrency (contoh: 50.000 request/detik), kardinalitas metrik yang tinggi (seperti memasukkan ID pengguna unik ke dalam label metrik) akan meledakkan penggunaan memori Prometheus (Out Of Memory / OOM Killer).

Studi Kasus: Layanan E-commerce mengalami lonjakan traffic saat Flash Sale.

  • Solusi Arsitektur: Kami menggunakan agregasi histogram_quantile di Prometheus untuk memantau latensi p99, bukan rata-rata (average). Rata-rata menyembunyikan lonjakan latensi ekstrem, sementara p99 secara akurat memperlihatkan pengalaman buruk 1% pengguna teratas.
  • Kueri PromQL untuk Latensi p99:
    histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, handler))
    

8. Common Pitfalls, Anti-Patterns & Solusi

  1. Anti-Pattern Kardinalitas Tinggi:
    • Masalah: Menyimpan IP Address atau UUID sebagai label metrik.
    • Solusi: Batasi label hanya pada entitas ber-kardinalitas rendah seperti status_code, method, atau service_name.
  2. Kurangnya Retensi dan Penyimpanan Jangka Panjang:
    • Masalah: Prometheus default menghapus data lama setelah beberapa minggu.
    • Solusi: Integrasikan Prometheus dengan penyimpanan Object Storage S3/MinIO menggunakan Thanos atau Cortex.

9. Benchmark, Metrik Kinerja & Tuning Performa

Lakukan uji beban menggunakan k6 atau wrk untuk memvalidasi performa sistem monitoring di bawah tekanan:

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '2m', target: 1000 }, // Ramp up ke 1000 VU
    { duration: '5m', target: 1000 }, // Pertahankan beban
    { duration: '2m', target: 0 },    // Ramp down
  ],
};

export default function () {
  const res = http.get('http://api.enterprise.internal/v1/checkout');
  check(res, { 'status is 200': (r) => r.status === 200 });
  sleep(1);
}

Tuning Parameter Linux (/etc/sysctl.conf):

fs.file-max = 2097152
vm.max_map_count = 262144

10. Checklist Penerapan Produksi & Kesimpulan

  • Konfigurasi TLS/SSL diaktifkan pada semua komunikasi endpoint Grafana dan Prometheus.
  • Autentikasi kuat (Grafana LDAP / OAuth2 / Grafana Cloud Integration) dikonfigurasi.
  • Alertmanager terhubung ke kanal eskalasi darurat (PagerDuty / Slack / Webhook).
  • Pengujian backup dan restore volume data Prometheus TSDB telah diverifikasi.

Dengan mengikuti arsitektur dan panduan implementasi di atas, tim SRE memiliki visibilitas penuh, latensi investigasi insiden yang mendekati nol, serta fondasi infrastruktur web yang tangguh dan skalabel.

🏷️ Tags: #Nginx #High Concurrency #Performance #Sysadmin #Web Server