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. 1030: [JSOI2007]文本生成器 ac自动机+dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6 ...

  2. MFC sendmessage实现进程间通信

    用sendmessage实现进程间通信. 1.WM_COPYDATA实现进程间通信 实现方式是发送WM_COPYDATA消息. 发送程序: LRESULT copyDataResult; //copy ...

  3. HDU 5651 组合+逆元

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5651 题目意思我看了半天没读懂,一直以为是回文子串又没看见substring的单词最后看博客才知道是用给 ...

  4. rabbitmq&&erlang 安装

    # yum install epel-release CentOS and Red Hat Enterprise Linux 6.x wget https://dl.fedoraproject.org ...

  5. 上下行分流下行负载方式和能ping通但不能打开

    1 下行线路负载方式选择  目的端口+协议  否则有可能出现微信443端口图片打不开的情况. 2.彭ping通但是打不开的情况下将上行线路mtu值改小 由1500改为1450

  6. office套件

    一.PDF模块 使用PyPDF2模块 pip install PyPDF2 1.1 从PDF读取数据 直接读取,并打印出来.但是这种打印存在一个问题,不能中文字符 import PyPDF2 impo ...

  7. Java进阶4表达式中的陷阱

    Java进阶4表达式中的陷阱 20131103 表达式是Java中最基本的组成单元,各种表达式是Java程序员最司空见惯的内容,Java中的表达式并不是十分的复杂,但是也有一些陷阱.例如当程序中使用算 ...

  8. 快速切题 poj 1002 487-3279 按规则处理 模拟 难度:0

    487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 247781   Accepted: 44015 Descr ...

  9. 老鼠走迷宫(2)输出所有路径(C语言)

    需求 有一个迷宫,在迷宫的某个出口放着一块奶酪.将一只老鼠由某个入口处放进去,它必须穿过迷宫,找到奶酪.请找出它的行走路径. STEP 1 题目转化 我们用一个二维数组来表示迷宫,用2表示迷宫的墙壁, ...

  10. 本地如何搭建IPv6环境测试你的APP(转)

    IPv6的简介 IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索). PS:在使用 IPv6 的热点时候,记得手机开 飞行模式 哦 ...