我成功地将Apache Camel的OpenTracing组件添加到了我的应用程序中。我可以在Jaeger UI中看到痕迹。但是RabbitMQ组件的跟踪只显示交换名称,而没有将路由关键字作为操作名称。因为我的应用程序只使用一个具有不同路由密钥的交换机,所以我需要在跟踪中看到路由密钥作为操作名称。
研究
使用OpenTracing Spring RabbitMQ,我可以公开另一个自定义的RabbitMqSpanDecorator
,请参阅Span装饰器:
注意:您可以通过声明一个重写的
RabbitMqSpanDecorator
bean来自定义跨度。
(但是,我根本无法用RabbitMqSpanDecorator
更改操作名称,因为操作名称硬编码为producer
或consumer
。(
不幸的是,ApacheCamel使用自己不同的RabbitmqSpanDecorator
实现来装饰跨度。我通过覆盖ApacheCamel的RabbitmqSpanDecorator
编写了一个自定义类,但没有使用我的自定义类。
问题
如何使用Apache Camel OpenTracing组件为Apache Camel RabbitMQ组件更改跨度的操作名称?
可以使用ServiceLoader
更改Tracer
实现,请参阅OpenTracing:
EXPLICIT
在POM中包括
camel-opentracing
组件,以及与所选OpenTracing兼容Tracer相关的任何特定依赖项。要显式配置OpenTracing支持,请实例化
OpenTracingTracer
并初始化camel上下文。您可以选择指定Tracer
,也可以使用Registry
或ServiceLoader
隐式发现它。
对于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();
}
}