首页 > 其他分享 >解决代码使用CompletableFuture做异步时spring-cloud-starter-sleuth的日志追踪号为空的情况

解决代码使用CompletableFuture做异步时spring-cloud-starter-sleuth的日志追踪号为空的情况

时间:2023-09-05 15:13:18浏览次数:45  
标签:sleuth return spring tracer CompletableFuture span Span Tracer

产生问题原因

就是异步调用,导致spanId和traceId丢失了
@Async 注解的异步调用是没问题的

前提

使用spring-cloud-starter-sleuth jar包版本2.2.8.RELEASE
关于追踪号的xml 配置为

<pattern>%yellow(%date{yyyy-MM-dd HH:mm:ss.SSS}) [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-B3-ParentSpanId:-},%X{X-Span-Export:-}] %highlight(%-5level) %yellow(%thread) %green(%logger:%line)  %msg%n</pattern>

当CompletableFuture有一个任务时,代码的写法

import brave.Span;
import brave.Tracer;

@Autowired
private Tracer tracer;

public String completableFutureTestOne() {
    log.info("--------");
    Span span = tracer.nextSpan();
    CompletableFuture.supplyAsync(()->{
        try (Tracer.SpanInScope cleared = tracer.withSpanInScope(span)) {
            print("zhangsan");
            return "zhangsan";
        }catch (Exception e) {
            e.printStackTrace();
            return "zhangsan";
        }

    });
    return "ok111";
}

当CompletableFuture有多个任务时,代码的写法

import brave.Span;
import brave.Tracer;
import brave.propagation.TraceContext;

@Autowired
private Tracer tracer;

public String completableFutureTest() {
    log.info("--------");
    TraceContext context = tracer.nextSpan().context();
    CompletableFuture.supplyAsync(()->{
        Span span = tracer.newChild(context);
        try (Tracer.SpanInScope cleared = tracer.withSpanInScope(span)) {
            print("zhangsan");
            return "zhangsan";
        }catch (Exception e) {
            e.printStackTrace();
            return "zhangsan";
        }

    });

    CompletableFuture.supplyAsync(()->{
        Span span = tracer.newChild(context);
        try (Tracer.SpanInScope cleared = tracer.withSpanInScope(span)) {
            print("lisi");
            return "lisi";
        }catch (Exception e) {
            e.printStackTrace();
            return "lisi";
        }
    });
    return "ok";
}

标签:sleuth,return,spring,tracer,CompletableFuture,span,Span,Tracer
From: https://www.cnblogs.com/shareToAll/p/17679694.html

相关文章

  • Springboot+Quartz+Dynamic-datasource
    在使用dynamic-datasource多数据源切换场景下,实现Quartz任务持久化配置和API动态调度1.pom依赖暂未找到版本对应关系,若有版本不一致异常,请自行尝试升降版本。<dependencies><!--动态数据源--><dependency><groupId>com.baomidou</groupI......
  • [SpringSecurity5.6.2源码分析二]:SecurityAutoConfiguration
    • SecurityAutoConfiguration是SpringSecurity最重要的一个自动配置类• 像以前版本的教程说要在启动类上配@EnableWebSecurity,现在也是由这个自动配置类负责引入• 分析一 已经介绍了DefaultAuthenticationEventPublisher,所以说重点就只有使用@Import导入的三个类,SpringBo......
  • Spring Bean 的生命周期,如何被管理的
    实例化一个Bean,也就是我们通常说的new按照Spring上下文对实例化的Bean进行配置,也就是IOC注入如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(StringbeanId)方法,此处传递的是Spring配置文件中Bean的ID如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBean......
  • springboot加载bean失败:No matching autowired candidates found
    场景:之前在培训轮岗,一直没有干活,最近开始干活遇到xxljob,打算自己学习了解一下。在按照文档配置执行器项目时,发现怎么启动,xxlJobExecutor都没有被加载进来。解决:后来经过查阅,原来是springBoot启动默认扫描的是启动类所在的包以及其子包,而我的文件为:因此bean注入失败。把......
  • Docker 部署 Jenkins 构建 SpringBoot 工程发布镜像
    说明全部都基于Docker服务搭建使用,首先用Docker安装Jenkins环境,Docker安装GitLab版本管理系统,执行Jenkins拉取指定版本tag进行编译构建,在用SonarQube进行代码质量检测,在打包制作镜像,发布到Harbor镜像仓库,最后启动SpringBoot工程并进行访问。系统平台CentOSLinu......
  • Spring最全的依赖注入方式
    前言Spring正如其名字,给开发者带来了春天,Spring是为解决企业级应用开发的复杂性而设计的一款框架,其设计理念就是:简化开发。Spring框架中最核心思想就是:IOC(控制反转):即转移创建对象的控制权,将创建对象的控制权从开发者转移到了Spring框架。AOP(切面编程):将公共行为(如记录日......
  • springboot启动错误: 找不到或无法加载主类
    当在eclipse启动springboot项目时出现问题:springboot错误:找不到或无法加载主类解决办法:1,通过cmd命令行,进入项目目录进行,mvncleaninstall进行编译项目install后,再到eclipse上选中项目按F5刷新项目。再运行即可问题解决。2,在eclipse上选中项目 点击clean清理项目再运行问......
  • 基于springboot的美食系统
    系统使用技术:springboot前端技术:bootstrap、vue、css、js等开发工具:idea数据库:mysql5.7项目介绍:该系统框架后端采用springboot框架,前端使用bootstrap、css、js等,系统界面美观,功能全面。系统主要分为2个角色:用户和管理员,主要功能为:菜谱管理、公告管理、资讯管理,收藏菜谱并评论,趣味答......
  • 基于springboot+LayUI的校园信息发布平台
    系统使用技术:springboot前端技术:LayUI、css、js等开发工具:idea数据库:mysql5.7项目介绍:本系统是一个类似于论坛的信息发布平台,采用MVC三层架构和rest风格URL,后端使用SpringBoot框架,前端采用LayUI框架+freemarker动态模板生成,数据库使用mysql,开发工具采用idea,jdk采用1.8。系统实现了......
  • SpringBoot启动o.s.b.d.LoggingFailure… 错误解决方法
    把@SpringBootApplication改成@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})即:......