L
Observability & Monitoring • Literally Web ID

Arsitektur Resilien Sistem Observability dan Distributed Tracing dengan OpenTelemetry di Cloud-Native

⏱️ 25 menit baca • 📅 19 Oct 2026 • 👁️ 3 views
Arsitektur Resilien Sistem Observability dan Distributed Tracing dengan OpenTelemetry di Cloud-Native

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur web modern yang berbasis cloud-native, sistem terdistribusi (distributed systems) telah menjadi standar emas. Monolit yang sebelumnya mudah dipantau melalui satu file log kini telah dipecah menjadi puluhan hingga ratusan microservices, serverless functions, kontainer Docker yang dikelola Kubernetes, serta dikelilingi oleh layanan eksternal seperti CDN Cloudflare, manajemen database terdistribusi, message broker seperti RabbitMQ/Kafka, hingga objek storage S3/MinIO.

Meskipun pendekatan ini memberikan skalabilitas dan ketahanan yang tinggi, ia memperkenalkan kompleksitas operasional yang masif. Salah satu tantangan terbesar bagi DevOps Engineer dan Site Reliability Engineer (SRE) adalah mengidentifikasi root cause dari bottleneck latensi atau kegagalan transaksi lintas layanan. Ketika sebuah permintaan HTTP dari pengguna akhir mengalami kelambatan, melacak jejaknya secara manual melalui log dari berbagai layanan (Nginx web server, PHP-FPM backend, Go worker, Redis cache, hingga database MySQL) ibarat mencari jarum di tumpukan jerami.

Sebelum vs Sesudah Penerapan Sistem Observability Terstandarisasi

Metrik / Aspek Sebelum (Legacy Logging & Ad-hoc Metrics) Sesudah (OpenTelemetry & Distributed Tracing)
MTTD (Mean Time to Detect) Berjam-jam; bergantung pada komplain user atau alert error 500 yang generik. Hitungan detik; alert otomatis berdasarkan deviasi latensi span.
MTTR (Mean Time to Resolution) Berhari-hari; harus membuka satu per satu log SSH di berbagai kontainer. Menit; langsung melihat waterfall trace yang menunjukkan layanan persis yang mengalami bottleneck.
Analisis Bottleneck Spekulasi berdasarkan intuisi; sering salah mendiagnosis penyebab utama. Berbasis data empiris akurat yang menunjukkan durasi presisi setiap fungsi atau query SQL.
Korelasi Data Terfragmentasi antara log, metrik, dan trace tanpa konteks yang sama. Terpadu melalui W3C Trace Context (traceparent) di seluruh jaringan.

Kegagalan dalam mengimplementasikan observability yang komprehensif sering berujung pada tingginya Customer Churn Rate, pemborosan sumber daya infrastruktur karena over-provisioning yang membabi buta, dan kelelahan mental tim engineering akibat alert fatigue.


2. Konsep Inti & Deep Dive Arsitektur

OpenTelemetry (OTel) adalah standar industri open-source yang dipelihara oleh Cloud Native Computing Foundation (CNCF), hasil penggabungan dari OpenTracing dan OpenCensus. OTel menyediakan spesifikasi tunggal dan toolkit untuk pengumpulan tiga pilar utama observability: Metrics, Logs, dan Traces.

Anatomi Distributed Trace

Sebuah Trace merepresentasikan perjalanan lengkap sebuah transaksi atau permintaan saat merambat melalui berbagai komponen sistem terdistribusi. Trace terdiri dari struktur pohon (tree) yang dibentuk oleh elemen-elemen individual yang disebut Span.

Setiap Span mencakup informasi krusial berikut:

  • Name: Operasi yang dieksekusi (contoh: HTTP GET /api/v1/checkout atau SELECT * FROM users).
  • Timestamps: Waktu mulai (start_time) dan waktu selesai (end_time).
  • Attributes: Kunci-nilai metadata (contoh: http.status_code=200, db.system=mysql).
  • Events: Log terstruktur di dalam span (anotasi waktu tertentu).
  • Links: Hubungan ke span lain di luar relasi parent-child langsung.
  • Context: TraceId, SpanId, dan TraceFlags yang diteruskan melalui jaringan menggunakan header HTTP (seperti standar W3C Trace Context).
[Client Browser]
       │
       ▼ HTTP Request (W3C Header: traceparent)
[Cloudflare CDN / Edge]
       │
       ▼ Reverse Proxy
[Nginx Web Server] ──────► (Span 1: Nginx Ingress)
       │
       ▼ FastCGI / gRPC
[Backend Go / Node.js] ──► (Span 2: API Handler)
       ├──► [Redis Cache] ──► (Span 3: Redis GET session)
       └──► [MySQL DB]   ──► (Span 4: SQL Query)

Arsitektur pengumpulan data menggunakan OpenTelemetry Collector yang bertindak sebagai agen pemrosesan pusat. Collector menerima data telemetry dari aplikasi, melakukan proses batching, filtering, transformation, dan mengekspornya ke backend analitik seperti Prometheus (untuk metrik) dan Grafana Tempo / Jaeger (untuk traces).


3. Perbandingan Komparatif / Analisis Pendekatan

Dalam membangun pipeline observability, terdapat beberapa pendekatan arsitektural yang dapat dipilih. Berikut adalah analisis komparatif mendalam:

Pendekatan Kelebihan Kekurangan Konsumsi Sumber Daya
Direct Export (App ke Backend) Implementasi awal sangat cepat; minim komponen perantara. Aplikasi terikat (tightly coupled) dengan backend tujuan; overhead jaringan tinggi di aplikasi skala besar. CPU/RAM Aplikasi: Tinggi (karena melakukan serialisasi dan pengiriman langsung).
OTel Collector (DaemonSet / Sidecar) Abstraksi penuh; aplikasi hanya mengirim ke localhost; mudah mengubah backend tanpa ubah kode. Membutuhkan manajemen infrastruktur tambahan untuk menjalankan Collector. CPU/RAM Collector: Sedikit lebih tinggi di node, namun membebaskan resource aplikasi.
Sampling-Based Tracing Menghemat storage secara drastis dengan mengambil persentase trace tertentu (misal: 1%). Risiko kehilangan jejak anomali atau error langka jika strategi sampling tidak tepat. Storage: Sangat hemat. CPU: Rendah.

[!TIP] Untuk lingkungan produksi skala enterprise, selalu gunakan OpenTelemetry Collector dengan konfigurasi Tail-Based Sampling agar transaksi yang mengalami error atau latensi tinggi selalu tersimpan 100%, sementara traffic normal di-sample secara agresif.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum melakukan deployment pipeline, pastikan infrastruktur memenuhi spesifikasi berikut:

  • Sistem Operasi: Linux Ubuntu 22.04 LTS / Debian 12 / RHEL 9 (Kernel >= 5.15).
  • Runtime: Docker Engine >= 24.x dan Docker Compose v2.
  • Network: Akses port internal terbuka untuk komunikasi antar kontainer (4317 untuk OTLP gRPC, 4318 untuk OTLP HTTP, 9090 untuk Prometheus, 3000 untuk Grafana).
  • Hak Akses: Akses root atau pengguna dengan hak akses sudo serta docker group.

Verifikasi kesiapan sistem dengan perintah:

docker version
docker compose version
sysctl fs.file-max

5. Panduan Implementasi Langkah demi Langkah

Kita akan membangun stack observability lengkap yang terdiri dari: OpenTelemetry Collector, Prometheus, Grafana Tempo (untuk distributed tracing), dan Grafana (sebagai UI visualisasi terpadu).

Langkah 1: Konfigurasi OpenTelemetry Collector (otel-collector-config.yaml)

Buat file konfigurasi untuk Collector yang menerima data OTLP, memprosesnya, dan meneruskannya ke Tempo dan 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:
  otlp/tempo:
    endpoint: "tempo:4317"
    tls:
      insecure: true
  prometheus:
    endpoint: "0.0.0.0:8889"

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

Langkah 2: Konfigurasi Grafana Tempo (tempo.yaml)

server:
  http_listen_port: 3200

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

ingester:
  lifecycler:
    ring:
      replication_factor: 1
      kvstore:
        store: inmemory
    addr: 127.0.0.1
    join_after: 0s

storage:
  trace:
    backend: local
    local:
      path: /tmp/tempo/blocks

compactor:
  storage:
    backend: local
    local:
    path: /tmp/tempo/compaction

Langkah 3: Konfigurasi Prometheus (prometheus.yml)

global:
  scrape_interval: 15s
  evaluation_interval: 15s

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

Langkah 4: Orchestrasi dengan Docker Compose (docker-compose.yml)

version: '3.8'

services:
  otel-collector:
    image: otel/opentelemetry-collector-contrib:0.95.0
    container_name: otel-collector
    command: ["--config=/etc/otel-collector-config.yaml"]
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
    ports:
      - "4317:4317"   # OTLP gRPC receiver
      - "4318:4318"   # OTLP HTTP receiver
      - "8889:8889"   # Prometheus exporter
    networks:
      - observability-net

  tempo:
    image: grafana/tempo:2.3.1
    container_name: tempo
    command: ["-config.file=/etc/tempo.yaml"]
    volumes:
      - ./tempo.yaml:/etc/tempo.yaml
      - tempo-data:/tmp/tempo
    ports:
      - "3200:3200"   # Tempo HTTP
      - "4317"        # OTLP gRPC
    networks:
      - observability-net

  prometheus:
    image: prom/prometheus:v2.50.0
    container_name: prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    ports:
      - "9090:9090"
    networks:
      - observability-net

  grafana:
    image: grafana/grafana:10.3.3
    container_name: grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=securepassword
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
    networks:
      - observability-net
    depends_on:
      - tempo
      - prometheus

volumes:
  tempo-data:
  prometheus-data:
  grafana-data:

networks:
  observability-net:
    driver: bridge

Jalankan stack dengan perintah:

docker compose up -d

6. Bedah Kode & Penjelasan Detail Baris Kunci

  • memory_limiter processor: Baris konfigurasi ini sangat krusial di lingkungan produksi. Tanpa pembatas memori, lonjakan traffic ekstrem (traffic burst) dapat menyebabkan OTel Collector mengalami Out-Of-Memory (OOM) Crash. Parameter limit_percentage: 80 memastikan collector mulai menolak atau men-drop data telemetry jika penggunaan memori mencapai 80% dari alokasi kontainer.
  • batch processor: Mengelompokkan span dan metrik ke dalam batch sebelum dikirim ke backend. Ini mengurangi overhead koneksi jaringan (TCP handshake berulang) dan meningkatkan efisiensi throughput secara signifikan.
  • W3C Trace Context: Ketika aplikasi backend menerima request HTTP, SDK OpenTelemetry secara otomatis membaca header traceparent (contoh format: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01). Jika header tidak ada, SDK akan membuat TraceId baru. Hal ini menjamin kesinambungan tracing lintas layanan web server Nginx, API Go, hingga database.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Kasus: E-Commerce Flash Sale dengan Load Tinggi

Sebuah platform e-commerce mengalami lonjakan transaksi hingga 50.000 request per detik (RPS) saat event flash sale. Latensi pada endpoint /checkout melonjak dari 150ms menjadi 4.5 detik.

Langkah Investigasi Menggunakan OpenTelemetry & Grafana Tempo:

  1. Masuk ke Grafana Dashboard, buka menu Explore, dan pilih data source Tempo.
  2. Lakukan pencarian trace berdasarkan kriteria http.status_code = 504 atau latensi > 2000ms.
  3. Analisis Trace Waterfall. Terlihat bahwa latensi tinggi bukan disebabkan oleh layanan API Gateway Go, melainkan oleh span SELECT * FROM inventory WHERE product_id = ? yang memakan waktu 3.8 detik akibat ketiadaan indeks pada tabel MySQL.
  4. Tim DBA segera menambahkan composite index pada kolom product_id dan status, dan latensi kembali normal dalam kurun waktu 5 menit tanpa perlu melakukan restart pada aplikasi web backend.

8. Common Pitfalls, Anti-Patterns & Solusi

  1. Unbounded Cardinality pada Attributes

    • Anti-Pattern: Memasukkan data unik seperti user_email atau request_uuid sebagai metric attribute di Prometheus.
    • Dampak: Meledaknya jumlah time-series di Prometheus (Time-Series Churn), menyebabkan RAM Prometheus habis dan server down.
    • Solusi: Gunakan attributes hanya untuk kategori ber-cardinality rendah (misal: status_code, region, service_name). Simpan data unik di dalam Traces (Tempo), bukan di Metrics.
  2. Mengabaikan Backpressure pada Collector

    • Anti-Pattern: Mengirimkan data tanpa konfigurasi retry dan buffer yang memadai saat backend analitik mengalami gangguan.
    • Solusi: Selalu aktifkan block storage lokal sementara dan memory limiter pada OTel Collector.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk menguji ketahanan pipeline observability, lakukan load testing menggunakan k6 atau wrk. Berikut adalah skrip pengujian sederhana menggunakan k6 (loadtest.js):

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

export const options = {
  stages: [
    { duration: '30s', target: 100 },
    { duration: '1m', target: 500 },
    { 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,
    'response time < 200ms': (r) => r.timings.duration < 200,
  });
  sleep(1);
}

Tuning Parameter Lanjutan di Kernel Linux (/etc/sysctl.conf)

Untuk menangani koneksi concurrent yang tinggi pada OTel Collector dan Web Server:

net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_local_port_range = 1024 65535

Terapkan perubahan dengan perintah:

sysctl -p

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum merilis pipeline observability ke lingkungan produksi live, pastikan seluruh item dalam checklist berikut telah terpenuhi:

  • Security: Komunikasi antara aplikasi dan OTel Collector menggunakan enkripsi TLS (jika melewati public network).
  • Resource Limits: Kontainer OTel Collector dibatasi (resource limits) CPU dan RAM-nya di Kubernetes/Docker Compose.
  • Sampling Strategy: Kebijakan tail-based atau head-based sampling telah dikonfigurasi untuk mengontrol biaya storage.
  • Alerting: Rule alert telah diatur di Prometheus/Grafana untuk mendeteksi kegagalan ekspor data telemetry.
  • Retention Policy: Kebijakan retensi data di Tempo dan Prometheus sudah disesuaikan dengan kapasitas disk server.

Dengan menerapkan arsitektur OpenTelemetry yang resilien ini, tim engineering tidak lagi bekerja dalam kegelapan saat menghadapi insiden, melainkan memiliki visibilitas total (full-stack observability) yang akurat, terstandarisasi, dan siap menghadapi skala enterprise.

🏷️ Tags: #Opentelemetry #Observability #Prometheus #Grafana #Distributed Tracing