当前位置: 首页 > 知识库问答 >
问题:

Spring-Cloud-侦探追踪黑森客户端

田硕
2023-03-14

我从sping-cloud-sleuth-core中找到restTemplateInterceptor和feignRequest estInterceptor,但是我们的项目使用的是hessian连接微服务,我发现sping-cloud-sleuth无法注入到hessian客户端。有人可以分享一下如何在hessian中使用sping-cloud-sleuth的代码吗?谢谢~

共有2个答案

何睿范
2023-03-14

没有默认的spring cloud sleuth注入hessian客户端,因此,我必须在hessian客户端周围创建2个钩子,向钩子添加add-zipkin通知代码。

常自强
2023-03-14

获取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。