Kodeloka
  1. Kodeloka
  2. Kelas OpenTelemetry
  3. Materi

1 · Fondasi · Modul 1 dari 8

Konsep Inti & Tiga Sinyal

Apa yang sebenarnya distandarkan OpenTelemetry, dan kenapa itu mengubah cara memilih alat pemantauan.

Yang Distandarkan dan Yang Tidak

OpenTelemetry bukan sistem pemantauan. Ia tidak menyimpan data, tidak menggambar grafik, dan tidak mengirim peringatan. Yang disediakannya adalah cara menghasilkan dan mengirim data telemetri yang sama di semua bahasa dan semua vendor.

Disediakan OTel     API, SDK, konvensi penamaan, protokol OTLP, Collector
Bukan bagian OTel   penyimpanan, dasbor, mesin peringatan, analisis
💡 Inilah alasan sesungguhnya OTel diadopsi luas

Sebelum OTel, mengganti vendor pemantauan berarti mengganti pustaka instrumentasi di seluruh basis kode — pekerjaan berbulan-bulan yang membuat tim terkunci pada satu vendor. Dengan OTel, instrumentasi ditulis sekali dan tujuan pengirimannya cukup diubah pada konfigurasi Collector. Perpindahan vendor menjadi perubahan berkas konfigurasi.

Tiga Sinyal, Tiga Pertanyaan Berbeda

Trace     Ke mana perginya permintaan ini, dan di mana waktunya habis?
Metrik    Bagaimana kondisi sistem secara agregat sepanjang waktu?
Log       Apa persisnya yang terjadi pada momen tertentu?

Ketiganya saling melengkapi. Metrik memberi tahu bahwa latensi p99 naik. Trace menunjukkan permintaan mana yang lambat dan pada layanan apa. Log menjelaskan apa yang terjadi di dalam layanan itu.

Anatomi Trace

Trace  ─ satu perjalanan permintaan lengkap, punya trace_id unik
  └─ Span ─ satu unit kerja di dalamnya, punya span_id

Trace: GET /pesanan/123        [========================] 240ms
  ├─ Span: autentikasi          [==]                        18ms
  ├─ Span: kueri basis data       [======]                  62ms
  ├─ Span: panggil layanan-stok        [==========]        118ms
  │    └─ Span: kueri stok              [=======]           94ms
  └─ Span: susun balasan                      [==]          22ms

Setiap span menyimpan parent_span_id, dan dari relasi itulah bentuk pohon tersusun. Span tanpa induk disebut root span — biasanya titik masuk permintaan.

Isi Sebuah Span

Nama          "GET /pesanan/:id"    — pola rute, BUKAN URL sesungguhnya
trace_id      128 bit
span_id       64 bit
parent_span_id
Waktu mulai & selesai
Atribut       pasangan kunci-nilai deskriptif
Peristiwa     kejadian berstempel waktu di dalam span
Status        Unset, Ok, atau Error
Tautan        hubungan ke span lain di trace berbeda
🚫 Jangan memasukkan nilai bervariasi ke dalam nama span

Menamai span GET /pesanan/12345 menghasilkan nama unik untuk setiap permintaan. Alat analisis mengelompokkan berdasarkan nama span, sehingga tidak ada lagi kelompok yang bermakna — mustahil melihat "berapa p99 endpoint ini" karena setiap permintaan menjadi endpoint tersendiri. Gunakan pola rute sebagai nama, dan taruh ID pada atribut.

span.updateName("GET /pesanan/:id");
span.setAttribute("pesanan.id", "12345");

Konteks dan Perambatan

Agar span di layanan berbeda tergabung dalam satu trace, trace_id harus ikut menyeberang batas jaringan. Standarnya adalah header W3C Trace Context:

traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
             │  │                                │                │
             │  trace_id (16 byte)               span_id          flag
             versi                               induk            01 = disampel

Sumber Daya: Identitas Penghasil Telemetri

service.name         wajib — tanpa ini data sulit ditelusuri
service.version
service.namespace
deployment.environment
host.name
k8s.pod.name
⚠️ Tanpa service.name, telemetri masuk sebagai "unknown_service"

Ini kesalahan paling umum saat pertama kali menyiapkan OTel. Data terkirim dengan benar, tetapi semua layanan menumpuk di bawah satu nama tak dikenal sehingga tidak dapat dibedakan. Setel lewat variabel lingkungan OTEL_SERVICE_NAME atau melalui Resource pada SDK.

Konvensi Semantik

http.request.method     GET
url.path                /pesanan/123
http.response.status_code  200
server.address          api.contoh.id
db.system               postgresql
db.query.text           SELECT * FROM pesanan WHERE id = $1
💡 Nama atribut yang seragam membuat dasbor bekerja tanpa disesuaikan

Bila satu layanan memakai http.status dan lainnya status_code, setiap kueri analisis harus menangani keduanya. Konvensi semantik menetapkan nama baku sehingga dasbor dan peringatan berlaku di seluruh layanan tanpa penyesuaian per bahasa. Perhatikan bahwa konvensi ini sempat berubah — atribut lama seperti http.method kini menjadi http.request.method.