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
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.
Instrumentasi Manual Aplikasi Java
Untuk menginstrumentasikan aplikasi Java secara manual, Anda perlu menulis kode instrumentasi.
- 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> - 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(); - 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()); } - 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"); - 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:

- 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(); - 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();
- Panggil metode Inject pada klien untuk menentukan informasi konteks.
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.
- 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> - 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"/> - 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.
- 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); } - 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.
- 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> - 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> - 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.
- 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> - 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 - Mulai permintaan HTTP, misalnya,
http://localhost:3380/traced.Catatan Untuk lebih banyak jalur permintaan, lihat metode di bawahcom.alibaba.apm.SampleControllerdalam 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.
