架构示意图
架构组件选型
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,执行调用,响应后打印日志
- 针对Http
- 数据存储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前缀匹配所有记录
- rowkey