Kutorkin Artyom created CAMEL-20603:
---------------------------------------

             Summary: Micrometer observation component losses spans during 
tracing
                 Key: CAMEL-20603
                 URL: https://issues.apache.org/jira/browse/CAMEL-20603
             Project: Camel
          Issue Type: Bug
          Components: camel-spring-boot
    Affects Versions: 4.4.0
            Reporter: Kutorkin Artyom
         Attachments: image-2024-03-22-16-34-11-487.png, 
image-2024-03-22-16-34-54-659.png, image-2024-03-22-16-46-21-015.png, 
image-2024-03-22-16-51-48-525.png

I've got an issue in my project related with Camel Observation within routes. 
Most of the time, during request processing previous spans are losing, so 
multiple traces can be created for one request. Also, for unknown reasons some 
of the spans that were created in current request, can join previous trace 
where spans were missed.

{*}Workflow{*}:
{code:java}
// 1. Spring controller producing the event to SEDA dictSync
producerTemplate.send(SEDA_DICT_SYNC_START.getUri(), exchange ->
    exchange.getIn().setBody(objectMapper.writeValueAsString(entities)));

// 2. Event-driven consumer consumes the event from SEDA dictSync and processes 
it in dictSyncStartProcessor
from(SEDA_DICT_SYNC_START)
    .routeId("DictSyncStart")
    .unmarshal().json(JsonLibrary.Jackson)
    .onException(Exception.class).handled(true)
        .process(exchange -> handleException((String) 
exchange.getIn().getBody(ArrayList.class).get(0), exchange))
    .end()
    .process(dictSyncStartProcessor);

// 3. dictSyncStartProcessor processes the event and send another to SEDA 
dictSyncSplit
producerTemplate.send(SEDA_DICT_SYNC_SPLIT.getUri(), exchange -> {
    Message message = exchange.getIn();

    entitySync.setUpdateDatetime(updateDatetime);
    message.setHeader("destination", destination.name());
    message.setHeader("entity", objectMapper.writeValueAsString(entitySync));
    message.setHeader("messageId", messageId);
    message.setBody(data);
});

// 4. dictSyncSplit consumes event, split its body, aggregate splitted records 
and send aggregated record to kafka
from(SEDA_DICT_SYNC_SPLIT)
    .routeId("DictSyncSplit")
    .onException(Exception.class).handled(true).useOriginalMessage()
        .process(exchange -> {
            var entitySync = 
objectMapper.readValue(exchange.getIn().getHeader("entity", String.class), 
EntitySync.class);
            handleException(entitySync.getEntity(), exchange);
        })
    .end()
    .split(body())
    .aggregate(header("messageId"), aggregationStrategy)
        .completionSize(20)
        .completionTimeout(1000L)
    .marshal().json(JsonLibrary.Jackson)
    .to(kafka(DICTIONARY_SYNC_TOPIC));

// 5. dictionarySync route consumes event from kafka and send another to 
proccesedEntitySync
producerTemplate.send(kafka(PROCESSED_ENTITY_SYNC_TOPIC).getUri(), ex ->
    ex.getIn().setBody(objectMapper.writeValueAsString(entitySync)));{code}
 

*First case*

Actual unexpected results:
 * dictSyncSplit route observations are missing (but will be associated during 
next request)
 * processedEntitySync is separated into another trace

!image-2024-03-22-16-34-11-487.png|width=460,height=166!!image-2024-03-22-16-34-54-659.png|width=422,height=198!

After invoking this request once again, new spans were associated with first 
request:

!image-2024-03-22-16-46-21-015.png|width=490,height=245!

 

*Second case*

Actual unexpected results:
 * dictSyncSplit is separated into another trace
 * processedEntitySync is separated into another trace

*!image-2024-03-22-16-51-48-525.png|width=549,height=112!*

 

*Observation dependencies:*
{code:java}
implementation 'org.springframework.boot:spring-boot-starter-aop'
implementation 'io.micrometer:micrometer-tracing-bridge-otel'
implementation 'io.opentelemetry:opentelemetry-exporter-zipkin'
implementation 
'org.apache.camel.springboot:camel-observation-starter:4.4.0'{code}
Spring boot version: 3.2.2



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to