如何使用ApacheCamelOpenTracing组件更改跨度的操作名称



我成功地将Apache Camel的OpenTracing组件添加到了我的应用程序中。我可以在Jaeger UI中看到痕迹。但是RabbitMQ组件的跟踪只显示交换名称,而没有将路由关键字作为操作名称。因为我的应用程序只使用一个具有不同路由密钥的交换机,所以我需要在跟踪中看到路由密钥作为操作名称。

研究

使用OpenTracing Spring RabbitMQ,我可以公开另一个自定义的RabbitMqSpanDecorator,请参阅Span装饰器:

注意:您可以通过声明一个重写的RabbitMqSpanDecoratorbean来自定义跨度。

(但是,我根本无法用RabbitMqSpanDecorator更改操作名称,因为操作名称硬编码为producerconsumer。(

不幸的是,ApacheCamel使用自己不同的RabbitmqSpanDecorator实现来装饰跨度。我通过覆盖ApacheCamel的RabbitmqSpanDecorator编写了一个自定义类,但没有使用我的自定义类。

问题

如何使用Apache Camel OpenTracing组件为Apache Camel RabbitMQ组件更改跨度的操作名称?

可以使用ServiceLoader更改Tracer实现,请参阅OpenTracing:

EXPLICIT

在POM中包括camel-opentracing组件,以及与所选OpenTracing兼容Tracer相关的任何特定依赖项。

要显式配置OpenTracing支持,请实例化OpenTracingTracer并初始化camel上下文。您可以选择指定Tracer,也可以使用RegistryServiceLoader隐式发现它。

对于DefaultTracer,也可以将RabbitmqSpanDecorator更改为ServiceLoader,请参阅Tracer.java:

static {
ServiceLoader.load(SpanDecorator.class).forEach(d -> {
SpanDecorator existing = DECORATORS.get(d.getComponent());
// Add span decorator if no existing decorator for the component,
// or if derived from the existing decorator's class, allowing
// custom decorators to be added if they extend the standard
// decorators
if (existing == null || existing.getClass().isInstance(d)) {
DECORATORS.put(d.getComponent(), d);
}
});
}

因此,我必须添加一个文件org.apache.camel.tracing.SpanDecorator,其中包含我的自定义RabbitmqSpanDecorator的名称,请参阅ServiceLoader:

在类路径上部署服务提供商

打包为类路径的JAR文件的服务提供程序是通过将提供程序配置文件放置在资源目录META-INF/services中来标识的。提供程序配置文件的名称是服务的完全限定二进制名称。提供程序配置文件包含服务提供程序的完全限定二进制名称列表,每行一个。

我的自定义RabbitmqSpanDecorator:

public class CustomRabbitmqSpanDecorator extends RabbitmqSpanDecorator {
@Override
public String getOperationName(Exchange exchange, Endpoint endpoint) {
return ((RabbitMQEndpoint) endpoint).getRoutingKey();
}
}

相关内容

  • 没有找到相关文章

最新更新