Membahas keandalan pipeline telemetry: sending_queue dan buffering di collector, sinyal backpressure seperti 429 dan ResourceExhausted, konfigurasi retry dan backoff, serta cara mencegah data loss saat backend observability sedang down

Di episode 13 kita mengurangi volume data dengan sampling. Episode 14 membahas sisi lain dari keandalan: apa yang terjadi saat backend observability down, lambat, atau menolak data? Tanpa mekanisme buffering dan retry yang benar, telemetry kalian hilang diam-diam — dan ironisnya, observability justru tidak bisa dipakai untuk menyelidiki insiden yang sedang berlangsung.
Ini bukan topik eksotis. Backend observability sering menjadi korban pertama saat beban tinggi — dan saat itulah kalian paling membutuhkan datanya. Pipeline telemetry yang andal dibangun dari tiga mekanisme: buffering (menahan data), backpressure (memberi tahu hulu untuk menunda), dan retry (mencoba lagi dengan strategi yang benar).
Exporter di collector memakai queue internal (sending_queue) untuk menahan data sebelum dikirim. Saat backend lambat, data menumpuk di queue, bukan dibuang:
exporters:
otlp/backend:
endpoint: jaeger:4317
tls:
insecure: true
sending_queue:
enabled: true
queue_size: 5120 # jumlah item dalam memory
num_consumers: 4 # goroutine pengirim paralel
storage: file_storage # opsi persist ke disk
retry_on_failure:
enabled: true
initial_interval: 5s
max_interval: 30s
max_elapsed_time: 5mParameter penting sending_queue:
queue_size — kapasitas queue dalam memory; 5120 item default.num_consumers — berapa pengirim paralel; naikkan saat banyak backend.storage — saat memakai file_storage extension, queue persisten ke disk — data selamat dari restart collector. Ini kunci pencegahan data loss.Tip
Untuk jaminan data loss minimal, kombinasikan sending_queue dengan file_storage extension. Queue yang hanya di memory tetap membuang data saat collector restart. Pahami juga bahwa queue memakai memory — jangan pasang queue_size raksasa tanpa memory_limiter yang pasang di pipeline.
Backpressure adalah mekanisme hulu-menunda saat hilir kewalahan. Di ekosistem OTel, sinyalnya mengalir mundur:
429 Too Many Requests atau gRPC ResourceExhausted.Kunci pemahamannya: penolakan bukan kegagalan, melainkan sinyal kendali. Sistem yang merespons backpressure dengan benar tidak kehilangan data — ia memperlambat aliran sampai hilir pulih.
retry_on_failure mengatur perilaku ekspor ulang:
initial_interval — jeda pertama (5 detik).max_interval — jeda maksimal (30 detik); interval tumbuh eksponensial dengan jitter.max_elapsed_time — berapa lama total mencoba sebelum menyerah (5 menit).Unavailable, ResourceExhausted, DeadlineExceeded (gRPC), 429 dan 5xx (HTTP).InvalidArgument (payload salah) — retry tidak akan pernah berhasil.Jitter penting: tanpa jitter, semua eksporter yang gagal akan retry pada momen yang sama dan kembali saling membanjiri — fenomena yang disebut thundering herd.
Saat collector turun sepenuhnya, SDKlah yang jadi buffer terakhir. Exporter SDK punya retry otomatis (episode 8), tetapi kapasitasnya terbatas: data yang tidak terkirim dalam beberapa kali percobaan akan di-drop oleh BatchSpanProcessor. Jika ini tidak bisa diterima, opsi lain:
filelog + otlp_json_file).Untuk kebanyakan kasus, retry + queue collector sudah memadai. Penyimpanan tambahan baru dibutuhkan saat SLA pengiriman telemetry menjadi komitmen formal.
Saat telemetry "hilang", ikuti alur ini secara sistematis:
otelcol_exporter_send_failed_*, otelcol_receiver_refused_*) di endpoint 8888 atau port prometheus.--config dengan service.telemetry.logs.level: debug akan mencetak alasan penolakan.Failed to export menunjukkan retry; jika berhenti, cek apakah queue SDK menyerah.otelcol_exporter_queue_size menurun tapi tidak pernah kosong = hilir lambat.receivers:
prometheus/self:
config:
scrape_configs:
- job_name: otel-collector
scrape_interval: 10s
static_configs:
- targets: ["localhost:8888"]
service:
pipelines:
metrics:
receivers: [prometheus/self]
processors: [batch]
exporters: [debug]Warning
Jangan lupa mengobservasi collector itu sendiri. Collector yang bukan bagian dari observability-nya sendiri adalah kesalahan arsitektur klasik. Minimal aktifkan endpoint metrics di 8888, atur alert saat queue_size mendekati queue_size maksimum, dan alert saat send_failed tinggi.
max_elapsed_time terlalu kecil — retry menyerah sebelum backend pulih; set minimal beberapa menit.Pada episode 14 ini, kalian telah memahami mekanisme keandalan pipeline telemetry.
Inti yang harus dibawa pulang:
sending_queue menahan data saat hilir lambat; file_storage membuatnya persisten.429/ResourceExhausted adalah sinyal kendali; rantai SDK → collector → backend saling menunda dengan benar.8888 adalah garis pertahanan pertama melawan data loss diam-diam.Di episode 15 selanjutnya, kita masuk Fase 4 dan membahas propagasi & distributed tracing across services — korelasi trace melewati HTTP, gRPC, dan queue Kafka, inject/extract context di Express, Gin, dan Spring, serta teknik melacak latency antar-service untuk menemukan bottleneck. Sampai jumpa di episode 15!