Amalan Terbaik Instrumentasi Manual
Fahami masa dan cara menggunakan instrumentasi manual untuk kawalan terperinci terhadap data kebolehcerapan anda. Pelajari cara memperkaya jejak dengan atribut tersuai.
Amalan Terbaik Instrumentasi Manual ialah pelajaran Kebolehlihatan Sistem: Pengelogan, Metrik & Penjejakan (ELK + OpenTelemetry) percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Kebolehlihatan Sistem: Pengelogan, Metrik & Penjejakan (ELK + OpenTelemetry), dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Kebolehlihatan Sistem: Pengelogan, Metrik & Penjejakan (ELK + OpenTelemetry) merangkumi sejumlah 4 pelajaran.
Pengenalan Instrumentasi Manual
Selamat datang! Dalam pelajaran ini, kita akan mendalami instrumentasi manual dengan OpenTelemetry. Walaupun instrumentasi automatik bagus untuk hasil pantas, kawalan manual memberikan ketepatan.
Instrumentasi manual membolehkan anda merekod butiran yang sangat khusus tentang operasi dalaman aplikasi anda. Ini penting untuk menyahpepijat logik perniagaan atau komponen tersuai yang kompleks.
Mengapa Manual Berbanding Automatik?
Instrumentasi automatik mengumpulkan data daripada pustaka dan rangka kerja biasa secara automatik. Walau bagaimanapun, ia tidak dapat mengetahui logik aplikasi unik anda.
- Logik Tersuai: Instrumentasikan fungsi atau blok kod tertentu.
- Konteks Perniagaan: Tambahkan atribut yang berkaitan dengan domain perniagaan anda.
- Kawalan Terperinci: Tentukan sempadan dan hubungan rentang dengan tepat.
- Liputan yang Hilang: Liputi bahagian yang tidak dicapai oleh instrumentasi automatik.
Mencipta Rentang Pertama Anda
Rentang mewakili satu operasi dalam sesuatu jejak. Untuk menciptanya secara manual, anda memerlukan Tracer, yang diperoleh daripada SDK OpenTelemetry.
Berikut ialah cara memulakan rentang baharu. Ingat untuk sentiasa menamatkan rentang anda!
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.SpanBuilder;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
public class ManualSpanDemo {
public static void main(String[] args) {
// Setup OpenTelemetry SDK (simplified for demo)
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder().build();
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
.setTracerProvider(sdkTracerProvider)
.buildAndRegisterGlobal();
Tracer tracer = openTelemetry.getTracer("my-app", "1.0.0");
// Start a new span
Span span = tracer.spanBuilder("MyCustomOperation").startSpan();
try {
System.out.println("Executing custom operation...");
// Simulate work
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
// Always end the span!
span.end();
System.out.println("Span ended.");
}
}
}Mengaktifkan Rentang dengan Skop
Untuk menjadi sebahagian daripada konteks jejak semasa (dan supaya rentang anak dipautkan kepadanya secara automatik), sesuatu rentang perlu aktif. Cara terbaik untuk menguruskannya adalah dengan menggunakan Scope bersama pernyataan try-with-resources.
Ini memastikan rentang ditetapkan sebagai aktif secara automatik dan ditamatkan apabila blok itu keluar.
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.Scope;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
public class ActiveSpanDemo {
public static void main(String[] args) {
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder().build();
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
.setTracerProvider(sdkTracerProvider)
.buildAndRegisterGlobal();
Tracer tracer = openTelemetry.getTracer("my-app", "1.0.0");
Span parentSpan = tracer.spanBuilder("ParentOperation").startSpan();
try (Scope parentScope = parentSpan.makeCurrent()) { // Parent span is active
System.out.println("Parent operation started.");
Span childSpan = tracer.spanBuilder("ChildOperation").startSpan(); // Automatically links to parent
try (Scope childScope = childSpan.makeCurrent()) {
System.out.println("Child operation executing...");
Thread.sleep(50);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
childSpan.end();
System.out.println("Child operation ended.");
}
Thread.sleep(50);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
parentSpan.end();
System.out.println("Parent operation ended.");
}
}
}Menambah Atribut Tersuai
Atribut ialah pasangan kunci-nilai yang memberikan maklumat kontekstual tentang sesuatu rentang. Atribut amat penting untuk menjadikan jejak anda mudah dicari dan difahami.
Anda boleh menambah atribut pada rentang menggunakan span.setAttribute(). Gunakan kunci yang deskriptif dan nilai yang berkaitan.
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.Scope;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
public class SpanAttributesDemo {
public static void main(String[] args) {
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder().build();
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
.setTracerProvider(sdkTracerProvider)
.buildAndRegisterGlobal();
Tracer tracer = openTelemetry.getTracer("my-app", "1.0.0");
Span span = tracer.spanBuilder("ProcessOrder").startSpan();
try (Scope scope = span.makeCurrent()) {
System.out.println("Processing order...");
// Add attributes for order details
span.setAttribute("order.id", "XYZ789");
span.setAttribute("customer.email", "user@example.com");
span.setAttribute(AttributeKey.longKey("item.count"), 3L);
Thread.sleep(150);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
span.end();
System.out.println("Order processed. Span ended with attributes.");
}
}
}Merekod Peristiwa Rentang
Peristiwa ialah mesej bertanda masa yang dikaitkan dengan sesuatu rentang. Peristiwa berguna untuk menandakan detik penting atau merekod tindakan tertentu yang berlaku sepanjang hayat rentang, tanpa mencipta rentang anak baharu.
Anggaplah peristiwa sebagai log kecil dalam jejak anda yang menambahkan butiran pada operasi tertentu.
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.Scope;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
public class SpanEventsDemo {
public static void main(String[] args) {
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder().build();
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
.setTracerProvider(sdkTracerProvider)
.buildAndRegisterGlobal();
Tracer tracer = openTelemetry.getTracer("my-app", "1.0.0");
Span span = tracer.spanBuilder("UserLogin").startSpan();
try (Scope scope = span.makeCurrent()) {
System.out.println("User login initiated...");
span.addEvent("AuthenticationStarted");
Thread.sleep(80);
// Add an event with attributes
span.addEvent("DatabaseCheck", Attributes.of(
AttributeKey.stringKey("db.query"), "SELECT * FROM users WHERE id=?"
));
Thread.sleep(70);
span.addEvent("AuthenticationSuccessful");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
span.end();
System.out.println("User login span ended with events.");
}
}
}Mengendalikan Ralat dalam Rentang
Adalah penting untuk menandakan span sebagai gagal apabila berlaku ralat. Ini membantu mengenal pasti operasi bermasalah dalam sistem anda dengan cepat.
Anda boleh menetapkan status span kepada ERROR dan merekodkan pengecualian yang menyebabkan kegagalan itu. Ini menyediakan konteks yang terperinci untuk penyahpepijatan.
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.api.trace.Scope;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
public class SpanErrorDemo {
public static void main(String[] args) {
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder().build();
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
.setTracerProvider(sdkTracerProvider)
.buildAndRegisterGlobal();
Tracer tracer = openTelemetry.getTracer("my-app", "1.0.0");
Span span = tracer.spanBuilder("CriticalFunction").startSpan();
try (Scope scope = span.makeCurrent()) {
System.out.println("Executing critical function...");
// Simulate an error condition
if (Math.random() > 0.5) {
throw new RuntimeException("Simulated critical failure!");
}
System.out.println("Critical function completed successfully.");
} catch (Exception e) {
System.out.println("Error caught: " + e.getMessage());
span.setStatus(StatusCode.ERROR, "Function failed");
span.recordException(e);
} finally {
span.end();
System.out.println("Critical function span ended.");
}
}
}Amalan Terbaik untuk Span
Untuk mendapatkan manfaat sepenuhnya daripada instrumentasi manual, ikuti garis panduan berikut:
- Keperincian: Cipta span untuk unit kerja yang bermakna, bukan untuk setiap baris kod.
- Nama Bermakna: Gunakan nama yang jelas dengan kardinaliti rendah (contohnya,
user.login,db.query). - Atribut Terperinci: Tambahkan konteks perniagaan dan teknikal yang berkaitan sebagai atribut.
- Sentiasa Tamatkan Span: Gunakan
try-with-resourcesatauspan.end()secara eksplisit dalam blokfinally. - Elakkan Instrumentasi Berlebihan: Terlalu banyak span boleh menambahkan overhed. Tumpukan pada laluan kritikal.
Memautkan Span Secara Eksplisit
Walaupun makeCurrent() mengendalikan kebanyakan pemautan induk-anak, kadangkala anda perlu memautkan span secara eksplisit. Keadaan ini biasa berlaku dalam senario tak segerak atau apabila berintegrasi dengan sistem yang tidak diinstrumentasikan.
Anda boleh menggunakan SpanBuilder.setParent() atau setNoParent() untuk mengawal hubungan induk-anak.
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.api.trace.TraceFlags;
import io.opentelemetry.api.trace.TraceState;
import io.opentelemetry.context.Context;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
public class ExplicitLinkDemo {
public static void main(String[] args) {
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder().build();
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
.setTracerProvider(sdkTracerProvider)
.buildAndRegisterGlobal();
Tracer tracer = openTelemetry.getTracer("my-app", "1.0.0");
// Imagine a span from an external system, represented by its context
SpanContext externalContext = SpanContext.create(
"1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d", // Trace ID
"0000000000000001", // Span ID
TraceFlags.getDefault(), TraceState.getDefault()
);
// Create a new span that links to this external context
Span linkedSpan = tracer.spanBuilder("ProcessingExternalMessage")
.setParent(Context.current().with(Span.wrap(externalContext))) // Link to external context
.setSpanKind(SpanKind.CONSUMER) // Indicate it's a message consumer
.startSpan();
try {
System.out.println("Processing message from external system...");
linkedSpan.setAttribute("message.id", "MSG-123");
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
linkedSpan.end();
System.out.println("Linked span ended.");
}
}
}Pemeriksaan Instrumentasi Manual
Anda sedang melaksanakan ciri baharu yang mengira mata kesetiaan pengguna. Anda mahu menginstrumentasikan pengiraan khusus ini untuk menjejaki tempohnya dan jumlah mata akhir yang diberikan. Antara pilihan berikut, yang manakah cara paling sesuai untuk merekodkan jumlah mata akhir menggunakan instrumentasi manual OpenTelemetry?
Imbas Kembali: Kawalan Manual
Dalam pelajaran ini, kita meneroka instrumentasi manual dengan OpenTelemetry. Anda telah mempelajari:
- Bila hendak memilih instrumentasi manual berbanding instrumentasi automatik untuk mendapatkan kawalan yang terperinci.
- Cara mencipta, mengaktifkan dan menamatkan span.
- Kepentingan atribut untuk menambahkan konteks yang terperinci pada surihan anda.
- Cara menggunakan peristiwa untuk menandakan detik tertentu dalam span.
- Amalan terbaik untuk mengendalikan ralat dan memautkan span secara eksplisit.
Penguasaan instrumentasi manual memberikan keterlihatan yang tiada tandingan terhadap logik dan prestasi unik aplikasi anda.
Pelajari Kebolehlihatan Sistem: Pengelogan, Metrik & Penjejakan (ELK + OpenTelemetry) dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 12
- Pelajaran
- 48
Soalan Lazim
Adakah pelajaran “Amalan Terbaik Instrumentasi Manual” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Kebolehlihatan Sistem: Pengelogan, Metrik & Penjejakan (ELK + OpenTelemetry), termasuk “Amalan Terbaik Instrumentasi Manual”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Kebolehlihatan Sistem: Pengelogan, Metrik & Penjejakan (ELK + OpenTelemetry) merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Amalan Terbaik Instrumentasi Manual”?
Fahami masa dan cara menggunakan instrumentasi manual untuk kawalan terperinci terhadap data kebolehcerapan anda. Pelajari cara memperkaya jejak dengan atribut tersuai. Anda berlatih Kebolehlihatan Sistem: Pengelogan, Metrik & Penjejakan (ELK + OpenTelemetry) menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Kebolehlihatan Sistem: Pengelogan, Metrik & Penjejakan (ELK + OpenTelemetry)?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Kebolehlihatan Sistem: Pengelogan, Metrik & Penjejakan (ELK + OpenTelemetry) di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Amalan Terbaik Instrumentasi Manual” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Kebolehlihatan Sistem: Pengelogan, Metrik & Penjejakan (ELK + OpenTelemetry) ini?
Ya. Setiap pelajaran Kebolehlihatan Sistem: Pengelogan, Metrik & Penjejakan (ELK + OpenTelemetry) menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Teknik Instrumentasi Automatik
- Amalan Terbaik Instrumentasi Manual
- Penyebaran Konteks dan Bagasi
- Atribut Rentang, Peristiwa dan Status