Trace là toàn bộ hành trình của một request qua hệ thống. Span là một đoạn công việc trong trace (một lời gọi HTTP, một truy vấn DB, một lần xử lý message) — có tên, thời điểm bắt đầu/kết thúc, thuộc tính, và id của span cha. Ghép các span theo quan hệ cha–con ra cây, nhìn được chặng nào tốn thời gian.
Cơ chế: mỗi span mang trace_id (chung cho cả trace) và span_id. Khi gọi service khác, bộ instrument inject context vào header chuẩn W3C:
traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01Bên nhận extract header đó, tạo span mới có parent là span vừa nhận. Đây là context propagation — đúng phần hay hỏng nhất trong thực tế.
Qua message queue: đứt trace là lỗi phổ biến vì producer và consumer không dùng chung HTTP header. Cách xử lý: inject traceparent vào message header/attribute lúc publish, extract lúc consume. Vì consumer chạy sau (có khi hàng phút), span của nó thường được mô hình hoá là link tới trace gốc thay vì span con trực tiếp, để biểu đồ thời gian không bị kéo dãn vô nghĩa.
Khác gì log: log trả lời "chuyện gì xảy ra ở đây", trace trả lời "thời gian đi đâu, chặng nào lỗi". Đưa trace_id vào mọi dòng log để nhảy qua lại giữa hai bên. Ở lưu lượng lớn phải sampling (ví dụ giữ 1-5% trace, giữ toàn bộ trace lỗi) vì lưu 100% rất tốn.