您的位置:首页 > 编程语言

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
sr
',
ss
annotations.
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 {
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Brave Zipkin