全部产品
Search
文档中心

Managed Service for OpenTelemetry:Gunakan Zipkin untuk melaporkan data aplikasi Java

更新时间:Jul 02, 2025

Zipkin adalah sistem pelacakan terdistribusi open source yang dikembangkan oleh Twitter untuk melacak data secara real-time. Sistem ini digunakan untuk mengumpulkan data pemantauan real-time dari berbagai sistem heterogen. Anda dapat menggunakan Zipkin untuk melaporkan data aplikasi Java ke Analisis Tracing.

Prasyarat

Untuk mendapatkan titik akhir Jaeger atau Zipkin, ikuti langkah-langkah berikut:

  1. Masuk ke Konsol Managed Service for OpenTelemetry.

  2. Di bilah navigasi sisi kiri, klik Cluster Configurations. Pada halaman yang muncul, klik tab Access point information.

  3. Pada bilah navigasi atas, pilih wilayah. Di bagian Cluster Information, aktifkan Show Token.

  4. Atur parameter Client ke Jaeger atau Zipkin. Dalam contoh ini, Jaeger dipilih.

    Dapatkan titik akhir Jaeger atau Zipkin di kolom Related Information tabel di bagian bawah.

    Jaeger/Zipkin接入点信息

    Catatan

    Jika aplikasi Anda diterapkan di lingkungan produksi Alibaba Cloud, gunakan titik akhir VPC. Jika tidak, gunakan titik akhir publik. Secara umum, gunakan titik akhir v2 untuk Zipkin. Gunakan titik akhir v1 hanya jika Anda memahami Zipkin dengan baik.

Informasi Latar Belakang

Zipkin telah berkembang selama bertahun-tahun dan mendukung berbagai kerangka kerja komprehensif, termasuk beberapa kerangka kerja Java berikut. Untuk informasi lebih lanjut, kunjungi brave-instrumentation.

  • Apache HttpClient
  • Dubbo
  • gRPC
  • JAX-RS 2.X
  • Jersey Server
  • Java Message Service (JMS)
  • Kafka
  • MySQL
  • Netty
  • OkHttp
  • Servlet
  • Spark
  • Spring Boot
  • Spring MVC

Untuk melaporkan data aplikasi Java ke konsol Analisis Tracing menggunakan Zipkin, Anda harus menginstrumentasikan aplikasi terlebih dahulu. Instrumentasi dapat dilakukan secara manual atau menggunakan komponen yang ada.

Gambar berikut menunjukkan cara melaporkan data menggunakan Zipkin.

Instrumentasi Manual Aplikasi Java

Untuk menginstrumentasikan aplikasi Java secara manual, Anda perlu menulis kode instrumentasi.

Catatan Unduh proyek demo. Kemudian, buka direktori manualDemo dan ikuti langkah-langkah dalam file README.md untuk menjalankan program demo.
  1. Tambahkan paket JAR sebagai dependensi.
    <dependency>
                <groupId>io.zipkin.brave</groupId>
                <artifactId>brave</artifactId>
                <version>5.4.2</version>
            </dependency>
            <dependency>
                <groupId>io.zipkin.reporter2</groupId>
                <artifactId>zipkin-sender-okhttp3</artifactId>
                <version>2.7.9</version>
            </dependency>
  2. Buat tracer.
    private static final String zipkinEndPoint = "<endpoint>";
      ...
      // Buat objek yang digunakan untuk mengirim data.
      OkHttpSender sender = OkHttpSender.newBuilder().endpoint(zipkinEndPoint).build();
    
      // Buat objek yang digunakan untuk melaporkan data.
      Reporter<Span> reporter = AsyncReporter.builder(sender).build();
    
      tracing = Tracing.newBuilder().localServiceName(localServiceName).spanReporter(reporter).build();
  3. Buat rentang dan rentang anak.
    private void firstBiz() {
            // Buat rentang root.
            tracing.tracer().startScopedSpan("parentSpan");
            Span span =  tracing.tracer().currentSpan();
            span.tag("key", "firstBiz");
            secondBiz();
            span.finish();
        }
    
        private void secondBiz() {
            tracing.tracer().startScopedSpanWithParent("childSpan", tracing.tracer().currentSpan().context());
            Span childSpan =  tracing.tracer().currentSpan();
            childSpan.tag("key", "secondBiz");
            childSpan.finish();
            System.out.println("end tracing,id:" + childSpan.context().traceIdString());
        }
  4. Opsional. Tambahkan tag kustom ke rentang untuk pemecahan masalah cepat. Misalnya, Anda dapat menambahkan tag kustom untuk mencatat nilai pengembalian permintaan atau memeriksa apakah terjadi kesalahan.
    tracer.activeSpan().setTag("http.status_code", "500");
  5. Dalam sistem terdistribusi, permintaan prosedur jarak jauh (RPC) dikirim bersama dengan data jejak. Data jejak berisi nilai-nilai parameter TraceId, ParentSpanId, SpanId, dan Sampled. Anda dapat memanggil metode Extract atau Inject untuk menentukan data dalam header permintaan HTTP. Contoh berikut menunjukkan seluruh proses:
    流程图
    1. Panggil metode Inject pada klien untuk menentukan informasi konteks.
      // mulai rentang baru yang mewakili permintaan klien
          oneWaySend = tracer.nextSpan().name(service + "/" + method).kind(CLIENT);
          --snip--
      
          // Tambahkan konteks jejak ke permintaan, sehingga dapat disebarkan secara in-band
          tracing.propagation().injector(Request::addHeader)
                           .inject(oneWaySend.context(), request);
      
         // kirim permintaan secara asinkron, sepenuhnya menjatuhkan respons apa pun
         request.execute();
      
         // mulai sisi klien dan flush alih-alih selesai
         oneWaySend.start().flush();
    2. Panggil metode Extract pada server untuk mengekstrak informasi konteks.
      // tarik konteks dari permintaan masuk
      extractor = tracing.propagation().extractor(Request::getHeader);
      
      // konversikan konteks tersebut menjadi rentang yang dapat Anda beri nama dan tambahkan tag
      oneWayReceive = nextSpan(tracer, extractor.extract(request))
          .name("process-request")
          .kind(SERVER)
          ... tambahkan tag dll.
      
      // mulai sisi server dan flush alih-alih selesai
      oneWayReceive.start().flush();
      
      // Anda tidak boleh memodifikasi rentang ini lagi karena sudah lengkap. Namun,
      // Anda dapat membuat anak-anak untuk mewakili pekerjaan tindak lanjut.
      next = tracer.newSpan(oneWayReceive.context()).name("step2").start();

Gunakan Spring 2.5 MVC atau Spring 3.0 MVC untuk menginstrumentasikan aplikasi Java

Anda dapat menggunakan Spring 2.5 MVC atau Spring 3.0 MVC untuk menginstrumentasikan aplikasi Java.

Catatan Unduh proyek demo. Kemudian, buka direktori springMvcDemo\webmvc3|webmvc25 dan ikuti langkah-langkah dalam file README.md untuk menjalankan program demo.
  1. Konfigurasikan objek pelacakan di file applicationContext.xml.
    <bean class="zipkin2.reporter.beans.OkHttpSenderFactoryBean">
      <property name="endpoint" value="<endpoint>"/>
    </bean>
    
    <!-- memungkinkan kita membaca nama layanan dari konfigurasi spring -->
    <context:property-placeholder/>
    
    <bean class="brave.spring.beans.TracingFactoryBean">
      <property name="localServiceName" value="brave-webmvc3-example"/>
      <property name="spanReporter">
        <bean class="zipkin2.reporter.beans.AsyncReporterFactoryBean">
          <property name="encoder" value="JSON_V2"/>
          <property name="sender" ref="sender"/>
          <!-- tunggu hingga setengah detik untuk rentang dalam penerbangan saat penutupan -->
          <property name="closeTimeout" value="500"/>
        </bean>
      </property>
      <property name="propagationFactory">
        <bean class="brave.propagation.ExtraFieldPropagation" factory-method="newFactory">
          <constructor-arg index="0">
            <util:constant static-field="brave.propagation.B3Propagation.FACTORY"/>
          </constructor-arg>
          <constructor-arg index="1">
            <list>
              <value>user-name</value>
            </list>
          </constructor-arg>
        </bean>
      </property>
      <property name="currentTraceContext">
        <bean class="brave.spring.beans.CurrentTraceContextFactoryBean">
          <property name="scopeDecorators">
            <bean class="brave.context.log4j12.MDCScopeDecorator" factory-method="create"/>
          </property>
        </bean>
      </property>
    </bean>
    
    <bean class="brave.spring.beans.HttpTracingFactoryBean">
      <property name="tracing" ref="tracing"/>
    </bean>
  2. Tambahkan objek interceptors.
    <bean class="brave.httpclient.TracingHttpClientBuilder"
          factory-method="create">
        <constructor-arg type="brave.http.HttpTracing" ref="httpTracing"/>
      </bean>
    
      <bean factory-bean="httpClientBuilder" factory-method="build"/>
    
      <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="interceptors">
          <list>
            <bean class="brave.spring.webmvc.SpanCustomizingHandlerInterceptor"/>
          </list>
        </property>
      </bean>
    
      <!-- Memuat controller -->
      <context:component-scan base-package="brave.webmvc"/>
  3. Tambahkan objek filter.
    <!-- Tambahkan delegasi ke filter pelacakan standar dan petakan ke semua jalur -->
    <filter>
      <filter-name>tracingFilter</filter-name>
      <filter-class>brave.spring.webmvc.DelegatingTracingFilter</filter-class>
    </filter>
    <filter-mapping>
      <filter-name>tracingFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

Gunakan Spring 4.0 MVC atau Spring Boot untuk menginstrumentasikan aplikasi Java

Anda dapat menggunakan Spring 4.0 MVC atau Spring Boot untuk menginstrumentasikan aplikasi Java.

Catatan Unduh proyek demo. Kemudian, buka direktori springMvcDemo\webmvc4-boot|webmv4 dan ikuti langkah-langkah dalam file README.md untuk menjalankan program demo.
  1. Konfigurasikan objek pelacakan dan filter.
    /** Konfigurasi untuk cara mengirim rentang ke Zipkin */
      @Bean Sender sender() {
        return OkHttpSender.create("<endpoint>");
      }
    
      /** Konfigurasi untuk cara menyangga rentang ke pesan untuk Zipkin */
      @Bean AsyncReporter<Span> spanReporter() {
        return AsyncReporter.create(sender());
      }
    
      /** Mengontrol aspek pelacakan seperti nama yang muncul di UI */
      @Bean Tracing tracing(@Value("${spring.application.name}") String serviceName) {
        return Tracing.newBuilder()
            .localServiceName(serviceName)
            .propagationFactory(ExtraFieldPropagation.newFactory(B3Propagation.FACTORY, "user-name"))
            .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder()
                .addScopeDecorator(MDCScopeDecorator.create()) // menempatkan ID jejak ke log
                .build()
            )
            .spanReporter(spanReporter()).build();
      }
    
      /** memutuskan cara memberi nama dan menandai rentang. Secara default mereka diberi nama sama seperti metode http. */
      @Bean HttpTracing httpTracing(Tracing tracing) {
        return HttpTracing.create(tracing);
      }
    
      /** Membuat rentang klien untuk permintaan http */
      // Kami menggunakan BPP karena Frontend menyediakan bean RestTemplate sebelum konfigurasi ini
      @Bean BeanPostProcessor connectionFactoryDecorator(final BeanFactory beanFactory) {
        return new BeanPostProcessor() {
          @Override public Object postProcessBeforeInitialization(Object bean, String beanName) {
            return bean;
          }
    
          @Override public Object postProcessAfterInitialization(Object bean, String beanName) {
            if (!(bean instanceof RestTemplate)) return bean;
    
            RestTemplate restTemplate = (RestTemplate) bean;
            List<ClientHttpRequestInterceptor> interceptors =
                new ArrayList<>(restTemplate.getInterceptors());
            interceptors.add(0, getTracingInterceptor());
            restTemplate.setInterceptors(interceptors);
            return bean;
          }
    
          // Pencarian lambat agar BPP tidak berakhir membutuhkan proxy apa pun.
          ClientHttpRequestInterceptor getTracingInterceptor() {
            return TracingClientHttpRequestInterceptor.create(beanFactory.getBean(HttpTracing.class));
          }
        };
      }
    
      /** Membuat rentang server untuk permintaan http */
      @Bean Filter tracingFilter(HttpTracing httpTracing) {
        return TracingFilter.create(httpTracing);
      }
    
      @Autowired SpanCustomizingAsyncHandlerInterceptor webMvcTracingCustomizer;
    
      /** Menghiasi rentang server dengan tag web yang ditentukan aplikasi */
      @Override public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(webMvcTracingCustomizer);
      }
  2. Konfigurasikan auto-konfigurasi di file spring.factories.
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    brave.webmvc.TracingConfiguration

Gunakan Dubbo untuk menginstrumentasikan aplikasi Java

Anda dapat menggunakan Dubbo untuk menginstrumentasikan aplikasi Java.

Catatan Unduh proyek demo. Kemudian, buka direktori dubboDemo dan ikuti langkah-langkah dalam file README.md untuk menjalankan program demo.
  1. Tambahkan paket JAR sebagai dependensi.
    <dependency>
                <groupId>io.zipkin.brave</groupId>
                <artifactId>brave-instrumentation-dubbo-rpc</artifactId>
                <version>5.4.2</version>
            </dependency>
    
            <dependency>
                <groupId>io.zipkin.brave</groupId>
                <artifactId>brave-spring-beans</artifactId>
                <version>5.4.2</version>
            </dependency>
    
            <dependency>
                <groupId>io.zipkin.brave</groupId>
                <artifactId>brave-context-slf4j</artifactId>
                <version>5.4.2</version>
            </dependency>
            <dependency>
                <groupId>io.zipkin.reporter2</groupId>
                <artifactId>zipkin-sender-okhttp3</artifactId>
                <version>2.7.9</version>
            </dependency>
            <dependency>
                <groupId>io.zipkin.brave</groupId>
                <artifactId>brave</artifactId>
                <version>5.4.2</version>
            </dependency>
    
            <dependency>
                <groupId>io.zipkin.reporter2</groupId>
                <artifactId>zipkin-sender-okhttp3</artifactId>
                <version>2.7.9</version>
            </dependency>
  2. Konfigurasikan objek pelacakan.
    <bean class="zipkin2.reporter.beans.OkHttpSenderFactoryBean">
            <property name="endpoint" value="<endpoint>"/>
        </bean>
    
        <bean class="brave.spring.beans.TracingFactoryBean">
            <property name="localServiceName" value="double-provider"/>
            <property name="spanReporter">
                <bean class="zipkin2.reporter.beans.AsyncReporterFactoryBean">
                    <property name="sender" ref="sender"/>
                    <!-- tunggu hingga setengah detik untuk rentang dalam penerbangan saat penutupan -->
                    <property name="closeTimeout" value="500"/>
                </bean>
            </property>
            <property name="currentTraceContext">
                <bean class="brave.spring.beans.CurrentTraceContextFactoryBean">
                    <property name="scopeDecorators">
                        <bean class="brave.context.slf4j.MDCScopeDecorator" factory-method="create"/>
                    </property>
                </bean>
            </property>
        </bean>
  3. Konfigurasikan objek filter.
    // Konfigurasi di server.
    <dubbo:provider filter="tracing" />
    // Konfigurasi di klien.
    <dubbo:consumer filter="tracing" />

Gunakan Spring Sleuth untuk menginstrumentasikan aplikasi Java

Anda dapat menggunakan Spring Sleuth untuk menginstrumentasikan aplikasi Java.

Catatan Unduh proyek demo. Kemudian, buka direktori sleuthDemo dan ikuti langkah-langkah dalam file README.md untuk menjalankan program demo.
  1. Tambahkan paket JAR sebagai dependensi.
    <dependency>
                <groupId>io.zipkin.brave</groupId>
                <artifactId>brave</artifactId>
                <version>5.4.2</version>
            </dependency>
    
            <dependency>
                <groupId>io.zipkin.reporter2</groupId>
                <artifactId>zipkin-sender-okhttp3</artifactId>
                <version>2.7.9</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.0.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-sleuth-core</artifactId>
                <version>2.0.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-sleuth-zipkin</artifactId>
                <version>2.0.1.RELEASE</version>
            </dependency>
  2. Konfigurasikan file application.yml.
    Catatan Ganti <endpoint_short> dengan titik akhir untuk klien dan wilayah Anda. Masuk ke konsol Analisis Tracing untuk mendapatkan titik akhir publik yang berakhiran api/v2/spans di tab Informasi Titik Akses halaman Cluster Configurations.
    spring:
       application:
         # Ini akan menjadi nama layanan di zipkin
         name: sleuthDemo
       zipkin:
         # Hapus komentar untuk mengirim ke zipkin, mengganti 192.168.99.100 dengan alamat IP zipkin Anda
         baseUrl: <endpoint_short>
    
       sleuth:
         sampler:
           probability: 1.0
    
       sample:
       zipkin:
         # Saat enabled=false, jejak log ke konsol. Komentari untuk mengirim ke zipkin
         enabled: true
  3. Mulai permintaan HTTP, misalnya, http://localhost:3380/traced.
    Catatan Untuk lebih banyak jalur permintaan, lihat metode di bawah com.alibaba.apm.SampleController dalam proyek demo.

FAQ

T: Mengapa saya tidak dapat menemukan data apa pun di situs web tertentu setelah program demo dijalankan?

A: Masukkan breakpoint untuk men-debug metode parseResponse di zipkin2.reporter.okhttp3.HttpCall dan periksa nilai pengembalian permintaan untuk melaporkan data. Jika kesalahan 403 dikembalikan, konfigurasi nama pengguna tidak valid. Periksa konfigurasi titik akhir Anda.