1

我在我的 Spring Boot 项目中添加了以下注释:

@CamelOpenTracing

这为我的消息通过的每条路线创建了一个跨度,并且效果很好。

但是,如何创建自己的跨度?我想为我的消息到达时添加一个跨度onException(添加使错误标记为真)。

我尝试从 中获取跟踪器camelContext并创建一个跨度,但没有成功。

4

2 回答 2

2

您可以像这样在骆驼进程中添加跨度:

 from("queue:" + properties.getJmsEndpoint())
        .routeId("Jms-To-Ftp-" + properties.getFlowName())

        .setHeader(MessageHeaders.SENDER_ID, simple(properties.getApplication()))
            .process(exchange -> {
              //save original body for DLQ route
              String originalBody = exchange.getIn().getBody(String.class);
              exchange.setProperty(MessageProperties.BACKUP_MESSAGE, originalBody);


              Span span = tracer.buildSpan("JmsMessage route").start();
              span.setTag("sender", properties.getApplication());
              span.setTag(MessageHeaders.DOCUMENT_ID, exchange.getIn().getHeader(MessageHeaders.DOCUMENT_ID).toString());
              span.setTag(MessageHeaders.PROCESS_TYPE_NAME, exchange.getIn().getHeader(MessageHeaders.PROCESS_TYPE_NAME).toString());

              span.log(ImmutableMap.of("file", originalBody));
              span.finish();

            })
       .to("queue:" + properties.getReceiver())
于 2019-09-06T13:14:01.820 回答
0

这是我使用 Camel 3.7.0 的方法,但我迟到了 2 年,所以我希望这对某人有所帮助,如果有更好的方法请发布。

我的目标是创建现有跨度的子跨度,这与 OpenTracing 示例绝对不同,因为 Camel 似乎有自己的方式来访问活动跨度。

第 1 步:从 Camel 上下文中获取 Tracer

Set<Tracer> tracers = exchange.getContext().getRegistry().findByType(Tracer.class);

// There should only be one Tracer
Tracer camelTracer = null;
for (Tracer tracer : tracers) {
    camelTracer = tracer;
}

第 2 步:从 Camel 获取活动跨度

OpenTracingSpanAdapter adapter = (OpenTracingSpanAdapter) ActiveSpanManager.getSpan(exchange);

Span activeSpan = adapter.getOpenTracingSpan(); 

第 3 步:创建子跨度

Span childSpan = camelTracer.buildSpan("operation name").asChildOf(activeSpan).start();

childSpan.log(ImmutableMap.of("thing", thing));
childSpan.setTag("error", true);

childSpan.finish();
于 2021-03-05T03:29:54.157 回答