L
Observability & Monitoring • Literally Web ID

Observabilitas Sistem Terdistribusi: Prometheus, Grafana, dan OpenTelemetry di Lingkungan Kubernetes

⏱️ 15 menit baca • 📅 14 Oct 2026 • 👁️ 1 views
Observabilitas Sistem Terdistribusi: Prometheus, Grafana, dan OpenTelemetry di Lingkungan Kubernetes

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur web modern yang bertumpu pada ekosistem terdistribusi dan containerized—khususnya Kubernetes—kompleksitas operasional meningkat secara eksponensial. Monolit tradisional yang hanya mengandalkan satu server web Nginx dan satu instans database MySQL telah berevolusi menjadi puluhan bahkan ratusan microservices yang saling berkomunikasi melalui jaringan internal menggunakan gRPC atau REST API.

Namun, pergeseran paradigma ini membawa tantangan berat. Ketika terjadi kegagalan sistem, seperti lonjakan latensi latensi pada endpoint /checkout e-commerce, melacak akar masalah (root cause analysis) menjadi bagaikan mencari jarum di tumpukan jerami. Apakah bottleneck terjadi karena antrian RabbitMQ yang membludak? Apakah PHP-FPM kehabisan worker process? Apakah Redis cache mengalami eviction akibat memori penuh? Atau apakah ada masalah resolusi DNS internal pada cluster Kubernetes Anda?

Sebelum adopsi stack observabilitas modern berbasis Prometheus, Grafana, dan OpenTelemetry, insinyur infrastruktur terjebak dalam kondisi reaktif. Pemantauan hanya mengandalkan uptime checks sederhana dan pembacaan file log mentah (/var/log/nginx/error.log atau /var/log/php8.2-fpm.log). Saat trafik melonjak drastis, tim baru menyadari sistem down setelah pengguna melapor via media sosial. Tidak ada korelasi antara metrik infrastruktur (penggunaan CPU/RAM node), metrik aplikasi (waktu eksekusi query SQL), dan distributed tracing (jalur lintas layanan dari frontend Next.js hingga backend Go dan penyimpanan MinIO S3).

Sesudah penerapan observabilitas komprehensif, paradigma berubah total menjadi proaktif. Dengan mengintegrasikan metrik pull-based Prometheus, visualisasi dasbor real-time Grafana, dan instrumentasi distributed tracing OpenTelemetry, kita mampu mendeteksi anomali sebelum berdampak pada pengalaman pengguna akhir. Metrik performa dari web server Caddy, status kesehatan pool koneksi database MariaDB, latensi antrian Redis, hingga performa SSL/TLS handshake di Cloudflare Edge dapat ditarik, dikorelasikan, dan divisualisasikan dalam satu panel kendali terpusat.

2. Konsep Inti & Deep Dive Arsitektur

Arsitektur observabilitas enterprise menuntut pemahaman mendalam tentang tiga pilar utama: Metrics, Logs, dan Traces. Di lingkungan Kubernetes, ketiga pilar ini dikumpulkan melalui pendekatan yang terstandarisasi.

Alur Data & Eksekusi (Data Flow)

[Client Browser / App] 
        │
        ▼
[Cloudflare CDN / WAF]
        │
        ▼
[Kubernetes Ingress (Nginx/Traefik)]
        │
        ├──────────────────────────┐
        ▼                          ▼
[Frontend App (Node.js/JS)]   [Backend App (Go/PHP-FPM)]
  (OpenTelemetry SDK)         (OpenTelemetry SDK)
        │                          │
        └───────────┬──────────────┘
                    ▼
         [OTel Collector DaemonSet]
                    │
         ┌──────────┴──────────┐
         ▼                     ▼
   (Push Traces)         (Scrape Metrics)
         ▼                     ▼
[Jaeger / Tempo]      [Prometheus Server]
         │                     │
         └──────────┬──────────┘
                    ▼
             [Grafana UI]
  1. Metrics (Prometheus): Prometheus menggunakan model Pull. Prometheus Server secara periodik melakukan HTTP GET request (/metrics) ke scrape targets (misalnya pod aplikasi, node exporter, Kubelet, atau Nginx Prometheus Exporter). Data yang ditarik bersifat time-series numerik.
  2. Tracing (OpenTelemetry & Tempo): Aplikasi diinstrumen menggunakan OpenTelemetry SDK. Saat sebuah request masuk dari Cloudflare Edge melewati Nginx Ingress, sebuah trace ID unik dihasilkan. Setiap lompatan (hop) dari frontend Next.js ke backend Go, lalu ke database MariaDB atau Redis, akan merekam span yang dikirim secara asinkron (push) ke OpenTelemetry Collector, untuk kemudian diteruskan ke penyimpanan backend seperti Grafana Tempo.
  3. Logs: Dikumpulkan melalui Fluentbit atau Promtail yang membaca direktori /var/log/pods di setiap node Kubernetes, lalu dikirim ke sistem penyimpanan log terpusat seperti Loki, yang kemudian diintegrasikan langsung ke Grafana.

3. Perbandingan Komparatif / Analisis Pendekatan

Dalam merancang sistem pemantauan, arsitek sering dihadapkan pada pilihan pendekatan pengumpulan metrik dan arsitektur agen. Berikut adalah analisis perbandingan mendalam:

Parameter / Fitur Model Pull (Prometheus) Model Push (StatsD / Datadog) OpenTelemetry Collector Log Sentralisasi Tradisional (ELK) Grafana Loki + Promtail
Konsumsi CPU/RAM Rendah di sisi aplikasi (Server yang bekerja) Sedang di sisi aplikasi Sedang hingga Tinggi (tergantung beban batching) Sangat Tinggi (Elasticsearch berat di RAM) Sangat Efisien (Indexing berbasis label)
Network Overhead Terkendali (Scrape interval diatur terpusat) Tinggi saat terjadi lonjakan trafik (traffic burst) Dapat dikonfigurasi (batching & compression) Tinggi Sangat Rendah
Discovery Native Service Discovery Kubernetes Konfigurasi manual / SDK Otomatis via OTel Operator Konfigurasi Filebeat / Logstash Label-based Kubernetes Discovery
Kompleksitas Setup Sedang Rendah Tinggi (Kurva belajar curam) Sangat Tinggi Rendah hingga Sedang
Trade-off Utama Target harus memiliki web server aktif untuk endpoint /metrics Aplikasi bisa membanjiri jaringan jika agen push gagal Membutuhkan manajemen memori yang ketat pada Collector Konsumsi memori disk dan RAM Elasticsearch luar biasa besar Tidak melakukan parsing full-text secara mendalam secara default

[!IMPORTANT] Pemilihan model Pull (Prometheus) untuk metrik dan Push (OTel Collector) untuk traces/logs adalah standar industri emas di Kubernetes karena memberikan stabilitas beban kerja pada aplikasi inti.

4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum melakukan deploy resource Kubernetes, pastikan environment Anda memenuhi spesifikasi berikut:

  • Cluster Kubernetes: Versi 1.25+ dengan akses cluster-admin.
  • Tooling CLI: kubectl, helm (v3.10+), dan jq terinstal di mesin lokal.
  • Storage Class: Persistent Volume (PV) yang mendukung Dynamic Provisioning (misalnya AWS EBS, GCP Persistent Disk, atau Longhorn/Ceph on-premise) untuk menyimpan data historis Prometheus dan Grafana.
  • Resource Node Minimum: Setidaknya 3 Node Worker dengan spesifikasi minimum masing-masing 4 vCPU dan 8 GB RAM.

Verifikasi akses cluster dengan perintah:

kubectl cluster-info
kubectl get nodes -o wide

Pastikan namespace khusus pemantauan telah dibuat:

kubectl create namespace monitoring

5. Panduan Implementasi Langkah demi Langkah

Kita akan menginstal Prometheus, Grafana, dan OpenTelemetry Collector menggunakan Helm Chart resmi.

Langkah 1: Tambahkan Helm Repositories

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm repo update

Langkah 2: Konfigurasi Prometheus & Alertmanager (values-prometheus.yaml)

Buat file konfigurasi values-prometheus.yaml untuk mengatur retensi data, penyimpanan persisten, dan scrape interval:

prometheus:
  prometheusSpec:
    retention: 15d
    retentionSize: 50Gi
    scrapeInterval: 15s
    evaluationInterval: 15s
    storageSpec:
      volumeClaimTemplate:
        spec:
          storageClassName: standard
          resources:
            requests:
              storage: 60Gi

nodeExporter:
  enabled: true

kubeStateMetrics:
  enabled: true

Langkah 3: Deploy Prometheus Stack

helm install prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --values values-prometheus.yaml

Langkah 4: Konfigurasi OpenTelemetry Collector (values-otel.yaml)

Buat file values-otel.yaml untuk mendeploy OpenTelemetry Collector sebagai DaemonSet agar dapat menangkap metrik dan traces dari setiap node:

mode: daemonset
config:
  receivers:
    otlp:
      protocols:
        grpc:
          endpoint: 0.0.0.0:4317
        http:
          endpoint: 0.0.0.0:4318
    prometheus:
      config:
        scrape_configs:
          - job_name: 'otel-collector'
            scrape_interval: 10s
            static_configs:
              - targets: ['0.0.0.0:8888']

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

  exporters:
    prometheus:
      endpoint: "0.0.0.0:8889"
    otlp/tempo:
      endpoint: "tempo-distributor.monitoring.svc.cluster.local:4317"
      tls:
        insecure: true

  service:
    pipelines:
      traces:
        receivers: [otlp]
        processors: [memory_limiter, batch]
        exporters: [otlp/tempo]
      metrics:
        receivers: [otlp, prometheus]
        processors: [memory_limiter, batch]
        exporters: [prometheus]

Deploy OpenTelemetry Collector:

helm install otel-collector open-telemetry/opentelemetry-collector \
  --namespace monitoring \
  --values values-otel.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah beberapa konfigurasi penting dari skrip di atas:

  1. retention: 15d dan retentionSize: 50Gi: Parameter ini mengontrol batas waktu dan kapasitas penyimpanan disk untuk Prometheus TSDB (Time Series Database). Jika disk penuh sebelum 15 hari, data terlama akan otomatis dihapus. Menyesuaikan parameter ini krusial agar disk Node Kubernetes tidak mengalami disk exhaustion yang dapat mematikan seluruh aplikasi.
  2. memory_limiter pada OTel Collector: Baris limit_percentage: 80 memastikan bahwa jika konsumsi memori Collector mencapai 80% dari alokasi pod Kubernetes, sistem akan secara agresif membuang batch data lama (dropping spans/metrics) untuk mencegah Out Of Memory (OOM) Killed oleh kernel Linux.
  3. scrapeInterval: 15s: Frekuensi penarikan data metrik setiap 15 detik adalah titik kompromi optimal antara akurasi deteksi anomali real-time dan beban I/O jaringan serta penyimpanan CPU Prometheus Server.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Studi Kasus: Sebuah platform e-commerce berbasis arsitektur microservices (Frontend Next.js, API Gateway Nginx, Backend Golang, Database MariaDB, dan Cache Redis) mengalami lonjakan trafik sebesar 500% saat kampanye flash sale 11.11.

Identifikasi Masalah via Observabilitas:

  1. Grafana Dashboard (Prometheus Node & Application Metrics): Tim melihat lonjakan metrik http_request_duration_seconds_bucket pada endpoint /api/v1/cart/checkout. Latensi rata-rata melonjak dari 45ms menjadi 3.2 detik.
  2. OpenTelemetry Tracing (Grafana Tempo): Dengan menelusuri Trace ID dari request yang lambat, teridentifikasi bahwa bottleneck bukan pada aplikasi Golang, melainkan pada eksekusi query SQL di MariaDB: SELECT * FROM inventory WHERE product_id = ? FOR UPDATE; yang mengalami deadlock dan antrean koneksi (connection pool exhaustion).
  3. Redis & PHP-FPM / Go Metrics: Metrik Prometheus menunjukkan koneksi Redis mencapai batas maksimum maxclients, menyebabkan fallback langsung ke database utama.

Tindakan Perbaikan Cepat (Mitigasi):

  • Melakukan penyesuaian parameter max_connections pada MariaDB.
  • Mengaktifkan rate limiting berbasis Redis pada Nginx Ingress untuk membatasi bot traffic.
  • Mengoptimalkan indeks pada tabel inventory MariaDB.

8. Common Pitfalls, Anti-Patterns & Solusi

  1. High Cardinality Metrics (Anti-Pattern Paling Berbahaya):
    • Masalah: Menyimpan label Prometheus yang nilai uniknya tidak terbatas, seperti mencatat alamat IP klien, UUID transaksi, atau token autentikasi langsung ke dalam metrik label (contoh: `http_requests_total{client_ip="192.168.1.55
🏷️ Tags: #Nginx #High Concurrency #Performance #Sysadmin #Web Server