All Products
Search
Document Center

Application Real-Time Monitoring Service:Laporkan data aplikasi Java menggunakan Jaeger

Last Updated:Sep 10, 2026

Setelah Anda menginstrumenasi aplikasi dengan Jaeger dan melaporkan data jejak ke Managed Service for OpenTelemetry, Managed Service for OpenTelemetry akan mulai memantau aplikasi Anda. Anda dapat melihat berbagai data pemantauan, seperti topologi aplikasi, jejak (traces), transaksi abnormal, transaksi lambat, dan analisis SQL. Topik ini menjelaskan cara melakukan instrumenasi manual serta instrumenasi otomatis menggunakan komponen Spring Cloud dan gRPC.

Penting

Untuk fitur lanjutan dan kemampuan pelacakan (tracing), kami merekomendasikan menghubungkan 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 Hubungkan aplikasi.

Prasyarat

Peroleh informasi endpoint

  1. Masuk ke Konsol ARMS. Di panel navigasi sebelah kiri, klik Integration Center.

  2. Di area Server-side Applications, klik kartu Jaeger.

  3. Di panel Jaeger, pilih wilayah tempat Anda ingin melaporkan data.

    Catatan

    Sumber daya akan diprovisikan secara otomatis saat pertama kali Anda mengakses suatu wilayah.

  4. Pilih Connection Type dan Export Protocol, lalu salin informasi endpoint-nya.

    • Connection Type: Jika layanan Anda diterapkan di Alibaba Cloud dan wilayahnya sama dengan wilayah integrasi yang dipilih, gunakan jaringan VPC Alibaba Cloud. Jika tidak, gunakan jaringan publik.

    • Export Protocol: Pilih protokol yang didukung oleh klien Anda. Misalnya, Anda dapat memilih gRPC.

    Di halaman informasi endpoint, atur wilayah ke China (Hangzhou), atur Connection Type ke Alibaba Cloud VPC network, dan atur Export Protocol ke gRPC. Contoh perintah untuk memperoleh endpoint: ./jaeger-agent --reporter.grpc.host-port=tracing-analysis-dc-hz-internal.aliyuncs.com:1883 --agent.tags=Authentication. Catatan: Untuk versi Jaeger Agent sebelum 1.15, ganti --agent.tags dengan --jaeger.tags.

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 menginstrumenasi aplikasi tersebut. Anda dapat melakukan instrumenasi manual atau menggunakan berbagai plugin yang tersedia untuk instrumenasi otomatis. Topik ini menjelaskan tiga metode instrumenasi berikut.

  • Instrumenasi manual

  • Instrumenasi menggunakan komponen Spring Cloud

  • Instrumenasi menggunakan komponen gRPC

Bagaimana data dilaporkan?

  • Gambar berikut menunjukkan cara melaporkan data tanpa menggunakan agen Jaeger.

  • Gambar berikut menunjukkan cara melaporkan data menggunakan agen Jaeger.

Instrumenasi aplikasi Java

Sebelum Anda dapat menggunakan Jaeger untuk mengirimkan data aplikasi Java ke Managed Service for OpenTelemetry, Anda harus menginstrumenasi aplikasi tersebut. Dalam contoh ini, aplikasi diinstrumenasi secara manual.

  1. Unduh proyek demo. Buka direktori manualDemo dan jalankan program sesuai petunjuk dalam file README.md.

  2. 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>
  3. Konfigurasikan parameter inisialisasi dan buat tracer.

    Tracer dapat digunakan untuk membuat span guna mencatat waktu operasi terdistribusi, mentransmisikan data lintas 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 (sampling rate), dan nama layanan. Anda dapat menyesuaikan laju pengambilan sampel untuk mengurangi overhead akibat pelaporan data.

    Catatan

    Ganti <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());
  4. 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();
  5. 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();
  6. Opsi. Untuk mempermudah pemecahan masalah, Anda dapat menambahkan tag kustom ke span. Misalnya, Anda dapat menambahkan tag kustom untuk memeriksa apakah terjadi error atau mencatat nilai kembali dari suatu permintaan.

    tracer.activeSpan().setTag("methodName", "testCall");
  7. Dalam sistem terdistribusi, permintaan remote procedure call (RPC) dikirim bersama data jejak (trace data). 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 keseluruhan prosesnya.

    1.jpg

    1. 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()");
                  }
              });
          }
    2. 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();
      }
                                      

Instrumenasi aplikasi Java dengan Spring Cloud

Untuk melaporkan data aplikasi Java ke konsol Managed Service for OpenTelemetry menggunakan Jaeger, Anda harus terlebih dahulu melakukan instrumenasi. Contoh ini menggunakan komponen Spring Cloud untuk instrumenasi. Spring Cloud menyediakan instrumenasi 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

Catatan

Unduh proyek demo, buka direktori springMvcDemo/webmvc4-boot, dan jalankan program sesuai petunjuk dalam file README.

  1. 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>
  2. Tambahkan bean OpenTracing Tracer.

    Catatan

    Ganti <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();
    }

Instrumenasi aplikasi Java dengan gRPC

Untuk mengirimkan data aplikasi Java ke konsol Managed Service for OpenTelemetry menggunakan Jaeger, Anda harus terlebih dahulu menginstrumenasi aplikasi Anda. Contoh ini menggunakan komponen gRPC untuk instrumenasi.

Catatan

Unduh proyek demo, buka direktori grpcDemo, dan jalankan program sesuai petunjuk dalam file README.

  1. Buka file pom.xml dan tambahkan dependensi JAR.

    <dependency>
        <groupId>io.opentracing.contrib</groupId>
        <artifactId>opentracing-grpc</artifactId>
        <version>0.2.3</version>
    </dependency>
  2. 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();
            }
        }
  3. 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. Silakan periksa dan perbaiki.