L
Observability & Monitoring • Literally Web ID

Observability Skala Lanjut: OpenTelemetry, Prometheus, dan Grafana untuk Mikroservis

⏱️ 18 menit baca • 📅 16 Oct 2026 • 👁️ 1 views
Observability Skala Lanjut: OpenTelemetry, Prometheus, dan Grafana untuk Mikroservis

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur modern, transisi dari monolit tradisional ke arsitektur mikroservis mendatangkan fleksibilitas deployment, skalabilitas independen, dan diversifikasi teknologi. Namun, di balik keunggulan tersebut tersimpan kompleksitas operasional yang luar biasa. Ketika sebuah permintaan HTTP dari klien masuk melalui ekosistem web—melewati Cloudflare CDN, WAF, Nginx Reverse Proxy, memicu autentikasi di API Gateway berbasis Go, berkomunikasi via gRPC dengan layanan PHP-FPM dan Node.js, melakukan query ke klaster MariaDB serta caching di Redis, memicu antrean background menggunakan Supervisor dan Postfix untuk pengiriman email—pelacakan masalah menjadi mimpi buruk jika sistem observability tidak dirancang secara komprehensif.

Bottleneck Performa dan Keamanan di Dunia Nyata

  1. Blind Spots Lintas Layanan: Ketika latensi melonjak dari 100ms menjadi 3000ms, tim SRE kesulitan menentukan layanan mana yang menjadi biang keladi. Apakah bottleneck terjadi pada koneksi database MySQL, antrean Redis, atau eksekusi sinkron di layanan backend?
  2. Keterisolasian Metrik, Log, dan Tracing: Pendekatan tradisional sering kali memisahkan ketiga pilar ini. Log disimpan di file flat server, metrik CPU/RAM dipantau terpisah di tool monitoring infrastruktur, dan tracing hampir tidak ada. Hal ini memaksa engineer melakukan korelasi manual secara membabi buta.
  3. Kegagalan Akselerasi Edge & Cache: Konfigurasi CDN Cloudflare yang tidak sinkron dengan header origin Nginx sering menyebabkan cache poisoning atau kegagalan invalidasi token SSL/TLS Let's Encrypt.

Perbandingan Kondisi: Sebelum vs Sesudah Penerapan

Parameter Sebelum Observability Terpadu Sesudah Menerapkan OpenTelemetry, Prometheus & Grafana
Mean Time to Resolution (MTTR) Berjam-jam hingga hari (Reaktif & Tebak-tebakan) Hitungan menit (Proaktif & Berbasis Root-Cause Analysis)
Identifikasi Bottleneck Sulit melacak jalur request antar-mikroservis Presisi tinggi melalui Distributed Tracing (Jaeger/Grafana Tempo)
Korelasi Data Terpisah (Log vs Metrik tidak terhubung) Terpadu (Context Propagation via TraceID & SpanID di setiap log)
Kapasitas Skala Beban Sering terjadi Resource Exhaustion mendadak Early Warning System via Alertmanager & Prometheus berbasis SLO

2. Konsep Inti & Deep Dive Arsitektur

Observability modern berdiri di atas tiga pilar utama: Metrics (kondisi numerik agregat), Logs (rekaman diskrit dari event aplikasi), dan Traces (perjalanan satu transaksi melalui berbagai komponen sistem). OpenTelemetry (OTel) hadir sebagai standar industri tunggal (vendor-neutral) untuk menghasilkan dan mengekspor telemetri tersebut.

Alur Data & Eksekusi Under the Hood

+---------------------------------------------------------------------------------------------------+
|                                     Klien / Browser / Mobile                                      |
+---------------------------------------------------------------------------------------------------+
                                                  |
                                                  v
+---------------------------------------------------------------------------------------------------+
|                                     Cloudflare CDN & WAF & Edge                                   |
+---------------------------------------------------------------------------------------------------+
                                                  |
                                                  v
+---------------------------------------------------------------------------------------------------+
|                         Nginx Reverse Proxy & SSL Termination (Let's Encrypt)                     |
+---------------------------------------------------------------------------------------------------+
                                                  |
                  +-------------------------------+-------------------------------+
                  |                               |                               |
                  v                               v                               v
+---------------------------------+ +-----------------------------+ +-----------------------------+
| Go API Gateway (OTel SDK)       | | Node.js Auth (OTel SDK)     | | PHP-FPM Service (OTel SDK)  |
+---------------------------------+ +-----------------------------+ +-----------------------------+
  | (Expose Metrics & Traces)       | (Expose Metrics & Traces)     | (Expose Metrics & Traces)
  +---------------+---------------+ +--------------+--------------+ +--------------+--------------+
                  |                               |                               |
                  +-------------------------------+-------------------------------+
                                                  |
                                                  v
+---------------------------------------------------------------------------------------------------+
|                                OpenTelemetry Collector (OTelCol)                                  |
+---------------------------------------------------------------------------------------------------+
                  |                                                               |
                  v                                                               v
+---------------------------------+                             +---------------------------------+
| Prometheus (Scraping Metrics)   |                             | Jaeger / Grafana Tempo (Traces) |
+---------------------------------+                             +---------------------------------+
                  |                                                               |
                  +-------------------------------+-------------------------------+
                                                  |
                                                  v
+---------------------------------------------------------------------------------------------------+
|                                  Grafana (Unified Visualization)                                  |
+---------------------------------------------------------------------------------------------------+

Penjelasan alur di atas: Aplikasi mikroservis diinstrumentasi menggunakan OpenTelemetry SDK yang menyuntikkan Trace Context (W3C Trace Context Standard) ke setiap header HTTP (traceparent). Saat permintaan berpindah dari Go ke Node.js dan PHP, konteks tetap utuh. OTel Collector mengumpulkan data ini, meneruskan metrik ke Prometheus, dan trace mentah ke Jaeger/Tempo, yang kemudian divisualisasikan secara terpadu di Grafana.


3. Perbandingan Komparatif / Analisis Pendekatan

Untuk mengimplementasikan koleksi metrik dan tracing, ada beberapa pendekatan yang dapat dipilih oleh SRE:

Aspek Komparasi OpenTelemetry Collector + Prometheus Datadog / New Relic (SaaS Proprietary) Custom Agent & StatsD
Model Lisensi Open Source (Apache 2.0) Proprietary / Berbayar per Host/GB Open Source / Custom
Overhead CPU & RAM Rendah hingga Menengah (Dapat disetel) Menengah (Agent bawaan sering cukup besar) Rendah (Tergantung implementasi)
Vendor Lock-in Tidak ada (Dapat dialirkan ke backend mana pun) Sangat Tinggi Tidak ada
Kompleksitas Setup Tinggi (Memerlukan pemeliharaan infrastruktur) Sangat Rendah (Instalasi satu baris agen) Sangat Tinggi (Maintenance mandiri)
Skalabilitas Data Sangat Tinggi (Arsitektur OTel Collector terdistribusi) Tergantung paket tier langganan Terbatas pada kapasitas custom server

[!TIP] Bagi perusahaan enterprise dengan regulasi data ketat (GDPR/HIPAA) atau volume log/trace harian mencapai Terabyte, kombinasi OpenTelemetry, Prometheus, dan Grafana memberikan efisiensi biaya operasional (CapEx/OpEx) hingga 70% dibandingkan solusi SaaS komersial.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum menjalankan instalasi, pastikan lingkungan produksi Anda memenuhi spesifikasi minimum berikut:

  • OS: Ubuntu Server 22.04 LTS / Debian 12 Bookworm / RHEL 9
  • Hardware: Minimal 4 Core vCPU, 8 GB RAM, 100 GB NVMe SSD (untuk menampung TSDB Prometheus dan penyimpanan data OTel Collector)
  • Networking: Port terbuka: 9090 (Prometheus), 3000 (Grafana), 4317 (OTLP gRPC), 4318 (OTLP HTTP), 9093 (Alertmanager)
  • Dependencies: Docker Engine (>= 24.0) dan Docker Compose (>= 2.20)

Verifikasi awal sistem operasi:

sysctl vm.max_map_count
# Jika nilai di bawah 262144, atur permanen:
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

5. Panduan Implementasi Langkah demi Langkah

Berikut adalah konfigurasi infrastruktur lengkap menggunakan Docker Compose yang mencakup Prometheus, Alertmanager, OpenTelemetry Collector, Grafana, dan Jaeger.

Struktur Direktori Proyek

/opt/observability/
├── docker-compose.yml
├── prometheus/
│   └── prometheus.yml
├── alertmanager/
│   └── alertmanager.yml
└── otelcol/
    └── otel-collector-config.yml

1. Konfigurasi prometheus/prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s

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

rule_files:
  - "/etc/prometheus/alert.rules.yml"

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

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

  - job_name: 'microservices-go'
    static_configs:
      - targets: ['go-backend-service:8080']

2. Konfigurasi alertmanager/alertmanager.yml

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'slack-notifications'

receivers:
  - name: 'slack-notifications'
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/T00/B00/XXXXX'
        channel: '#sre-alerts'
        send_resolved: true
        text: "<!channel> Alert: {{ .CommonLabels.alertname }}\nSeverity: {{ .CommonLabels.severity }}\nSummary: {{ .CommonAnnotations.summary }}"

3. Konfigurasi otelcol/otel-collector-config.yml

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: 8192
    timeout: 1s
    send_batch_max_size: 10240
  resourcedetection:
    detectors: [env, system]
    timeout: 2s

exporters:
  prometheus:
    endpoint: "0.0.0.0:8889"
    namespace: "otel"
  jaeger:
    endpoint: "jaeger:4317"
    tls:
      insecure: true

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

4. Konfigurasi Utama docker-compose.yml

version: '3.8'

networks:
  observability-net:
    driver: bridge

services:
  otel-collector:
    image: otel/opentelemetry-collector-contrib:0.95.0
    container_name: otel-collector
    restart: unless-stopped
    command: ["--config=/etc/otel-collector-config.yml"]
    volumes:
      - ./otelcol/otel-collector-config.yml:/etc/otel-collector-config.yml
    ports:
      - "4317:4317"
      - "4318:4318"
      - "8889:8889"
    networks:
      - observability-net

  prometheus:
    image: prom/prometheus:v2.51.0
    container_name: prometheus
    restart: unless-stopped
    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'
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    ports:
      - "9090:9090"
    networks:
      - observability-net

  alertmanager:
    image: prom/alertmanager:v0.27.0
    container_name: alertmanager
    restart: unless-stopped
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
      - '--storage.path=/alertmanager'
    volumes:
      - ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
    ports:
      - "9093:9093"
    networks:
      - observability-net

  jaeger:
    image: jaegertracing/all-in-one:1.55
    container_name: jaeger
    restart: unless-stopped
    environment:
      - COLLECTOR_OTLP_ENABLED=true
    ports:
      - "16686:16686"
    networks:
      - observability-net

  grafana:
    image: grafana/grafana:10.4.0
    container_name: grafana
    restart: unless-stopped
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=secure_grafana_password_2024
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    networks:
      - observability-net

volumes:
  prometheus_data:
    
  grafana_data:

Jalankan stack dengan perintah:

docker compose up -d

6. Bedah Kode & Penjelasan Detail Baris Kunci

  1. memory_limiter pada OTel Collector: Baris konfigurasi limit_percentage: 80 memastikan bahwa jika konsumsi memori Collector mencapai 80% dari total RAM kontainer, proses internal akan mulai menolak atau membersihkan batch data secara asinkron (spike_limit_percentage: 20). Hal ini mencegah terjadinya Out-Of-Memory (OOM) Killer pada kontainer.
  2. W3C Trace Context: Protokol komunikasi di SDK aplikasi (Go, Node, PHP) menggunakan standar W3C (traceparent). Jika header ini tidak diteruskan secara eksplisit melalui HTTP client antar-mikroservis, Jaeger akan memutus rantai trace, menghasilkan orphan spans yang menyulitkan debugging.
  3. scrape_interval: 15s: Interval waktu Prometheus menarik data dari target. Mengatur nilai terlalu rendah (< 5s) akan membebani jaringan dan penyimpanan TSDB, sedangkan terlalu tinggi (> 60s) membuat deteksi anomali real-time melambat.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Kasus: Lonjakan Traffic Flash Sale pada Layanan E-Commerce Berbasis Mikroservis

Pada saat Flash Sale, traffic meningkat dari 1.000 req/sec menjadi 45.000 req/sec. Gateway Nginx mulai melaporkan HTTP 504 Gateway Timeout.

Langkah Investigasi SRE:

  1. Membuka Grafana Dashboard utama. Terlihat lonjakan metrik http_server_duration_milliseconds pada layanan Order Processing. Latency rata-rata melonjak dari 40ms ke 4500ms.
  2. Menavigasi ke Jaeger UI untuk melihat Distributed Trace berdasarkan filter status error http.status_code == 500 atau durasi terlama.
  3. Trace menunjukkan bahwa operasi query ke database MySQL untuk mengurangi stok mengalami Row Lock Contention, sementara antrean Redis caching mengalami lonjakan koneksi.
  4. Tim segera melakukan scale-out pada pod worker Redis dan mengaktifkan rate-limiting di Nginx/Cloudflare, menyelesaikan insiden dalam waktu kurang dari 8 menit tanpa reboot layanan.

8. Common Pitfalls, Anti-Patterns & Solusi

  • Anti-Pattern 1: Mengirim Semua Log, Metrik, dan Trace Tanpa Sampling. Mengirim 100% trace pada sistem dengan traffic tinggi akan melumpuhkan penyimpanan Jaeger/Tempo.
    • Solusi: Terapkan Head-based Sampling atau Tail-based Sampling di OpenTelemetry Collector (misal: hanya rekam 5% dari request sukses, tetapi rekam 100% dari request yang menghasilkan error HTTP 5xx).
  • Anti-Pattern 2: Kardinalitas Metrik yang Terlalu Tinggi (High Cardinality). Menggunakan user_id atau UUID transaksi sebagai label metrik di Prometheus.
    • Solusi: Label Prometheus harus berupa data berbatas kecil (seperti status_code, method, endpoint). Jangan pernah memasukkan data unik tak terbatas ke dalam label Prometheus karena akan menyebabkan TimeSeries explosion dan membuat Prometheus crash akibat kehabisan memori.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk menguji ketahanan infrastruktur observability, lakukan load testing menggunakan tool k6 atau wrk pada aplikasi yang telah diinstrumentasi:

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

export const options = {
  stages: [
    { duration: '2m', target: 100 },
    { duration: '5m', target: 500 },
    { duration: '2m', target: 0 },
  ],
};

export default function () {
  const res = http.get('http://go-backend-service:8080/api/v1/resource');
  check(res, { 'status was 200': (r) => r.status === 200 });
  sleep(1);
}

Hasil Tuning Lanjutan:

  • Atur retensi TSDB Prometheus agar tidak memenuhi disk: --storage.tsdb.retention.time=15d.
  • Gunakan kompresi snappy pada eksporter OTel untuk mengurangi penggunaan bandwidth jaringan antar-node.

10. Checklist Penerapan Produksi & Kesimpulan

Pastikan seluruh item berikut terpenuhi sebelum merilis sistem observability ke lingkungan produksi:

  • Memori dan CPU limit telah dikonfigurasi pada semua kontainer OTel Collector dan Prometheus.
  • Aturan sampling trace telah diaktifkan untuk mencegah lonjakan volume data.
  • Label Prometheus telah diaudit untuk menghindari High Cardinality.
  • Alertmanager terhubung dengan kanal eskalasi darurat (PagerDuty/Slack/Webhook).
  • Dashboard Grafana diamankan dengan autentikasi kuat dan manajemen peran (RBAC).
  • Cadangan volume data TSDB Prometheus dan konfigurasi secara berkala telah otomatis.

Dengan arsitektur OpenTelemetry, Prometheus, dan Grafana yang terintegrasi penuh, tim SRE dan Platform Engineer memiliki visibilitas total (single pane of glass) untuk mendiagnosis masalah, menjaga Service Level Objectives (SLO), dan menjamin keandalan sistem mikroservis skala enterprise secara proaktif.

🏷️ Tags: #Microservices #Opentelemetry #Prometheus #Grafana #Jaeger