springcloud trace SDK 自研方案

2023-05-16

SDK 形式,利用 threadlocal 实现 trace。http, grpc, rabbitMQ, springcloud-gateway, 异步线程池这类常见场景。

客户端在协议 header 中增加 x-request-id,服务端解析 header 中 x-request-id,存储在 threadlocal,日志框架格式化输出。

java 服务只用依赖 common-tracing.jar lib。

日志格式化输出 traceId 可以使用 MDC,各种协议支持可以考虑 springBoot 的自动注入机制。

grpc

grpc 使用 client 拦截器 和 server拦截器解析 x-request-id。利用 io.grpc.ClientInterceptor,org.lognet.springboot.grpc.GRpcGlobalInterceptor 实现无侵入自动注入。

producer consumer grpcServerInterceptor send a grpc request 1 intercept 2 get traceId, or create uuid put in threadload and cmap put in MDC - 3 print log with traceId producer consumer grpcServerInterceptor 消费 grpc 请求
producer clientInterceptor consumer intercept 1 get traceId from threadLoad put traceId to grpc header send a grpc request 2 producer clientInterceptor consumer 生产 grpc 请求

RabbitMQ

rabbitMQ 使用 messageConvert 解析 x-request-id,使用 SmartInitializingSingleton 获取 SimpleMessageListenerContainer bean,再注入 messagePostProcessors。

producer MQ consumer mqMessageConvert.fromMessage send a MQ 1 send a message 2 intercept 3 get traceId, or create uuid put in threadload and cmap put in MDC - 4 print log with traceId producer MQ consumer mqMessageConvert.fromMessage 消费 RabbitMQ
producer mqMessageConvert.toMessage MQ consumer intercept 1 get traceId from threadLoad put traceId to message header 2 send a MQ 3 send a MQ with traceId 4 producer mqMessageConvert.toMessage MQ consumer 生产 RabbitMQ
@Slf4j
@Component
@ConditionalOnClass(SimpleMessageListenerContainer.class)
public class FromProcessorConfig implements SmartInitializingSingleton {

    @Autowired(required = false)
    SimpleMessageListenerContainer listenerContainer;


    public void setAfterReceivePostProcessors(SimpleMessageListenerContainer listenerContainer) {
        try {
            Class<?> obj = Class.forName("org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer");
            Field field = obj.getSuperclass().getDeclaredField("afterReceivePostProcessors");
            field.setAccessible(true);
            Collection<MessagePostProcessor> messagePostProcessors = (Collection<MessagePostProcessor>)field.get(listenerContainer);
            if (CollectionUtils.isEmpty(messagePostProcessors)) {
                listenerContainer.setAfterReceivePostProcessors(new TracingFromMessagePostProcessor());
            }else {
                messagePostProcessors.add(new TracingFromMessagePostProcessor());
            }
            log.info("Initial tracingFromMessagePostProcessor success.");
        } catch (Exception e) {
            log.error("Initial tracingFromMessagePostProcessor failed.", e);
        }
    }

    @Override
    public void afterSingletonsInstantiated() {
        if (listenerContainer != null) {
            setAfterReceivePostProcessors(listenerContainer);
        }
    }
}
@Slf4j
@Component
@ConditionalOnClass(RabbitTemplate.class)
public class ToProcessorConfig implements SmartInitializingSingleton {

    @Autowired(required = false)
    RabbitTemplate rabbitTemplate;

    public void setBeforePublishPostProcessors(RabbitTemplate template) {
        try {
            Class<?> obj = Class.forName("org.springframework.amqp.rabbit.core.RabbitTemplate");
            Field field = obj.getDeclaredField("beforePublishPostProcessors");
            field.setAccessible(true);
            Collection<MessagePostProcessor> messagePostProcessors = (Collection<MessagePostProcessor>)field.get(template);
            if (CollectionUtils.isEmpty(messagePostProcessors)) {
                template.setBeforePublishPostProcessors(new TracingToMessagePostProcessor());
            }else {
                messagePostProcessors.add(new TracingToMessagePostProcessor());
            }
            log.info("Initial tracingToMessagePostProcessor success.");
        } catch (Exception e) {
            log.error("Initial tracingToMessagePostProcessor failed.", e);
        }
    }

    @Override
    public void afterSingletonsInstantiated() {
        if (rabbitTemplate != null) {
            setBeforePublishPostProcessors(rabbitTemplate);
        }
    }
}

http

http 使用 restTemplate 拦截器和 springMVC filter解析

producer consumer springMVCFilter send a http request 1 filter 2 get traceId, or create uuid put in threadload and cmap put in MDC 3 print log with traceId producer consumer springMVCFilter 消费 http
producer restTemplateInterceptor consumer intercept 1 get traceId from threadLoad put traceId to http header 2 send a http reqeust with traceId 3 producer restTemplateInterceptor consumer 生产 http

进程内异步线程池

使用 ttl agent 全局替换,集成 MDC。

ttl 作用:将当前线程的 threadLocal,执行线程池任务时,传递到执行线程中。

springcloud - gateway

使用 GlobalFilter 解析 traceId,注意将 GloabalFilter 执行顺序放到最高。

集成功能

  1. 监控异常请求,告警
  2. response header 对 traceId 的透出
  3. 根据参数打印所有链路输入输出参数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springcloud trace SDK 自研方案 的相关文章

  • Android Studio 不允许我更改 SDK 位置

    我打开 Android Studio 然后我打开 SDK 管理器 我拥有最新版本 但是我的 SDK 平台需要 Android 6 0 它甚至不让我点击任何东西 在此图像中 您可以看到文本和复选框变色 我无法单击 SDK 平台内的任何内容 甚
  • 有没有办法在 Spring Boot 应用程序配置中使用 Spring Cloud {cipher} ?

    我有一个使用 Spring Cloud Config 的 Spring Boot 应用程序 但我想在 Spring Boot 应用程序 bootstrap yml 文件中加密 Spring Cloud Config 密码 有没有办法做到这一
  • Spring Cloud Gateway 全局异常处理和自定义错误响应

    我有一个自定义过滤器 可以在使用 Spring Cloud Gateway 调用实际 API 之前对每个请求进行身份验证 Spring Cloud中有没有办法像Spring提供 ControllerAdvice一样集中处理异常 我想全局处理
  • 设置了 server.contextPath 的 Spring Boot 与通过 Eureka Server 访问 hystrix.stream 的 URL

    我有运行 Turbine 实例的 Eureka Server 以及连接到它的一些发现客户端 一切正常 但如果我注册一个发现客户端server contextPath设置后 它没有被识别InstanceMonitor涡轮流无法结合其hystr
  • 自定义 MKAnnotationView - 如何捕获触摸而不忽略标注?

    我有一个自定义 MKAnnotationView 子类 它完全按照我想要的方式显示视图 在那个视图中 我有一个按钮 我想捕获按钮上的事件来执行操作 这很好用 但是 我不希望标注被忽略或消失 基本上 触摸标注中的按钮将开始播放声音 但我想保留
  • 安卓框架?

    是否有任何框架比构建 Android 应用程序更容易 您会对其中一个感兴趣吗 很快就会有 我正在开发 DroidFu 一个 Android 共享库 它将为您提供 活动 和服务 中直接提供大量实用功能 例如生成列表和错误对话框 检查 Inte
  • Paypal Rest API - 来自批准 URL 的令牌生命周期

    我使用 Paypal Rest API 我的问题是 有多长token来自批准 URL 有效吗 我想将此令牌 也包含我的令牌 存储到数据库并生成带有我的令牌的链接 稍后 如果我单击此链接 将我的令牌替换为 paypal 令牌 我想重定向到 p
  • FB SDK 3.0 我是否需要扩展访问令牌还是自动的?

    基于http developers facebook com roadmap offline access removal http developers facebook com roadmap offline access remova
  • Spring Cloud Gateway 无法在 Docker 上运行

    我已经配置了一个 Spring Cloud 网关来重定向到使用以下路由创建的服务器 Bean public RouteLocator myRoutes RouteLocatorBuilder builder return builder r
  • Spring Cloud Streams - 源和接收器的多个动态目的地

    我的系统上有一个更改请求 该请求当前侦听多个通道并向多个通道发送消息 但现在目标名称将位于数据库中并随时更改 我很难相信我是第一个遇到这种情况的人 但我看到的信息有限 我只找到这2个 动态接收器目的地 https github com sp
  • 使用 Zuul 将客户端证书导出到后端

    是否可以使用 Zuul 作为代理 负载均衡器将客户端证书导出 转发到后端服务 我终于有了一个使用 https 的 zuul 和 spring cloud 的工作示例 并使用 https 将请求转发到后端的安全服务 现在我除了使用https之
  • Windows 上的 OpenGL SDK

    我正在尝试编写一个 OpenGL 应用程序 因此我安装了 Windows 7 SDK 然而 它似乎是OpenGL 1 1 define GL VERSION 1 1 1 如何找到我安装的 OpenGL 版本 dll 以及在哪里可以找到较新的
  • Android studio SDK 管理器丢失

    我正在关注这个离子教程 https ionicacademy com get started with ionic 在 Android Studio 中设置 SDK 来测试我的 ionic 项目时遇到了一些问题 我正在寻找 SDK 管理器
  • 最小 sdk 9 的应用程序兼容版本

    我有 Android Studio 版本 2 3 3 和sdk工具版本 25 2 5 当我用 min 构建一个新项目时sdk9 它犯了一个错误 我必须使用 minsdk我的项目为 14 无论如何 必须将其更改为 9 并使用 appcompa
  • 适用于 WP8 的 Windows Phone 8.1 和 Admob SDK

    我想问是否只是我没有得到任何添加 NoFill 错误 或者 admob sdk 实际上应该更新到 wp8 1
  • android sdk 管理器未更新

    在尝试更新适用于 Android 的 eclipse sdk 管理器时 我收到以下错误而不是更新 Downloading Android SDK Platform tools revision 20 URL not found C Prog
  • 在构建服务器上安装 F# 4.1 SDK

    我已在 PC 上安装了支持 F 的 Visual Studio 2017 并且 MSBuild 目标位于C Program Files x86 Microsoft Visual Studio 2017 Enterprise MSBuild
  • MSBuild 找不到 resgen.exe

    我有一台 VM 机器 我在其中复制了 SDK 文件和路径 转到注册表并将密钥添加到注册表中 但我不断收到错误 resgen exe找不到 C Windows Microsoft NET Framework v4 0 30319 Micros
  • 如何降低iphone的sdk Audioqueue的声音?

    我正在使用 Aran Mulhollan 的 RemoteIOPlayer 在 SDK iphone 中使用音频队列 我可以毫无问题 添加两个信号来混合声音 通过乘以从 wav 文件中获得的 UInt32 来增加音量 但所有其他操作都会给我
  • Android Eclipse 支持库:所需版本为空

    我刚刚从 Android 开发者网站下载并安装了适用于 Windows 的最新 ADT 捆绑包 接下来 我在 SDK 管理器中安装了所有软件包 包括 Android 支持库 Rev 18 最后 我通过 Eclipse 中的 帮助 gt 安装

随机推荐

  • Nginx规则配置实例

    配置某个ip或者页面禁止访问及跳转方法 server listen 80 server name www test com cn location proxy redirect off proxy set header host host
  • Debian 11.2安装ssh服务

    切换到root用户 更新软件源 span class token function apt get span update 安装ssh span class token function apt get span span class to
  • Python计算文件大小

    span class token comment usr bin env python span span class token comment coding utf 8 span span class token triple quot
  • Python获取文件内的下一行数据

    span class token comment usr bin env python span span class token comment Version 61 3 8 1 span span class token comment
  • iptables配置实例

    查看当前所有规则 iptables L n 查看所有规则 iptables nL line number 显示行 iptables nvL line number 显示行 清空所有配置 iptables F iptables X iptab
  • 利用Shell脚本校验数据一致性

    span class token shebang important bin bash span span class token comment span span class token comment 检测两台服务器指定目录下的文件一
  • Debian11系统Redis源码安装

    span class token shebang important bin bash span span class token comment Debian11 Redis6 2 6安装 span span class token co
  • iOS 根据文字内容设置cell 的高度

    今天学习一个简单的 根据内容的大小设置cell 的高度 第一步 建两个类 分别继承于UIViewController 和UITableViewCell 第二步 mainViewController h import lt UIKit UIK
  • Python下载GitHub数据

    配置文件 span class token punctuation span Source span class token punctuation span Source path span class token operator 61
  • pip 指定安装位置

    离线安装且指定位置 sudo pip3 install no index find links 61 requirements r requirements txt target 61 usr lib python3 dist packag
  • [微服务感悟] 服务雪崩与熔断器

    文章目录 什么是服务雪崩解决方式熔断器舱壁模式 服务隔离 什么是服务雪崩 之前工作中出现了这样的一个问题 xff0c 有一个业务服务 xff0c 它的功能是政府某部门的文件流转柜 那个业务中原本每个外部请求都有一个独立的线程池去处理任务 x
  • [微服务感悟] 很好理解的分布式事务

    事务是保证一系列操作是一个整体 xff0c 要么都执行 xff0c 要么都不执行 比如A给B转账 xff0c A扣钱了 xff0c B的账户的钱也要加上去 xff0c 不能出现A扣钱B不加钱 xff0c 或者B加钱A不扣钱的情况 在单体程序
  • 参加2020Jam初赛记录与部分题目解答

    Google Jam大赛是谷歌举办的一年一届的在线答算法题的的比赛 初赛比赛时长27小时 xff0c 一共有5道算法题 xff0c 总分100分 xff0c 获得分数30分和以上者 xff0c 就能晋级下一轮比赛 在这27小时内 xff0c
  • Cannot add task wrapper as a task with that name already exists - 问题解决

    问题描述 项目使用 gradle build 去打包 xff0c 报错 Cannot add task 39 wrapper 39 as a task with that name already exists xff0c 使用 gradl
  • K3s 无法下载镜像 failed to authorize/ failed to fetch anonymous token/ unexpected status/ 401 Unauthorized

    我需要部署公司功能节点进行测试 xff0c 考虑自己的 mac pro 内存很小只有 16g xff0c k8s 运行需要大量内存 xff0c 电脑可能要卡死 周边同学推荐装 k3s xff0c 它可以看作 k8s 的精简版 xff0c 删
  • 一看就懂的 RabbitMQ 使用教程

    一天 xff0c 阿强接到一个需求 xff0c 将公网的服务的执行结果通知到内网的服务上 阿强一想 xff0c 很简单阿 xff0c 只要在公网搭一个简单的消息服务 xff0c 给公网系统提供一个存储消息接口 xff1b 给内网系统提供一个
  • OOM 很可怕吗 -- minio-client 上传文件触发 OOM 排错

    不要把 OOM 问题当作一个可怕的难题 xff0c 也许对着报错堆栈日志看代码就能解决 问题描述 线上服务出现 OOM 的日志 xff0c 日志显示是 minio client 的错误 使用 minio client 版本是 3 0 10
  • AI 写代码来了 - github 的 AI 写代码插件 copilot 发布

    以前老在调侃 AI 自动写代码 xff0c 没想到这么快就成现实 这几天 github 出了 AI 写代码插件 xff0c 支持 vscode 编辑器 xff0c js xff0c py xff0c go 等语言 xff0c 看了介绍 xf
  • 枚举与字符串的转换

    枚举类型的使用优势没啥好说的 但经常需要将它与字串进行转换方便显示或其它需求 1 将枚举中的标示转成字符串 xff1a define enumToString value 64 value 将枚举转换成字符串 2 在常见的方案中 xff0c
  • springcloud trace SDK 自研方案

    SDK 形式 xff0c 利用 threadlocal 实现 trace http grpc rabbitMQ springcloud gateway 异步线程池这类常见场景 客户端在协议 header 中增加 x request id x