- 根据
tcp_seq
获取network span
和service间调用的system span
数据type=request
,使用req_tcp_seq
关联查询,相同req_tcp_seq
的flow
会被关联
req_tcp_seq={flow.req_tcp_seq}
type=response
,使用resp_tcp_seq
关联查询,相同resp_tcp_seq
的flow
会被关联
resp_tcp_seq={flow.resp_tcp_seq}
type=session
: 使用req_tcp_seq
和resp_tcp_seq
关联查询
(req_tcp_seq={flow.req_tcp_seq} or resp_tcp_seq={flow.resp_tcp_seq})
- 额外条件
resp_tcp_seq!=0 OR req_tcp_seq!=0 span_id相同 x_request_id相同
- 根据
syscalltraceid
获取service内部的system span
数据syscall_trace_id_request
以及syscall_trace_id_request
只要不为0则都会被关联查询
syscall_trace_id_request={flow.syscall_trace_id_request} OR syscall_trace_id_response={flow.syscall_trace_id_request} OR syscall_trace_id_request={flow.syscall_trace_id_response} OR syscall_trace_id_response={flow.syscall_trace_id_response}
- 额外条件
vtap_id相同 x_request_id相同
- 获取
app span
数据- 根据
parent_span_id
以及span_id
关联查询
具体代码parent_span_id={flow.span_id} OR span_id={flow.span_id} span_id={flow.parent_span_id} OR parent_span_id={flow.parent_span_id}
- 根据
- 获取
x_request_id
关联数据具体代码x_request_id={flow.x_request_id}
- 获取
trace_id
关联数据具体代码trace_id={trace_id}
- 将上述所有条件用
OR
进行拼接,查询所有符合条件的flow,然后进行细粒度的筛选:- network span
- 时间范围差距不能超过配置的网络最大时延
network_delay_us
abs(self.start_time_us - flow.start_time_us) <= self.network_delay_us abs(self.end_time_us - flow.end_time_us) <= self.network_delay_us
- 时间范围差距不能超过配置的网络最大时延
- network span
- 查询结果中增加对关联关系的描述
- 以下
flow
不进行合并type == session && tap_side != sysspan
的非系统spantap_side != system span
时,每条flow
的_id
最多只有一来一回两条, 大于等于两条vtap_id
,tap_port
,tap_port_type
,l7_protocol
,request_id
,tap_side
,flow_id
不同request
的start_time
大于response
的start_time
system span
的flow
需要request_flow['syscall_cap_seq_0'] + 1 != response_flow['syscall_cap_seq_1']
- 合并字段,被合并的
flow
会将原始flow
中缺少的字段补充进去flow['type'] == 0
是,按以下字段合并
l7_protocol,protocol,version,request_type,request_domain,request_resource,request_id
flow['type'] == 1
时,按以下字段合并
response_status,response_code,response_exception,response_result,http_proxy_client
flow['type'] == 其他
时,按以下字段合并
l7_protocol,protocol,version, request_type,request_domain,request_resource,request_id, response_status,response_code,response_exception,response_result, http_proxy_client,trace_id,span_id,x_request_id ]
request
和response
合并时,会设置flow['type;] = 2(session)
system span
首次合并如果失败,需要将flow
倒序,再进行第二次合并
- 具体代码
- 构建
service
进程span
Service- 基于每个
tap_side = s-p
的flow
构建一个service
- 将每个
tap_side = c-p
的flow
添加进所属的service
中- 判断所属
service
的逻辑:vtap_id
,process_id
与service
相同,并且s-p
的时间范围需要覆盖c-p
,有多个service
符合条件的情况下选择start_time
最近的。
- 判断所属
- 基于每个
应用span
添加进service
attach_app_flow应用span
的span_id
与系统span_id
相同时,如果系统span
的tap_side = c-p
,则将该应用span
添加进service
应用span
的parent_id
与系统span_id
相同时,如果系统span
的tap_side = s-p
,且不存在和s-p
相同的c-p
,将该应用span
添加进service
- 两条
应用span
的span_id
有关联且service_name
相同时,将其中一条还未添加进service
的flow
添加进另一条flow
所属的service
中
- 设置
parent
网络span
network_flow_sort- 存在
tcp_seq
相同的flow
,非local
和rest
按照以下优先级确认parent
,local
和rest
就近(比较采集器)排到其他位置(tcp_seq 相同)附近(按时间排)
c, c-nd, c-hv, c-gw-hv, c-gw, s-gw, s-gw-hv, s-hv, s-nd, s
- 存在
span_id
相同的应用span
,将该网络span
的parent
设置为该span_id
相同的应用span
- 存在
应用span
app_flow_sort- 若存在
parent_span_id
,且tap_side = s
的flow
的span_id
等于parent_span_id
,则将该应用span
的parent
设置为该flow
- 若存在
parent_span_id
,且span_id
等于该parent_span_id
的flow
存在span_id
相同的网络span
,则将该应用span
的parent
设置为该网络span
- 若存在
parent_span_id
, 将该应用span的parent设置为span_id等于该parent_span_id的flow - 若有所属
service
,将该应用span
的parent
设置为该service
的s-p
的flow
- 若存在
系统span
tap_side = c
c-p_flow_sort- 存在
span_id
相同的应用span
,将该系统span
的parent
设置为该span_id
相同的应用span
- 所属
service
中存在应用span
,将该系统span
的parent
设置为service
中最后一条应用span
- 存在
syscalltraceid
相同且tap_side = s
的系统span
,该系统span
的parent
设置为该flow
(syscalltraceid
相同且tap_side = s
)
- 存在
tap_side = s
s-p_flow_sort- 存在
span_id
相同的应用span
,将该系统span
的parent
设置为该span_id
相同的应用span
- 存在
span_id
相同且存在parent_span_id
的flow
,将该系统span
的parent
设置为span_id
等于该parent_span_id
的flow
- 存在
- 具体代码