Setelah Anda menggunakan Jaeger untuk menginstrumentasikan aplikasi Java dan melaporkan data jejak ke Managed Service for OpenTelemetry, Managed Service for OpenTelemetry mulai memantau aplikasi Java. Anda dapat melihat data pemantauan aplikasi seperti topologi aplikasi, jejak, transaksi abnormal, transaksi lambat, dan analisis SQL. Topik ini menjelaskan cara menginstrumentasikan aplikasi Java secara manual dan menggunakan Spring Cloud atau gRPC untuk menginstrumentasikan aplikasi Java secara otomatis.
Kami merekomendasikan agar Anda menghubungkan aplikasi ke Managed Service for OpenTelemetry menggunakan Protokol OpenTelemetry (OTLP). Dengan pendekatan ini, Anda mendapatkan lebih banyak fitur, pelacakan canggih, dan pengalaman pengguna terbaik.
Alibaba Cloud menyediakan panduan terperinci tentang cara mengintegrasikan OpenTelemetry dengan aplikasi, serta praktik terbaik dalam penggunaan OpenTelemetry, untuk membantu Anda segera memulai dengan Managed Service for OpenTelemetry. Untuk informasi lebih lanjut, lihat Persiapan.
Prasyarat
Informasi latar belakang
Jaeger adalah sistem pelacakan terdistribusi sumber terbuka yang kompatibel dengan API OpenTracing dan telah bergabung dengan Asosiasi Komputasi Cloud Native (CNCF). Jaeger mengumpulkan data pemantauan waktu nyata dari berbagai sistem heterogen. Komunitas OpenTracing menyediakan banyak komponen yang mendukung kerangka kerja Java berikut:
Untuk menggunakan Jaeger melaporkan data aplikasi Java ke konsol Managed Service for OpenTelemetry, Anda harus terlebih dahulu menginstrumentasikan aplikasi. Anda dapat melakukannya secara manual atau menggunakan komponen yang ada. Topik ini menjelaskan tiga metode yang dapat digunakan:
Menginstrumentasikan aplikasi Java secara manual.
Menggunakan Spring Cloud untuk menginstrumentasikan aplikasi Java.
Menggunakan gRPC untuk menginstrumentasikan aplikasi Java.
Menginstrumentasikan aplikasi Java
Sebelum menggunakan Jaeger untuk mengirimkan data aplikasi Java ke Managed Service for OpenTelemetry, Anda harus menginstrumentasikan aplikasi tersebut. Contoh ini menunjukkan cara menginstrumentasikan aplikasi secara manual.
Unduh proyek demo. Buka direktori manualDemo dan jalankan program sesuai petunjuk di file README.md.
Tambahkan dependensi berikut untuk klien Jaeger ke file pom.xml:
<dependency> <groupId>io.jaegertracing</groupId> <artifactId>jaeger-client</artifactId> <version>0.31.0</version> </dependency>Konfigurasikan parameter inisialisasi dan buat tracer.
Tracer digunakan untuk membuat rentang yang mencatat waktu operasi terdistribusi, mentransmisikan data lintas server menggunakan metode Extract atau Inject, atau menentukan rentang saat ini. Tracer juga mencakup data seperti titik akhir pelaporan, alamat IP lokal, laju pengambilan sampel, dan nama layanan. Anda dapat menyesuaikan laju pengambilan sampel untuk mengurangi overhead pelaporan data.
CatatanGanti
<endpoint>dengan titik akhir yang diperoleh di bagian "Prasyarat".// Ganti manualDemo dengan nama aplikasi Anda. io.jaegertracing.Configuration config = new io.jaegertracing.Configuration("manualDemo"); io.jaegertracing.Configuration.SenderConfiguration sender = new io.jaegertracing.Configuration.SenderConfiguration(); // Ganti <endpoint> dengan titik akhir yang Anda peroleh di bagian "Prasyarat" dari topik ini. sender.withEndpoint("<endpoint>"); config.withSampler(new io.jaegertracing.Configuration.SamplerConfiguration().withType("const").withParam(1)); config.withReporter(new io.jaegertracing.Configuration.ReporterConfiguration().withSender(sender).withMaxQueueSize(10000)); // Tetapkan tag sumber daya, seperti versi aplikasi dan lingkungan penyebaran. Map<String, String> map = new HashMap<>(); map.put("service.version", "1.0.0"); map.put("deployment.environment", "test"); config.withTracerTags(map); GlobalTracer.register(config.getTracer());Catat data permintaan.
Tracer tracer = GlobalTracer.get(); // Buat rentang. Span span = tracer.buildSpan("parentSpan").withTag("myTag", "spanFirst").start(); tracer.scopeManager().activate(span, false); tracer.activeSpan().setTag("methodName", "testTracing"); // Logika bisnis. secondBiz(); span.finish();Opsional. Anda dapat menjalankan kode sebelumnya untuk membuat rentang root yang mencatat operasi root dari permintaan. Untuk mencatat operasi sebelum dan sesudah permintaan, tentukan informasi konteks.
Tracer tracer = GlobalTracer.get(); Span parentspan = tracer.activeSpan(); Tracer.SpanBuilder spanBuilder = tracer.buildSpan("childSpan").withTag("myTag", "spanSecond"); if (parentspan !=null) { spanBuilder.asChildOf(parentspan).start(); } Span childSpan = spanBuilder.start(); Scope scope = tracer.scopeManager().activate(childSpan); // Pernyataan ini dieksekusi sekali saat permintaan dimulai. // Logika bisnis. Fungsi buildSpan dapat dieksekusi beberapa kali. childSpan.finish(); tracer.activeSpan().setTag("methodName", "testCall"); // Pernyataan ini dieksekusi sekali saat permintaan berakhir. scope.close();Opsional. Untuk memecahkan masalah secara efisien, tambahkan tag kustom ke rentang. Misalnya, Anda dapat menambahkan tag untuk memeriksa kesalahan atau mencatat nilai yang dikembalikan oleh permintaan.
tracer.activeSpan().setTag("methodName", "testCall");Dalam sistem terdistribusi, permintaan panggilan prosedur jarak jauh (RPC) dikirim bersama dengan data jejak. Data jejak berisi nilai-nilai parameter TraceId, ParentSpanId, SpanId, dan Sampled. Gunakan metode Extract atau Inject untuk melewati data jejak di header permintaan HTTP. Gambar berikut menunjukkan seluruh proses.

Panggil metode Inject di klien untuk menentukan informasi konteks.
private void attachTraceInfo(Tracer tracer, Span span, final Request request) { tracer.inject(span.context(), Format.Builtin.TEXT_MAP, new TextMap() { @Override public void put(String key, String value) { request.setHeader(key, value); } @Override public Iterator<Map.Entry<String, String>> iterator() { throw new UnsupportedOperationException("TextMapInjectAdapter should only be used with Tracer.inject()"); } }); }Panggil metode Extract di server untuk mengekstrak informasi konteks.
protected Span extractTraceInfo(Request request, Tracer tracer) { Tracer.SpanBuilder spanBuilder = tracer.buildSpan("/api/xtrace/test03"); try { SpanContext spanContext = tracer.extract(Format.Builtin.TEXT_MAP, new TextMapExtractAdapter(request.getAttachments())); if (spanContext !=null) { spanBuilder.asChildOf(spanContext); } } catch (Exception e) { spanBuilder.withTag("Error", "extract from request fail, error msg:" + e.getMessage()); } return spanBuilder.start(); }
Gunakan Spring Cloud untuk menginstrumentasikan aplikasi Java
Untuk menggunakan Jaeger melaporkan data aplikasi Java ke konsol Managed Service for OpenTelemetry, Anda harus terlebih dahulu menginstrumentasikan aplikasi. Contoh ini menunjukkan cara menggunakan Spring Cloud untuk menginstrumentasikan aplikasi. Berikut adalah beberapa komponen yang dapat diinstrumentasikan:
@Async, @Scheduled, Executors
Feign, HystrixFeign
Hystrix
JDBC
JMS
Mongo
RabbitMQ
Redis
RxJava
Spring Messaging: Pesan jejak dikirim melalui saluran pesan.
Spring Web (RestControllers, RestTemplates, WebAsyncTask)
Logging Standar: Log ditambahkan ke rentang saat ini.
WebSocket STOMP
Zuul
Lakukan langkah-langkah berikut untuk menggunakan Spring Cloud menginstrumentasikan aplikasi:
Unduh proyek demo. Buka direktori springMvcDemo/webmvc4-boot dan jalankan program sesuai petunjuk di file README.md.
Buka file pom.xml dan tambahkan dependensi JAR.
<dependency> <groupId>io.opentracing.contrib</groupId> <artifactId>opentracing-spring-cloud-starter</artifactId> <version>0.5.8</version> </dependency> <dependency> <groupId>io.jaegertracing</groupId> <artifactId>jaeger-client</artifactId> <version>1.4.0</version> </dependency>Tambahkan bean OpenTracing Tracer.
CatatanGanti
<endpoint>dengan titik akhir yang diperoleh di bagian "Prasyarat".@Bean public io.opentracing.Tracer tracer() { io.jaegertracing.Configuration config = new io.jaegertracing.Configuration("springFrontend"); io.jaegertracing.Configuration.SenderConfiguration sender = new io.jaegertracing.Configuration.SenderConfiguration(); sender.withEndpoint("<endpoint>"); config.withSampler(new io.jaegertracing.Configuration.SamplerConfiguration().withType("const").withParam(1)); config.withReporter(new io.jaegertracing.Configuration.ReporterConfiguration().withSender(sender).withMaxQueueSize(10000)); return config.getTracer(); }
Gunakan gRPC untuk menginstrumentasikan aplikasi Java
Untuk menggunakan Jaeger melaporkan data aplikasi Java ke konsol Managed Service for OpenTelemetry, Anda harus terlebih dahulu menginstrumentasikan aplikasi. Contoh ini menunjukkan cara menggunakan gRPC untuk menginstrumentasikan aplikasi.
Gunakan gRPC untuk menginstrumentasikan aplikasi dengan melakukan langkah-langkah berikut:
Unduh proyek demo. Buka direktori grpcDemo dan jalankan program sesuai petunjuk di file README.md.
Buka file pom.xml dan tambahkan dependensi JAR.
<dependency> <groupId>io.opentracing.contrib</groupId> <artifactId>opentracing-grpc</artifactId> <version>0.2.3</version> </dependency>Inisialisasi objek Tracer di server, buat kelas ServerTracingInterceptor, lalu tambahkan interceptor ke server.
import io.opentracing.Tracer; public class YourServer { private int port; private Server server; private final Tracer tracer; private void start() throws IOException { ServerTracingInterceptor tracingInterceptor = new ServerTracingInterceptor(this.tracer); // Jika menggunakan GlobalTracer: // ServerTracingInterceptor tracingInterceptor = new ServerTracingInterceptor(); server = ServerBuilder.forPort(port) .addService(tracingInterceptor.intercept(someServiceDef)) .build() .start(); } }Inisialisasi objek Tracer di klien, buat kelas ClientTracingInterceptor, lalu tambahkan interceptor ke klien.
import io.opentracing.Tracer; public class YourClient { private final ManagedChannel channel; private final GreeterGrpc.GreeterBlockingStub blockingStub; private final Tracer tracer; public YourClient(String host, int port) { channel = ManagedChannelBuilder.forAddress(host, port) .usePlaintext(true) .build(); ClientTracingInterceptor tracingInterceptor = new ClientTracingInterceptor(this.tracer); // Jika menggunakan GlobalTracer: // ClientTracingInterceptor tracingInterceptor = new ClientTracingInterceptor(); blockingStub = GreeterGrpc.newBlockingStub(tracingInterceptor.intercept(channel)); } }
FAQ
T: Apa yang harus saya lakukan jika tidak ada data yang dilaporkan ke konsol setelah menjalankan program demo?
J: Debug metode io.jaegertracing.thrift.internal.senders.HttpSender.send(Process process, List<Span> spans) dan periksa nilai pengembalian pelaporan data. Jika kesalahan HTTP 403 dikembalikan, Anda telah menentukan titik akhir yang tidak valid. Ubah titik akhir ke yang valid.
