我从sping-cloud-sleuth-core中找到restTemplateInterceptor和feignRequest estInterceptor,但是我们的项目使用的是hessian连接微服务,我发现sping-cloud-sleuth无法注入到hessian客户端。有人可以分享一下如何在hessian中使用sping-cloud-sleuth的代码吗?谢谢~
没有默认的spring cloud sleuth注入hessian客户端,因此,我必须在hessian客户端周围创建2个钩子,向钩子添加add-zipkin通知代码。
获取spring\u上下文的跟踪,从跟踪bean中创建一个span,然后通过重写hessianProxy将span的信息添加到http头中,这样就可以了
提供演示
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.caucho.hessian.client.HessianConnection;
import com.caucho.hessian.client.HessianProxyFactory;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.instrument.web.TraceFilter;
import org.springframework.cloud.sleuth.util.SpanNameUtil;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author yezhi.li
* @date 19-1-3 下午2:41
*/
public class MyHessianProxy extends com.caucho.hessian.client.HessianProxy {
//create function new proxy
private URL urlLocal =null;
protected static final String TRACE_REQUEST_ATTR = TraceFilter.class.getName()
+ ".TRACE";
private static final long serialVersionUID = 6732486042199684754L;
private Logger log = LoggerFactory.getLogger(MyHessianProxy.class);
protected MyHessianProxy(URL url, HessianProxyFactory factory) {
super(url, factory);
this.urlLocal =url;
}
protected MyHessianProxy(URL url, HessianProxyFactory factory, Class<?> type) {
super(url, factory, type);
this.urlLocal =url;
}
@Override
protected void addRequestHeaders(HessianConnection conn)
{
Tracer tracer = SpringUtil.getBean(Tracer.class);
String spanName = null;
try {
spanName = getName(urlLocal.toURI());
} catch (URISyntaxException e) {
e.printStackTrace();
}
Span newSpan = tracer.createSpan(spanName,trace.getcurrentSpan());
inject(newSpan ,conn);
//detach span
tracer.detach(newSpan);
}
private String getName(URI uri) {
// The returned name should comply with RFC 882 - Section 3.1.2.
// i.e Header values must composed of printable ASCII values.
return SpanNameUtil.shorten(uriScheme(uri) + ":" + uri.getRawPath());
}
private String uriScheme(URI uri) {
return uri.getScheme() == null ? "http" : uri.getScheme();
}
public void inject(Span span,HessianConnection conn){
setHeader(conn, Span.TRACE_ID_NAME, span.traceIdString());
setIdHeader(conn, Span.SPAN_ID_NAME, span.getSpanId());
setHeader(conn, Span.SAMPLED_NAME, span.isExportable() ? Span.SPAN_SAMPLED : Span.SPAN_NOT_SAMPLED);
setHeader(conn, Span.SPAN_NAME_NAME, span.getName());
setIdHeader(conn, Span.PARENT_ID_NAME, getParentId(span));
setHeader(conn, Span.PROCESS_ID_NAME, span.getProcessId());
for (Map.Entry<String, String> entry : span.baggageItems()) {
conn.addHeader(prefixedKey(entry.getKey()), entry.getValue());
}
}
private void setIdHeader(HessianConnection conn, String name, Long value) {
if (value != null) {
setHeader(conn, name, Span.idToHex(value));
}
}
private void setHeader(HessianConnection conn,String key,String value){
conn.addHeader(key,value);
}
private Long getParentId(Span span) {
return !span.getParents().isEmpty() ? span.getParents().get(0) : null;
}
private String prefixedKey(String key) {
if (key.startsWith(Span.SPAN_BAGGAGE_HEADER_PREFIX
+ "-")) {
return key;
}
return Span.SPAN_BAGGAGE_HEADER_PREFIX + "-"
+ key;
}
}
当应用程序使用maven时,我有一个Spring Cloud Sleuth Stream应用程序正在工作并发送到我的本地OpenZipkin(docker),但是当我尝试运行gradle Spring boot应用程序时,Zipkin不会显示跟踪。有趣的是,Spring日志似乎显示了正确的跟踪信息。。因此,应用程序本身正在识别侦探,但出于某种原因,Zipkin要么没有收到信息,要么没有显示。我进入
我想知道Hazelcast中是否有一些侦探的集成。在我的应用程序中,我有Hazelcast队列,其中配置了用于addEntity事件的事件侦听器,问题是一旦该侦听器触发,跨度似乎就会中断。我知道ExecutorService集成了侦探,但com.hazelcast.core.ItemListener是否有类似的东西?提前谢谢。 UPD:提供更多细节。我有一些使用spring cloud sleth
本文向大家介绍Spring Cloud Zipkin服务端追踪服务,包括了Spring Cloud Zipkin服务端追踪服务的使用技巧和注意事项,需要的朋友参考一下 Zipkin 简介 ZipKin 是一个开放源代码的分布式跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题。包括数据的收集、存储、查找和展现。 每个服务向 Zipkin 报告计时数据,Zipkin 会根据调用关系通过
我正在尝试实现Slueth,用于spring boot微服务的分布式跟踪,这些微服务通过消息传递通道相互通信。 其中一个微服务是一个调度器,它接收一天内创建的新消费者。然后,它以异步方式为每个消费者的数据运行分组过程。 现在,我使用traceableExeucutorService将为调度程序线程生成的sleuth跟踪传递给每个使用者的子线程。 跟踪配置 调度程序服务 这最终会为每个消费者使用相同
我正在使用侦探,我想知道是否有可能获得当前的跟踪ID?我不需要添加任何响应或任何东西。我只是想要跟踪ID的电子邮件提醒开发团队在某些情况下。
我有两个非常简单的spring-cloud-stream应用程序。消息生产者Service3通过Binder-Kafka向消费者Service4发送消息。 我用春云侦探来追踪它们之间的跨度。但是只有Service3中的跨在zipkin服务器中可用。Service4没有显示span。