OpenTracing,Spring Cloud Stream和Solace

问题描述

我刚开始将OpenTracing与Jaeger Cloud启动器一起使用。为此,我在项目中添加了以下依赖项:

 <dependency>
    <groupId>io.opentracing.contrib</groupId>
    <artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
    <version>3.1.2</version>
  </dependency>

opentracing-spring-messaging 项目的 io.opentracing.contrib.spring.integration.messaging.OpenTracingChannelInterceptor 将范围(ThreadLocalScope)添加到消息头。

Solace活页夹输出消息处理程序仅支持作为Serializable实例的标头值。 因此,它开箱即用。 我围绕此消息处理程序实现了一个方面,如下所示(只是其中的一部分):

  final MessageTextMap messageTextMap = new MessageTextMap(message);
  tracer.inject(span.context(),Builtin.TEXT_MAP,messageTextMap);
  messageTextMap.addHeader(OpenTracingChannelInterceptor.class.getName() + ".ScopE",""); // with this I'm removing the ThreadLocalScope

使用此技巧即可。 避免这种黑客入侵的正确方法是什么?

TextMap的另一个实现?哪一个

更新:

我找到了一种方法,但是我不确定这是正确的方法

public class SolaceMessageTextMap<T> implements TextMap {

private final MessageTextMap<T> delegate;

public SolaceMessageTextMap(final Message<T> message) {
    final Message<T> filteredMessage = filteredMessage(message);
    delegate = new MessageTextMap<>(filteredMessage);
}

@Override
public Iterator<Entry<String,String>> iterator() {
    return delegate.iterator();
}

@Override
public void put(final String key,String value) {
    delegate.put(key,value);
}

public Message<T> getMessage() {
    return delegate.getMessage();
}

private Message<T> filteredMessage(final Message<T> message) {
    return MessageBuilder.withPayload(message.getPayload())
            .copyHeaders(filteredHeaders(message.getHeaders()))
            .build();
}

private Map<String,Object> filteredHeaders(final MessageHeaders headers) {
    return headers.entrySet().stream()
            .filter(entry -> isValid(entry.getValue()))
            .collect(Collectors.toMap(Entry::getKey,Entry::getValue));
}

private boolean isValid(final Object value) {
    return value instanceof Serializable;
}

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)