分布式链路跟踪系统概设
分布式链路跟踪系统概设
土豆_BIG 发表于1个月前
分布式链路跟踪系统概设
  • 发表于 1个月前
  • 阅读 2
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

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

架构示意图

架构组件选型

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前缀匹配所有记录
共有 人打赏支持
粉丝 0
博文 4
码字总数 7234
×
土豆_BIG
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: