Skip to content

Latest commit

 

History

History
134 lines (127 loc) · 8.24 KB

HOW-TO-GET-SPAN-LIKE-DATA.md

File metadata and controls

134 lines (127 loc) · 8.24 KB

关联 flow

  • 根据tcp_seq获取network spanservice间调用的system span数据
    • type=request,使用req_tcp_seq关联查询,相同req_tcp_seqflow会被关联
    req_tcp_seq={flow.req_tcp_seq}
    
    • type=response,使用resp_tcp_seq关联查询,相同resp_tcp_seqflow会被关联
    resp_tcp_seq={flow.resp_tcp_seq}
    
    • type=session: 使用req_tcp_seqresp_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
      
  • 查询结果中增加对关联关系的描述
    • 字段:related_ids
    • 值:[flowindex-关联type-数据库id],例如:["16-traceid-7148686813239271301", "1-app-7148686813239271297"]
    • 标记数据是如何关联
      • network,表示是通过tcp_seq关联出的数据
      • syscall,表示是通过syscalltraceid关联出的数据
      • app,表示是通过span_id以及parent_span_id关联出的数据
      • traceid,表示是通过trace_id关联出的数据
      • xrequestid,表示是通过x_request_id关联出的数据 <

合并 flow

  • 以下flow不进行合并
    • type == session && tap_side != sysspan的非系统span
    • tap_side != system span时,每条flow_id最多只有一来一回两条, 大于等于两条
    • vtap_id, tap_port, tap_port_type, l7_protocol, request_id, tap_side, flow_id不同
    • requeststart_time大于responsestart_time
    • system spanflow需要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
    ]
    
    • requestresponse合并时,会设置flow['type;] = 2(session)
    • system span首次合并如果失败,需要将flow倒序,再进行第二次合并
  • 具体代码

排序

  • 构建service
    • 进程span Service
      • 基于每个tap_side = s-pflow构建一个service
      • 将每个tap_side = c-pflow添加进所属的service
        • 判断所属service的逻辑:vtap_idprocess_idservice相同,并且s-p的时间范围需要覆盖c-p,有多个service符合条件的情况下选择start_time最近的。
    • 应用span添加进service attach_app_flow
      • 应用spanspan_id系统span_id相同时,如果系统spantap_side = c-p,则将该应用span添加进service
      • 应用spanparent_id系统span_id相同时,如果系统spantap_side = s-p,且不存在和s-p相同的c-p,将该应用span添加进service
      • 两条应用spanspan_id有关联且service_name相同时,将其中一条还未添加进serviceflow添加进另一条flow所属的service
  • 设置parent
    • 网络span network_flow_sort
      • 存在tcp_seq相同的flow,非localrest按照以下优先级确认parentlocalrest就近(比较采集器)排到其他位置(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,将该网络spanparent设置为该span_id相同的应用span
    • 应用span app_flow_sort
      • 若存在parent_span_id,且tap_side = sflowspan_id等于parent_span_id,则将该应用spanparent设置为该flow
      • 若存在parent_span_id,且span_id等于该parent_span_idflow存在span_id相同的网络span,则将该应用spanparent设置为该网络span
      • 若存在parent_span_id, 将该应用span的parent设置为span_id等于该parent_span_id的flow
      • 若有所属service,将该应用spanparent设置为该services-pflow
    • 系统span
      • tap_side = c c-p_flow_sort
        • 存在span_id相同的应用span,将该系统spanparent设置为该span_id相同的应用span
        • 所属service中存在应用span,将该系统spanparent设置为service中最后一条应用span
        • 存在syscalltraceid相同且tap_side = s系统span,该系统spanparent设置为该flow(syscalltraceid相同且tap_side = s)
      • tap_side = s s-p_flow_sort
        • 存在span_id相同的应用span,将该系统spanparent设置为该span_id相同的应用span
        • 存在span_id相同且存在parent_span_idflow,将该系统spanparent设置为span_id等于该parent_span_idflow
  • 具体代码