diff --git a/maven-extension/src/main/java/io/opentelemetry/maven/resources/MavenResourceProvider.java b/maven-extension/src/main/java/io/opentelemetry/maven/resources/MavenResourceProvider.java index d72e9c27b..66e7b028b 100644 --- a/maven-extension/src/main/java/io/opentelemetry/maven/resources/MavenResourceProvider.java +++ b/maven-extension/src/main/java/io/opentelemetry/maven/resources/MavenResourceProvider.java @@ -10,19 +10,22 @@ import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.semconv.ServiceAttributes; -import org.apache.maven.rtinfo.RuntimeInformation; -import org.apache.maven.rtinfo.internal.DefaultRuntimeInformation; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; +import org.apache.maven.Maven; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class MavenResourceProvider implements ResourceProvider { + private static final Logger logger = LoggerFactory.getLogger(MavenResourceProvider.class); + @Override public Resource createResource(ConfigProperties config) { - // TODO verify if there is solution to retrieve the RuntimeInformation instance loaded by the - // Maven Plexus Launcher - RuntimeInformation runtimeInformation = new DefaultRuntimeInformation(); return Resource.builder() .put(ServiceAttributes.SERVICE_NAME, MavenOtelSemanticAttributes.SERVICE_NAME_VALUE) - .put(ServiceAttributes.SERVICE_VERSION, runtimeInformation.getMavenVersion()) + .put(ServiceAttributes.SERVICE_VERSION, getMavenRuntimeVersion()) .put( MavenOtelSemanticAttributes.TELEMETRY_DISTRO_NAME, MavenOtelSemanticAttributes.TELEMETRY_DISTRO_NAME_VALUE) @@ -31,4 +34,40 @@ public Resource createResource(ConfigProperties config) { MavenOtelSemanticAttributes.TELEMETRY_DISTRO_VERSION_VALUE) .build(); } + + /** + * Recopy of + * org.apache.maven.rtinfo.internal.DefaultRuntimeInformation#getMavenVersion() + * that is not available in Maven 4.0+ + */ + static String getMavenRuntimeVersion() { + String mavenVersion; + Properties props = new Properties(); + String resource = "META-INF/maven/org.apache.maven/maven-core/pom.properties"; + + try (InputStream is = Maven.class.getResourceAsStream("/" + resource)) { + if (is != null) { + props.load(is); + } else { + logger.warn( + "Could not locate {} on classpath, Maven runtime information not available", resource); + } + } catch (IOException e) { + String msg = "Could not parse " + resource + ", Maven runtime information not available"; + if (logger.isDebugEnabled()) { + logger.warn(msg, e); + } else { + logger.warn(msg); + } + } + + String version = props.getProperty("version", "").trim(); + if (!version.startsWith("${")) { + mavenVersion = version; + } else { + mavenVersion = ""; + } + return mavenVersion; + } } diff --git a/maven-extension/src/test/java/io/opentelemetry/maven/resources/MavenResourceProviderTest.java b/maven-extension/src/test/java/io/opentelemetry/maven/resources/MavenResourceProviderTest.java new file mode 100644 index 000000000..c5170004a --- /dev/null +++ b/maven-extension/src/test/java/io/opentelemetry/maven/resources/MavenResourceProviderTest.java @@ -0,0 +1,19 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.maven.resources; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class MavenResourceProviderTest { + + @Test + void testGetMavenVersion() { + String mavenVersion = MavenResourceProvider.getMavenRuntimeVersion(); + assertThat(mavenVersion).isEqualTo("3.5.0"); + } +}