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 条评论
下一页