全部产品
Search
文档中心

Application Real-Time Monitoring Service:Gunakan Jaeger untuk melaporkan data aplikasi Java

更新时间:Jul 06, 2025

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.

Penting

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

Memperoleh titik akhir

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

  2. Di halaman Integration Center, klik kartu Jaeger di bagian Server-side Applications.

  3. Di panel Jaeger, klik tab Start Integration, lalu pilih wilayah tempat Anda ingin melaporkan data.

    Catatan

    Sumber daya diinisialisasi secara otomatis di wilayah yang Anda akses untuk pertama kalinya.

  4. Konfigurasikan parameter Tipe Koneksi dan Protokol Ekspor, lalu salin titik akhir.

    • Connection Type: Jika layanan Anda diterapkan di Alibaba Cloud dan berada di wilayah yang dipilih, atur parameter ini ke Alibaba Cloud VPC Network. Jika tidak, atur ke Public Network.

    • Export Protocol: Atur parameter ini ke gRPC sesuai protokol yang didukung oleh klien.

    68

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.

Bagaimana data dilaporkan?

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

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

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.

  1. Unduh proyek demo. Buka direktori manualDemo dan jalankan program sesuai petunjuk di 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 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.

    Catatan

    Ganti <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());
  4. 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();
  5. 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();
  6. 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");
  7. 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.

    1.jpg

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

Catatan

Unduh proyek demo. Buka direktori springMvcDemo/webmvc4-boot dan jalankan program sesuai petunjuk di file README.md.

  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 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:

Catatan

Unduh proyek demo. Buka direktori grpcDemo dan jalankan program sesuai petunjuk di file README.md.

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