sleuth和zipkin调试流程图(rpc响应-上报cs,cr和第一个入口请求)
2020-03-06 17:52:22   0  举报             
     
         
 springcloud的sleuth分布式链路方案客户端第一个请求入口上报源码流程图
    作者其他创作
 大纲/内容
 org.springframework.http.client.InterceptingClientHttpRequest.InterceptingRequestExecution#execute
    路径判断是否跳过,采样器是否配置
  请求和响应信息存list内存中
  一系列处理
  spanFromRequest != null
  什么都不做
  Y
  spanFromRequest.logEvent(Span.SERVER_SEND);
  spanFromRequest.hasSavedSpan()
  this.tracer.close(spanFromRequest);
  Add headers before filter chain in case one of the filters flushes the response
  N
  this.interceptor.finish();
  org.springframework.cloud.sleuth.instrument.web.client.TraceRestTemplateInterceptor#intercept
  组合请求路径
  org.springframework.boot.actuate.trace.WebRequestTraceFilter#doFilterInternal
  resttemplate发送请求给后台接口时,先会进这个拦截器
  经过内部反射调用等一系列处理进入WebRequestTraceFilter过滤器
  N:将采样器kv形式加入response
  currentSpan().logEvent(Span.CLIENT_RECV);
  上步获取的span如判断是否为空
  跟踪进去:加时间日志和关闭当前手动创建的span
  给第三个span添加cs事件
  this.tracer.close(this.currentSpan());
  并给第一个span添加sr事件
  Span parent =  spanFromRequest.getSavedSpan();\t\t\t\t\tif (parent.isRemote()) {\t\t\t\t\t\tparent.logEvent(Span.SERVER_SEND);\t\t\t\t\t\tparent.stop();\t\t\t\t\t\tthis.spanReporter.report(parent);\t\t\t\t\t}
  org.springframework.cloud.sleuth.instrument.web.client.AbstractTraceHttpRequestInterceptor#finish
  获取请求接口的方法路径
  创建新第一个span
    if (spanFromRequest != null) { 
  org.springframework.cloud.sleuth.instrument.web.client.AbstractTraceHttpRequestInterceptor#publishStartEvent
  拦截器TraceRestTemplateInteceptor* Interceptor that verifies whether the trance and span id has been set on the request * and sets them if one or both of them are missing.
  this.tracer.continueSpan(spanFromRequest);
  org.springframework.boot.actuate.trace.WebRequestTraceFilter#enhanceTrace
  !isTracing()
  加入一些标签anotation如请求方式,url等等
  Span spanFromRequest = (Span) request.getAttribute(TRACE_REQUEST_ATTR);
  请求进入服务器,经过一系列过滤器进入TraceFilter
  Y:减的动作
  Servlet {@link Filter} that logs all requests to a {@link TraceRepository}.
  String uri = this.urlPathHelper.getPathWithinApplication(request);
  addRequestTags(request);
  N:再次将采样器加到response中’
  关闭第一个span
  rpc响应-上报cs,cr和第一个入口请求上报流程图--->后台接口返回时上报
  过滤器
  isAsyncStarted(request) || request.isAsyncStarted()
  ResponseEntity<String> forEntity = restTemplate.getForEntity(new URI(\"http://localhost:\"+otherappPort+\"/getTime\
  rpc响应-上报cs,cr和第一个入口请求
  Y:不创建span,维持
  URI uri = request.getURI();  String spanName = uriScheme(uri) + \":\
  org.springframework.cloud.sleuth.instrument.web.TraceFilter#doFilterInternal
  创建第三个新span
  String name = HTTP_COMPONENT + \":\" + uri;
  根据org.springframework.cloud.sleuth.instrument.web.TraceFilter.TRACE从request获取span对象
  执行关闭response和关闭span
  添加第三个span的cr事件并关闭且上报
  关闭第三个span
  给第一个span添加ss事件
  this.repository.add(trace);
  以上步的请求路径作为参数创建新的span
  this.tracer.detach(spanFromRequest);
  org.springframework.cloud.sleuth.instrument.web.client.TraceHttpResponse#close
  this.delegate.close();
   
 
 
 
 
  0 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 