您的位置:首页 > 其它

分布式链路跟踪系统概设

2017-09-12 00:00 1526 查看
摘要: 目标:实现一套可以在生产环境上使用的全链路系统,方便问题查找

架构示意图



架构组件选型

logstash->kafka->consumer->hbase

通过AGENT生成调用链trace日志。

通过logstash采集日志到kafka。

kafka负责提供数据给下游消费。

消费端解析trace信息,traceID作为rowkey,将信息插入hbase。

实现思路

Trace头部定义

Trace-Id(每次请求的唯一标识,在请求的链路中传递)

Rpc-Id(调用链内部的唯一ID,还原调用顺序和调用间的嵌套关系,需要考虑的调用关系包括同步、并发、异步、一对多。)

Trace-Status(链路请求状态,整个链路传递,解决没被采样的异常跟踪丢失)

Trace-Sampled(调用链采样,因为QPS越高,需要生成的调用日志也就越高。因此,为了降低整体的输出数据量。默认全采集)

TraceId组成

毫秒时间(时间戳,13)

顺序数(4)

IPv4(8)

进程ID(4)

RpcId组成

默认顶级为0

所有RpcId,包含所有父级RpcId(0.1.1他的父级为0.1,0.1的父级为0)

系统整合

针对Http

利用Servlet的FIlter

接收请求时,从header中获取Trace-Id、Rpc-Id、Trace-Sampled,没有则创建Trace对象,并放入ThreadLocal中。

响应时,在header中设置Trace-Status,用来标识本次链路状态,解决没被采样的异常跟踪丢失

针对Dubbo

利用Dubbo的Filter机制

客户端发起请求时,创建新的Trace,将Trace-Id、Rpc-Id、Trace-Sampled放入invocation的attachments中,执行调用,响应后打印日志

服务端接收请求时,从invocation的attachments中获取Trace-Id、Rpc-Id、Trace-Sampled,执行调用,响应后打印日志

数据存储HBase

rowkey

traceId+endpoint(服务端、客户端)+rpcId

value

traceType(类型:http、dubbo、redis、MQ等)

traceName(具体访问的url、访问的接口方法)

appName(应用名称)

localIp(本机IP)

remoteIp(发起远程调用服务的IP)

status(trace的状态)

size(请求大小)

time(耗时)

message(信息:默认响应状态)

检索

使用RowPrefixFilter根据rowkey前缀匹配所有记录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  分布式链路追踪