Backend

99 Ngày Spring — Ngày 77: Distributed Tracing với Micrometer và Zipkin

SSite Admin
12 tháng 10, 2026 2 phút đọc 6 lượt xem
99 Ngày Spring — Ngày 77: Distributed Tracing với Micrometer và Zipkin

Một request đi qua gateway, order và payment; log của từng service riêng lẻ không cho thấy đường đi đầy đủ. Distributed tracing gắn các thao tác vào cùng một trace, đo thời gian của từng span và đưa dữ liệu tới backend như Zipkin. Đây là phần đào sâu cho observability ngày 70.

Distributed Tracing với Micrometer và Zipkin

1. Trace ID, span ID và quan hệ cha con

Trace ID đại diện cho toàn bộ hành trình; mỗi thao tác có span ID riêng. Span giữ thời điểm bắt đầu, kết thúc, tên, thuộc tính và trạng thái lỗi. Quan hệ parent-child cho biết thao tác nào gọi thao tác nào. Một biểu đồ nhiều span không tự chứng minh nguyên nhân chậm; nhìn thời gian trên critical path và các lời gọi chạy song song.

trace 8f2...:
gateway GET /orders/{id}      420 ms
  order query database          25 ms
  payment GET /payments/{id}   380 ms

2. Bật Micrometer Tracing và xuất Zipkin

Với Spring Boot 3.x, thêm Actuator, bridge Micrometer sang Brave hoặc OpenTelemetry và reporter/exporter Zipkin tương ứng phiên bản. Cấu hình endpoint Zipkin, xác nhận một request tạo trace trong giao diện trước khi phụ thuộc vào nó. Mặc định có sampling; môi trường dev có thể tăng lên 100%, production chọn tỷ lệ theo tải và nhu cầu điều tra.

# Spring Boot 3.x example; choose matching managed dependencies
management.tracing.sampling.probability=1.0
management.zipkin.tracing.endpoint=http://localhost:9411/api/v2/spans

3. Context phải đi qua ranh giới mạng

HTTP client tạo bằng builder do Spring Boot cấu hình sẽ được instrumentation và truyền trace context. Tự new client bên ngoài builder có thể làm mất span con. Với hàng đợi, async executor hoặc thread tự tạo, kiểm tra cơ chế truyền context tương ứng; ThreadLocal không tự đi qua mọi ranh giới. Trong log, tìm cùng trace ID ở hai service để đối chiếu.

  • Trace thiếu span ở service kế tiếp: kiểm tra header và client builder.

  • Span con thiếu cha: kiểm tra điểm chuyển sang async.

4. Điều tra và bảo vệ dữ liệu

Mở trace của một request chậm, tìm span lâu nhất trên critical path rồi nối tới log và metric của service đó. Không gắn user ID, token hay payload nhạy cảm vào span attributes. Tên span nên có cardinality thấp, ví dụ /orders/{id} thay vì URL chứa ID thật. Dùng sampling phù hợp để kiểm soát chi phí.

// Add a named business observation, without sensitive IDs
Observation.createNotStarted("payment.authorize", registry)
    .observe(() -> authorizePayment());

Trace chỉ hữu ích khi context truyền liên tục và tên span sạch. Ngày 78 chuyển sang giao tiếp bất đồng bộ với Kafka trong Spring.

Tài liệu đối chiếu

  • https://docs.spring.io/spring-boot/3.5/reference/actuator/tracing.html

  • https://docs.micrometer.io/tracing/reference/

S

Site Admin

Engineer and writer. Building things with TypeScript and distributed systems.

Bình luận (0)

Bạn cần đăng nhập bằng Google để bình luận.

Hãy là người bình luận đầu tiên.

Bài viết liên quan

99 Ngày Java — Ngày 77: String Pool và Interning

Literal, new String, intern(), equals so với == và khi chia sẻ chuỗi có thể phản tác dụng.

12 thg 10, 20262 phút6
99 Ngày Spring — Ngày 76: Circuit Breaker với Resilience4j

CLOSED, OPEN, HALF_OPEN, fallback, bulkhead và rate limiter để giới hạn lỗi dây chuyền.

10 thg 10, 20262 phút5
99 Ngày Java — Ngày 76: Soft, Weak và Phantom Reference

Bốn mức tham chiếu, WeakHashMap, ReferenceQueue và cách chọn cache có giới hạn trên Java 21.

10 thg 10, 20262 phút6