Golang中主要结合jaeger和opentracing去实现链路追踪
链路追踪中的基本概念:
tracer、span
tracer代表了一个流程或事务在分布式系统中的执行过程,tracer由多个span构成的有向无环图,每个span代表tracer中被命名并计时的连续性执行片段
span代表系统中具有开始时间和执行时长的逻辑单元,span之间通过嵌套或者顺序排列建立逻辑因果关系
关系:
分布式追踪中的每个组件都包含自己的一个或者多个span。例如,在一个常规的RPC调用过程中,在RPC的客户端和服务端,至少各有一个span,用于记录RPC调用的客户端和服务端信息。
一个父级的span会显示的并行或者串行启动多个子span。
tracer和span的时间轴关系
在分布式服务中需要用一个标志连接彼此的关系
traceId
a->b->c->d
{root span id}:{this span id}:{parent span id}:{flag}
jaeger的5大组件:
jaeger-client:代码接入的 jaegerClient。
jaeger-agent:jaeger-client 会把 span 上报给 jaeger-agent,这个 aegent 最好和 jaeger-client 部署在同一台服务器,离得近上报也快,否则可能会因为上报数据反而拖累业务
jaeger-collector:负责从 jaeger-agent 那里拿数据的服务, 有 push /pull 两种方式
storage:存储jaeger-collector 拿到的数据的地方,可以选 es 或者 cassandra。
jaeger-query:负责从 storage 查询数据
运行流程图: