天天看點

Java Agent的應用:修改Spring Cloud使用Hystrix實作熔斷時的線程名

本文作者:suxingrui

本文連結:https://blog.csdn.net/suxingrui/article/details/80206058

版權聲明:本文為原創文章,轉載請注明出處。

跟蹤請求的整個處理鍊路過程,最友善的就是線上程名中添加traceId(跟蹤辨別符)或者streamNo(流水号),并列印線程名到日志。

如下圖

Java Agent的應用:修改Spring Cloud使用Hystrix實作熔斷時的線程名

然而在使用Hystrix實作熔斷的時候發現,熔斷器使用自己的線程池,不易線上程名中展現出請求的整個處理鍊路過程。

為了實作這個目的,調查發現可以在FutureTask類的構造函數裡插入一行代碼。

public FutureTask(Runnable runnable, V result) {
    // 在這插入一行代碼
    // runnable = AgentHandler.prefixThreadName(runnable);
    this.callable = Executors.callable(runnable, result);
    this.state = NEW;       // ensure visibility of callable
}
           

實作

FutureTaskTransformer

Java Agent的應用:修改Spring Cloud使用Hystrix實作熔斷時的線程名

AgentHandler

Java Agent的應用:修改Spring Cloud使用Hystrix實作熔斷時的線程名

PrefixThreadName

Java Agent的應用:修改Spring Cloud使用Hystrix實作熔斷時的線程名

并在請求的AOP切面中添加

Java Agent的應用:修改Spring Cloud使用Hystrix實作熔斷時的線程名
Java Agent的應用:修改Spring Cloud使用Hystrix實作熔斷時的線程名

這樣就能夠到達目的。