如何使用Apache Camel OpenTracing组件更改span的操作名?

cnh2zyt3  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(178)

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

研究

使用OpenTracing Spring RabbitMQ,我可以公开另一个定制的RabbitMqSpanDecorator,请参见Span装饰器:
注意:您可以通过声明一个被覆盖的RabbitMqSpanDecorator bean来自定义跨度。
(但是,我根本无法使用RabbitMqSpanDecorator更改操作名,因为操作名已硬编码为producerconsumer。)
不幸的是,Apache Camel使用它自己的RabbitmqSpanDecorator实现来修饰span。我通过覆盖Apache Camel的RabbitmqSpanDecorator编写了一个自定义类,但我的自定义类没有被使用。

问题

如何更改Apache Camel RabbitMQ组件的具有Apache Camel OpenTracing组件的span的操作名称?

envsm3lx

envsm3lx1#

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

明确

在POM中包含camel-opentracing组件,沿着与所选的OpenTracing兼容跟踪器关联的任何特定依赖项。
要显式配置OpenTracing支持,请示例化OpenTracingTracer并初始化camel上下文。可以选择指定Tracer,也可以使用RegistryServiceLoader隐式搜索Tracer
对于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();
  }
}

相关问题