This is an automated email from the ASF dual-hosted git repository.
bvahdat pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 3574cead243 CAMEL-20937 add azure-storage-datalake span decorator
3574cead243 is described below
commit 3574cead2437fa1918d350fbd21303a111727088
Author: anirudh-04 <[email protected]>
AuthorDate: Thu Mar 27 15:57:57 2025 +0530
CAMEL-20937 add azure-storage-datalake span decorator
---
.../org.apache.camel.tracing.SpanDecorator | 1 +
.../org.apache.camel.tracing.SpanDecorator | 1 +
.../AzureStorageDataLakeSpanDecorator.java | 133 ++++++++++++++++++++
.../AzureStorageDataLakeSpanDecoratorTest.java | 136 +++++++++++++++++++++
4 files changed, 271 insertions(+)
diff --git
a/components/camel-observation/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator
b/components/camel-observation/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator
index 36bdfa6d8f1..5a13187e277 100644
---
a/components/camel-observation/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator
+++
b/components/camel-observation/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator
@@ -18,6 +18,7 @@
org.apache.camel.tracing.decorators.AhcSpanDecorator
org.apache.camel.tracing.decorators.AmqpSpanDecorator
org.apache.camel.tracing.decorators.AzureServiceBusSpanDecorator
+org.apache.camel.tracing.decorators.AzureStorageDataLakeSpanDecorator
org.apache.camel.tracing.decorators.CometdSpanDecorator
org.apache.camel.tracing.decorators.CometdsSpanDecorator
org.apache.camel.tracing.decorators.CqlSpanDecorator
diff --git
a/components/camel-opentelemetry/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator
b/components/camel-opentelemetry/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator
index 36bdfa6d8f1..5a13187e277 100644
---
a/components/camel-opentelemetry/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator
+++
b/components/camel-opentelemetry/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator
@@ -18,6 +18,7 @@
org.apache.camel.tracing.decorators.AhcSpanDecorator
org.apache.camel.tracing.decorators.AmqpSpanDecorator
org.apache.camel.tracing.decorators.AzureServiceBusSpanDecorator
+org.apache.camel.tracing.decorators.AzureStorageDataLakeSpanDecorator
org.apache.camel.tracing.decorators.CometdSpanDecorator
org.apache.camel.tracing.decorators.CometdsSpanDecorator
org.apache.camel.tracing.decorators.CqlSpanDecorator
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
new file mode 100644
index 00000000000..01e607fd13a
--- /dev/null
+++
b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AzureStorageDataLakeSpanDecorator.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.tracing.decorators;
+
+import java.time.Duration;
+import java.time.OffsetDateTime;
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.tracing.SpanAdapter;
+import org.apache.camel.tracing.TagConstants;
+
+public class AzureStorageDataLakeSpanDecorator extends AbstractSpanDecorator {
+
+ static final String STORAGE_DATALAKE_DIRECTORY_NAME = "directoryName";
+ static final String STORAGE_DATALAKE_FILE_NAME = "fileName";
+ static final String STORAGE_DATALAKE_PATH = "path";
+ static final String STORAGE_DATALAKE_TIMEOUT = "timeout";
+ static final String STORAGE_DATALAKE_CONTENT_TYPE = "contentType";
+ static final String STORAGE_DATALAKE_METADATA = "metadata";
+ static final String STORAGE_DATALAKE_LAST_MODIFIED = "lastModified";
+ static final String STORAGE_DATALAKE_POSITION = "position";
+ static final String STORAGE_DATALAKE_EXPRESSION = "expression";
+
+ /**
+ * Constants copied from {@link
org.apache.camel.component.azure.storage.datalake.DataLakeConstants}
+ */
+ static final String OPERATION = "CamelAzureStorageDataLakeOperation";
+ static final String FILESYSTEM_NAME =
"CamelAzureStorageDataLakeFileSystemName";
+ static final String DIRECTORY_NAME =
"CamelAzureStorageDataLakeDirectoryName";
+ static final String FILE_NAME = "CamelAzureStorageDataLakeFileName";
+ static final String PATH = "CamelAzureStorageDataLakePath";
+ static final String TIMEOUT = "CamelAzureStorageDataLakeTimeout";
+ static final String CONTENT_TYPE = "CamelAzureStorageDataLakeContentType";
+ static final String METADATA = "CamelAzureStorageDataLakeMetadata";
+ static final String LAST_MODIFIED =
"CamelAzureStorageDataLakeLastModified";
+ static final String POSITION = "CamelAzureStorageDataLakePosition";
+ static final String EXPRESSION = "CamelAzureStorageDataLakeExpression";
+
+ @Override
+ public String getComponent() {
+ return "azure-storage-datalake";
+ }
+
+ @Override
+ public String getComponentClassName() {
+ return
"org.apache.camel.component.azure.storage.datalake.DataLakeComponent";
+ }
+
+ @Override
+ public String getOperationName(Exchange exchange, Endpoint endpoint) {
+ String operation = exchange.getIn().getHeader(OPERATION, String.class);
+ if (operation == null) {
+ Map<String, String> queryParameters =
toQueryParameters(endpoint.getEndpointUri());
+ return queryParameters.containsKey("operation")
+ ? queryParameters.get("operation")
+ : super.getOperationName(exchange, endpoint);
+ }
+ return operation;
+ }
+
+ @Override
+ public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) {
+ super.pre(span, exchange, endpoint);
+ span.setTag(TagConstants.DB_SYSTEM, getComponent());
+
+ String fileSystemName = exchange.getIn().getHeader(FILESYSTEM_NAME,
String.class);
+ if (fileSystemName != null) {
+ span.setTag(TagConstants.DB_NAME, fileSystemName);
+ }
+
+ String directoryName = exchange.getIn().getHeader(DIRECTORY_NAME,
String.class);
+ if (directoryName != null) {
+ span.setTag(STORAGE_DATALAKE_DIRECTORY_NAME, directoryName);
+ }
+
+ String fileName = exchange.getIn().getHeader(FILE_NAME, String.class);
+ if (fileName != null) {
+ span.setTag(STORAGE_DATALAKE_FILE_NAME, fileName);
+ }
+
+ String path = exchange.getIn().getHeader(PATH, String.class);
+ if (path != null) {
+ span.setTag(STORAGE_DATALAKE_PATH, path);
+ }
+
+ Duration timeout = exchange.getIn().getHeader(TIMEOUT, Duration.class);
+ if (timeout != null) {
+ span.setTag(STORAGE_DATALAKE_TIMEOUT, timeout.toString());
+ }
+
+ String contentType = exchange.getIn().getHeader(CONTENT_TYPE,
String.class);
+ if (contentType != null) {
+ span.setTag(STORAGE_DATALAKE_CONTENT_TYPE, contentType);
+ }
+
+ Map metadata = exchange.getIn().getHeader(METADATA, Map.class);
+ if (metadata != null) {
+ span.setTag(STORAGE_DATALAKE_METADATA, metadata.toString());
+ }
+
+ OffsetDateTime lastModified =
exchange.getIn().getHeader(LAST_MODIFIED, OffsetDateTime.class);
+ if (lastModified != null) {
+ span.setTag(STORAGE_DATALAKE_LAST_MODIFIED,
lastModified.toString());
+ }
+
+ Long position = exchange.getIn().getHeader(POSITION, Long.class);
+ if (position != null) {
+ span.setTag(STORAGE_DATALAKE_POSITION, position);
+ }
+
+ String expression = exchange.getIn().getHeader(EXPRESSION,
String.class);
+ if (expression != null) {
+ span.setTag(STORAGE_DATALAKE_EXPRESSION, expression);
+ }
+ }
+
+}
diff --git
a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AzureStorageDataLakeSpanDecoratorTest.java
b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AzureStorageDataLakeSpanDecoratorTest.java
new file mode 100644
index 00000000000..5629774c0e8
--- /dev/null
+++
b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AzureStorageDataLakeSpanDecoratorTest.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.tracing.decorators;
+
+import java.time.Duration;
+import java.time.OffsetDateTime;
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.tracing.MockSpanAdapter;
+import org.apache.camel.tracing.TagConstants;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class AzureStorageDataLakeSpanDecoratorTest {
+
+ @Test
+ public void testGetOperationNameFromHeader() {
+ String operation = "upload";
+ Exchange exchange = Mockito.mock(Exchange.class);
+ Message message = Mockito.mock(Message.class);
+
+ Mockito.when(exchange.getIn()).thenReturn(message);
+
Mockito.when(message.getHeader(AzureStorageDataLakeSpanDecorator.OPERATION,
String.class)).thenReturn(operation);
+
+ AbstractSpanDecorator decorator = new
AzureStorageDataLakeSpanDecorator();
+
+ assertEquals(operation, decorator.getOperationName(exchange, null));
+ }
+
+ @Test
+ public void testGetOperationNameFromHeaderWithEnum() {
+ operationEnum operation = operationEnum.upload;
+
+ Exchange exchange = Mockito.mock(Exchange.class);
+ Message message = Mockito.mock(Message.class);
+ Mockito.when(exchange.getIn()).thenReturn(message);
+
Mockito.when(message.getHeader(AzureStorageDataLakeSpanDecorator.OPERATION,
String.class))
+ .thenReturn(operation.toString());
+
+ AbstractSpanDecorator decorator = new
AzureStorageDataLakeSpanDecorator();
+
+ assertEquals(operation.toString(),
decorator.getOperationName(exchange, null));
+ }
+
+ @Test
+ public void testGetOperationNameFromQueryParameter() {
+ Endpoint endpoint = Mockito.mock(Endpoint.class);
+ Exchange exchange = Mockito.mock(Exchange.class);
+ Message message = Mockito.mock(Message.class);
+
+
Mockito.when(endpoint.getEndpointUri()).thenReturn("azure-storage-datalake:myAccount/myFileSystem?operation=upload");
+ Mockito.when(exchange.getIn()).thenReturn(message);
+
+ AbstractSpanDecorator decorator = new
AzureStorageDataLakeSpanDecorator();
+
+ assertEquals("upload", decorator.getOperationName(exchange, endpoint));
+ }
+
+ @Test
+ public void testPre() {
+ String fileSystemName = "myFileSystem";
+ String directoryName = "myDirectory";
+ String fileName = "myFile";
+ String path = "myPath";
+ String expression = "myExpression";
+ String contentType = "myContentType";
+ Duration timeout = Duration.ofDays(7);
+ Map<String, String> metadata = Map.of("key1", "value1", "key2",
"value2");
+ OffsetDateTime lastModified = OffsetDateTime.now();
+ Long position = 21L;
+
+ Endpoint endpoint = Mockito.mock(Endpoint.class);
+ Exchange exchange = Mockito.mock(Exchange.class);
+ Message message = Mockito.mock(Message.class);
+
+
Mockito.when(endpoint.getEndpointUri()).thenReturn("azure-storage-datalake:account/myFileSystem");
+ Mockito.when(exchange.getIn()).thenReturn(message);
+
Mockito.when(message.getHeader(AzureStorageDataLakeSpanDecorator.FILESYSTEM_NAME,
String.class))
+ .thenReturn(fileSystemName);
+
Mockito.when(message.getHeader(AzureStorageDataLakeSpanDecorator.DIRECTORY_NAME,
String.class))
+ .thenReturn(directoryName);
+
Mockito.when(message.getHeader(AzureStorageDataLakeSpanDecorator.FILE_NAME,
String.class)).thenReturn(fileName);
+ Mockito.when(message.getHeader(AzureStorageDataLakeSpanDecorator.PATH,
String.class)).thenReturn(path);
+
Mockito.when(message.getHeader(AzureStorageDataLakeSpanDecorator.EXPRESSION,
String.class)).thenReturn(expression);
+
Mockito.when(message.getHeader(AzureStorageDataLakeSpanDecorator.CONTENT_TYPE,
String.class)).thenReturn(contentType);
+
Mockito.when(message.getHeader(AzureStorageDataLakeSpanDecorator.TIMEOUT,
Duration.class)).thenReturn(timeout);
+
Mockito.when(message.getHeader(AzureStorageDataLakeSpanDecorator.METADATA,
Map.class))
+ .thenReturn(metadata);
+
Mockito.when(message.getHeader(AzureStorageDataLakeSpanDecorator.LAST_MODIFIED,
OffsetDateTime.class))
+ .thenReturn(lastModified);
+
Mockito.when(message.getHeader(AzureStorageDataLakeSpanDecorator.POSITION,
Long.class)).thenReturn(position);
+
+ AbstractSpanDecorator decorator = new
AzureStorageDataLakeSpanDecorator();
+
+ MockSpanAdapter span = new MockSpanAdapter();
+
+ decorator.pre(span, exchange, endpoint);
+
+ assertEquals("azure-storage-datalake",
span.tags().get(TagConstants.DB_SYSTEM));
+ assertEquals(fileSystemName, span.tags().get(TagConstants.DB_NAME));
+ assertEquals(directoryName,
span.tags().get(AzureStorageDataLakeSpanDecorator.STORAGE_DATALAKE_DIRECTORY_NAME));
+ assertEquals(fileName,
span.tags().get(AzureStorageDataLakeSpanDecorator.STORAGE_DATALAKE_FILE_NAME));
+ assertEquals(path,
span.tags().get(AzureStorageDataLakeSpanDecorator.STORAGE_DATALAKE_PATH));
+ assertEquals(expression,
span.tags().get(AzureStorageDataLakeSpanDecorator.STORAGE_DATALAKE_EXPRESSION));
+ assertEquals(contentType,
span.tags().get(AzureStorageDataLakeSpanDecorator.STORAGE_DATALAKE_CONTENT_TYPE));
+ assertEquals(timeout.toString(),
span.tags().get(AzureStorageDataLakeSpanDecorator.STORAGE_DATALAKE_TIMEOUT));
+ assertEquals(metadata.toString(),
span.tags().get(AzureStorageDataLakeSpanDecorator.STORAGE_DATALAKE_METADATA));
+ assertEquals(lastModified.toString(),
+
span.tags().get(AzureStorageDataLakeSpanDecorator.STORAGE_DATALAKE_LAST_MODIFIED));
+ assertEquals(position,
span.tags().get(AzureStorageDataLakeSpanDecorator.STORAGE_DATALAKE_POSITION));
+ }
+
+ enum operationEnum {
+ upload
+ }
+
+}