dubbo日志链路追踪traceid怎么选型-亚博电竞手机版

dubbo日志链路追踪traceid怎么选型

本篇内容介绍了“dubbo日志链路追踪traceid怎么选型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、目的

开发排查系统问题用得最多的手段就是查看系统日志,但是在分布式环境下使用日志定位问题还是比较麻烦,需要借助 全链路追踪id 把上下文串联起来,本文主要分享基于 spring boot dubbo 框架下 日志链路追踪id 的实现方案选型思路。

全链路追踪的核心思想:

  • 为每条请求都单独分配一个唯一的 traceid 用来标识一条请求链路,该 traceid 会贯穿整个请求处理过程的所有服务

  • 每个服务/线程都拥有自己的 spanid 标识,代表请求的其中一段处理步骤

  • 一个请求包含一个 traceid 和一个或多个 spanid

日志全链路追踪 就是在每条系统日志里都添加显示 traceidspanid 信息

二、方案选型

2.1. 方案一(apm-toolkit)

这是 skywalking 的一个日志插件,通过这个插件可以在日志中输出 traceid

2.1.1. 使用方式

配置依赖,在 pom 文件中添加以下内容

org.apache.skywalkingapm-toolkit-logback-1.x8.1.0

配置日志模板,修改 logback-spring.xml 文件中 appender 元素的 encoder 为以下内容

%d{yyyy-mm-ddhh:mm:ss.sss}[%tid][%thread]%-5level%logger{35}-%msg%n

ps: pattern 中的内容按需修改,其中的 %tid 就是相当于 traceid,默认 tid:n/a,当有请求调用时会生成并显示 traceid

2.1.2. 总结

  • 优点:无需编码,业务无入侵,可与 skywalking 的图形化界面中使用该id快速定位各种接口的调用关系。

  • 缺点:强耦合 skywalking 才能生效

    • 必须添加sk的 javaagent

    • 必须部署 skywalking 服务端

2.2. 方案二(sleuth)

sleuthspring cloud 的组件之一,它为 spring cloud 实现了一种分布式追踪亚博vip888的解决方案,兼容zipkin,htrace与其他日志追踪系统

2.2.1. 使用方式

配置父依赖,在 pom 文件中添加以下内容管理版本号

org.springframework.cloudspring-cloud-sleuth2.2.4.releasepomimport

配置依赖,在 pom 文件中添加以下内容

org.springframework.cloudspring-cloud-starter-sleuth

适配dubbo,要让 sleuth 支持 dubbo 框架,需要增加以下两个步骤:

首先添加 dubbo 的插件依赖

io.zipkin.bravebrave-instrumentation-dubbo-rpc5.12.6

配置 dubbo 过滤器

dubbo:provider:filter:tracingconsumer:filter:tracing

配置日志模板,修改 logback-spring.xml 文件中 appender 元素的 encoder 为以下内容

%d{yyyy-mm-ddhh:mm:ss.sss}[%x{x-b3-traceid},%x{x-b3-spanid}][%thread]%-5level%logger{35}-%msg%nutf-8

ps: pattern 中的内容按需修改,其中的 %x{x-b3-traceid} 为 traceid,%x{x-b3-spanid} 为 spanid

2.2.2. 总结

  • 优点:业务无入侵,有丰富的插件进行扩展包括定时任务、mq等。

  • 缺点brave-instrumentation-dubbo-rpc 不支持 dubbo 2.7.x 需要自行开发插件。

2.3. 方案三(自研)

2.3.1. 无入侵增加 traceid

使用 logbackmdc 机制,在日志模板中加入 traceid 标识,取值方式为 %x{traceid}

  1. 系统入口(api网关)创建 traceid 的值

  2. 使用 mdc 保存 traceid

  3. 修改 logback 配置文件模板格式添加标识 %x{traceid}

mdc(mapped diagnostic context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。

2.3.2. 跨线程传递

解决 traceid 跨线程丢失问题

由于 mdc 内部使用的是 threadlocal 所以只有本线程才有效,子线程和下游的服务 mdc 里的值会丢失;

需要解决 spring 的各种线程池与异步方法的父子线程间传递。

解决思路:重写一个 mdcadapter 使用阿里的 transmittablethreadlocal 替换原来的 threadlocal 对象,解决各种线程池(executorservice / forkjoinpool / timertask)父子进程传值问题。

需要使用 ttlrunnablettlcallable 来修饰传入线程池的 runnablecallable

2.3.3. 跨进程传递

解决 traceid 跨进程丢失问题

dubbo服务 使用 org.apache.dubbo.rpc.filter 创建一个过滤器进行 traceid 传递

  • 服务消费者:负责传递链路追踪 id

  • 服务提供者:负责接收 id 并保存到 mdc

2.3.4. 总结

  • 优点:业务无入侵,最小依赖,扩展灵活,适配性强。

  • 缺点:需要自行实现,有大量的开发工作量。

三、方案总结

方案开发工作量可维护性入侵性性能
apm-toolkit业务无入侵
sleuth业务无入侵
自研业务无入侵

“dubbo日志链路追踪traceid怎么选型”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注恰卡编程网网站,小编将为大家输出更多高质量的实用文章!

展开全文
内容来源于互联网和用户投稿,文章中一旦含有亚博电竞手机版的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系亚博电竞手机版删除

最新文章

网站地图