Zipkin-1.19.0学习系列10: brave-web-servlet-filter (3.16.0)代码研究
2017-01-09 00:00
459 查看
估计最普遍的应用就是HTTP调用了,所以,接下来我们来研究HTTP如何上传zipkin信息。
---官网地址:https://github.com/openzipkin/brave/tree/master/brave-web-servlet-filter
按照官网的说法,应该这么做(最靠谱的还是官网啊)
The module contains a Servlet filter (javax.servlet.filter) to deal with server side integration: Getting existing span/trace state from request, create and submit span with
Example Servlet API 3.0 Java Config
WebApplicationInitializer 是什么?查看代码
按照上面的说明,可以配置任何给定的 servlet,filter,listener,context-params和属性。
---接下来就测试吧,我自己写了一个类如下:
然后我需要创建debug环境来debug上面的代码。
---
通过跟踪源码,刚开始主要是创建了一个new Brave.Builder,然后通过这个对象创建一个Brave对象。
=============================
可以看到,代码还是不少的,所以要认真debug
然后进入addFilter环节,通过debug
栈如下:
---这个时候,可以直接debug到org.apache.catalina.core.StandardContext.addFilterDef查看当前 Filter.
===最终,我自己写了一个Filter如下:
---官网地址:https://github.com/openzipkin/brave/tree/master/brave-web-servlet-filter
按照官网的说法,应该这么做(最靠谱的还是官网啊)
The module contains a Servlet filter (javax.servlet.filter) to deal with server side integration: Getting existing span/trace state from request, create and submit span with
sr',
ssannotations.
Example Servlet API 3.0 Java Config
public class WebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { Brave brave = new Brave.Builder("myservicename")).build(); servletContext.addFilter(“BraveServletFilter”, BraveServletFilter.create(brave)); } }
WebApplicationInitializer 是什么?查看代码
public interface WebApplicationInitializer { /** * Configure the given {@link ServletContext} with any servlets, filters, listeners * context-params and attributes necessary for initializing this web application. See * examples {@linkplain WebApplicationInitializer above}. * @param servletContext the {@code ServletContext} to initialize * @throws ServletException if any call against the given {@code ServletContext} * throws a {@code ServletException} */ void onStartup(ServletContext servletContext) throws ServletException; }
按照上面的说明,可以配置任何给定的 servlet,filter,listener,context-params和属性。
---接下来就测试吧,我自己写了一个类如下:
package com.freedom.monitor.myeye.client.http; import javax.servlet.ServletContext; import javax.servlet.ServletException; import org.springframework.web.WebApplicationInitializer; import com.github.kristofa.brave.Brave; import com.github.kristofa.brave.servlet.BraveServletFilter; public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { Brave brave = new Brave.Builder("myservicename").build(); servletContext.addFilter("BraveServletFilter", BraveServletFilter.create(brave)); } }
然后我需要创建debug环境来debug上面的代码。
---
jdb -Djava.uot/tomcat_9.0.0_binary_deploy_files/apache-tomcat-9.0.0.M13/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -classpath /root/tomcat_9.0.0_binary_deploy_files/apache-tomcat-9.0.0.M13/webapps/sourcecode:/root/tomcat_9.0.0_binary_deploy_files/apache-tomcat-9.0.0.M13/bin/bootstrap.jar:/root/tomcat_9.0.0_binary_deploy_files/apache-tomcat-9.0.0.M13/bin/tomcat-juli.jar -Dcatalina.base=/root/tomcat_9.0.0_binary_deploy_files/apache-tomcat-9.0.0.M13 -Dcatalina.home=/root/tomcat_9.0.0_binary_deploy_files/apache-tomcat-9.0.0.M13 -Djava.io.tmpdir=/root/tomcat_9.0.0_binary_deploy_files/apache-tomcat-9.0.0.M13/temp org.apache.catalina.startup.Bootstrap start stop in com.freedom.monitor.filter.MyBraveFilter.onStartup stop in com.github.kristofa.brave.Brave$Builder.build stop in com.github.kristofa.brave.ClientTracer.builder stop in com.freedom.monitor.myeye.client.tomcat.MyWebAppInitializer.onStartup run
通过跟踪源码,刚开始主要是创建了一个new Brave.Builder,然后通过这个对象创建一个Brave对象。
=============================
可以看到,代码还是不少的,所以要认真debug
private Brave(Builder builder) { serverTracer = ServerTracer.builder().randomGenerator(builder.random).reporter(builder.reporter) .state(builder.state).traceSampler(builder.sampler).clock(builder.clock) .traceId128Bit(builder.traceId128Bit).build(); clientTracer = ClientTracer.builder().randomGenerator(builder.random).reporter(builder.reporter) .state(builder.state).traceSampler(builder.sampler).clock(builder.clock) .traceId128Bit(builder.traceId128Bit).build(); localTracer = LocalTracer.builder().randomGenerator(builder.random).reporter(builder.reporter) .allowNestedLocalSpans(builder.allowNestedLocalSpans) .spanAndEndpoint(SpanAndEndpoint.LocalSpanAndEndpoint.create(builder.state)) .traceSampler(builder.sampler).clock(builder.clock).traceId128Bit(builder.traceId128Bit).build(); serverRequestInterceptor = new ServerRequestInterceptor(serverTracer); serverResponseInterceptor = new ServerResponseInterceptor(serverTracer); clientRequestInterceptor = new ClientRequestInterceptor(clientTracer); clientResponseInterceptor = new ClientResponseInterceptor(clientTracer); serverSpanAnnotationSubmitter = AnnotationSubmitter .create(SpanAndEndpoint.ServerSpanAndEndpoint.create(builder.state)); serverSpanThreadBinder = new ServerSpanThreadBinder(builder.state); clientSpanThreadBinder = new ClientSpanThreadBinder(builder.state); localSpanThreadBinder = new LocalSpanThreadBinder(builder.state); }
然后进入addFilter环节,通过debug
栈如下:
[1] org.apache.catalina.core.ApplicationContextFacade.addFilter (ApplicationContextFacade.java:448) [2] com.freedom.monitor.myeye.client.http.MyWebAppInitializer.onStartup (MyWebAppInitializer.java:17) [3] org.springframework.web.SpringServletContainerInitializer.onStartup (SpringServletContainerInitializer.java:169) [4] org.apache.catalina.core.StandardContext.startInternal (StandardContext.java:5,168) [5] org.apache.catalina.util.LifecycleBase.start (LifecycleBase.java:183) [6] org.apache.catalina.core.ContainerBase.addChildInternal (ContainerBase.java:752) [7] org.apache.catalina.core.ContainerBase.addChild (ContainerBase.java:728) [8] org.apache.catalina.core.StandardHost.addChild (StandardHost.java:734) [9] org.apache.catalina.startup.HostConfig.deployWAR (HostConfig.java:952) [10] org.apache.catalina.startup.HostConfig$DeployWar.run (HostConfig.java:1,823) [11] java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:511) [12] java.util.concurrent.FutureTask.run (FutureTask.java:266) [13] java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1,142) [14] java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:617) [15] java.lang.Thread.run (Thread.java:745)
---这个时候,可以直接debug到org.apache.catalina.core.StandardContext.addFilterDef查看当前 Filter.
===最终,我自己写了一个Filter如下:
package com.freedom.monitor.myeye.client.tomcat; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import com.github.kristofa.brave.Brave; import com.github.kristofa.brave.servlet.BraveServletFilter; //使用方法见下方,在你的tomcat里新建一个类,正如下面被注释的几行所示即可 // //@Order(1) //@WebFilter(filterName = "MyBraveFilter", urlPatterns = { "/*" }) //public class MyBraveFilter extends BraveFilter { //} /** * * @author liuzhq * @version 0.1 */ public class BraveFilter implements Filter { private static Filter filter = null; @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("MyBraveFilter.onStartup invoked..."); // 创建Brave对象 Brave brave = new Brave.Builder("MyServiceName").build(); // 创建Filter&赋值 filter = BraveServletFilter.create(brave); filter.init(filterConfig); System.out.println("***--->BraveServletFilter add succeed..."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { filter.doFilter(request, response, chain); } @Override public void destroy() { filter.destroy(); } // public class MyBraveFilter implements WebApplicationInitializer { }
相关文章推荐
- Twitter zipkin 分布式跟踪系统的设计与实现
- zipkin
- Zipkin分布式任务追踪
- 微服务之分布式跟踪系统(springboot+zipkin)
- Zipkin-1.19.0学习系列1:java范例
- Zipkin-1.19.0学习系列3:跟踪main函数
- Zipkin-1.19.0学习系列4:(启动事件分发)
- Leoncom » 分布式服务的Trace——Google Da
- (六)整合spring cloud云服务架构 - HongHu云架构common-service代码结构分析
- zipkin服务端高可用
- 一次zipkin接口down问题的排查
- zipkin相关材料
- 打造立体化监控体系与APM最佳实践系列 --Zipkin部署与使用
- 分布式会话跟踪系统架构设计与实践
- #研发解决方案介绍#Tracing(鹰眼)
- 从菜鸟到调用链专家---PPT
- Zipkin-1.19.0学习系列30:本回合终结篇
- Zipkin-1.19.0学习系列29:Zipkin服务器端API(14~28)-Spring内置的一些URL
- Zipkin-1.19.0学习系列16:关于数据上报
- Zipkin-1.19.0学习系列15:Nodejs范例(Server Received,Server Sent)