L
Observability & Monitoring • Literally Web ID

Observabilitas Skala Penuh dengan Prometheus, Grafana, dan OpenTelemetry

⏱️ 18 menit baca • 📅 13 Oct 2026 • 👁️ 1 views
Observabilitas Skala Penuh dengan Prometheus, Grafana, dan OpenTelemetry

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap infrastruktur web modern saat ini, kompleksitas aplikasi telah mencapai tingkat yang belum pernah terjadi sebelumnya. Arsitektur monolitik tradisional telah lama ditinggalkan dan digantikan oleh microservices, arsitektur berbasis event, edge computing via Cloudflare, serta ketergantungan pada berbagai layanan pihak ketiga seperti S3/MinIO, Redis untuk caching, dan sistem antrean (queue) seperti Supervisor. Ketika sebuah request HTTP masuk dari pengguna, ia tidak lagi sekadar melewati satu skrip PHP atau Node.js sederhana, melainkan melewati lapisan DNS, WAF, CDN, Nginx reverse proxy, PHP-FPM, komunikasi ke database MySQL/MariaDB terdistribusi, serta sinkronisasi real-time via WebSocket.

Kondisi ini menciptakan tantangan besar yang dikenal sebagai observability blind spots. Seringkali, tim Site Reliability Engineering (SRE) dan Systems Administrator baru mengetahui adanya kegagalan sistem setelah pengguna akhir melaporkannya melalui media sosial atau tiket dukungan pelanggan. Pendekatan monitoring tradisional yang hanya mengandalkan uptime check dasar atau pemantauan penggunaan CPU/RAM server secara parsial sudah tidak lagi memadai. Bottleneck performa sering kali tersembunyi di tempat-tempat yang tidak terduga: connection pool exhaustion pada database, blocking I/O pada asynchronous event loop Node.js, slow queries yang tidak terindeks, atau latensi jaringan mikro-detik antar kontainer Docker.

[!WARNING] Mengandalkan metrik sistem dasar (seperti top atau htop) pada arsitektur terdistribusi modern adalah resep pasti menuju kegagalan operasional. Anda tidak dapat mendiagnosis masalah latensi cross-service tanpa visibilitas penuh (full-stack observability).

Perbandingan Kondisi: Sebelum vs Sesudah Penerapan

Aspek Operasional Sebelum (Monitoring Tradisional) Sesudah (Prometheus, Grafana, & OpenTelemetry)
Deteksi Insiden Reaktif (Laporan pengguna / alert palsu) Proaktif (Deteksi anomali real-time & predictive alerting)
Root Cause Analysis Memakan waktu berjam-jam (menebak-nebak log) Hitungan menit berkat distributed tracing presisi
Korelasi Data Terisolasi (Metrik, Log, dan Trace terpisah) Terintegrasi penuh dalam satu panel visual Grafana
Kapasitas Skala Rentan timeout dan metric cardinality explosion Dioptimalkan dengan service discovery otomatis dan sampling cerdas

2. Konsep Inti & Deep Dive Arsitektur

Untuk mencapai observabilitas skala penuh, kita harus memahami tiga pilar utama (Three Pillars of Observability): Metrics (angka agregat yang menunjukkan kesehatan sistem), Logs (rekaman diskrit dari peristiwa yang terjadi), dan Traces (perjalanan satu request saat melintasi berbagai layanan).

Arsitektur yang akan kita bedah menggabungkan OpenTelemetry (OTel) sebagai standar tunggal untuk instrumentasi, Prometheus sebagai mesin pengumpul (scraper) dan basis data time-series, serta Grafana sebagai lapisan visualisasi dan analitik.

Alur Data dan Eksekusi (Data Flow Architecture)

+------------------+
|  Client Browser  |
+--------+---------+
         |
         v
+------------------+
|  Cloudflare CDN  |
+--------+---------+
         |
         v
+------------------+
|  Nginx / Caddy   |
+--------+---------+
         |
         +---------------------------------------+
         |                                       |
         v                                       v
+------------------+                   +------------------+
| Backend (Go/PHP) | --(OTel SDK)-->   | OTel Collector   |
+--------+---------+                   +--------+---------+
         |                                       |
         v                                       v
+------------------+                   +------------------+
| MySQL / Redis    |                   | Prometheus / S3  |
+------------------+                   +------------------+
                                                 ^
                                                 |
                                       +---------+--------+
                                       |  Grafana UI      |
                                       +------------------+

Alur kerja sistem berjalan sebagai berikut:

  1. Injeksi Konteks: Saat request HTTP masuk melalui Edge/Cloudflare, header pelacakan seperti traceparent disuntikkan atau diteruskan ke Web Server (Nginx).
  2. Instrumentasi Aplikasi: Aplikasi backend (baik yang ditulis dalam Go, PHP, maupun Node.js) yang telah diinstrumentasi menggunakan OpenTelemetry SDK menangkap konteks tersebut, mencatat span waktu eksekusi (spans), dan mengekspor metrik kinerja ke Prometheus serta traces ke backend OTLP yang kompatibel.
  3. Scraping Metrik: Prometheus secara berkala (pull-based) melakukan scrape pada endpoint /metrics yang diekspos oleh aplikasi dan layanan infrastruktur (seperti node-exporter).
  4. Visualisasi: Grafana mengambil data dari Prometheus untuk metrik dan dari sumber penyimpanan trace untuk menampilkan dasbor terpadu.

3. Perbandingan Komparatif / Analisis Pendekatan

Dalam membangun sistem observabilitas, arsitek sering kali dihadapkan pada pilihan alat pengumpul dan protokol. Berikut adalah analisis mendalam antara pendekatan OpenTelemetry vs agen pemantauan vendor tertutup (vendor lock-in agents), serta perbandingan metode Push vs Pull.

Tabel Komparasi Pendekatan Pengumpulan Data

Parameter OpenTelemetry + Prometheus + Grafana Agen Vendor Tertutup (Datadog/New Relic)
Kepemilikan Data 100% On-Premise / Self-Hosted Cloud Pihak Ketiga (Risiko GDPR/Compliance)
Biaya Operasional Biaya infrastruktur penyimpanan & komputasi Berdasarkan volume gigabyte / host-based (mahal pada skala besar)
Fleksibilitas Standar industri terbuka, tanpa lock-in Proprietary SDK, migrasi sulit
Konsumsi Sumber Daya Memerlukan tuning memori & disk Prometheus Agen ringan, namun minim kustomisasi deep level
Kurva Pembelajaran Tinggi (Membutuhkan keahlian SRE mendalam) Rendah (Plug and play)

[!TIP] Untuk perusahaan enterprise dengan regulasi data yang ketat (seperti perbankan atau kesehatan), tumpukan berbasis OpenTelemetry dan Prometheus adalah pilihan mutlak demi menjaga kedaulatan data.

4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum melangkah ke implementasi teknis, pastikan infrastruktur Anda memenuhi spesifikasi minimum berikut agar sistem observabilitas tidak justru membebani server produksi:

  • Sistem Operasi: Ubuntu 22.04 LTS / Debian 12 (Kernel Linux >= 5.15)
  • Spesifikasi Hardware (Minimum untuk Server Monitoring): 4 vCPU, 8 GB RAM, 100 GB NVMe SSD (untuk penyimpanan time-series Prometheus).
  • Dependensi Utama: Docker Engine (v24+), Docker Compose (v2.20+), Git, dan cURL.
  • Hak Akses: Akses root atau sudo pada server target.

Verifikasi awal kesiapan sistem dengan menjalankan perintah berikut di terminal:

sysctl vm.max_map_count
docker version
docker compose version

Pastikan vm.max_map_count bernilai minimal 262144 agar penyimpanan data time-series dapat berjalan stabil tanpa out-of-memory error.

5. Panduan Implementasi Langkah demi Langkah

Kita akan membangun sebuah tumpukan observabilitas lengkap menggunakan Docker Compose yang mencakup: Prometheus, Grafana, OpenTelemetry Collector, dan Node Exporter untuk metrik sistem.

Langkah 1: Struktur Direktori Proyek

Buat struktur direktori kerja di server Anda:

mkdir -p /opt/observability/{prometheus,grafana/provisioning,otel-collector}
cd /opt/observability

Langkah 2: Konfigurasi Prometheus (prometheus/prometheus.yml)

Buat file konfigurasi Prometheus untuk mengatur interval scraping dan target penarikan metrik.

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets: []

rule_files:
  - "alert.rules.yml"

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

  - job_name: 'node-exporter'
    static_configs:
      - targets: ['node-exporter:9100']

  - job_name: 'otel-collector'
    static_configs:
      - targets: ['otel-collector:8889']

Langkah 3: Konfigurasi Aturan Peringatan (prometheus/alert.rules.yml)

groups:
  - name: HostHighCpuLoad
    rules:
      - alert: HighCpuUsage
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "High CPU usage detected on {{ $labels.instance }}"
          description: "CPU usage has been above 85% for more than 5 minutes."

Langkah 4: Konfigurasi OpenTelemetry Collector (otel-collector/otel-collector-config.yml)

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:
    timeout: 1s
    send_batch_size: 1024

exporters:
  prometheus:
    endpoint: "0.0.0.0:8889"
    namespace: "otel"

  logging:
    loglevel: debug

service:
  pipelines:
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [prometheus, logging]
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [logging]

Langkah 5: Berkas Orkestrasi Docker Compose (docker-compose.yml)

version: '3.8'

networks:
  observability_net:
    driver: bridge

services:
  prometheus:
    image: prom/prometheus:v2.45.0
    container_name: prometheus
    restart: unless-stopped
    volumes:
      - ./prometheus:/etc/prometheus
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
    ports:
      - "9090:9090"
    networks:
      - observability_net

  grafana:
    image: grafana/grafana:10.1.0
    container_name: grafana
    restart: unless-stopped
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=secure_grafana_password_2024
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning
    ports:
      - "3000:3000"
    networks:
      - observability_net

  node-exporter:
    image: prom/node-exporter:v1.6.0
    container_name: node-exporter
    restart: unless-stopped
    ports:
      - "9100:9100"
    networks:
      - observability_net

  otel-collector:
    image: otel/opentelemetry-collector-contrib:v0.84.0
    container_name: otel-collector
    restart: unless-stopped
    volumes:
      - ./otel-collector:/etc/otel-collector
    command: ["--config=/etc/otel-collector/otel-collector-config.yml"]
    ports:
      - "4317:4317"
      - "4318:4318"
      - "8889:8889"
    networks:
      - observability_net

volumes:
  prometheus_data:
  grafana_data:

Langkah 6: Menjalankan Layanan

Jalankan perintah berikut untuk menginisialisasi seluruh kontainer di latar belakang:

docker compose up -d

Verifikasi bahwa semua kontainer berjalan normal:

docker compose ps

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah beberapa parameter krusial dari konfigurasi di atas untuk memastikan Anda memahami implikasi produksinya:

  • scrape_interval: 15s pada Prometheus: Menentukan seberapa sering Prometheus menarik data dari target. Interval 15 detik adalah standar industri yang memberikan keseimbangan optimal antara ketajaman data dan beban I/O penyimpanan time-series.
  • batch processor pada OpenTelemetry Collector: Pengaturan send_batch_size: 1024 dan timeout: 1s sangat penting untuk mengurangi overhead jaringan (network round-trips). Alih-alih mengirim setiap span secara individual, OTel Collector mengumpulkan data hingga 1024 item atau dalam waktu 1 detik sebelum dikirim secara kolektif.
  • vm.max_map_count: Seperti disinggung sebelumnya, basis data penyimpanan seperti Prometheus menggunakan memori yang dipetakan ke file (memory-mapped files). Jika sistem operasi membatasi jumlah ini, Prometheus akan mengalami panic crash saat jumlah metrik mencapai jutaan (high cardinality).

7. Skenario Produksi & Studi Kasus Dunia Nyata

Studi Kasus: Menangani Lonjakan Traffic E-Commerce pada Event Flash Sale

Sebuah platform e-commerce berbasis Go dan MySQL mengalami lonjakan traffic hingga 50.000 request per second (RPS) saat acara flash sale. Pada kondisi beban puncak ini, sistem mengalami database connection pool exhaustion, yang menyebabkan latensi API melonjak drastis dari 45ms menjadi 4.200ms.

Langkah Investigasi Menggunakan Stack Observabilitas:

  1. Grafana Dashboard: SRE melihat lonjakan metrik http_server_duration_milliseconds_bucket pada persentil ke-99 (p99).
  2. OpenTelemetry Traces: Dengan menelusuri ID trace dari request yang lambat, ditemukan bahwa hambatan utama bukan pada logika aplikasi Go, melainkan pada antrean koneksi MySQL (database/sql: conn pool limit exceeded).
  3. Resolusi Cepat: Berdasarkan data metrik real-time dari Prometheus, SRE segera menaikkan batas maksimum maxOpenConns pada konfigurasi pool koneksi database dan melakukan scale-out kontainer backend secara horizontal.

8. Common Pitfalls, Anti-Patterns & Solusi

Berikut adalah kesalahan fatal yang sering dilakukan oleh pengembang dan administrator saat mengimplementasikan sistem observabilitas:

  • Anti-Pattern 1: High Cardinality Metric Labels
    • Masalah: Menambahkan ID pengguna (user_id) atau URL parameter dinamis sebagai label metrik di Prometheus. Ini menyebabkan ledakan kardinalitas (cardinality explosion), menghabiskan RAM server Prometheus hingga habis.
    • Solusi: Gunakan labels hanya untuk dimensi terbatas (seperti status_code, method, service_name). Untuk data unik per pengguna, gunakan Distributed Tracing (OpenTelemetry), bukan metrik Prometheus.
  • Anti-Pattern 2: Tidak Mengatur Retensi Data (storage.tsdb.retention.time)
    • Masalah: Membiarkan Prometheus menyimpan data tanpa batas waktu, mengakibatkan penuhnya partisi disk utama.
    • Solusi: Selalu tetapkan bendera --storage.tsdb.retention.time=15d atau sesuai kapasitas penyimpanan SSD Anda.
  • Anti-Pattern 3: Mengabaikan Keamanan Endpoint Metrik
    • Masalah: Membuka port metrik /metrics atau 9090 secara publik ke internet tanpa autentikasi.
    • Solusi: Gunakan Nginx reverse proxy dengan autentikasi dasar (Basic Auth) atau batasi akses hanya melalui jaringan internal VPN/VPC.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk menguji ketahanan sistem observabilitas yang baru dibangun, lakukan pengujian beban menggunakan alat benchmark modern seperti k6.

Buat skrip pengujian beban sederhana (load-test.js):

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

export const options = {
  stages: [
    { duration: '30s', target: 50 },
    { duration: '1m', target: 200 },
    { duration: '30s', target: 0 },
  ],
};

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

Jalankan pengujian untuk memantau bagaimana OpenTelemetry Collector dan Prometheus merespons lonjakan metrik:

k6 run load-test.js

Parameter Tuning Lanjutan

  1. Prometheus Tuning: Sesuaikan ukuran head block memori dengan bendera --storage.tsdb.min-block-duration=2h dan --storage.tsdb.max-block-duration=2h untuk mengoptimalkan kinerja query jangka panjang.
  2. OS Kernel Tuning: Tambahkan konfigurasi berikut ke /etc/sysctl.conf untuk menangani buffer jaringan berkecepatan tinggi:
    net.core.somaxconn = 65535
    net.ipv4.tcp_max_syn_backlog = 65535
    

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meluncurkan tumpukan observabilitas ini ke lingkungan produksi tingkat enterprise, pastikan Anda telah memverifikasi seluruh poin dalam daftar periksa berikut:

  • Keamanan Jaringan: Port Prometheus (9090) dan Grafana (3000) dilindungi oleh Firewall (UFW/Cloudflare Firewall) atau hanya dapat diakses melalui VPN internal.
  • Enkripsi SSL/TLS: Akses ke antarmuka Grafana telah diamankan menggunakan sertifikat SSL/TLS valid (Let's Encrypt).
  • Manajemen Kredensial: Mengganti kata sandi admin default Grafana dengan kombinasi string acak yang kuat.
  • Kebijakan Retensi: Kapasitas disk dan masa retensi data Prometheus telah dikonfigurasi dengan benar.
  • Uji Cipta Peringatan (Alerting): Notifikasi alert telah diuji dan terhubung dengan saluran komunikasi tim (Slack, Telegram, atau PagerDuty).
  • Kardinalitas Terkontrol: Tidak ada label metrik dengan kardinalitas tinggi di dalam skrip aplikasi.

Dengan menerapkan arsitektur observabilitas skala penuh menggunakan Prometheus, Grafana, dan OpenTelemetry ini, organisasi Anda tidak lagi berjalan dalam kegelapan. Anda memiliki visibilitas total, kemampuan deteksi dini yang presisi, serta fondasi teknik yang kokoh untuk menjaga keandalan infrastruktur web modern dalam skala apa pun.

🏷️ Tags: #Devops #Sre #Opentelemetry #Prometheus #Grafana