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 c1fffd60c7c46671de4c780a495f3cd82e385707 Author: Claus Ibsen <[email protected]> AuthorDate: Thu Dec 4 09:47:22 2025 +0100 CAMEL-22749: camel-telemetry - Clip operation name as it must not be longer than 250 in micrometer/otel libraries --- .../decorators/AbstractInternalSpanDecorator.java | 2 +- .../decorators/AbstractMessagingSpanDecorator.java | 2 +- .../decorators/AbstractSpanDecorator.java | 12 +++++++++++ .../decorators/ElasticsearchSpanDecorator.java | 3 ++- .../telemetry/decorators/MongoDBSpanDecorator.java | 8 ++++---- .../telemetry/decorators/RestSpanDecorator.java | 2 +- .../telemetry/decorators/TimerSpanDecorator.java | 9 ++++---- .../AbstractMessagingSpanDecoratorTest.java | 24 ++++++++++++++++++++++ .../decorators/TimerSpanDecoratorTest.java | 2 +- 9 files changed, 50 insertions(+), 14 deletions(-) diff --git a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/AbstractInternalSpanDecorator.java b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/AbstractInternalSpanDecorator.java index b0a847d768cf..83b74d2edc88 100644 --- a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/AbstractInternalSpanDecorator.java +++ b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/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-telemetry/src/main/java/org/apache/camel/telemetry/decorators/AbstractMessagingSpanDecorator.java b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/AbstractMessagingSpanDecorator.java index 0724fe1807f4..bd4852ffaea2 100644 --- a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/AbstractMessagingSpanDecorator.java +++ b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/AbstractMessagingSpanDecorator.java @@ -26,7 +26,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-telemetry/src/main/java/org/apache/camel/telemetry/decorators/AbstractSpanDecorator.java b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/AbstractSpanDecorator.java index 8f549b1d5756..ee7e8002e2e2 100644 --- a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/AbstractSpanDecorator.java +++ b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/AbstractSpanDecorator.java @@ -39,6 +39,18 @@ public abstract class AbstractSpanDecorator implements SpanDecorator { /* Prefix for camel component tag */ static String CAMEL_COMPONENT = "camel-"; + 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-telemetry/src/main/java/org/apache/camel/telemetry/decorators/ElasticsearchSpanDecorator.java b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/ElasticsearchSpanDecorator.java index 5b00c1281a37..fc9c8755f1cd 100644 --- a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/ElasticsearchSpanDecorator.java +++ b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/ElasticsearchSpanDecorator.java @@ -40,9 +40,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-telemetry/src/main/java/org/apache/camel/telemetry/decorators/MongoDBSpanDecorator.java b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/MongoDBSpanDecorator.java index 8a87d83d9558..86b67d87bfe6 100644 --- a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/MongoDBSpanDecorator.java +++ b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/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-telemetry/src/main/java/org/apache/camel/telemetry/decorators/RestSpanDecorator.java b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/RestSpanDecorator.java index 96b85a2c9efa..16a33f38b7cb 100644 --- a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/RestSpanDecorator.java +++ b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/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-telemetry/src/main/java/org/apache/camel/telemetry/decorators/TimerSpanDecorator.java b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/TimerSpanDecorator.java index e7ed0dee9b86..81cb16505ec1 100644 --- a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/decorators/TimerSpanDecorator.java +++ b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/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 name = exchange.getProperty(Exchange.TIMER_NAME, String.class); + if (name == null) { + name = super.getOperationName(exchange, endpoint); } - - return super.getOperationName(exchange, endpoint); + return clipMaxLength(name); } } diff --git a/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/decorators/AbstractMessagingSpanDecoratorTest.java b/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/decorators/AbstractMessagingSpanDecoratorTest.java index dd20ca04c2b4..8435af4a48d1 100644 --- a/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/decorators/AbstractMessagingSpanDecoratorTest.java +++ b/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/decorators/AbstractMessagingSpanDecoratorTest.java @@ -21,6 +21,7 @@ import org.apache.camel.Exchange; import org.apache.camel.telemetry.SpanDecorator; import org.apache.camel.telemetry.TagConstants; import org.apache.camel.telemetry.mock.MockSpanAdapter; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -107,4 +108,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-telemetry/src/test/java/org/apache/camel/telemetry/decorators/TimerSpanDecoratorTest.java b/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/decorators/TimerSpanDecoratorTest.java index cda93bd91924..12b229b84382 100644 --- a/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/decorators/TimerSpanDecoratorTest.java +++ b/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/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
