diff --git a/maven-extension/README.md b/maven-extension/README.md
index 3ae23c7f9..91ec71744 100644
--- a/maven-extension/README.md
+++ b/maven-extension/README.md
@@ -61,14 +61,15 @@ Without this setting, the traces won't be exported and the OpenTelemetry Maven E
The Maven OpenTelemetry Extension supports a subset of the [OpenTelemetry autoconfiguration environment variables and JVM system properties](https://github.com/open-telemetry/opentelemetry-java/tree/main/sdk-extensions/autoconfigure).
-| System property
Environment variable | Default value | Description |
-|--------------------------------------------------------------------------------------------|-------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|
-| `otel.traces.exporter`
`OTEL_TRACES_EXPORTER` | `none` | Select the OpenTelemetry exporter for tracing, the currently only supported values are `none` and `otlp`. `none` makes the instrumentation NoOp |
-| `otel.exporter.otlp.endpoint`
`OTEL_EXPORTER_OTLP_ENDPOINT` | `http://localhost:4317` | The OTLP traces and metrics endpoint to connect to. Must be a URL with a scheme of either `http` or `https` based on the use of TLS. |
-| `otel.exporter.otlp.headers`
`OTEL_EXPORTER_OTLP_HEADERS` | | Key-value pairs separated by commas to pass as request headers on OTLP trace and metrics requests. |
-| `otel.exporter.otlp.timeout`
`OTEL_EXPORTER_OTLP_TIMEOUT` | `10000` | The maximum waiting time, in milliseconds, allowed to send each OTLP trace and metric batch. |
-| `otel.resource.attributes`
`OTEL_RESOURCE_ATTRIBUTES` | | Specify resource attributes in the following format: key1=val1,key2=val2,key3=val3 |
-| `otel.instrumentation.maven.mojo.enabled`
`OTEL_INSTRUMENTATION_MAVEN_MOJO_ENABLED` | `true` | Whether to create spans for mojo goal executions, `true` or `false`. Can be configured to reduce the number of spans created for large builds. |
+| System property
Environment variable | Default value | Description |
+|----------------------------------------------------------------------------------------------------|-------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|
+| `otel.traces.exporter`
`OTEL_TRACES_EXPORTER` | `none` | Select the OpenTelemetry exporter for tracing, the currently only supported values are `none` and `otlp`. `none` makes the instrumentation NoOp |
+| `otel.exporter.otlp.endpoint`
`OTEL_EXPORTER_OTLP_ENDPOINT` | `http://localhost:4317` | The OTLP traces and metrics endpoint to connect to. Must be a URL with a scheme of either `http` or `https` based on the use of TLS. |
+| `otel.exporter.otlp.headers`
`OTEL_EXPORTER_OTLP_HEADERS` | | Key-value pairs separated by commas to pass as request headers on OTLP trace and metrics requests. |
+| `otel.exporter.otlp.timeout`
`OTEL_EXPORTER_OTLP_TIMEOUT` | `10000` | The maximum waiting time, in milliseconds, allowed to send each OTLP trace and metric batch. |
+| `otel.resource.attributes`
`OTEL_RESOURCE_ATTRIBUTES` | | Specify resource attributes in the following format: key1=val1,key2=val2,key3=val3 |
+| `otel.instrumentation.maven.mojo.enabled`
`OTEL_INSTRUMENTATION_MAVEN_MOJO_ENABLED` | `true` | Whether to create spans for mojo goal executions, `true` or `false`. Can be configured to reduce the number of spans created for large builds. |
+| `otel.instrumentation.maven.transfer.enabled`
`OTEL_INSTRUMENTATION_MAVEN_TRANSFER_ENABLED` | `false` | Whether to create spans for artifact transfers, `true` or `false`. Can be activated to understand impact of artifact transfers on performances. |
ℹ️ The `service.name` is set to `maven` and the `service.version` to the version of the Maven runtime in use.
diff --git a/maven-extension/build.gradle.kts b/maven-extension/build.gradle.kts
index 4304534f8..d14faa992 100644
--- a/maven-extension/build.gradle.kts
+++ b/maven-extension/build.gradle.kts
@@ -6,7 +6,7 @@ plugins {
}
// NOTE
-// `META-INF/sis/javax.inject.Named` is manually handled under src/main/resources because there is
+// `META-INF/sisu/javax.inject.Named` is manually handled under src/main/resources because there is
// no Gradle equivalent to the Maven plugin `org.eclipse.sisu:sisu-maven-plugin`
description = "Maven extension to observe Maven builds with distributed traces using OpenTelemetry SDK"
@@ -24,7 +24,7 @@ dependencies {
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
implementation("io.opentelemetry:opentelemetry-exporter-otlp")
implementation("io.opentelemetry.semconv:opentelemetry-semconv")
- testImplementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating")
+ implementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating")
annotationProcessor("com.google.auto.value:auto-value")
compileOnly("com.google.auto.value:auto-value-annotations")
diff --git a/maven-extension/src/main/java/io/opentelemetry/maven/ChainedTransferListener.java b/maven-extension/src/main/java/io/opentelemetry/maven/ChainedTransferListener.java
new file mode 100644
index 000000000..692d1aff3
--- /dev/null
+++ b/maven-extension/src/main/java/io/opentelemetry/maven/ChainedTransferListener.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.maven;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.eclipse.aether.transfer.TransferCancelledException;
+import org.eclipse.aether.transfer.TransferEvent;
+import org.eclipse.aether.transfer.TransferListener;
+
+/**
+ * Util class to chain multiple {@link TransferListener} as Maven APIs don't offer this capability.
+ */
+final class ChainedTransferListener implements TransferListener {
+
+ private final List listeners;
+
+ /**
+ * @param listeners {@code null} values are filtered
+ */
+ ChainedTransferListener(TransferListener... listeners) {
+ this.listeners = Arrays.stream(listeners).filter(e -> e != null).collect(Collectors.toList());
+ }
+
+ @Override
+ public void transferInitiated(TransferEvent event) throws TransferCancelledException {
+ for (TransferListener listener : this.listeners) {
+ listener.transferInitiated(event);
+ }
+ }
+
+ @Override
+ public void transferStarted(TransferEvent event) throws TransferCancelledException {
+ for (TransferListener listener : this.listeners) {
+ listener.transferStarted(event);
+ }
+ }
+
+ @Override
+ public void transferProgressed(TransferEvent event) throws TransferCancelledException {
+ for (TransferListener listener : this.listeners) {
+ listener.transferProgressed(event);
+ }
+ }
+
+ @Override
+ public void transferCorrupted(TransferEvent event) throws TransferCancelledException {
+ for (TransferListener listener : this.listeners) {
+ listener.transferCorrupted(event);
+ }
+ }
+
+ @Override
+ public void transferSucceeded(TransferEvent event) {
+ for (TransferListener listener : this.listeners) {
+ listener.transferSucceeded(event);
+ }
+ }
+
+ @Override
+ public void transferFailed(TransferEvent event) {
+ for (TransferListener listener : this.listeners) {
+ listener.transferFailed(event);
+ }
+ }
+}
diff --git a/maven-extension/src/main/java/io/opentelemetry/maven/OpenTelemetrySdkService.java b/maven-extension/src/main/java/io/opentelemetry/maven/OpenTelemetrySdkService.java
index a357b3177..0d2e5150e 100644
--- a/maven-extension/src/main/java/io/opentelemetry/maven/OpenTelemetrySdkService.java
+++ b/maven-extension/src/main/java/io/opentelemetry/maven/OpenTelemetrySdkService.java
@@ -49,10 +49,12 @@ public final class OpenTelemetrySdkService implements Closeable {
private final boolean mojosInstrumentationEnabled;
+ private final boolean transferInstrumentationEnabled;
+
private boolean disposed;
public OpenTelemetrySdkService() {
- logger.debug(
+ logger.info(
"OpenTelemetry: Initialize OpenTelemetrySdkService v{}...",
MavenOtelSemanticAttributes.TELEMETRY_DISTRO_VERSION_VALUE);
@@ -76,6 +78,8 @@ public OpenTelemetrySdkService() {
this.mojosInstrumentationEnabled =
configProperties.getBoolean("otel.instrumentation.maven.mojo.enabled", true);
+ this.transferInstrumentationEnabled =
+ configProperties.getBoolean("otel.instrumentation.maven.transfer.enabled", false);
this.tracer = openTelemetrySdk.getTracer("io.opentelemetry.contrib.maven", VERSION);
}
@@ -154,4 +158,8 @@ public ContextPropagators getPropagators() {
public boolean isMojosInstrumentationEnabled() {
return mojosInstrumentationEnabled;
}
+
+ public boolean isTransferInstrumentationEnabled() {
+ return transferInstrumentationEnabled;
+ }
}
diff --git a/maven-extension/src/main/java/io/opentelemetry/maven/OtelExecutionListener.java b/maven-extension/src/main/java/io/opentelemetry/maven/OtelExecutionListener.java
index 8da5c3acd..830412f7f 100644
--- a/maven-extension/src/main/java/io/opentelemetry/maven/OtelExecutionListener.java
+++ b/maven-extension/src/main/java/io/opentelemetry/maven/OtelExecutionListener.java
@@ -17,12 +17,9 @@
import io.opentelemetry.maven.handler.MojoGoalExecutionHandler;
import io.opentelemetry.maven.handler.MojoGoalExecutionHandlerConfiguration;
import io.opentelemetry.maven.semconv.MavenOtelSemanticAttributes;
-import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
import org.apache.maven.execution.AbstractExecutionListener;
import org.apache.maven.execution.ExecutionEvent;
import org.apache.maven.execution.ExecutionListener;
@@ -338,19 +335,4 @@ public void sessionEnded(ExecutionEvent event) {
logger.debug("OpenTelemetry: Maven session ended, end root span");
spanRegistry.removeRootSpan().end();
}
-
- private static class ToUpperCaseTextMapGetter implements TextMapGetter