Springboot-使用骆驼跟踪器创建自己的Opentracing跨度

时间:2019-07-08 12:49:27

标签: java apache-camel opentracing jaeger

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

@CamelOpenTracing

这会为我的邮件通过的每条路线创建一个范围,并且效果很好。

但是,如何创建自己的跨度?我想为邮件发送到onException时添加跨度(添加make error标签为true)。

我尝试从camelContext获取示踪剂并创建跨度失败。

2 个答案:

答案 0 :(得分:1)

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

 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())

答案 1 :(得分: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();