This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch maxlength in repository https://gitbox.apache.org/repos/asf/camel.git
commit ee14b28ac58071f7ff8ba23677d01f9fdfabfec3 Author: Claus Ibsen <[email protected]> AuthorDate: Thu Dec 4 09:38:32 2025 +0100 CAMEL-22749: camel-tracing - Clip operation name as it must not be longer than 250 in micrometer/otel libraries --- .../decorators/AbstractInternalSpanDecorator.java | 2 +- .../decorators/AbstractMessagingSpanDecorator.java | 2 +- .../tracing/decorators/AbstractSpanDecorator.java | 12 +++++++++++ .../AzureStorageDataLakeSpanDecorator.java | 2 +- .../decorators/ElasticsearchSpanDecorator.java | 3 ++- .../tracing/decorators/MongoDBSpanDecorator.java | 8 ++++---- .../tracing/decorators/RestSpanDecorator.java | 2 +- .../tracing/decorators/TimerSpanDecorator.java | 9 ++++---- .../AbstractMessagingSpanDecoratorTest.java | 24 ++++++++++++++++++++++ .../tracing/decorators/TimerSpanDecoratorTest.java | 2 +- 10 files changed, 51 insertions(+), 15 deletions(-) diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractInternalSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractInternalSpanDecorator.java index a0c08a91b523..cb5ff6fa7b3d 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractInternalSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractInternalSpanDecorator.java @@ -25,7 +25,7 @@ public abstract class AbstractInternalSpanDecorator extends AbstractSpanDecorato public String getOperationName(Exchange exchange, Endpoint endpoint) { // Internal communications use descriptive names, so suitable // as an operation name, but need to strip the scheme and any options - return stripSchemeAndOptions(endpoint); + return clipMaxLength(stripSchemeAndOptions(endpoint)); } } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecorator.java index 9477ccc5e79d..4c9dfddf97a0 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecorator.java @@ -33,7 +33,7 @@ public abstract class AbstractMessagingSpanDecorator extends AbstractSpanDecorat @Override public String getOperationName(Exchange exchange, Endpoint endpoint) { // Use the destination name - return getDestination(exchange, endpoint); + return clipMaxLength(getDestination(exchange, endpoint)); } @Override diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractSpanDecorator.java index d3b3bc73d722..cefb3445f8d8 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractSpanDecorator.java @@ -37,6 +37,18 @@ import org.apache.camel.util.URISupport; */ public abstract class AbstractSpanDecorator implements SpanDecorator { + private static final int MAX_LENGTH = 250; + + /** + * Clips the name to be at most 250 chars in length so it's valid according to micrometer/otel libraries. + */ + public static String clipMaxLength(String name) { + if (name != null && name.length() > MAX_LENGTH) { + name = name.substring(0, MAX_LENGTH); + } + return name; + } + /** * This method removes the scheme, any leading slash characters and options from the supplied URI. This is intended * to extract a meaningful name from the URI that can be used in situations, such as the operation name. diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AzureStorageDataLakeSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AzureStorageDataLakeSpanDecorator.java index 01e607fd13ac..fd7c698686b1 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AzureStorageDataLakeSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AzureStorageDataLakeSpanDecorator.java @@ -71,7 +71,7 @@ public class AzureStorageDataLakeSpanDecorator extends AbstractSpanDecorator { ? queryParameters.get("operation") : super.getOperationName(exchange, endpoint); } - return operation; + return clipMaxLength(operation); } @Override diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecorator.java index b0f733259191..0a8c2bb62f42 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecorator.java @@ -43,9 +43,10 @@ public class ElasticsearchSpanDecorator extends AbstractSpanDecorator { @Override public String getOperationName(Exchange exchange, Endpoint endpoint) { Map<String, String> queryParameters = toQueryParameters(endpoint.getEndpointUri()); - return queryParameters.containsKey("operation") + String answer = queryParameters.containsKey("operation") ? queryParameters.get("operation") : super.getOperationName(exchange, endpoint); + return clipMaxLength(answer); } @Override diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/MongoDBSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/MongoDBSpanDecorator.java index 5e3b5fa5e526..7c017534c90d 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/MongoDBSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/MongoDBSpanDecorator.java @@ -38,11 +38,11 @@ public class MongoDBSpanDecorator extends AbstractSpanDecorator { @Override public String getOperationName(Exchange exchange, Endpoint endpoint) { Map<String, String> queryParameters = toQueryParameters(endpoint.getEndpointUri()); - String opName = queryParameters.get("operation"); - if (opName != null) { - return opName; + String answer = queryParameters.get("operation"); + if (answer == null) { + answer = super.getOperationName(exchange, endpoint); } - return super.getOperationName(exchange, endpoint); + return clipMaxLength(answer); } @Override diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RestSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RestSpanDecorator.java index d7c32c80ac39..eb132830f9bc 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RestSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RestSpanDecorator.java @@ -40,7 +40,7 @@ public class RestSpanDecorator extends AbstractHttpSpanDecorator { @Override public String getOperationName(Exchange exchange, Endpoint endpoint) { - return getPath(endpoint.getEndpointUri()); + return clipMaxLength(getPath(endpoint.getEndpointUri())); } @Override diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/TimerSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/TimerSpanDecorator.java index 9c3c8fc13721..91203f7cf3aa 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/TimerSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/TimerSpanDecorator.java @@ -33,12 +33,11 @@ public class TimerSpanDecorator extends AbstractSpanDecorator { @Override public String getOperationName(Exchange exchange, Endpoint endpoint) { - Object name = exchange.getProperty(Exchange.TIMER_NAME); - if (name instanceof String) { - return (String) name; + String answer = exchange.getProperty(Exchange.TIMER_NAME, String.class); + if (answer == null) { + answer = super.getOperationName(exchange, endpoint); } - - return super.getOperationName(exchange, endpoint); + return clipMaxLength(answer); } } diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecoratorTest.java index b5a3a9374eda..697fe9c295ee 100644 --- a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecoratorTest.java @@ -21,6 +21,7 @@ import org.apache.camel.Exchange; import org.apache.camel.tracing.MockSpanAdapter; import org.apache.camel.tracing.SpanDecorator; import org.apache.camel.tracing.TagConstants; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -106,4 +107,27 @@ public class AbstractMessagingSpanDecoratorTest { assertEquals(messageId, span.tags().get(TagConstants.MESSAGE_ID)); } + @Test + public void testOperationNameMaxLength() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(endpoint.getEndpointUri()) + .thenReturn("kafka:" + "A".repeat(90) + "," + "B".repeat(90) + "," + "C".repeat(90)); + + SpanDecorator decorator = new AbstractMessagingSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + }; + + String name = decorator.getOperationName(null, endpoint); + Assertions.assertEquals(250, name.length()); + } + } diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/TimerSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/TimerSpanDecoratorTest.java index ac549df48948..bc75f8146708 100644 --- a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/TimerSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/TimerSpanDecoratorTest.java @@ -31,7 +31,7 @@ public class TimerSpanDecoratorTest { public void testGetOperationName() { Exchange exchange = Mockito.mock(Exchange.class); - Mockito.when(exchange.getProperty(Exchange.TIMER_NAME)).thenReturn(TEST_NAME); + Mockito.when(exchange.getProperty(Exchange.TIMER_NAME, String.class)).thenReturn(TEST_NAME); SpanDecorator decorator = new TimerSpanDecorator() { @Override
