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());
}
});
}
}
相关文档
如果您的流量不符合预期,可以打开采集请求详情开关对链路进行分析。具体操作,请参见全链路灰度可观测问题排查。