You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (Jira)" <ji...@apache.org> on 2024/03/22 14:39:00 UTC

[jira] [Updated] (CAMEL-20603) Micrometer observation component losses spans during tracing

     [ https://issues.apache.org/jira/browse/CAMEL-20603?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Claus Ibsen updated CAMEL-20603:
--------------------------------
    Priority: Minor  (was: Major)

> 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
>            Priority: Minor
>         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)