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.

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 ms2. 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/spans3. 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/
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.


