L
Observability & Monitoring • Literally Web ID

Observabilitas Sistem Terdistribusi dengan OpenTelemetry, Prometheus, dan Grafana

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

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur sistem terdistribusi modern, transisi dari monolit legacy ke arsitektur microservices telah membawa efisiensi skalabilitas yang masif. Namun, pergeseran ini juga memperkenalkan kompleksitas operasional yang belum pernah terjadi sebelumnya. Ketika sebuah permintaan (request) HTTP tunggal dari klien menembus lapisan Cloudflare WAF, melewati Nginx reverse proxy, diteruskan ke Go API Gateway, dan memicu panggilan RPC gRPC ke sepuluh backend service berbeda (PHP-FPM, Node.js), membaca database MySQL terdistribusi, serta mengambil cache Redis secara paralel, menemukan sumber latensi tinggi atau kegagalan transaksi menjadi seperti mencari jarum di dalam tumpukan jerami digital.

Bottleneck Performa dan Keamanan di Dunia Nyata

  • Blind Spot Transaksional: Tim Site Reliability Engineering (SRE) sering kali hanya mengetahui layanan "down" setelah pengguna melapor via media sosial atau tiket dukungan, karena metrik dasar (seperti CPU utilization dan memory usage) tidak menunjukkan konteks bisnis dari kegagalan tersebut.
  • Keterbatasan Logging Tradisional: Log berbasis teks (/var/log/nginx/error.log atau stdout container Docker) bersifat terisolasi. Tanpa distributed tracing context propagation (W3C Trace Context), melacak satu request ID melintasi batas jaringan asinkron antar layanan memerlukan pencarian manual yang melelahkan pada puluhan file log.
  • Overhead Telemetri yang Berlebihan: Penggunaan agen pemantauan berpemilik (proprietary agents) yang tidak efisien sering kali memakan memori berlebih pada server production, menyebabkan CPU throttling, dan menambah latensi jaringan yang merusak SLA (Service Level Agreement).

Kondisi Sebelum vs Sesudah Penerapan

  • Sebelum: Debugging insiden memakan waktu berjam-jam (MTTR - Mean Time to Resolution yang tinggi). Engineer menebak-nebak akar masalah, melakukan SSH ke berbagai node server, menjalankan grep pada file log mentah, dan sering kali gagal mereproduksi bug yang bersifat intermiten.
  • Sesudah: Penerapan pipeline observabilitas terpadu berbasis OpenTelemetry, Prometheus, dan Grafana memberikan visibilitas penuh (full-stack visibility). SRE dapat langsung melihat trace waterfall lengkap, mengidentifikasi query SQL lambat di database MySQL, atau mendeteksi lonjakan error 502 dari PHP-FPM dalam hitungan detik setelah anomali terdeteksi oleh sistem alert terpusat.

2. Konsep Inti & Deep Dive Arsitektur

Observabilitas modern tidak lagi sekadar mengandalkan tiga pilar terpisah (Metrics, Logs, Traces - dikenal sebagai M.E.L.T), melainkan peleburan ketiganya ke dalam konteks eksekusi yang sama. OpenTelemetry (OTel) bertindak sebagai standar industri tunggal yang menyatukan spesifikasi dan alat untuk pengumpulan data telemetri.

Alur Data & Eksekusi Telemetri (Under the Hood)

[Client Request]
       │
       ▼
[Cloudflare / Nginx (Edge)]
       │
       ▼ (Inject W3C TraceContext headers)
[Backend Service (Go/Node/PHP + OTel SDK)]
       ├──> Generates Traces (Spans) ────────┐
       ├──> Generates Metrics (Prometheus) ─┼──> [OpenTelemetry Collector]
       └──> Generates Structured Logs ──────┘           │
                                                        ├──> Exposes / Scrapes ──> [Prometheus Server]
                                                        └──> Exports Traces ────> [Tempo / Jaeger Storage]
                                                                                         │
                                                                                         ▼
                                                                                 [Grafana Dashboards]
  1. Instrumentation: Aplikasi backend (baik Go, Node.js, maupun PHP) menggunakan OpenTelemetry SDK untuk menginisialisasi TracerProvider dan MeterProvider. Setiap request HTTP yang masuk akan mendekode header W3C Trace Context (traceparent dan tracestate).
  2. Context Propagation: Saat aplikasi memanggil database MySQL via driver terinstrumentasi atau memanggil layanan eksternal via HTTP/gRPC, konteks trace ID dan span ID disuntikkan ke dalam header jaringan agar layanan hilir (downstream) tetap berada dalam satu silsilah transaksi yang sama.
  3. Collection (OTel Collector): Data metrik dan traces diekspor oleh aplikasi (biasanya menggunakan protokol OTLP/gRPC pada port 4317 atau OTLP/HTTP pada port 4318) ke OpenTelemetry Collector. Collector bertindak sebagai agen perantara yang melakukan batching, filtering, dan routing data telemetri.
  4. Storage & Visualization: Prometheus secara aktif menarik (scrapes) metrik dari endpoint yang diekspos oleh OTel Collector atau aplikasi secara langsung, sementara Grafana menyajikan data tersebut dalam bentuk visual interaktif untuk memantau RED metrics.

3. Perbandingan Komparatif / Analisis Pendekatan

Untuk merancang sistem observabilitas yang tahan banting di lingkungan enterprise, pemilihan komponen infrastruktur sangat menentukan stabilitas jangka panjang.

Parameter Perbandingan OpenTelemetry (OTel) Proprietary APM Agents (Datadog/NewRelic) Prometheus Scraper Push-based Metrics (StatsD)
Vendor Lock-in Rendah (Open Source) Tinggi (Proprietary) Rendah (Open Source) Rendah (Open Source)
Resource Overhead Rendah - Menengah Tinggi (Sering memori leak) Sangat Rendah Rendah
Standarisasi API Standar Industri CNCF Spesifik Vendor Standar OpenMetrics Beragam format
Biaya Lisensi Gratis (Self-Hosted) Berbayar per host/gigabyte Gratis Gratis
Kompleksitas Setup Menengah - Tinggi Rendah (Plug and Play) Menengah Menengah

[!IMPORTANT] Pemilihan arsitektur pull-based (seperti Prometheus menarik metrik) jauh lebih unggul dalam mendeteksi kegagalan target scraping dibandingkan arsitektur push-based, karena jika target mengalami crash, Prometheus dapat langsung membunyikan alarm TargetDown.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum melakukan deploy pipeline observabilitas, pastikan infrastruktur memenuhi spesifikasi minimal berikut:

Spesifikasi Lingkungan Produksi

  • OS: Ubuntu 22.04 LTS / Debian 12 (Kernel Linux >= 5.15)
  • RAM: Minimal 8 GB (untuk menjalankan Prometheus, Grafana, dan OTel Collector secara bersamaan)
  • Storage: SSD NVMe dengan alokasi minimal 50 GB untuk retensi metrik Prometheus
  • Network: Port terbuka: 9090 (Prometheus), 3000 (Grafana), 4317/4318 (OTel Collector OTLP)

Verifikasi Awal & Dependensi Sistem

Jalankan perintah berikut di terminal untuk menyiapkan direktori dan memastikan utilitas dasar tersedia:

sudo apt update && sudo apt install -y curl wget apt-transport-https ca-certificates gnupg lsb-release
sudo mkdir -p /etc/otelcol /etc/prometheus /etc/grafana /var/lib/prometheus

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Konfigurasi OpenTelemetry Collector

Buat file konfigurasi OTel Collector di /etc/otelcol/config.yaml:

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
  memory_limiter:
    check_interval: 1s
    limit_percentage: 80
    spike_limit_percentage: 20

exporters:
  prometheus:
    host: 0.0.0.0
    port: 8889
    namespace: "enterprise"

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

Langkah 2: Konfigurasi Prometheus Scraper

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

global:
  scrape_interval: 15s
  evaluation_interval: 15s

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

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

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

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

Langkah 3: Implementasi Backend dengan OpenTelemetry (Contoh Go Backend)

Buat file main.go untuk menginstrumentasi aplikasi backend Go:

package main

import (
	"context"
	"log"
	"net/http"
	"time"

	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
	"go.opentelemetry.io/otel/propagation"
	"go.opentelemetry.io/otel/sdk/resource"
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
	semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
	trace "go.opentelemetry.io/otel/trace"
)

func initTracer(ctx context.Context) (*sdktrace.TracerProvider, error) {
	exporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure(), otlptracegrpc.WithEndpoint("localhost:4317"))
	if err != nil {
		return nil, err
	}

	tp := sdktrace.NewTracerProvider(
		sdktrace.WithSampler(sdktrace.AlwaysSample()),
		sdktrace.WithBatcher(exporter),
		sdktrace.WithResource(resource.NewWithAttributes(
			semconv.SchemaURL,
			semconv.ServiceNameKey.String("auth-service"),
		)),
	)
	otel.SetTracerProvider(tp)
	otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
	return tp, nil
}

func main() {
	ctx := context.Background()
	tp, err := initTracer(ctx)
	if err != nil {
		log.Fatalf("Failed to init tracer: %v", err)
	}
	defer func() {
		if err := tp.Shutdown(ctx); err != nil {
			log.Printf("Error terminating TracerProvider: %v", err)
		}
	}()

	http.HandleFunc("/api/v1/login", func(w http.ResponseWriter, r *http.Request) {
		tr := otel.Tracer("auth-service")
		ctx, span := tr.Start(r.Context(), "HandleLogin", trace.WithSpanKind(trace.SpanKindServer))
		defer span.End()

		// Simulasi pemrosesan database / autentikasi
		time.Sleep(50 * time.Millisecond)
		w.WriteHeader(http.StatusOK)
		w.Write([]byte(`{"status":"success"}`))
	})

	log.Println("Auth service running on :8080")
	if err := http.ListenAndServe(":8080", nil); err != nil {
		log.Fatal(err)
	}
}

Langkah 4: Menjalankan Service via Systemd

Buat file service systemd untuk OTel Collector di /etc/systemd/system/otelcol.service:

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

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/otelcol --config=/etc/otelcol/config.yaml
Restart=on-failure

[Install]
WantedBy=multi-user.target

Aktifkan dan jalankan layanan:

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

6. Bedah Kode & Penjelasan Detail Baris Kunci

  • otlptracegrpc.New(...): Baris ini menginisialisasi koneksi gRPC klien OpenTelemetry menuju Collector lokal (localhost:4317). Penggunaan gRPC jauh lebih efisien dibandingkan HTTP/JSON karena mendukung multiplexing dan kompresi biner.
  • sdktrace.WithSampler(sdktrace.AlwaysSample()): Menentukan kebijakan sampling. Di lingkungan production dengan traffic jutaan request per detik, nilai ini harus diubah menggunakan ParentBased sampler atau TraceIDRatioBased (misal: 0.1 atau 10%) untuk mencegah pembengkakan penyimpanan traces.
  • memory_limiter pada konfigurasi OTel Collector: Konfigurasi krusial untuk mencegah Collector mengalami Out-Of-Memory (OOM) Killer ketika terjadi lonjakan traffic mendadak yang membanjiri antrean memori.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Dalam studi kasus e-commerce dengan skala flash sale (mencapai 50.000 requests per second), penggunaan pipeline observabilitas ini diintegrasikan dengan Nginx reverse proxy menggunakan modul opentelemetry-nginx.

Ketika terjadi lonjakan latensi pada endpoint /checkout, SRE membuka Grafana dashboard dan langsung melihat metrik RED:

  • Rate: Terjadi peningkatan request rate sebesar 400%.
  • Errors: Tingkat error HTTP 500 melonjak hingga 12%.
  • Duration: P99 latency meningkat dari 120ms menjadi 3.4 detik.

Melalui distributed trace waterfall, teridentifikasi bahwa perlambatan bukan disebabkan oleh API Gateway Go, melainkan karena connection pool exhaustion pada database MySQL akibat query SELECT tanpa indeks pada tabel keranjang belanja.


8. Common Pitfalls, Anti-Patterns & Solusi

[!WARNING] Jangan pernah menggunakan AlwaysSample() di Production pada traffic tinggi! Hal ini akan menghabiskan gigabyte storage disk dalam hitungan jam dan membebani jaringan secara masif.

  • Anti-Pattern 1: Mengirim data telemetri langsung dari aplikasi ke penyimpanan jangka panjang tanpa melalui OTel Collector. Solusi: Selalu gunakan Collector sebagai penyangga (buffer) untuk menangani fluktuasi jaringan dan backpressure.
  • Anti-Pattern 2: Menambahkan atribut berkeadilan tinggi (high-cardinality attributes seperti alamat IP pengguna atau UUID transaksi penuh) ke dalam label metrik Prometheus. Solusi: Simpan atribut berkeadilan tinggi di dalam Traces, bukan di dalam Metrics, untuk mencegah time-series database bloat.

9. Benchmark, Metrik Kinerja & Tuning Performa

Pengujian beban dilakukan menggunakan utilitas k6 untuk mengukur dampak agen OpenTelemetry terhadap performa aplikasi backend.

Skrip Benchmark load-test.js (k6)

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

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

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

Hasil Tuning & Optimasi Lanjutan

  • Batch Processor Tuning: Mengatur send_batch_size: 2048 dan timeout: 2s pada OTel Collector menurunkan penggunaan CPU hingga 18% pada beban puncak.
  • Kernel Tuning (sysctl.conf): Meningkatkan batas socket buffer jaringan (net.core.somaxconn = 65535) untuk mencegah dropped packets pada port penerima OTLP.

10. Checklist Penerapan Produksi & Kesimpulan

Pastikan checklist berikut terpenuhi sebelum merilis pipeline observabilitas ke lingkungan live production:

  • Autentikasi TLS diaktifkan pada komunikasi OTLP antara aplikasi dan OTel Collector.
  • Aturan sampling traces telah disesuaikan dengan kapasitas penyimpanan (misal: 5% atau adaptive sampling).
  • Alertmanager terintegrasi dengan kanal eskalasi darurat (PagerDuty/Slack/Webhook).
  • Retensi data Prometheus dan Grafana Tempo telah dikonfigurasi dengan kebijakan rotasi otomatis.

Dengan mengimplementasikan arsitektur observabilitas yang solid menggunakan OpenTelemetry, Prometheus, dan Grafana, tim SRE dan Backend Developer memiliki fondasi kokoh untuk menjaga keandalan sistem terdistribusi skala enterprise secara proaktif.

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