This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch camel-4.14.x
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/camel-4.14.x by this push:
     new 4fe1a44fe84b CAMEL-22749 (#20225)
4fe1a44fe84b is described below

commit 4fe1a44fe84b27a0dca4b84f6198b04eec29e516
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Dec 4 10:27:34 2025 +0100

    CAMEL-22749 (#20225)
    
    * CAMEL-22749: camel-tracing - Clip operation name as it must not be longer 
than 250 in micrometer/otel libraries
    
    * 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 +-
 .../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 +-
 19 files changed, 101 insertions(+), 29 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
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

Reply via email to