L
Observability & Monitoring • Literally Web ID

Implementasi Observability Terpusat dengan Grafana, Prometheus, dan OpenTelemetry

⏱️ 18 menit baca • 📅 13 Oct 2026 • 👁️ 1 views
Implementasi Observability Terpusat dengan Grafana, Prometheus, dan OpenTelemetry

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap infrastruktur web modern saat ini, kompleksitas arsitektur telah melampaui kemampuan pemantauan tradisional. Sistem berbasis monolitik yang dulunya mudah di-debug kini telah bermigrasi menjadi ekosistem microservices terdistribusi, berjalan di atas orkestrasi kontainer seperti Kubernetes, didukung oleh arsitektur edge caching melalui Cloudflare, serta mengandalkan penyimpanan data terdistribusi seperti MySQL/MariaDB cluster, Redis, dan Object Storage S3. Ketika sebuah permintaan HTTP masuk dari pengguna, permintaan tersebut melewati puluhan lapisan: DNS, WAF, CDN, Reverse Proxy (Nginx/Caddy), Aplikasi Backend (Go, Node.js, PHP-FPM), hingga database, queue, dan mail server (Postfix).

Masalah krusial muncul ketika terjadi degradasi performa atau outage. Pendekatan monitoring lama yang hanya mengandalkan pengecekan metrik dasar (CPU usage, RAM, disk space) atau melihat log mentah secara terisolasi sudah tidak memadai. Tim Site Reliability Engineer (SRE) sering kali mengalami Mean Time to Detection (MTTD) dan Mean Time to Resolution (MTTR) yang tinggi karena:

  1. Fragmentasi Data: Metrik berada di satu sistem, log berada di sistem lain, dan tracing tidak ada.
  2. Blind Spot Infrastruktur Web: Kurangnya visibilitas terhadap metrik spesifik web server (seperti jumlah koneksi aktif Nginx, antrean PHP-FPM, cache hit ratio Redis, hingga performa WebSocket real-time).
  3. Alert Fatigue: Terlalu banyak false positive dari alert statis yang tidak kontekstual.

Kondisi Sebelum vs Sesudah Penerapan Observability Terpusat

Aspek Sebelum (Monitoring Tradisional / Terisolasi) Sesudah (Grafana, Prometheus, OpenTelemetry Terpadu)
Deteksi Masalah Reaktif (menunggu komplain pengguna atau error 500 melonjak) Proaktif (deteksi anomali latensi p99 dan error rate secara real-time)
Root Cause Analysis Membutuhkan waktu berjam-jam membuka file log satu per satu di server berbeda Hitungan menit melacak request spesifik dari edge Cloudflare hingga query SQL lewat Distributed Tracing
Korelasi Data Terputus antara metrik infrastruktur dan log aplikasi Terintegrasi penuh (klik pada spike metrik langsung melihat log dan trace terkait)
Skalabilitas Sistem monitoring menjadi lambat saat beban trafik tinggi Pengumpulan data terdistribusi yang efisien dengan OpenTelemetry Collector

2. Konsep Inti & Deep Dive Arsitektur

Observability modern dibangun di atas tiga pilar utama: Metrics (angka agregat yang menunjukkan kesehatan sistem), Logs (rekaman kejadian diskrit dengan stempel waktu), dan Traces (perjalanan satu request melintasi batas-batas layanan).

Arsitektur yang akan kita bangun menggunakan OpenTelemetry (OTel) Collector sebagai agen penerima data terpusat, Prometheus sebagai time-series database untuk scraping metrik, dan Grafana sebagai lapisan visualisasi serta korelasi data.

Alur Eksekusi & Data Flow

+-----------------------------------------------------------------------------------------+
|                                     Aplikasi & Edge                                     | 
|  [Nginx / Caddy]    [Backend (Go/PHP/Node)]    [Database & Redis]    [Cloudflare / WAF] |
+---------+--------------------------+----------------------+--------------------+--------+
          |                          |                      |                    |
          | (Prometheus Exporter)    | (OTLP gRPC/HTTP)     | (Exporters)        | (Logpush/Webhook)
          v                          v                      v                    v
+-----------------------------------------------------------------------------------------+
|                                OpenTelemetry Collector                                  | 
|         (Receivers) ----> [Processors: Batch, Memory Limiter] ----> (Exporters)         | 
+---------+-----------------------------------------------------------------+-------------+
          |                                                                 |
          | (Remote Write / Metrics)                                        | (OTLP / Traces & Logs)
          v                                                                 v
+---------------------------------+                             +-------------------------+
|           Prometheus            |                             |     Loki / Tempo / DB   |
+-----------------+---------------+                             +------------+------------+
                  |                                                          |
                  +-----------------------------------+----------------------+
                                                      |
                                                      v
                                            +---------+---------+
                                            |      Grafana      |
                                            +-------------------+

Dalam alur di atas, OpenTelemetry Collector bertindak sebagai pengumpul universal. Ia menerima data dari berbagai sumber, melakukan transformasi, penyaringan (filtering), dan batching untuk mengurangi beban jaringan, lalu meneruskannya ke backend penyimpanan yang sesuai (Prometheus untuk metrik, Tempo untuk traces, dan Loki untuk logs).


3. Perbandingan Komparatif / Analisis Pendekatan

Sebelum menentukan stack, mari kita analisis perbandingan pendekatan pengumpulan data:

Pendekatan / Tool Kelebihan Kekurangan Dampak Sumber Daya (CPU/RAM/Latency)
Prometheus Agent Langsung Setup awal cepat, ekosistem luas Tidak mendukung traces dengan baik, pull-based terkadang sulit di balik NAT/Firewall Konsumsi RAM moderat, overhead jaringan rendah
OpenTelemetry Collector Universal (mendukung metrics, logs, traces), arsitektur pipeline fleksibel, push/pull Konfigurasi awal kompleks, kurva belajar curam Konsumsi CPU/RAM dapat meningkat jika konfigurasi batching dan memory limiter tidak diatur
Fluentd / Logstash (Alternatif Log) Ekosistem plugin besar untuk log Boros memori (berbasis JVM untuk Logstash), kurang terintegrasi dengan metrik Konsumsi RAM tinggi

Trade-off Keputusan: Menggunakan OpenTelemetry Collector di setiap node atau sebagai gateway terpusat memberikan fleksibilitas jangka panjang terbaik, meskipun membutuhkan pemahaman mendalam tentang manajemen memori OTel Collector.


4. Prasyarat Sistem & Persiapan Lingkungan

Untuk mengimplementasikan panduan ini, siapkan environment produksi dengan spesifikasi minimal:

  • OS: Ubuntu 22.04 LTS / Debian 12 / AlmaLinux 9
  • CPU/RAM: Minimal 2 vCPU, 4 GB RAM (untuk node monitoring)
  • Akses: Hak akses root atau sudo
  • Port yang harus dibuka:
    • 9090 (Prometheus)
    • 3000 (Grafana)
    • 4317 (OTLP gRPC)
    • 4318 (OTLP HTTP)
    • 9100 (Node Exporter)
    • 9113 (Nginx Prometheus Exporter)

Verifikasi instalasi dasar menggunakan perintah terminal:

sudo apt update && sudo apt install -y curl wget git ufw
sudo ufw allow 22/tcp
sudo ufw allow 3000/tcp
sudo ufw allow 9090/tcp
sudo ufw allow 4317/tcp
sudo ufw allow 4318/tcp
sudo ufw enable

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Konfigurasi OpenTelemetry Collector

Buat file konfigurasi /etc/otelcol/config.yaml. File ini mengatur receiver untuk menerima data OTLP, processor untuk manajemen memori, dan exporter untuk meneruskannya ke Prometheus.

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

processors:
  memory_limiter:
    check_interval: 1s
    limit_percentage: 80
    spike_limit_percentage: 20
  batch:
    send_batch_size: 1024
    timeout: 1s

exporters:
  prometheus:
    endpoint: 0.0.0.0:8889
    namespace: "otel"
  logging:
    verbosity: detailed

service:
  pipelines:
    metrics:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [prometheus, logging]
    traces:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [logging]
  telemetry:
    logs:
      level: "info"

Langkah 2: Konfigurasi Prometheus Scrape Targets

Buat atau perbarui file /etc/prometheus/prometheus.yml untuk melakukan scraping terhadap metrik infrastruktur, Nginx, PHP-FPM, dan OpenTelemetry Collector.

global:
  scrape_interval: 15s
  evaluation_interval: 15s

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

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: 'nginx'
    static_configs:
      - targets: ['localhost:9113']

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

  - job_name: 'php-fpm'
    static_configs:
      - targets: ['localhost:9253']

Langkah 3: Definisi Aturan Alerting Prometheus

Buat file /etc/prometheus/alert_rules.yml untuk mendeteksi lonjakan error HTTP 5xx dan tingginya penggunaan CPU.

groups:
  - name: WebInfrastructureAlerts
    rules:
      - alert: HighHttpErrorRate
        expr: sum(rate(nginx_http_requests_total{status=~"5.*"}[5m])) / sum(rate(nginx_http_requests_total[5m])) * 100 > 5
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "High HTTP 5xx Error Rate detected"
          description: "HTTP 5xx error rate is above 5% for the last 2 minutes (current value: {{ $value }}%)."

      - alert: NodeHighCPUUsage
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage detected on {{ $labels.instance }}"
          description: "CPU usage is above 85% for more than 5 minutes."

Langkah 4: Automasi Systemd untuk OpenTelemetry Collector

Pastikan OTel Collector berjalan sebagai service systemd. Buat file /etc/systemd/system/otelcol.service:

[Unit]
Description=OpenTelemetry Collector
After=network.target

[Service]
User=root
ExecStart=/usr/local/bin/otelcol --config=/etc/otelcol/config.yaml
Restart=always
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

Aktifkan dan jalankan service:

sudo systemctl daemon-reload
sudo systemctl enable otelcol
sudo systemctl start otelcol

6. Bedah Kode & Penjelasan Detail Baris Kunci

  • memory_limiter pada OTel Collector: Baris limit_percentage: 80 sangat krusial. Konfigurasi ini mencegah OTel Collector mengalami Out-Of-Memory (OOM) Killer oleh kernel Linux saat menerima lonjakan trafik telemetry yang masif. Jika penggunaan memori mencapai 80%, collector akan secara otomatis menolak data baru atau melakukan drop secara terstruktur.
  • rate(nginx_http_requests_total{status=~"5.*"}[5m]): Fungsi PromQL rate() menghitung tingkat kenaikan per detik dari penghitung kumulatif (counter) selama jendela waktu 5 menit. Penggunaan regex {status=~"5.*"} memfilter semua respon server yang menghasilkan status error 5xx, yang kemudian dibandingkan dengan total request untuk mendapatkan persentase error yang presisi.

[!WARNING] Jangan pernah menggunakan fungsi increase() di dalam kalkulasi alerting persentase instan karena dapat menghasilkan pembagian dengan nol atau hasil yang tidak konsisten pada interval scraping yang pendek.


7. Skenario Produksi & Studi Kasus Dunia Nyata

Pada lingkungan produksi dengan beban tinggi (misalnya flash sale e-commerce menangani 50.000 req/sec di balik Cloudflare), arsitektur di atas menghadapi tantangan high cardinality.

Studi Kasus Penanganan High Cardinality: Jika aplikasi web Anda mencatat metrik dengan label dinamis seperti user_id atau request_uri yang berisi parameter unik (misal /product/12345, /product/12346), Prometheus akan kehabisan memori karena menciptakan jutaan time series baru.

Solusi: Gunakan OTel Collector Processor untuk melakukan attributes sanitization atau metric filtering sebelum dikirim ke Prometheus:

processors:
  transform:
    metric_statements:
      - context: datapoint
        statements:
          - set(attributes["uri_path"], "/product/*") where IsMatch(attributes["uri_path"], "^/product/\\d+$")

Pendekatan ini menormalisasi path URL sehingga cardinality tetap terkendali dan performa Prometheus terjaga.


8. Common Pitfalls, Anti-Patterns & Solusi

  1. Anti-Pattern: Scraping Terlalu Sering (scrape_interval < 5s)
    • Dampak: Beban I/O disk dan CPU pada target server meningkat drastis tanpa memberikan nilai tambah analitik yang signifikan.
    • Solusi: Gunakan scrape_interval: 15s atau 30s untuk metrik infrastruktur standar, dan andalkan tracing untuk analisis kejadian mikro.
  2. Pitfalls: Mengabaikan Keamanan Endpoint OTLP
    • Dampak: Siapa saja yang mengetahui IP server dapat mengirimkan data sampah (metric spoofing) ke collector.
    • Solusi: Selalu aktifkan autentikasi mTLS atau token header menggunakan OTel Collector auth extension di lingkungan produksi publik.

[!TIP] Selalu uji konfigurasi Prometheus sebelum melakukan reload dengan menjalankan perintah validasi bawaan: promtool check config /etc/prometheus/prometheus.yml.


9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk menguji ketahanan sistem observability yang telah dibangun, lakukan load testing menggunakan tool k6 atau wrk pada aplikasi web Anda, sambil memantau penggunaan sumber daya collector:

# Contoh pengujian beban menggunakan wrk
wrk -t12 -c400 -d30s https://your-domain.com/

Metrik Kinerja Utama yang Harus Dipantau pada Collector:

  • otelcol_processor_dropped_records: Pastikan nilainya nol. Jika bernilai positif, naikkan batas memori atau tingkatkan kapasitas instance OTel Collector.
  • prometheus_tsdb_head_samples_appended: Menunjukkan jumlah samples yang masuk ke penyimpanan Prometheus per detik.

Tuning Kernel Linux (/etc/sysctl.conf): Untuk server dengan throughput tinggi yang menjalankan Prometheus/OTel Collector, sesuaikan parameter jaringan dan memori:

fs.file-max = 2097152
net.core.somaxconn = 65535
vm.max_map_count = 262144

Terapkan dengan perintah sudo sysctl -p.


10. Checklist Penerapan Produksi & Kesimpulan

Sebelum merilis sistem observability ini ke lingkungan produksi penuh, pastikan checklist berikut terpenuhi:

  • Konfigurasi memory_limiter aktif pada OpenTelemetry Collector.
  • Aturan alerting Prometheus telah diuji dengan memicu simulated failure.
  • Panel Grafana menampilkan metrik dari seluruh lapisan (Nginx, PHP-FPM, Node Exporter, OTel).
  • Rotasi log dan retensi data Prometheus/Loki telah dikonfigurasi (misalnya retensi 15 hari).
  • Otentikasi dan enkripsi TLS diaktifkan pada jalur komunikasi OTLP dan Grafana.

Dengan mengintegrasikan Grafana, Prometheus, dan OpenTelemetry secara tepat, organisasi Anda tidak hanya memiliki alat pantau, tetapi juga infrastruktur observability kelas enterprise yang siap mendeteksi, menganalisis, dan menyelesaikan anomali sistem secara proaktif sebelum berdampak buruk pada pengalaman pengguna akhir.

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