brave是同步收集信息,及计算调用时间,但是异步发送日志信息给zipkin;所以很多时候你无法在第一时间获取日志数据可能需要等一会。另外在写一个demo的时候,因为最后睡了1秒,经常会发现丢了一些日志;后来最后sleep(5000)之后,日志都成功获取了。

  brave在report发送了一个日志之后其实是放到了一个队列里面了;然后会有消费者线程从队列中取出数据,当数据达到一定程度(或者一段时间之后,这个是根据现象推测的)在批量告知zipkin 服务器。
servlet.isAsync是只有servlet3之后才会支持异步调用;

  brave整体分为两部分来理解:
  当前节点作为Client端(发送request请求),将会在RestTemplate埋下一个拦截器,这个拦截器将会记录下请求的往来的信息,包括时间间隔;调用完成后将会发送到zipkin服务器;但是想要是拦截器生效前提条件当前应用发送请求使用的是RestTemplate对象。
  当前节点作为Server端(接收请求),将会在通过web的Filter(javax.servlet.Filter)来进行埋点;在Filter的doFilter调用中实现对servlet的service()的调用前后拦截处理;

  TracingClientHttpRequestInterceptor
  明白了client和server端,下面就是两者对应的处理,在RestTemplate埋点的对象是TracingClientHttpRequestInterceptor,这个interceptor核心方法是intercept,Interceptor和Filter处理机制类似,都是在在调用真谛函数(Interceptor的真谛函数就是execution.execute(request, body),执行请求,Filter的真谛函数就是servlet.service())前和后进行拦截处理;
  真谛函数之前是调用handler的handler.handleSend,handleSend里面将会把Kind设置为Client,从request中获取span信息(通过span.customizer(),这个函数在handleReceive里面也会用到,主要就是从request以及response中获取信息,然后填充到tags节点中),最后调用span.start,来启动一个span;
  真谛函数之后调用的是handler的handleReceive,通过span.customizer()来填充span的信息;最后调用span.finish来向zipkin server提交日志内容。

  TracingFilter
  是server角色埋的点,默认情况下第一个Filter是DelegatingTracingFilter,这个filter在init的时候就创建了TracingFilter(构造函数里面传的是HttpTracing),然后在doFilter的时候,调用TracingFilter的doFilter来进行拦截;TracingFilter里面也是有着HttpServerHandler,在doFilter里面在真谛函数前后的就是调用HttpServerHandler的handleReceive和handleSend两个函数。
  handleReceive函数里面,首先设置Kind类型为Server,然后通过HttpServerParser来从request里面获取数据填充到span中;最后调用一下span.start来标记一个span的开始;
  问题:nextSpan是否会把parent的span获取?
  handleSend函数中,首先从response中获取相应的信息填充信息,最后调用span.finish向服务器提交一下span内容。
  问题:client和server都会想zipkinServer提交log内容吗?
  最后还有一个拦截器要交代一下,就是SpanCustomizingAsyncHandlerInterceptor,这个其实是一个server角色拦截器,
  问题:这个SpanCustomizingAsyncHandlerInterceptor还需要深入了解一下,尤其里面提到的http.route我记得在别的地方还有用到。

改写
为什么我改写了CrmTracingHttpClientBuilder里面的decorateProtocolExec的实现类,但是还说是走原生的?

  原来CrmTracingHttpClientBuilder是我复制的类,虽然改写了decorateProtocolExec函数里面返回类,但是CrmTracingHttpClientBuilder创建的create函数里面返回的builder还是TracingHttpClientBuilder,所以根本就没有走CrmTracingHttpClientBuilder里面的decorateProtocolExec。

  这个问题和brave无关,是自己大脑短路。

  servlet2.0怎么办?

  我靠,发现maven版本里面打的servletapi是3.0,但是tomcat5确实低版本的servlet(2.4);导致某些方法无法使用!关键是maven里面竟然没有2.4,因为太古老了。是的maven里面没有该jar包。没办法只好从tomcat5中拷贝出来一款
  开始是使用:强转方式,但是后来发现到了servlet3之后,这种强转是报错的;
 int statusCode = ((brave.servlet.ServletRuntime.Servlet25ServerResponseAdapter)httpResponse).httpStatus; 
  还好后来找到了brave的超级强大的地方,自己判断平台。
 int statusCode = brave.servlet.ServletRuntime.get().status(httpResponse); 
搞掂了。

参考:

1.这强推墨竹的博客,对于zipkin的brave组价讲解十分透彻。

http://blog.mozhu.org/categories/zipkin/

2.brave的一个demo

zipkin之brave的更多相关文章

  1. Zipkin和Brave实现http服务调用的跟踪

    使用Zipkin和Brave实现http服务调用的跟踪,Brave 是用来装备Java程序的类库,提供了面向标准Servlet.Spring MVC.Http Client.JAX RS.Jersey ...

  2. 调用链系列二、Zipkin 和 Brave 实现(springmvc、RestTemplate)服务调用跟踪

    Brave介绍 1.Brave简介 Brave 是用来装备 Java 程序的类库,提供了面向标准Servlet.Spring MVC.Http Client.JAX RS.Jersey.Resteas ...

  3. 第二十八章 springboot + zipkin(brave定制-AsyncHttpClient)

    brave本身没有对AsyncHttpClient提供类似于brave-okhttp的ClientRequestInterceptor和ClientResponseInterceptor,所以需要我们 ...

  4. 使用 Zipkin 和 Brave 实现分布式系统追踪(基础篇)

    一.Zipkin 1.1.简介 Zipkin 是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper 的论文设计而来,由 Twi ...

  5. 【第二十八章】 springboot + zipkin(brave定制-AsyncHttpClient)

    brave本身没有对AsyncHttpClient提供类似于brave-okhttp的ClientRequestInterceptor和ClientResponseInterceptor,所以需要我们 ...

  6. 调用链系列三、基于zipkin调用链封装starter实现springmvc、dubbo、restTemplate等实现全链路跟踪

    一.实现思路 1.过滤器实现思路 所有调用链数据都通过过滤器实现埋点并收集.同一条链共享一个traceId.每个节点有唯一的spanId. 2.共享传递方式 1.rpc调用:通过隐式传参.dubbo有 ...

  7. 第二十九章 springboot + zipkin + mysql

    zipkin的数据存储可以存在4个地方: 内存(仅用于测试,数据不会持久化,zipkin-server关掉,数据就没有了) 这也是之前使用的 mysql 可能是最熟悉的方式 es Cassandra ...

  8. 原理分析dubbo分布式应用中使用zipkin做链路追踪

    zipkin是什么 Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开 ...

  9. 【第二十九章】 springboot + zipkin + mysql

    zipkin的数据存储可以存在4个地方: 内存(仅用于测试,数据不会持久化,zipkin-server关掉,数据就没有了) 这也是之前使用的 mysql 可能是最熟悉的方式 es Cassandra ...

随机推荐

  1. 转:MyEclipse安装Eclipse Memory Analyzer插件,并进行错误文件分析流程

    转自 http://www.cnblogs.com/nb44c/p/5218880.html 1.先安装MAT插件 Memory Analyzer 插件下载地址:http://www.eclipse. ...

  2. yii控制布局方式

    1:在控制器内成员变量设置 public $layout = false; //不使用布局 public $layout = “main”; //设置使用的布局文件 2:在控制器成员方法内设置 $th ...

  3. mysql 5.1.71升级到5.6.30

    mysql 5.1.71升级到5.6.30 mysqldump -h主机名 -P端口 -u用户名 -p密码 (–database) 数据库名 > 文件名.sql 备份MySQL数据库的命令 my ...

  4. navicat for mysql 导入SQL Server显示中文乱码解决办法

    解决方法是在navicat里右击一个连接,选择连接属性,切换到高级选项卡,去掉“使用mysql字符集”前的对勾,在编码里选择utf-8

  5. 如何自定义FileZilla编辑文件的默认打开方式

    看一下设置: 原来是人家默默认不给我们提示 改一下: 还是不行,还是跳到网页去了 还是不行 这样就好了...

  6. TensorFlow 的使用步骤

    使用 TensorFlow 的基本步骤 学习目标: 学习基本的 TensorFlow 概念 在 TensorFlow 中使用 LinearRegressor 类并基于单个输入特征预测各城市街区的房屋价 ...

  7. SSH服务:packet_write_wait: Connection to 67.218.143.160 port 22: Broken pipe错误处理

    1.在~/.ssh/config配置文件中添加 IPQoS lowdelay throughput 2.在/etc/ssh/ssh_config配置文件中添加 IPQoS lowdelay throu ...

  8. 20165202 2017-2018-2《Java程序设计》课程总结

    每周作业链接汇总 ++预备作业一:我期待的师生关系++ ++预备作业二:学习基础和C语言基础调查++ ++预备作业三:linux安装及学习++ ++第一周作业:初识JAVA,注册码云并配置Git++ ...

  9. (转) MapReduce Design Patterns(chapter 2 (part 1))(二)

     CHAPTER 2 .Summarization Patterns 随着每天都有更多的数据加载进系统,数据量变得很庞大.这一章专注于对你的数据顶层的,概括性意见的设计模式,从而使你能扩展思路,但可能 ...

  10. 向量点积(Dot Product),向量叉积(Cross Product)

    参考的是<游戏和图形学的3D数学入门教程>,非常不错的书,推荐阅读,老外很喜欢把一个东西解释的很详细. 1.向量点积(Dot Product) 向量点积的结果有什么意义?事实上,向量的点积 ...