Setelah Anda menginstrumentasi aplikasi dengan Jaeger dan melaporkan trace data ke Managed Service for OpenTelemetry, Managed Service for OpenTelemetry mulai memantau aplikasi Anda. Anda dapat melihat serangkaian data pemantauan, seperti topologi aplikasi, jejak (traces), transaksi abnormal, transaksi lambat, dan analisis SQL. Topik ini menjelaskan cara melakukan instrumentasi manual serta instrumentasi otomatis menggunakan komponen Spring Cloud dan gRPC.
Untuk fitur lanjutan dan kemampuan pelacakan terdistribusi, kami menyarankan menyambungkan aplikasi Anda ke Managed Service for OpenTelemetry menggunakan protokol OpenTelemetry.
Panduan integrasi OpenTelemetry terperinci dan praktik terbaik kami membantu Anda memulai dengan Managed Service for OpenTelemetry. Untuk informasi selengkapnya, lihat Connect an application.
Prasyarat
Informasi latar belakang
Jaeger adalah sistem pelacakan terdistribusi open source yang kompatibel dengan API OpenTracing dan merupakan proyek lulusan dari Cloud Native Computing Foundation (CNCF). Sistem ini mengumpulkan data pemantauan waktu nyata dari berbagai sistem heterogen. Komunitas OpenTracing menyediakan banyak komponen yang mendukung berbagai framework Java. Contohnya meliputi:
Untuk melaporkan data aplikasi Java ke konsol Managed Service for OpenTelemetry menggunakan Jaeger, Anda harus terlebih dahulu menginstrumentasi aplikasi tersebut. Anda dapat melakukan instrumentasi manual atau menggunakan berbagai plugin yang tersedia untuk instrumentasi otomatis. Topik ini menjelaskan tiga metode instrumentasi berikut.
-
Instrumentasi manual
-
Instrumentasi menggunakan komponen Spring Cloud
-
Instrumentasi menggunakan komponen gRPC
Instrumentasi aplikasi Java
Sebelum Anda dapat menggunakan Jaeger untuk mengirimkan data aplikasi Java ke Managed Service for OpenTelemetry, Anda harus menginstrumentasi aplikasi tersebut. Dalam contoh ini, aplikasi diinstrumentasi secara manual.
-
Unduh proyek demo. Buka direktori manualDemo dan jalankan program sesuai petunjuk dalam 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 dapat digunakan untuk membuat span guna mencatat waktu operasi terdistribusi, mentransmisikan data antar server dalam mode pass-through menggunakan metode Extract atau Inject, atau menentukan span saat ini. Tracer juga berisi data seperti endpoint yang digunakan untuk pelaporan data, alamat IP lokal, laju pengambilan sampel, dan nama layanan. Anda dapat menyesuaikan laju pengambilan sampel untuk mengurangi overhead akibat pelaporan data.
CatatanGanti
<endpoint>dengan endpoint yang Anda peroleh di bagian "Prasyarat" topik ini.// 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 endpoint yang Anda peroleh di bagian "Prasyarat" 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)); // Atur tag sumber daya, seperti versi aplikasi dan lingkungan penerapan. 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 span. Span span = tracer.buildSpan("parentSpan").withTag("myTag", "spanFirst").start(); tracer.scopeManager().activate(span, false); tracer.activeSpan().setTag("methodName", "testTracing"); // Logika bisnis. secondBiz(); span.finish(); -
Opsi. Anda dapat menjalankan kode di atas untuk membuat root span guna mencatat operasi akar dari suatu permintaan. Jika Anda ingin mencatat operasi sebelum dan sesudah permintaan, tentukan informasi konteksnya.
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 dijalankan sekali saat permintaan dimulai. // Logika bisnis. Fungsi buildSpan dapat dijalankan beberapa kali. childSpan.finish(); tracer.activeSpan().setTag("methodName", "testCall"); // Pernyataan ini dijalankan sekali saat permintaan berakhir. scope.close(); -
Opsi. Untuk mempermudah pemecahan masalah, Anda dapat menambahkan tag kustom ke span. Misalnya, tambahkan tag kustom untuk memeriksa apakah terjadi error atau mencatat nilai kembali dari suatu permintaan.
tracer.activeSpan().setTag("methodName", "testCall"); -
Dalam sistem terdistribusi, permintaan remote procedure call (RPC) dikirim bersama data jejak. Data jejak berisi nilai parameter TraceId, ParentSpanId, SpanId, dan Sampled. Anda dapat memanggil metode Extract atau Inject untuk meneruskan data jejak dalam header permintaan HTTP. Gambar berikut menunjukkan seluruh prosesnya.

-
Panggil metode Inject di sisi 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 sisi 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(); }
-
Instrumentasi aplikasi Java dengan Spring Cloud
Untuk melaporkan data aplikasi Java ke konsol Managed Service for OpenTelemetry menggunakan Jaeger, Anda harus terlebih dahulu melakukan instrumentasi. Contoh ini menggunakan komponen Spring Cloud untuk instrumentasi. Spring Cloud menyediakan instrumentasi untuk komponen-komponen berikut:
-
@Async, @Scheduled, Executors
-
Feign, HystrixFeign
-
Hystrix
-
JDBC
-
JMS
-
Mongo
-
RabbitMQ
-
Redis
-
RxJava
-
Spring Messaging - Jejak dikirim melalui saluran pesan.
-
Spring Web (RestControllers, RestTemplates, WebAsyncTask)
-
Standard Logging - Log ditambahkan ke Span saat ini.
-
WebSocket STOMP
-
Zuul
Unduh proyek demo, buka direktori springMvcDemo/webmvc4-boot, dan jalankan program sesuai petunjuk dalam file README.
-
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 endpoint yang Anda peroleh di bagian "Prasyarat" topik ini.@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(); }
Instrumentasi aplikasi Java dengan gRPC
Untuk mengirim data aplikasi Java ke konsol Managed Service for OpenTelemetry menggunakan Jaeger, Anda harus terlebih dahulu menginstrumentasi aplikasi Anda. Contoh ini menggunakan komponen gRPC untuk instrumentasi.
Unduh proyek demo, buka direktori grpcDemo, dan jalankan program sesuai petunjuk dalam file README.
-
Buka file pom.xml dan tambahkan dependensi JAR.
<dependency> <groupId>io.opentracing.contrib</groupId> <artifactId>opentracing-grpc</artifactId> <version>0.2.3</version> </dependency> -
Di sisi server, inisialisasi objek Tracer, buat ServerTracingInterceptor, lalu tambahkan sebagai interceptor 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(); } } -
Di sisi klien, inisialisasi objek Tracer, buat ClientTracingInterceptor, lalu tambahkan sebagai interceptor channel 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: Program demo saya berjalan tanpa error, tetapi tidak ada data yang muncul di konsol. Apa penyebabnya?
J: Debug metode io.jaegertracing.thrift.internal.senders.HttpSender.send(Process process, List<Span> spans) dan periksa nilai kembalinya saat data dilaporkan. Jika muncul error 403, artinya konfigurasi endpoint salah. Harap periksa dan perbaiki.