问题描述
我想在一个HTTP调用中收集所有生成的跨度(相同的traceid)。我有一个自己的HttpFilter
,称为MyHttpFilter
(比TracingFilter
高),并且有一个实现Reporter<zipkin2.Span>
的类MyReporter
。在我的MyReporter
中,我将所有范围添加到Threadlocal
对象中,因此我可以在我的MyHttpFilter
中获得所有范围。
代码如下:
class MyReporter implements Reporter<zipkin2.Span>
{
ThreadLocal<XXX> threadLocal = ThreadLocal.withInitial(XXX)
@Override
public void report(Span span) {
XXX X = threadLocal.get();
X.add(span) // add span to threadlocal object
}
public XXX currentSpans() {
return threadLocal.get();
}
}
class MyHttpFilter extends HttpFilter {
@Override
protected void doFilter(HttpServletRequest request,HttpServletResponse response,FilterChain chain) throws IOException,servletexception {
// xxxxxx
chain.doFilter(request,response);
// get all spans from thread local
MyReporter.currentSpans();
// .....
}
}
如果在此HTTP调用中,我将执行一系列操作,例如使用resttemplate
请求数据并使用rabbimqtemplate
发送消息,那么我通常可以从ThreadLocal
收集所有跨度。
但是,如果我使用Redistemplate
,则无法从ThreadLocal
收集跨度,似乎redis工具类报告跨度在另一个线程中。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)