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());
}
});
}
}
相關文檔
如果您的流量不符合預期,可以打開采集請求詳情開關對鏈路進行分析。具體操作,請參見全鏈路灰度可觀測問題排查。