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. 闲话__stdcall, __cdecl, __fastcall出现的历史背景以及各自解决的问题

    可以认为最先由微软搞出来了__stdcall, 其实就是和WINAPI的声明是一样的,入栈顺序是从右到左,函数返回时,会进行出栈操作. PASCAL语言是非常古老的编程语言,在C语言之前,因此在当时的 ...

  2. Opencv+pycharm+anaconda配置

    最简便的方法,没有之一 首先下载annconda:(不要从官网下,还要FQ,还要慢) https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 请注 ...

  3. NetHogs 实时检测网络流量 转

    有很多适用于Linux系统的开源网络监视工具.比如说,你可以用命令iftop来检查带宽使用情况. netstat用来查看接口统计报告,还有top监控系统当前运行进程.但是如果你想要找一个能够按进程实时 ...

  4. Git 的origin和master分析(转)

    转:http://lishicongli.blog.163.com/blog/static/1468259020132125247302/ 首先要明确一点,对git的操作是围绕3个大的步骤来展开的(其 ...

  5. iptables详解(8):iptables扩展模块之state扩展

    当我们通过http的url访问某个网站的网页时,客户端向服务端的80端口发起请求,服务端再通过80端口响应我们的请求,于是,作为客户端,我们似乎应该理所应当的放行80端口,以便服务端回应我们的报文可以 ...

  6. Markdown_02_作图

    [TOC] 前言 一.序列图(Sequence) 序列图由 js-sequence提供支持,可以将代码块转成序列图 示例如下: ```sequence Title: Here is a title A ...

  7. CMDB配置资源管理数据库(理解)

    CMDB是运维自动化的基础,它为日志系统,发布系统,监控系统等运维系统(ELK,zabbix,open-falcon)提供接口函数, 第一种方式:Agent方法实现,agent不能直接访问数据库,因为 ...

  8. windows下的一些命令

    dir 相当于linux下的ls clear 清屏 netstat 活动连接 | 管道命令 findstr 查询类似linux的grep tasklist 查看进程列表 taskkill 杀死进程 d ...

  9. MATLAB基础知识tips

    网络论坛资源: MATLAB中文论坛https://i.cnblogs.com/EditPosts.aspx?opt=1 circshift 移位函数,circshift(A,SHIFTSIZE).S ...

  10. GPU编程自学6 —— 函数与变量类型限定符

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...