Menyatukan tiga pilar observability: korelasi metrics, logs, dan traces melalui trace_id dan metrics exemplar, menerapkan workflow SRE dari alert ke trace lalu ke log, serta menyusun satu pipeline OTLP untuk ketiga sinyal menuju backend Grafana LGTM dan Jaeger

Tiga sinyal sudah kalian kuasai secara terpisah: traces (episode 4), metrics (5), dan logs (6). Episode 17 menyatukannya — karena kekuatan observability bukan pada masing-masing pilar, melainkan pada kemampuan berpindah antar-pilar tanpa pindah konteks. Inilah yang dipanggil data correlation.
Mengapa penting? Workflow insiden yang sesungguhnya adalah: alert metrics berbunyi → buka trace yang paling relevan → masuk ke log pada titik kegagalan → temukan root cause. Setiap perpindahan itu butuh data yang saling tertaut. Tanpa korelasi, kalian pindah antar-tool dengan menyalin-menempel ID secara manual — dan di tengah insiden, itu waktu yang mahal.
Jembatan korelasi yang menyatukan tiga pilar adalah trace_id:
trace_id nyata.trace_id/span_id dari konteks span aktif (episode 6).trace_id itu.Perhatikan arah alur: metrics menunjuk ke trace (lewat exemplar), logs menyediakan detail (lewat trace_id di record). Backend yang baik membuat perpindahan ini satu klik.
Exemplar adalah mekanisme yang membuat histogram tidak hanya "tinggi" tetapi juga "kenapa". Untuk bucket tertentu, SDK menyimpan satu contoh pengukuran asli beserta atribut dan trace_id-nya:
latency = meter.create_histogram("http.server.request.duration", unit="s")
def handler(ctx, duration_s):
# Exemplar secara otomatis mengikat pengukuran ke trace_id span aktif
latency.record(duration_s, {"http.route": "/checkout"})Saat memeriksa histogram di backend, exemplar memperlihatkan contoh request nyata (dengan trace_id) yang masuk ke bucket tertentu — biasanya bucket lambat atau bucket error. Dari situ kalian langsung lompat ke trace.
Note
Exemplar bukan data lengkap — ia satu contoh per bucket, dipilih sesuai filter filter/reservoir sampling di SDK. Jangan berharap semua request punya exemplar. Fungsinya adalah titik masuk investigasi, bukan data statistik tambahan.
Alur investigasi modern yang efisien adalah rantai korelasi:
trace_id span tersebut; baca pesan error persis di titik kegagalan.groups:
- name: http
rules:
- alert: HighErrorRate
expr: rate(http_server_request_count_total{status="5xx"}[5m]) > 0.05
annotations:
summary: "Error rate > 5%"Setiap langkah hanya butuh satu klik di backend yang terintegrasi (Grafana + Tempo + Loki, atau Jaeger + log index). Inilah alasan industri bergeser ke stack observability yang memakai identitas bersama.
Keindahan arsitektur OTel: ketiga sinyal melewati pipeline yang sama dan bisa diteruskan ke satu set backend. Tambahkan backend logs (Loki) ke stack kalian:
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
memory_limiter:
check_interval: 1s
limit_mib: 512
batch:
timeout: 2s
exporters:
otlp/tempo:
endpoint: tempo:4317
tls:
insecure: true
prometheus:
endpoint: 0.0.0.0:8889
namespace: otel
otlp/loki:
endpoint: loki:4317
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlp/tempo]
metrics:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [prometheus]
logs:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlp/loki]Arsitektur di atas adalah versi ringkas dari Grafana LGTM stack (Loki + Grafana + Tempo + Mimir) yang menerima OTel secara native — satu collector mengisi tiga backend berbeda dengan satu koneksi dari SDK.
Gejala data yang tidak berkorelasi, dan penyebabnya:
| Gejala | Kemungkinan Penyebab |
|---|---|
| Exemplar tidak pernah muncul | Histogram tanpa atribut yang cukup / filter reservoir menutup |
Log tidak punya trace_id | Log dikeluarkan di luar span aktif (thread/callback) |
| Trace terlihat terpotong | Propagasi putus di salah satu hop (episode 15) |
| Service tidak muncul di metrics | Resource service.name tidak konsisten dengan trace |
| Alert tidak bisa dibuka ke trace | Backend tidak menghubungkan exemplar; cek index/metric nama |
Tip
Konsistensi service.name adalah syarat korelasi lintas sinyal. Jika metric dari payment-service sedangkan trace-nya bernama payment_svc, korelasi otomatis backend akan gagal meski trace_id benar. Standarkan penamaan service sejak episode 7.
Pada episode 17 ini, kalian telah menyatukan tiga pilar observability.
Inti yang harus dibawa pulang:
trace_id adalah jembatan korelasi: exemplar menghubungkan metrics→trace, log record membawa trace ke detail.service.name dan propagasi konteks.Di episode 18 selanjutnya, kita masuk Fase 5 dan membahas Kubernetes: Helm, DaemonSet & OTel K8s Operator — install collector lewat Helm chart, mode daemonset vs deployment, enrichment atribut K8s, serta auto-instrumentasi dengan OpenTelemetry Operator. Sampai jumpa di episode 18!