diff --git a/HOW-TO-GET-SPAN-LIKE-DATA.md b/HOW-TO-GET-SPAN-LIKE-DATA.md index a1eef38..b7408f7 100644 --- a/HOW-TO-GET-SPAN-LIKE-DATA.md +++ b/HOW-TO-GET-SPAN-LIKE-DATA.md @@ -112,7 +112,12 @@ #### SpanSet 连接 -SpanSet 之间两两互相连接,并标记他们之间的 Parent 关系。总共有如下五种连接的场景,依次从上到下按优先级来挂。其中,1/2/3/4 包含如下限制条件: +SpanSet 之间两两互相连接,并标记他们之间的 Parent 关系。连接分为两个阶段: + +- **准确连接阶段**(场景 1-6):基于强关联证据(span_id、x_request_id、tcp_seq、grpc stream_id、trace_id+协议特征)建立连接,依次按优先级执行。 +- **弱关联阶段**(场景 7):仅在准确连接阶段完成并清空匹配状态后执行,通过配置项 `span_set_connection_strategies` 控制是否开启,基于 trace_id 做推断性连接。 + +其中,场景 1-5 包含如下通用约束条件: 约束条件: - 避免「同组 SpanSet 」首尾的 Span 满足上述 1.2. 条件发生首尾互连,限制满足条件的两个 Span 不能是同一个 SpanSet [代码位置](https://github.com/deepflowio/deepflow-app/blob/v6.6.3/app/app/application/l7_flow_tracing.py#L2319) @@ -156,11 +161,32 @@ SpanSet 之间两两互相连接,并标记他们之间的 Parent 关系。总 - 如果 x_request_id_0 等于 x_request_id_1,无额外要求,意味着中间有个网关做 x_request_id 注入,直接匹配挂接 - 一个 NetworkSpanSet 的结尾 Span span_id 等于另一个 NetworkSpanSet 的开头 Span 的 span_id [代码位置](https://github.com/deepflowio/deepflow-app/blob/v6.6.3/app/app/application/l7_flow_tracing.py#L2480) - 同时要求前者所有 Span 的最大 response_duration 比后所有 Span 的最小值要大,与 x_request_id_0/1 对应相等的场景处理办法完全相同 + - 对 gRPC/HTTP2 协议,一个 NetworkSpanSet 的结尾 Span 的 `request_id`(来源于 gRPC stream_id)等于另一个 NetworkSpanSet 的开头 Span 的 `request_id`,且后者时延 ≤ 前者时延(包括双方时延均为 0 的情况) + - 仅支持 gRPC/HTTP2,因为其他协议(如 MySQL StatementID)的 request_id 可能短期内被重用,容易产生误连接