Menghasilkan trace berkualitas membutuhkan instrumentasi yang benar. Episode ini membahas auto-instrumentation untuk berbagai bahasa, pembuatan span manual, context propagation W3C, serta best practices penamaan span dan atribut agar trace mudah dibaca dan diquery.

Tempo menyediakan penyimpanan, namun trace tidak muncul tanpa instrumentasi. Di episode ini kalian belajar menghasilkan trace berkualitas dengan OpenTelemetry: mulai dari auto-instrumentation yang praktis, pembuatan span manual untuk logika khusus, sampai context propagation yang menyatukan trace lintas service.
Di akhir episode kalian akan tahu cara membuat aplikasi yang menghasilkan trace lengkap dengan nama dan atribut konsisten — bahan baku untuk query TraceQL di episode 15.
Auto-instrumentation otomatis menangani framework populer tanpa mengubah kode bisnis:
opentelemetry-javaagent.jar dijalankan dengan flag -javaagent.opentelemetry-instrumentation-* dan command opentelemetry-instrument.@opentelemetry/instrumentation bersama auto-loader.OpenTelemetry.AutoInstrumentation.pip install opentelemetry-distro opentelemetry-instrumentation-flask
opentelemetry-instrument python3 app.pyPerintah opentelemetry-instrument python3 app.py menjalankan aplikasi dengan tracing HTTP aktif tanpa menyentuh kode aplikasi.
Untuk logika yang tidak tercakup auto-instrumentation, buat span secara manual:
from opentelemetry import trace
tracer = trace.get_tracer("orders")
def process(order_id):
with tracer.start_as_current_span("orders.process") as span:
span.set_attribute("order.id", order_id)
result = charge(order_id)
span.set_status(trace.Status(trace.StatusCode.OK))
return resultKonstruksi with tracer.start_as_current_span("orders.process") memastikan span ditutup otomatis dan menjadi child dari span aktif.
order.id.span.add_event("charge.attempt", {"attempt": 1})
try:
charge(order_id)
except Exception as exc:
span.record_exception(exc)
span.set_status(trace.Status(trace.StatusCode.ERROR, str(exc)))Pola span.record_exception(exc) menyimpan error di dalam trace sehingga debugging di episode 21 jadi jauh lebih cepat.
Agar satu trace menyambung antar service, context harus diteruskan lewat header HTTP:
traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01Header traceparent membawa versi, TraceID, SpanID, dan sampling flags. Auto-instrumentation biasanya sudah menangani injeksi dan ekstraksi context secara otomatis.
python3 -c "from opentelemetry import propagate; print(propagate.get_global_text_map_propagator())"Perintah python3 -c ... menampilkan propagator global yang sedang aktif di proses Python.
verb.noun seperti orders.process dan checkout.pay — bukan nama function bebas.http.method, http.route, db.system.Warning
Jangan menaruh data PII sebagai atribut span. Atribut diindex untuk query dan bisa muncul di dashboard — ikuti praktik redaction yang dibahas di episode 33.
Di episode 14 ini kalian memahami auto-instrumentation untuk Java, Python, Node.js, dan .NET, cara membuat span manual dengan atribut, event, exception, dan status, context propagation W3C dengan propagator dan baggage, serta best practices penamaan span dan atribut.
Inti yang harus dibawa pulang:
with agar selalu tertutup.Di episode 15 selanjutnya kita akan membahas TraceQL — bahasa query Tempo untuk mencari trace berdasarkan atribut span, hubungan antar span, operator pembanding dan logika, hingga query lanjutan dan metrik dari trace. Trace yang kalian hasilkan akan bisa dijelajahi dengan presisi.