【问题标题】:How to change the operation name of a span with Apache Camel OpenTracing component?如何使用 Apache Camel OpenTracing 组件更改跨度的操作名称?
【发布时间】:2021-03-15 17:07:27
【问题描述】:

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

研究

使用OpenTracing Spring RabbitMQ,我可以公开另一个自定义RabbitMqSpanDecorator,参见Span decorator

注意:您可以通过声明覆盖的 RabbitMqSpanDecorator bean 来自定义跨度。

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

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

问题

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

【问题讨论】:

  • Camel 在Tracer 中使用Java 的service loader API 来实际加载各自的装饰。因此,如果您按照 JavaDocs 的Deploying service providers on the class path 部分中提到的方式打包您的装饰器,则应该选择您的自定义装饰器
  • @RomanVottner 谢谢。有用。你想写一个详细的答案吗?我会接受的。

标签: rabbitmq apache-camel jaeger opentracing


【解决方案1】:

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

显式

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

要显式配置 OpenTracing 支持,请实例化 OpenTracingTracer 并初始化骆驼上下文。您可以选择指定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

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

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

我的自定义RabbitmqSpanDecorator

public class CustomRabbitmqSpanDecorator extends RabbitmqSpanDecorator {

  @Override
  public String getOperationName(Exchange exchange, Endpoint endpoint) {

    return ((RabbitMQEndpoint) endpoint).getRoutingKey();
  }
}

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多