一 基本术语
Trace : 表示系统中一次数据或者执行路径的轨迹,可以简单认为是多个Span有向无环图。
Span:Span代表系统中一次逻辑操作运行单元。Span之间会建立嵌套或者顺序排列建立逻辑因果关系。
二 Jaeger组件架构
无缓存队列的架构
有缓存队列架构
三 服务追踪
服务追踪过程
四 应用埋点
1 手动埋点工具Client
针对非java应用,目前只能通过手动埋点的方式上报服务追踪信息,对应的client列表如下 :
Language |
GitHub Repo |
Go |
|
Java |
|
Node.js |
|
Python |
|
C++ |
|
C# |
2 手动埋点过程
1. 添加依赖 主要添加opentracing 和 jaeger相关依赖
2. 初始化Tracer对象,并注册到GlobalTracer
io.jaegertracing.Configuration config = new io.jaegertracing.Configuration("demo");
io.jaegertracing.Configuration.SenderConfiguration sender = new io.jaegertracing.Configuration.SenderConfiguration();
// endpoint 为jaeger collector url :14268/api/traces
sender.withEndpoint("http://collertor-host:14268/api/traces ");
config.withSampler(new io.jaegertracing.Configuration.SamplerConfiguration().withType("const").withParam(1));
config.withReporter(new io.jaegertracing.Configuration.ReporterConfiguration().withSender(sender).withMaxQueueSize(10000));
GlobalTracer.register(config.getTracer());
3. 具体方法体内部获取Tracer对象,并记录请求数据
Tracer tracer = GlobalTracer.get();
// 创建 Span
Span span = tracer.buildSpan("parentSpan").withTag("myTag", "spanFirst").start();
tracer.scopeManager().activate(span,false);
tracer.activeSpan().setTag("methodName", "testTracing");
// 业务逻辑
...
span.finish();
4. 多个微服务间通过Context传递Trace信息,比如在HTTP请求中使用Extract/Inject 方法在 HTTP Request Headers 上透传数据
//客户端Inject
tracer.inject(tracer.ac