MSE全链路灰度支持异步任务

MSE全链路灰度需要在请求的调用链路中传递灰度流量标签,如果遇到一些不支持的异步任务场景,可能会导致流量的标签传递中断,从而引起灰度流量处理失败。对于通过Spring的@Async注解实现的异步任务,MSE默认支持对其进行标签传递。此外,MSE还支持通过添加异步透传扫描包自定义异步任务实现流量标签透传。

前提条件

请确保您的MSE探针版本为v3.2.0及以上公测版本。如需将探针升级到新版本,请加入MSE钉钉群43525005207进行升级。

您可以使用以下命令查看探针版本:

cat /home/admin/.opt/ArmsAgent/version

方式一:默认支持Spring的@Async注解

MSE默认支持使用Spring的@Async注解实现的异步任务进行异步标签透传。对于下列Spring框架中默认的Executor和Task,MSE会自动完成增强:

  • Executor:

    • org.springframework.scheduling.concurrent.ConcurrentTaskExecutor

    • org.springframework.core.task.SimpleAsyncTaskExecutor

    • org.springframework.scheduling.quartz.SimpleThreadPoolTaskExecutor

    • org.springframework.core.task.support.TaskExecutorAdapter

    • org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor

    • org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler

    • org.springframework.jca.work.WorkManagerTaskExecutor

    • org.springframework.scheduling.commonj.WorkManagerTaskExecutor

  • Task:

    org.springframework.aop.interceptor.AsyncExecutionInterceptor$1

    org.springframework.aop.interceptor.AsyncExecutionInterceptor$$Lambda$

方式二:添加异步透传扫描包

在Java应用中,您可以通过添加环境变量或Java启动参数的方式使用异步透传扫描包能力,实现异步任务的流量标签透传。这种能力涉及到的Runnable、Callable和Supplier接口在创建新对象时会自动捕获当前线程调用链的上下文,并在异步线程中执行时使用该调用链上下文,实现灰度流量标的全链路透传。

-Dprofiler.thread.match.package="com.alibaba.mse.brightroar.console.service"
说明

如需添加多个异步透传扫描包,可以使用半角逗号(,)分隔。

例如,对于通过以下示例代码创建的异步任务,您可以使用添加异步透传扫描包的方式对此异步任务进行监控。此示例代码中,异步透传包名com.alibaba.mse.brightroar.console.service

说明

在配置时,您可以按需调整异步透传包名的范围。若需监控的异步任务过多,您可以缩小异步透传包名的范围。在本示例中,除了输入完整的异步透传包名com.alibaba.mse.brightroar.console.service以外,您还可以输入更短的前缀包名com.alibaba.mse来自动扫描此目录下的所有子透传包。但需注意的是,若前缀包名范围过大,会对性能产生影响,请谨慎操作。

package com.alibaba.mse.brightroar.console.service;

@Service
public class NameService {

    private ExecutorService es = Executors.newFixedThreadPool(5);

    public void name() {
        es.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println(System.currentTimeMillis()+ ": my name is john, " + Thread.currentThread().getId());
            }
        });
    }
}

相关文档

如果您的流量不符合预期,可以打开采集请求详情开关对链路进行分析。具体操作,请参见全链路灰度可观测问题排查