zipkin之brave
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创建的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的更多相关文章
- Zipkin和Brave实现http服务调用的跟踪
使用Zipkin和Brave实现http服务调用的跟踪,Brave 是用来装备Java程序的类库,提供了面向标准Servlet.Spring MVC.Http Client.JAX RS.Jersey ...
- 调用链系列二、Zipkin 和 Brave 实现(springmvc、RestTemplate)服务调用跟踪
Brave介绍 1.Brave简介 Brave 是用来装备 Java 程序的类库,提供了面向标准Servlet.Spring MVC.Http Client.JAX RS.Jersey.Resteas ...
- 第二十八章 springboot + zipkin(brave定制-AsyncHttpClient)
brave本身没有对AsyncHttpClient提供类似于brave-okhttp的ClientRequestInterceptor和ClientResponseInterceptor,所以需要我们 ...
- 使用 Zipkin 和 Brave 实现分布式系统追踪(基础篇)
一.Zipkin 1.1.简介 Zipkin 是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper 的论文设计而来,由 Twi ...
- 【第二十八章】 springboot + zipkin(brave定制-AsyncHttpClient)
brave本身没有对AsyncHttpClient提供类似于brave-okhttp的ClientRequestInterceptor和ClientResponseInterceptor,所以需要我们 ...
- 调用链系列三、基于zipkin调用链封装starter实现springmvc、dubbo、restTemplate等实现全链路跟踪
一.实现思路 1.过滤器实现思路 所有调用链数据都通过过滤器实现埋点并收集.同一条链共享一个traceId.每个节点有唯一的spanId. 2.共享传递方式 1.rpc调用:通过隐式传参.dubbo有 ...
- 第二十九章 springboot + zipkin + mysql
zipkin的数据存储可以存在4个地方: 内存(仅用于测试,数据不会持久化,zipkin-server关掉,数据就没有了) 这也是之前使用的 mysql 可能是最熟悉的方式 es Cassandra ...
- 原理分析dubbo分布式应用中使用zipkin做链路追踪
zipkin是什么 Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开 ...
- 【第二十九章】 springboot + zipkin + mysql
zipkin的数据存储可以存在4个地方: 内存(仅用于测试,数据不会持久化,zipkin-server关掉,数据就没有了) 这也是之前使用的 mysql 可能是最熟悉的方式 es Cassandra ...
随机推荐
- HDU 2795 线段树单点更新
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- h5开发中,利用微信或者QQ登陆以后获取用户头像在canvas画布显示问题
在实际开发上先的h5页面产品中,总会遇到各种坑,好多坑都是安卓和iPhone端兼容的问题(用电脑谷歌浏览器输入 chrome://inspect/#devices可以用手机USB调试,打开) eg: ...
- MyCat入门指南
入门篇 1. 安装 1.1从https://github.com/MyCATApache/Mycat-download下载压缩包 1.2解压缩后复制到相应目录下面,比如/usr/local ...
- MySQL简单的操作,增删改查
B/S架构模式与C/S架构模式的区别 B/S=WEB/SERVER C/S=CLIENT/SERVIR B/S:用户通过web浏览器打开域名就能访问服务器server的方式就叫做B/S用户不需要安装任 ...
- poj21516
首先对于一种商品 如果这种货不足需求就直接输出-1 剩下的就是KM算法 分k次分别计算每种商品的最小权值匹配 代码: #include<cstdio> #include<cstrin ...
- SpringAnnotation注解之@Resource
@Resource:同样也是注入,默认是按byName,byName找不到的话按byType 1 2 3 4 @Resource public void setUserDao(UserDao user ...
- vue和react
1. 数据渲染 vue是使用template模板进行渲染,react使用的是jsx语法,对组件进行渲染 vue模板中使用{{ this.data }} 双括号包着变量,代表变量表示的值.外面那层表示需 ...
- java数组实现简单的DVD管理
package com; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; pub ...
- Objective C - 4 - 下载图片并且加载到View
#import "LoadInternetImageViewController.h" @interface LoadInternetImageViewController () ...
- iOS通讯录相关知识-浅析
本文来自于:贞娃儿的博客 http://blog.sina.com.cn/zhenwawaer 在开发一些应用中,我们如果需要iPhone设备中的通讯录信息.或者,需要开发通讯录相关的一些功能.那 ...