- Zipkin
- Brave
Zipkin
- 开源的分布式实时数据追踪系统 distributed tracking system,基于 google dapper 系统的论文设计而来,由twitter开发开源
- 主要功能 聚集各个异构系统的实时监控数据,追踪微服务架构下的系统延时问题
- zipkin以trace结构表示对一次请求的追踪,每个trace分为许多有依赖关系的span(处理请求过程中的子服务)
- 由四个模块组成
- 收集器 – 搜集各系统报告的追踪数据
- 数据存储 --可以放在内存中 开启后默认Cassandra,支持mysql,elasticsearch
- 查询 --向其他服务提供数据查询的能力
- Web界面 UI 默认图形化的能力
- 安装环境和集成包
修改本机环境 jdk
JAVA_HOME
D:\Program Files\Java\jdk1.7.0_75
D:\Program Files\Java\jdk1.8.0_40
JRE_HOME
D:\Program Files\Java\jre7
D:\Program Files\Java\jdk1.8.0_40\jre
将集成包安装到mvn本地厂库
mvn install:install-file -Dfile=brave-dubbo-1.0.0-SNAPSHOT.jar -DgroupId=io.zipkin.brave -DartifactId=brave-dubbo -Dversion=1.0.0-SN
APSHOT -Dpackaging=jar
- 使用zipkin
java -jar zipkin-server-2.10.4-exec.jar
- 指定使用elasticsearch作为数据存储
java -jar zipkin-server-2.10.4-exec.jar --STORAGE_TYPE=elasticsearch --DES_HOSTS=http://localhost:9200 > 1.log &
elasticsearch 中默认索引名 zipkin:span-yyyy-mm-dd
Brave 3.X版本 -----Zipkin for java
-
zipkin 提供用来装备java程序的类库
-
提供 面向 Standard Servlet,Spring MVC ,Http Client,JAX RS,Jersey,Resteasy和mysql等接口的装备能力
(装备—想zipkin报告数据 ),能够让基于以上框架的应用支持zipkin,Brave也提供简单接口方便扩展和定制。 -
使用Brave 3.X版本
Brave.Builder builder = new Brave.Builder("serviceName");
Brave.brave = builder.build();
serviceName 为服务名
++如上监控数据以日志形式 打印的到控制台++
HttpSpanCollector 负责将数据发送给zipkin服务端
Brave.Builder builder = new Brave.Builder("serviceName");
builder.spanCollector(HttpSpanCollector.create(this.zipkinHost, new EmptySpanCollectorMetricsHandler())).traceSampler(Sampler.create(rate)).build();
Brave.brave = builder.build();
- Brave 与 Spring 集成
网上已有一些集成好的,采用 BraveFactoryBean 方式实现单例模式
使用的时候 xml 如下配置
<bean id="brave" class="com.github.kristofa.brave.dubbo.BraveFactoryBean" p:serviceName="truceProvider" p:zipkinHost="http://localhost:9411/" p:rate="1.0" />
- 原理
和Dubbo服务请求透传ID的原理是一样的,都是通过Dubbo
扩展的 filter 内往RpcContext里放traceId SpanID等实现。
RpcContext.getContext().setAttachment
brave 完成了 透传ID和发送数据到zipkin服务端 的功能
[外链图片转存失败(img-HGDfny5g-1562924173538)(http://ox0rewbep.bkt.clouddn.com/blog/180808/0I70IjII1f.png?imageslim)]
[外链图片转存失败(img-gDbOqLU7-1562924173540)(http://ox0rewbep.bkt.clouddn.com/blog/180808/halh5cEG6J.png?imageslim)]
[外链图片转存失败(img-8DtntBWS-1562924173541)(http://ox0rewbep.bkt.clouddn.com/blog/180808/2GE7dbg0hI.png?imageslim)]
Brave 5.2 版本 -----Zipkin for java
Brave 模块brave-instrumentation-dubbo-rpc
Dubbo rpc 调用追踪原理
Client Span Server Span
┌──────────────────┐ ┌──────────────────┐
│ │ │ │
│ TraceContext │ Http Request Headers │ TraceContext │
│ ┌──────────────┐ │ ┌───────────────────┐ │ ┌──────────────┐ │
│ │ TraceId │ │ │ X─B3─TraceId │ │ │ TraceId │ │
│ │ │ │ │ │ │ │ │ │
│ │ ParentSpanId │ │ Extract │ X─B3─ParentSpanId │ Inject │ │ ParentSpanId │ │
│ │ ├─┼─────────>│ ├────────┼>│ │ │
│ │ SpanId │ │ │ X─B3─SpanId │ │ │ SpanId │ │
│ │ │ │ │ │ │ │ │ │
│ │ Sampled │ │ │ X─B3─Sampled │ │ │ Sampled │ │
│ └──────────────┘ │ └───────────────────┘ │ └──────────────┘ │
│ │ │ │
└──────────────────┘ └──────────────────┘
TracingFilter.java 详解
属性:tracer extractor injector
功能:如上图
伪代码
如果是 client端
如果tracer内没有父span
创建一个新span
有
创建一个子span
如果是 server端
rpc调用信息 是否有追踪信息(TraceContext)
有则 放入 span中,放入Tracer中
没有 则Tracer 创建新的追踪信息