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