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
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
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
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
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.