From 8982fcc6f3f6402d1f63e07a936ae6c9a1829e0c Mon Sep 17 00:00:00 2001 From: Hayanesh Date: Sun, 17 Sep 2023 16:32:10 +0530 Subject: [PATCH 1/4] Add Spring Boot service version finder / ResourceProvider --- .../SpringBootServiceNameDetector.java | 5 ++ .../SpringBootServiceVersionDetector.java | 64 +++++++++++++++++++ .../SpringBootServiceVersionDetectorTest.java | 40 ++++++++++++ .../resources/META-INF/build-info.properties | 3 + 4 files changed, 112 insertions(+) create mode 100644 instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java create mode 100644 instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java create mode 100644 instrumentation/spring/spring-boot-resources/library/src/test/resources/META-INF/build-info.properties diff --git a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetector.java b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetector.java index 59b3517ee7da..ed2908805aa6 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetector.java +++ b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetector.java @@ -293,6 +293,11 @@ InputStream openClasspathResource(String filename) { return classLoader.getResourceAsStream(path); } + InputStream openClasspathResource(String filename, String location) { + String path = location + "/" + filename; + return classLoader.getResourceAsStream(path); + } + InputStream openFile(String filename) throws Exception { return Files.newInputStream(Paths.get(filename)); } diff --git a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java new file mode 100644 index 000000000000..748e7dc8de42 --- /dev/null +++ b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java @@ -0,0 +1,64 @@ +package io.opentelemetry.instrumentation.spring.resources; + +import static java.util.logging.Level.FINE; + +import com.google.auto.service.AutoService; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; +import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.semconv.ResourceAttributes; +import java.io.IOException; +import java.io.InputStream; +import java.util.Optional; +import java.util.Properties; +import java.util.logging.Logger; +import io.opentelemetry.instrumentation.spring.resources.SpringBootServiceNameDetector.SystemHelper; + +@AutoService(ResourceProvider.class) +public class SpringBootServiceVersionDetector implements ResourceProvider { + + private static final Logger logger = + Logger.getLogger(SpringBootServiceVersionDetector.class.getName()); + + private final SystemHelper system; + + public SpringBootServiceVersionDetector() { + this.system = new SystemHelper(); + } + + // Exists for testing + public SpringBootServiceVersionDetector(SystemHelper system){ + this.system = system; + } + + @Override + public Resource createResource(ConfigProperties config) { + return getServiceVersionFromBuildInfo() + .map(version -> { + logger.log(FINE, "Auto-detected Spring Boot service version: {0}", version); + return Resource.builder().put(ResourceAttributes.SERVICE_VERSION, version).build(); + }) + .orElseGet(Resource::empty); + } + + + private Optional getServiceVersionFromBuildInfo(){ + try(InputStream in = system.openClasspathResource("build-info.properties", "META-INF")){ + return getServiceVersionPropertyFromStream(in); + }catch (Exception e){ + return Optional.empty(); + } + } + + private static Optional getServiceVersionPropertyFromStream(InputStream in){ + Properties properties = new Properties(); + try { + // Note: load() uses ISO 8859-1 encoding, same as spring uses by default for property files + properties.load(in); + return Optional.ofNullable(properties.getProperty("build.version")); + } catch (IOException e) { + return Optional.empty(); + } + } + +} diff --git a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java new file mode 100644 index 000000000000..eaf1a33e287f --- /dev/null +++ b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java @@ -0,0 +1,40 @@ +package io.opentelemetry.instrumentation.spring.resources; + +import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_VERSION; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.resources.Resource; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import java.io.InputStream; + +@ExtendWith(MockitoExtension.class) +class SpringBootServiceVersionDetectorTest { + + static final String BUILD_PROPS = "build-info.properties"; + static final String META_INFO = "META-INF"; + + @Mock + ConfigProperties config; + @Mock + SpringBootServiceNameDetector.SystemHelper system; + + @Test + void givenBuildVersionIsPresentInBuildInfProperties_thenReturnBuildVersion() { + when(system.openClasspathResource(BUILD_PROPS, META_INFO)) + .thenReturn(openClasspathResource(META_INFO + "/" + BUILD_PROPS)); + + SpringBootServiceVersionDetector guesser = new SpringBootServiceVersionDetector(system); + Resource result = guesser.createResource(config); + assertThat(result.getAttribute(SERVICE_VERSION)).isEqualTo("0.0.2"); + } + + private InputStream openClasspathResource(String resource) { + return getClass().getClassLoader().getResourceAsStream(resource); + } + +} diff --git a/instrumentation/spring/spring-boot-resources/library/src/test/resources/META-INF/build-info.properties b/instrumentation/spring/spring-boot-resources/library/src/test/resources/META-INF/build-info.properties new file mode 100644 index 000000000000..2b810fb32475 --- /dev/null +++ b/instrumentation/spring/spring-boot-resources/library/src/test/resources/META-INF/build-info.properties @@ -0,0 +1,3 @@ +build.artifact=something +build.name=some-name +build.version=0.0.2 From cc1c5c7098c3fa95a59c900fc3a7efe570a509be Mon Sep 17 00:00:00 2001 From: Hayanesh Date: Sun, 17 Sep 2023 16:54:37 +0530 Subject: [PATCH 2/4] Apply spotless --- .../SpringBootServiceVersionDetector.java | 28 +++++++++++-------- .../SpringBootServiceVersionDetectorTest.java | 14 ++++++---- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java index 748e7dc8de42..23d15c61e5fb 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java +++ b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java @@ -1,8 +1,14 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.instrumentation.spring.resources; import static java.util.logging.Level.FINE; import com.google.auto.service.AutoService; +import io.opentelemetry.instrumentation.spring.resources.SpringBootServiceNameDetector.SystemHelper; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; import io.opentelemetry.sdk.resources.Resource; @@ -12,7 +18,6 @@ import java.util.Optional; import java.util.Properties; import java.util.logging.Logger; -import io.opentelemetry.instrumentation.spring.resources.SpringBootServiceNameDetector.SystemHelper; @AutoService(ResourceProvider.class) public class SpringBootServiceVersionDetector implements ResourceProvider { @@ -27,30 +32,30 @@ public SpringBootServiceVersionDetector() { } // Exists for testing - public SpringBootServiceVersionDetector(SystemHelper system){ + public SpringBootServiceVersionDetector(SystemHelper system) { this.system = system; } @Override public Resource createResource(ConfigProperties config) { return getServiceVersionFromBuildInfo() - .map(version -> { - logger.log(FINE, "Auto-detected Spring Boot service version: {0}", version); - return Resource.builder().put(ResourceAttributes.SERVICE_VERSION, version).build(); - }) + .map( + version -> { + logger.log(FINE, "Auto-detected Spring Boot service version: {0}", version); + return Resource.builder().put(ResourceAttributes.SERVICE_VERSION, version).build(); + }) .orElseGet(Resource::empty); } - - private Optional getServiceVersionFromBuildInfo(){ - try(InputStream in = system.openClasspathResource("build-info.properties", "META-INF")){ + private Optional getServiceVersionFromBuildInfo() { + try (InputStream in = system.openClasspathResource("build-info.properties", "META-INF")) { return getServiceVersionPropertyFromStream(in); - }catch (Exception e){ + } catch (Exception e) { return Optional.empty(); } } - private static Optional getServiceVersionPropertyFromStream(InputStream in){ + private static Optional getServiceVersionPropertyFromStream(InputStream in) { Properties properties = new Properties(); try { // Note: load() uses ISO 8859-1 encoding, same as spring uses by default for property files @@ -60,5 +65,4 @@ private static Optional getServiceVersionPropertyFromStream(InputStream return Optional.empty(); } } - } diff --git a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java index eaf1a33e287f..3d3a2023ab1c 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java +++ b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.instrumentation.spring.resources; import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_VERSION; @@ -6,11 +11,11 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.resources.Resource; +import java.io.InputStream; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.io.InputStream; @ExtendWith(MockitoExtension.class) class SpringBootServiceVersionDetectorTest { @@ -18,10 +23,8 @@ class SpringBootServiceVersionDetectorTest { static final String BUILD_PROPS = "build-info.properties"; static final String META_INFO = "META-INF"; - @Mock - ConfigProperties config; - @Mock - SpringBootServiceNameDetector.SystemHelper system; + @Mock ConfigProperties config; + @Mock SpringBootServiceNameDetector.SystemHelper system; @Test void givenBuildVersionIsPresentInBuildInfProperties_thenReturnBuildVersion() { @@ -36,5 +39,4 @@ void givenBuildVersionIsPresentInBuildInfProperties_thenReturnBuildVersion() { private InputStream openClasspathResource(String resource) { return getClass().getClassLoader().getResourceAsStream(resource); } - } From 282da0dfe1966c25fbdf5d8f8db2fbfda7ef62b8 Mon Sep 17 00:00:00 2001 From: Hayanesh Date: Mon, 18 Sep 2023 13:40:19 +0530 Subject: [PATCH 3/4] Handle build-info.properties file not present case --- .../SpringBootServiceVersionDetector.java | 2 +- .../SpringBootServiceVersionDetectorTest.java | 19 +++++++++++++++++++ .../src/test/resources/build-info.properties | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 instrumentation/spring/spring-boot-resources/library/src/test/resources/build-info.properties diff --git a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java index 23d15c61e5fb..a42b72a08daf 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java +++ b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java @@ -49,7 +49,7 @@ public Resource createResource(ConfigProperties config) { private Optional getServiceVersionFromBuildInfo() { try (InputStream in = system.openClasspathResource("build-info.properties", "META-INF")) { - return getServiceVersionPropertyFromStream(in); + return in != null ? getServiceVersionPropertyFromStream(in) : Optional.empty(); } catch (Exception e) { return Optional.empty(); } diff --git a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java index 3d3a2023ab1c..862a165c2fef 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java +++ b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java @@ -36,6 +36,25 @@ void givenBuildVersionIsPresentInBuildInfProperties_thenReturnBuildVersion() { assertThat(result.getAttribute(SERVICE_VERSION)).isEqualTo("0.0.2"); } + @Test + void givenBuildVersionFileNotPresent_thenReturnEmptyResource() { + when(system.openClasspathResource(BUILD_PROPS, META_INFO)).thenReturn(null); + + SpringBootServiceVersionDetector guesser = new SpringBootServiceVersionDetector(system); + Resource result = guesser.createResource(config); + assertThat(result).isEqualTo(Resource.empty()); + } + + @Test + void givenBuildVersionFileIsPresentButBuildVersionPropertyNotPresent_thenReturnEmptyResource() { + when(system.openClasspathResource(BUILD_PROPS, META_INFO)) + .thenReturn(openClasspathResource(BUILD_PROPS)); + + SpringBootServiceVersionDetector guesser = new SpringBootServiceVersionDetector(system); + Resource result = guesser.createResource(config); + assertThat(result).isEqualTo(Resource.empty()); + } + private InputStream openClasspathResource(String resource) { return getClass().getClassLoader().getResourceAsStream(resource); } diff --git a/instrumentation/spring/spring-boot-resources/library/src/test/resources/build-info.properties b/instrumentation/spring/spring-boot-resources/library/src/test/resources/build-info.properties new file mode 100644 index 000000000000..9a0f8f1ab576 --- /dev/null +++ b/instrumentation/spring/spring-boot-resources/library/src/test/resources/build-info.properties @@ -0,0 +1,2 @@ +build.artifact=something +build.name=some-name From fc031754aee30df9ce15dd8a3e69de9676f92042 Mon Sep 17 00:00:00 2001 From: Hayanesh Date: Thu, 21 Sep 2023 18:35:07 +0530 Subject: [PATCH 4/4] Added smoke test for SpringBootServiceVersionDetector --- .../SpringBootServiceNameDetector.java | 59 ---------------- .../SpringBootServiceVersionDetector.java | 5 +- .../spring/resources/SystemHelper.java | 70 +++++++++++++++++++ .../SpringBootServiceNameDetectorTest.java | 2 +- .../SpringBootServiceVersionDetectorTest.java | 8 +-- .../smoketest/SpringBootSmokeTest.groovy | 9 ++- 6 files changed, 85 insertions(+), 68 deletions(-) create mode 100644 instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SystemHelper.java diff --git a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetector.java b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetector.java index ed2908805aa6..e6a0549d3621 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetector.java +++ b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetector.java @@ -15,12 +15,8 @@ import io.opentelemetry.semconv.ResourceAttributes; import java.io.IOException; import java.io.InputStream; -import java.lang.reflect.Method; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Properties; import java.util.function.Function; import java.util.function.Supplier; @@ -264,59 +260,4 @@ private String loadFromClasspath(String filename, Function return null; } } - - // Exists for testing - static class SystemHelper { - private final ClassLoader classLoader; - private final boolean addBootInfPrefix; - - SystemHelper() { - ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); - classLoader = - contextClassLoader != null ? contextClassLoader : ClassLoader.getSystemClassLoader(); - addBootInfPrefix = classLoader.getResource("BOOT-INF/classes/") != null; - if (addBootInfPrefix) { - logger.log(Level.FINER, "Detected presence of BOOT-INF/classes/"); - } - } - - String getenv(String name) { - return System.getenv(name); - } - - String getProperty(String key) { - return System.getProperty(key); - } - - InputStream openClasspathResource(String filename) { - String path = addBootInfPrefix ? "BOOT-INF/classes/" + filename : filename; - return classLoader.getResourceAsStream(path); - } - - InputStream openClasspathResource(String filename, String location) { - String path = location + "/" + filename; - return classLoader.getResourceAsStream(path); - } - - InputStream openFile(String filename) throws Exception { - return Files.newInputStream(Paths.get(filename)); - } - - /** - * Attempts to use ProcessHandle to get the full commandline of the current process (including - * the main method arguments). Will only succeed on java 9+. - */ - @SuppressWarnings("unchecked") - String[] attemptGetCommandLineArgsViaReflection() throws Exception { - Class clazz = Class.forName("java.lang.ProcessHandle"); - Method currentMethod = clazz.getDeclaredMethod("current"); - Method infoMethod = clazz.getDeclaredMethod("info"); - Object currentInstance = currentMethod.invoke(null); - Object info = infoMethod.invoke(currentInstance); - Class infoClass = Class.forName("java.lang.ProcessHandle$Info"); - Method argumentsMethod = infoClass.getMethod("arguments"); - Optional optionalArgs = (Optional) argumentsMethod.invoke(info); - return optionalArgs.orElse(new String[0]); - } - } } diff --git a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java index a42b72a08daf..3c9ddb05fcdd 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java +++ b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java @@ -8,7 +8,6 @@ import static java.util.logging.Level.FINE; import com.google.auto.service.AutoService; -import io.opentelemetry.instrumentation.spring.resources.SpringBootServiceNameDetector.SystemHelper; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; import io.opentelemetry.sdk.resources.Resource; @@ -32,7 +31,7 @@ public SpringBootServiceVersionDetector() { } // Exists for testing - public SpringBootServiceVersionDetector(SystemHelper system) { + SpringBootServiceVersionDetector(SystemHelper system) { this.system = system; } @@ -48,7 +47,7 @@ public Resource createResource(ConfigProperties config) { } private Optional getServiceVersionFromBuildInfo() { - try (InputStream in = system.openClasspathResource("build-info.properties", "META-INF")) { + try (InputStream in = system.openClasspathResource("META-INF", "build-info.properties")) { return in != null ? getServiceVersionPropertyFromStream(in) : Optional.empty(); } catch (Exception e) { return Optional.empty(); diff --git a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SystemHelper.java b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SystemHelper.java new file mode 100644 index 000000000000..59606a62c296 --- /dev/null +++ b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SystemHelper.java @@ -0,0 +1,70 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.spring.resources; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Optional; +import java.util.logging.Level; +import java.util.logging.Logger; + +class SystemHelper { + private static final Logger logger = Logger.getLogger(SystemHelper.class.getName()); + + private final ClassLoader classLoader; + private final boolean addBootInfPrefix; + + SystemHelper() { + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + classLoader = + contextClassLoader != null ? contextClassLoader : ClassLoader.getSystemClassLoader(); + addBootInfPrefix = classLoader.getResource("BOOT-INF/classes/") != null; + if (addBootInfPrefix) { + logger.log(Level.FINER, "Detected presence of BOOT-INF/classes/"); + } + } + + String getenv(String name) { + return System.getenv(name); + } + + String getProperty(String key) { + return System.getProperty(key); + } + + InputStream openClasspathResource(String filename) { + String path = addBootInfPrefix ? "BOOT-INF/classes/" + filename : filename; + return classLoader.getResourceAsStream(path); + } + + InputStream openClasspathResource(String directory, String filename) { + String path = directory + "/" + filename; + return classLoader.getResourceAsStream(path); + } + + InputStream openFile(String filename) throws Exception { + return Files.newInputStream(Paths.get(filename)); + } + + /** + * Attempts to use ProcessHandle to get the full commandline of the current process (including the + * main method arguments). Will only succeed on java 9+. + */ + @SuppressWarnings("unchecked") + String[] attemptGetCommandLineArgsViaReflection() throws Exception { + Class clazz = Class.forName("java.lang.ProcessHandle"); + Method currentMethod = clazz.getDeclaredMethod("current"); + Method infoMethod = clazz.getDeclaredMethod("info"); + Object currentInstance = currentMethod.invoke(null); + Object info = infoMethod.invoke(currentInstance); + Class infoClass = Class.forName("java.lang.ProcessHandle$Info"); + Method argumentsMethod = infoClass.getMethod("arguments"); + Optional optionalArgs = (Optional) argumentsMethod.invoke(info); + return optionalArgs.orElse(new String[0]); + } +} diff --git a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetectorTest.java b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetectorTest.java index 80a0beb4e55b..0d10364649d6 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetectorTest.java +++ b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetectorTest.java @@ -31,7 +31,7 @@ class SpringBootServiceNameDetectorTest { static final String PROPS = "application.properties"; static final String APPLICATION_YML = "application.yml"; @Mock ConfigProperties config; - @Mock SpringBootServiceNameDetector.SystemHelper system; + @Mock SystemHelper system; @Test void findByEnvVar() { diff --git a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java index 862a165c2fef..9bce16b4fcd2 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java +++ b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java @@ -24,11 +24,11 @@ class SpringBootServiceVersionDetectorTest { static final String META_INFO = "META-INF"; @Mock ConfigProperties config; - @Mock SpringBootServiceNameDetector.SystemHelper system; + @Mock SystemHelper system; @Test void givenBuildVersionIsPresentInBuildInfProperties_thenReturnBuildVersion() { - when(system.openClasspathResource(BUILD_PROPS, META_INFO)) + when(system.openClasspathResource(META_INFO, BUILD_PROPS)) .thenReturn(openClasspathResource(META_INFO + "/" + BUILD_PROPS)); SpringBootServiceVersionDetector guesser = new SpringBootServiceVersionDetector(system); @@ -38,7 +38,7 @@ void givenBuildVersionIsPresentInBuildInfProperties_thenReturnBuildVersion() { @Test void givenBuildVersionFileNotPresent_thenReturnEmptyResource() { - when(system.openClasspathResource(BUILD_PROPS, META_INFO)).thenReturn(null); + when(system.openClasspathResource(META_INFO, BUILD_PROPS)).thenReturn(null); SpringBootServiceVersionDetector guesser = new SpringBootServiceVersionDetector(system); Resource result = guesser.createResource(config); @@ -47,7 +47,7 @@ void givenBuildVersionFileNotPresent_thenReturnEmptyResource() { @Test void givenBuildVersionFileIsPresentButBuildVersionPropertyNotPresent_thenReturnEmptyResource() { - when(system.openClasspathResource(BUILD_PROPS, META_INFO)) + when(system.openClasspathResource(META_INFO, BUILD_PROPS)) .thenReturn(openClasspathResource(BUILD_PROPS)); SpringBootServiceVersionDetector guesser = new SpringBootServiceVersionDetector(system); diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy index eeb463d8d17c..4e4b36ef236e 100644 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy +++ b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SpringBootSmokeTest.groovy @@ -21,7 +21,7 @@ import static java.util.stream.Collectors.toSet class SpringBootSmokeTest extends SmokeTest { protected String getTargetImage(String jdk) { - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-spring-boot:jdk$jdk-20230321.4484174638" + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-spring-boot:jdk$jdk-20230920.6251727205" } @Override @@ -94,6 +94,13 @@ class SpringBootSmokeTest extends SmokeTest { serviceName.isPresent() serviceName.get() == "otel-spring-test-app" + then: "service version is autodetected" + def serviceVersion = findResourceAttribute(traces, "service.version") + .map { it.stringValue } + .findAny() + serviceVersion.isPresent() + serviceVersion.get() == "1.31.0-alpha-SNAPSHOT" + cleanup: stopTarget()