From 956da5b340a0d5d55b320e65ccb45e13d071d494 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Fri, 26 Aug 2022 15:45:21 -0700 Subject: [PATCH 01/11] Add spring boot service name guesser. --- .../build.gradle.kts | 3 + .../SpringBootServiceNameGuesser.java | 264 ++++++++++++++++++ .../SpringBootServiceNameGuesserTest.java | 137 +++++++++ .../src/test/resources/application.properties | 3 + .../src/test/resources/application.yml | 14 + 5 files changed, 421 insertions(+) create mode 100644 instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java create mode 100644 instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java create mode 100644 instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.properties create mode 100644 instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yml diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts index a867b133eb22..50aeb893c9fb 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts +++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts @@ -14,6 +14,9 @@ dependencies { implementation("org.springframework.boot:spring-boot-autoconfigure:$springBootVersion") annotationProcessor("org.springframework.boot:spring-boot-autoconfigure-processor:$springBootVersion") implementation("javax.validation:validation-api:2.0.1.Final") + annotationProcessor("com.google.auto.service:auto-service") + compileOnly("com.google.auto.service:auto-service-annotations") + testCompileOnly("com.google.auto.service:auto-service-annotations") implementation(project(":instrumentation-annotations-support")) implementation(project(":instrumentation:kafka:kafka-clients:kafka-clients-2.6:library")) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java new file mode 100644 index 000000000000..39ef24d84dcb --- /dev/null +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java @@ -0,0 +1,264 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.spring.autoconfigure.resources; + +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.resource.attributes.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; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Stream; +import javax.annotation.Nullable; +import org.yaml.snakeyaml.Yaml; + +/** + * A ResourceProvider that will attempt to guess the application name for a Spring Boot service. + * When successful, it will return a Resource that has the service name attribute populated with the + * name of the Spring Boot application. It uses the following strategies, and the first successful + * strategy wins: + * + * + */ +@AutoService(ResourceProvider.class) +public class SpringBootServiceNameGuesser implements ResourceProvider { + + private static final Pattern COMMANDLINE_PATTERN = + Pattern.compile(".*--spring\\.application\\.name=([a-zA-Z.\\-_]+).*"); + private static final Logger logger = + Logger.getLogger(SpringBootServiceNameGuesser.class.getName()); + private final SystemHelper system; + + public SpringBootServiceNameGuesser() { + this(new SystemHelper()); + } + + // Exists for testing + SpringBootServiceNameGuesser(SystemHelper system) { + this.system = system; + } + + @Override + public Resource createResource(ConfigProperties config) { + + logger.log(Level.FINER, "Performing Spring Boot service name auto-detection..."); + Stream> finders = + Stream.of( + this::findByCommandlineArgument, + this::findBySystemProperties, + this::findByEnvironmentVariable, + this::findByCurrentDirectoryApplicationProperties, + this::findByCurrentDirectoryApplicationYaml, + this::findByClasspathApplicationProperties, + this::findByClasspathApplicationYaml); + return finders + .map(Supplier::get) + .filter(Objects::nonNull) + .findFirst() + .map( + serviceName -> { + logger.log(Level.FINER, "Guessed Spring Boot service name: " + serviceName); + return Resource.builder().put(ResourceAttributes.SERVICE_NAME, serviceName).build(); + }) + .orElseGet(Resource::empty); + } + + @Nullable + private String findByEnvironmentVariable() { + String result = system.getenv("SPRING_APPLICATION_NAME"); + logger.log(Level.FINER, "Checking for SPRING_APPLICATION_NAME in env: " + result); + return result; + } + + @Nullable + private String findBySystemProperties() { + String result = system.getProperty("spring.application.name"); + logger.log(Level.FINER, "Checking for spring.application.name system property: " + result); + return result; + } + + @Nullable + private String findByClasspathApplicationProperties() { + String result = readNameFromAppProperties(); + logger.log( + Level.FINER, + "Checking for spring.application.name in application.properties file: " + result); + return result; + } + + @Nullable + private String findByCurrentDirectoryApplicationProperties() { + String result = null; + try (InputStream in = system.openFile("application.properties")) { + result = getAppNamePropertyFromStream(in); + } catch (Exception e) { + // expected to fail sometimes + } + logger.log(Level.FINER, "Checking application.properties in current dir: " + result); + return result; + } + + @Nullable + private String findByClasspathApplicationYaml() { + String result = + loadFromClasspath("application.yml", SpringBootServiceNameGuesser::parseNameFromYaml); + logger.log(Level.FINER, "Checking application.yml in classpath: " + result); + return result; + } + + @Nullable + private String findByCurrentDirectoryApplicationYaml() { + String result = null; + try (InputStream in = system.openFile("application.yml")) { + result = parseNameFromYaml(in); + } catch (Exception e) { + // expected to fail sometimes + } + logger.log(Level.FINER, "Checking application.yml in current dir: " + result); + return result; + } + + @Nullable + @SuppressWarnings("unchecked") + private static String parseNameFromYaml(InputStream in) { + Yaml yaml = new Yaml(); + try { + Map data = yaml.load(in); + Map> spring = + (Map>) data.get("spring"); + if (spring != null) { + Map app = spring.get("application"); + if (app != null) { + Object name = app.get("name"); + return (String) name; + } + } + } catch (RuntimeException e) { + // expected to fail sometimes + } + return null; + } + + @Nullable + private String findByCommandlineArgument() { + String result = attemptProcessHandleReflection(); + if (result == null) { + String javaCommand = system.getProperty("sun.java.command"); + result = parseNameFromCommandLine(javaCommand); + } + logger.log(Level.FINER, "Checking application commandline args: " + result); + return result; + } + + @Nullable + private String attemptProcessHandleReflection() { + try { + String commandLine = system.attemptGetCommandLineViaReflection(); + return parseNameFromCommandLine(commandLine); + } catch (Exception e) { + return null; + } + } + + @Nullable + private static String parseNameFromCommandLine(@Nullable String commandLine) { + if (commandLine == null) { + return null; + } + Matcher matcher = COMMANDLINE_PATTERN.matcher(commandLine); + if (matcher.find()) { // Required before group() + return matcher.group(1); + } + return null; + } + + @Nullable + private String readNameFromAppProperties() { + return loadFromClasspath( + "application.properties", SpringBootServiceNameGuesser::getAppNamePropertyFromStream); + } + + @Nullable + private static String getAppNamePropertyFromStream(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 properties.getProperty("spring.application.name"); + } catch (IOException e) { + return null; + } + } + + @Nullable + private String loadFromClasspath(String filename, Function parser) { + try (InputStream in = system.openClasspathResource(filename)) { + return parser.apply(in); + } catch (Exception e) { + return null; + } + } + + // Exists for testing + static class SystemHelper { + + String getenv(String name) { + return System.getenv(name); + } + + String getProperty(String key) { + return System.getProperty(key); + } + + InputStream openClasspathResource(String filename) { + return ClassLoader.getSystemClassLoader().getResourceAsStream(filename); + } + + 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. Will only + * succeed on java 9+. + */ + @SuppressWarnings("unchecked") + @Nullable + String attemptGetCommandLineViaReflection() 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); + Method commandLineMethod = info.getClass().getInterfaces()[0].getMethod("commandLine"); + Object optionalCommandLine = commandLineMethod.invoke(info); + return ((Optional) optionalCommandLine).orElse(null); + } + } +} diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java new file mode 100644 index 000000000000..11a21e8336c4 --- /dev/null +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java @@ -0,0 +1,137 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.spring.autoconfigure.resources; + +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.BufferedReader; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import static io.opentelemetry.semconv.resource.attributes.ResourceAttributes.SERVICE_NAME; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class SpringBootServiceNameGuesserTest { + + static final String PROPS = "application.properties"; + static final String APPLICATION_YML = "application.yml"; + @Mock ConfigProperties config; + @Mock SpringBootServiceNameGuesser.SystemHelper system; + + @Test + void findByEnvVar() { + String expected = "fur-city"; + when(system.getenv("SPRING_APPLICATION_NAME")).thenReturn(expected); + + SpringBootServiceNameGuesser guesser = new SpringBootServiceNameGuesser(system); + + Resource result = guesser.createResource(config); + expectServiceName(result, expected); + } + + @Test + void classpathApplicationProperties() { + when(system.openClasspathResource(PROPS)).thenCallRealMethod(); + SpringBootServiceNameGuesser guesser = new SpringBootServiceNameGuesser(system); + Resource result = guesser.createResource(config); + expectServiceName(result, "dog-store"); + } + + @Test + void propertiesFileInCurrentDir() throws Exception { + Path propsPath = Paths.get(PROPS); + try { + writeString(propsPath, "spring.application.name=fish-tank\n"); + when(system.openFile(PROPS)).thenCallRealMethod(); + SpringBootServiceNameGuesser guesser = new SpringBootServiceNameGuesser(system); + Resource result = guesser.createResource(config); + expectServiceName(result, "fish-tank"); + } finally { + Files.delete(propsPath); + } + } + + @Test + void classpathApplicationYaml() { + when(system.openClasspathResource(APPLICATION_YML)).thenCallRealMethod(); + SpringBootServiceNameGuesser guesser = new SpringBootServiceNameGuesser(system); + Resource result = guesser.createResource(config); + expectServiceName(result, "cat-store"); + } + + @Test + void yamlFileInCurrentDir() throws Exception { + Path yamlPath = Paths.get(APPLICATION_YML); + try { + URL url = getClass().getClassLoader().getResource(APPLICATION_YML); + String content = readString(Paths.get(url.toURI())); + writeString(yamlPath, content); + when(system.openFile(PROPS)).thenThrow(new FileNotFoundException()); + when(system.openFile(APPLICATION_YML)).thenCallRealMethod(); + SpringBootServiceNameGuesser guesser = new SpringBootServiceNameGuesser(system); + Resource result = guesser.createResource(config); + expectServiceName(result, "cat-store"); + } finally { + Files.delete(yamlPath); + } + } + + @Test + void getFromCommandlineArgsWithProcessHandle() throws Exception { + when(system.attemptGetCommandLineViaReflection()) + .thenReturn( + "/bin/java sweet-spring.jar --spring.application.name=tiger-town --quiet=never"); + SpringBootServiceNameGuesser guesser = new SpringBootServiceNameGuesser(system); + Resource result = guesser.createResource(config); + expectServiceName(result, "tiger-town"); + } + + @Test + void getFromCommandlineArgsWithSystemProperty() throws Exception { + when(system.getProperty("sun.java.command")) + .thenReturn("/bin/java sweet-spring.jar --spring.application.name=bullpen --quiet=never"); + SpringBootServiceNameGuesser guesser = new SpringBootServiceNameGuesser(system); + Resource result = guesser.createResource(config); + expectServiceName(result, "bullpen"); + } + + private static void expectServiceName(Resource result, String expected) { + assertThat(result.getAttribute(SERVICE_NAME)).isEqualTo(expected); + } + + private static void writeString(Path path, String value) throws Exception { + try(OutputStream out = Files.newOutputStream(path)){ + out.write(value.getBytes(StandardCharsets.UTF_8)); + } + } + + private static String readString(Path path) throws Exception { + StringBuilder buff = new StringBuilder(); + try (InputStream in = Files.newInputStream(path)) { + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + char[] block = new char[1024]; + int rc; + while((rc = reader.read(block)) > 0){ + buff.append(block, 0, rc); + } + return buff.toString(); + } + } +} diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.properties b/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.properties new file mode 100644 index 000000000000..1b5b5c8d01cc --- /dev/null +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.properties @@ -0,0 +1,3 @@ +server.port=777 +server.context-path=/meow +spring.application.name=dog-store diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yml b/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yml new file mode 100644 index 000000000000..3bfd3386b84e --- /dev/null +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yml @@ -0,0 +1,14 @@ +flib: + something: + 12 + +section: + two: 2 + +server: + port: 777 + context-path: /meow + +spring: + application: + name: cat-store \ No newline at end of file From c64a806a871eb3ccb0c02747a3dac8ace85cfc9a Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Fri, 26 Aug 2022 16:06:40 -0700 Subject: [PATCH 02/11] add encoding --- .../SpringBootServiceNameGuesserTest.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java index 11a21e8336c4..9896aa627077 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java @@ -5,13 +5,13 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.resources; +import static io.opentelemetry.semconv.resource.attributes.ResourceAttributes.SERVICE_NAME; +import static java.nio.charset.StandardCharsets.UTF_8; +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.BufferedReader; import java.io.FileNotFoundException; import java.io.InputStream; @@ -22,10 +22,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; - -import static io.opentelemetry.semconv.resource.attributes.ResourceAttributes.SERVICE_NAME; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) class SpringBootServiceNameGuesserTest { @@ -117,18 +117,18 @@ private static void expectServiceName(Resource result, String expected) { } private static void writeString(Path path, String value) throws Exception { - try(OutputStream out = Files.newOutputStream(path)){ - out.write(value.getBytes(StandardCharsets.UTF_8)); + try (OutputStream out = Files.newOutputStream(path)) { + out.write(value.getBytes(UTF_8)); } } private static String readString(Path path) throws Exception { StringBuilder buff = new StringBuilder(); try (InputStream in = Files.newInputStream(path)) { - BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + BufferedReader reader = new BufferedReader(new InputStreamReader(in, UTF_8)); char[] block = new char[1024]; int rc; - while((rc = reader.read(block)) > 0){ + while ((rc = reader.read(block)) > 0) { buff.append(block, 0, rc); } return buff.toString(); From db221335480a796d6af25f75842136762c824d65 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Fri, 26 Aug 2022 16:21:54 -0700 Subject: [PATCH 03/11] improve commandline handling --- .../SpringBootServiceNameGuesser.java | 28 +++++++++++++------ .../SpringBootServiceNameGuesserTest.java | 10 +++++-- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java index 39ef24d84dcb..5e02e8f59495 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java @@ -49,10 +49,11 @@ @AutoService(ResourceProvider.class) public class SpringBootServiceNameGuesser implements ResourceProvider { - private static final Pattern COMMANDLINE_PATTERN = - Pattern.compile(".*--spring\\.application\\.name=([a-zA-Z.\\-_]+).*"); private static final Logger logger = Logger.getLogger(SpringBootServiceNameGuesser.class.getName()); + public static final String COMMANDLINE_ARG_PREFIX = "--spring.application.name="; + private static final Pattern COMMANDLINE_PATTERN = + Pattern.compile(".*--spring\\.application\\.name=([a-zA-Z.\\-_]+).*"); private final SystemHelper system; public SpringBootServiceNameGuesser() { @@ -179,8 +180,8 @@ private String findByCommandlineArgument() { @Nullable private String attemptProcessHandleReflection() { try { - String commandLine = system.attemptGetCommandLineViaReflection(); - return parseNameFromCommandLine(commandLine); + String[] args = system.attemptGetCommandLineArgsViaReflection(); + return parseNameFromProcessArgs(args); } catch (Exception e) { return null; } @@ -198,6 +199,15 @@ private static String parseNameFromCommandLine(@Nullable String commandLine) { return null; } + @Nullable + private static String parseNameFromProcessArgs(String[] args) { + return Stream.of(args) + .filter(arg -> arg.startsWith(COMMANDLINE_ARG_PREFIX)) + .map(arg -> arg.substring(COMMANDLINE_ARG_PREFIX.length())) + .findFirst() + .orElse(null); + } + @Nullable private String readNameFromAppProperties() { return loadFromClasspath( @@ -249,16 +259,16 @@ InputStream openFile(String filename) throws Exception { * succeed on java 9+. */ @SuppressWarnings("unchecked") - @Nullable - String attemptGetCommandLineViaReflection() throws Exception { + 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); - Method commandLineMethod = info.getClass().getInterfaces()[0].getMethod("commandLine"); - Object optionalCommandLine = commandLineMethod.invoke(info); - return ((Optional) optionalCommandLine).orElse(null); + 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-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java index 9896aa627077..1644bba32d94 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java @@ -18,7 +18,6 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.net.URL; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -95,9 +94,14 @@ void yamlFileInCurrentDir() throws Exception { @Test void getFromCommandlineArgsWithProcessHandle() throws Exception { - when(system.attemptGetCommandLineViaReflection()) + when(system.attemptGetCommandLineArgsViaReflection()) .thenReturn( - "/bin/java sweet-spring.jar --spring.application.name=tiger-town --quiet=never"); + new String[] { + "/bin/java", + "sweet-spring.jar", + "--spring.application.name=tiger-town", + "--quiet=never" + }); SpringBootServiceNameGuesser guesser = new SpringBootServiceNameGuesser(system); Resource result = guesser.createResource(config); expectServiceName(result, "tiger-town"); From 7973ce0e11ded8ef5a0fe588e8238bb920c1b81d Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Mon, 29 Aug 2022 09:42:26 -0700 Subject: [PATCH 04/11] move guesser to own module --- .../spring-boot-autoconfigure/build.gradle.kts | 3 --- .../spring-boot-resources/library/build.gradle.kts | 12 ++++++++++++ .../resources/SpringBootServiceNameGuesser.java | 0 .../resources/SpringBootServiceNameGuesserTest.java | 0 .../src/test/resources/application.properties | 0 .../library}/src/test/resources/application.yml | 0 settings.gradle.kts | 1 + 7 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 instrumentation/spring/spring-boot-resources/library/build.gradle.kts rename instrumentation/spring/{spring-boot-autoconfigure => spring-boot-resources/library}/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java (100%) rename instrumentation/spring/{spring-boot-autoconfigure => spring-boot-resources/library}/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java (100%) rename instrumentation/spring/{spring-boot-autoconfigure => spring-boot-resources/library}/src/test/resources/application.properties (100%) rename instrumentation/spring/{spring-boot-autoconfigure => spring-boot-resources/library}/src/test/resources/application.yml (100%) diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts index 50aeb893c9fb..a867b133eb22 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts +++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts @@ -14,9 +14,6 @@ dependencies { implementation("org.springframework.boot:spring-boot-autoconfigure:$springBootVersion") annotationProcessor("org.springframework.boot:spring-boot-autoconfigure-processor:$springBootVersion") implementation("javax.validation:validation-api:2.0.1.Final") - annotationProcessor("com.google.auto.service:auto-service") - compileOnly("com.google.auto.service:auto-service-annotations") - testCompileOnly("com.google.auto.service:auto-service-annotations") implementation(project(":instrumentation-annotations-support")) implementation(project(":instrumentation:kafka:kafka-clients:kafka-clients-2.6:library")) diff --git a/instrumentation/spring/spring-boot-resources/library/build.gradle.kts b/instrumentation/spring/spring-boot-resources/library/build.gradle.kts new file mode 100644 index 000000000000..d1807e1fbec9 --- /dev/null +++ b/instrumentation/spring/spring-boot-resources/library/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + id("otel.library-instrumentation") +} + +dependencies { + compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") + annotationProcessor("com.google.auto.service:auto-service") + compileOnly("com.google.auto.service:auto-service-annotations") + implementation("org.yaml:snakeyaml:1.31") + testCompileOnly("com.google.auto.service:auto-service-annotations") + testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") +} diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java similarity index 100% rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java rename to instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java similarity index 100% rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java rename to instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.properties b/instrumentation/spring/spring-boot-resources/library/src/test/resources/application.properties similarity index 100% rename from instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.properties rename to instrumentation/spring/spring-boot-resources/library/src/test/resources/application.properties diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yml b/instrumentation/spring/spring-boot-resources/library/src/test/resources/application.yml similarity index 100% rename from instrumentation/spring/spring-boot-autoconfigure/src/test/resources/application.yml rename to instrumentation/spring/spring-boot-resources/library/src/test/resources/application.yml diff --git a/settings.gradle.kts b/settings.gradle.kts index e085ca97ad58..a7093a514501 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -423,6 +423,7 @@ include(":instrumentation:servlet:servlet-5.0:javaagent") include(":instrumentation:spark-2.3:javaagent") include(":instrumentation:spring:spring-batch-3.0:javaagent") include(":instrumentation:spring:spring-boot-actuator-autoconfigure-2.0:javaagent") +include(":instrumentation:spring:spring-boot-resources:library") include(":instrumentation:spring:spring-core-2.0:javaagent") include(":instrumentation:spring:spring-data-1.8:javaagent") include(":instrumentation:spring:spring-integration-4.1:javaagent") From e588243c309e8a83d94b09283d7f08cda5f65aa7 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Mon, 29 Aug 2022 09:48:48 -0700 Subject: [PATCH 05/11] use readAllBytes which exists in java 8 --- .../resources/SpringBootServiceNameGuesserTest.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java index 1644bba32d94..14d132738f9a 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java +++ b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java @@ -18,6 +18,7 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -127,15 +128,7 @@ private static void writeString(Path path, String value) throws Exception { } private static String readString(Path path) throws Exception { - StringBuilder buff = new StringBuilder(); - try (InputStream in = Files.newInputStream(path)) { - BufferedReader reader = new BufferedReader(new InputStreamReader(in, UTF_8)); - char[] block = new char[1024]; - int rc; - while ((rc = reader.read(block)) > 0) { - buff.append(block, 0, rc); - } - return buff.toString(); - } + byte[] allBytes = Files.readAllBytes(path); + return new String(allBytes, UTF_8); } } From 19d863a6ca103e1def14aeda18b44a76f2058d76 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Mon, 29 Aug 2022 09:56:17 -0700 Subject: [PATCH 06/11] spotless --- .../resources/SpringBootServiceNameGuesserTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java index 14d132738f9a..d3214556a157 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java +++ b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java @@ -12,13 +12,9 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.resources.Resource; -import java.io.BufferedReader; import java.io.FileNotFoundException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.io.OutputStream; import java.net.URL; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; From 6e2d5d22deb27966939501f27d88a639ed5f07b0 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Tue, 30 Aug 2022 11:28:18 -0700 Subject: [PATCH 07/11] add note and link to spring docs --- .../autoconfigure/resources/SpringBootServiceNameGuesser.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java index 5e02e8f59495..de278fb6644f 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java +++ b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java @@ -69,6 +69,10 @@ public SpringBootServiceNameGuesser() { public Resource createResource(ConfigProperties config) { logger.log(Level.FINER, "Performing Spring Boot service name auto-detection..."); + // Note: The order should be consistent with the order of Spring matching, but noting + // that we have "first one wins" while Spring has "last one wins". + // The docs for Spring are here: + // https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config Stream> finders = Stream.of( this::findByCommandlineArgument, From b5f6bc31e11d22dbc62cda906a5735a4f3e2dcf0 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Tue, 30 Aug 2022 11:31:36 -0700 Subject: [PATCH 08/11] group for readability --- .../spring/spring-boot-resources/library/build.gradle.kts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/instrumentation/spring/spring-boot-resources/library/build.gradle.kts b/instrumentation/spring/spring-boot-resources/library/build.gradle.kts index d1807e1fbec9..5e3dbc6a77eb 100644 --- a/instrumentation/spring/spring-boot-resources/library/build.gradle.kts +++ b/instrumentation/spring/spring-boot-resources/library/build.gradle.kts @@ -4,9 +4,12 @@ plugins { dependencies { compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") + annotationProcessor("com.google.auto.service:auto-service") compileOnly("com.google.auto.service:auto-service-annotations") - implementation("org.yaml:snakeyaml:1.31") testCompileOnly("com.google.auto.service:auto-service-annotations") + + implementation("org.yaml:snakeyaml:1.31") + testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") } From aca0afc6a377d4c85841759e306df49117ac48c9 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Tue, 30 Aug 2022 11:40:14 -0700 Subject: [PATCH 09/11] repackage --- .../resources/SpringBootServiceNameGuesser.java | 2 +- .../resources/SpringBootServiceNameGuesserTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/{autoconfigure => }/resources/SpringBootServiceNameGuesser.java (99%) rename instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/{autoconfigure => }/resources/SpringBootServiceNameGuesserTest.java (98%) diff --git a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesser.java similarity index 99% rename from instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java rename to instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesser.java index de278fb6644f..faecf64495a3 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesser.java +++ b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesser.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.spring.autoconfigure.resources; +package io.opentelemetry.instrumentation.spring.resources; import com.google.auto.service.AutoService; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; diff --git a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesserTest.java similarity index 98% rename from instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java rename to instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesserTest.java index d3214556a157..61866e41f206 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringBootServiceNameGuesserTest.java +++ b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesserTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.spring.autoconfigure.resources; +package io.opentelemetry.instrumentation.spring.resources; import static io.opentelemetry.semconv.resource.attributes.ResourceAttributes.SERVICE_NAME; import static java.nio.charset.StandardCharsets.UTF_8; From d01ddadc832115495b08ce72e187c33a42afbd95 Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Wed, 7 Sep 2022 09:45:24 +0200 Subject: [PATCH 10/11] Apply suggestions from code review Co-authored-by: Trask Stalnaker --- .../spring/resources/SpringBootServiceNameGuesser.java | 6 +++--- .../spring/resources/SpringBootServiceNameGuesserTest.java | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesser.java b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesser.java index faecf64495a3..149d57e12eb3 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesser.java +++ b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesser.java @@ -51,9 +51,9 @@ public class SpringBootServiceNameGuesser implements ResourceProvider { private static final Logger logger = Logger.getLogger(SpringBootServiceNameGuesser.class.getName()); - public static final String COMMANDLINE_ARG_PREFIX = "--spring.application.name="; + private static final String COMMANDLINE_ARG_PREFIX = "--spring.application.name="; private static final Pattern COMMANDLINE_PATTERN = - Pattern.compile(".*--spring\\.application\\.name=([a-zA-Z.\\-_]+).*"); + Pattern.compile("--spring\\.application\\.name=([a-zA-Z.\\-_]+)"); private final SystemHelper system; public SpringBootServiceNameGuesser() { @@ -88,7 +88,7 @@ public Resource createResource(ConfigProperties config) { .findFirst() .map( serviceName -> { - logger.log(Level.FINER, "Guessed Spring Boot service name: " + serviceName); + logger.log(Level.FINER, "Guessed Spring Boot service name: {0}", serviceName); return Resource.builder().put(ResourceAttributes.SERVICE_NAME, serviceName).build(); }) .orElseGet(Resource::empty); diff --git a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesserTest.java b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesserTest.java index 61866e41f206..3743dfe91d5e 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesserTest.java +++ b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesserTest.java @@ -79,7 +79,6 @@ void yamlFileInCurrentDir() throws Exception { URL url = getClass().getClassLoader().getResource(APPLICATION_YML); String content = readString(Paths.get(url.toURI())); writeString(yamlPath, content); - when(system.openFile(PROPS)).thenThrow(new FileNotFoundException()); when(system.openFile(APPLICATION_YML)).thenCallRealMethod(); SpringBootServiceNameGuesser guesser = new SpringBootServiceNameGuesser(system); Resource result = guesser.createResource(config); From 967a800a43b4e1e71dbc05bc3052bb809350500f Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Wed, 7 Sep 2022 10:11:35 +0200 Subject: [PATCH 11/11] code review comments --- .../SpringBootServiceNameGuesser.java | 20 ++++++++++--------- .../SpringBootServiceNameGuesserTest.java | 1 - 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesser.java b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesser.java index 149d57e12eb3..8947e1bb12a3 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesser.java +++ b/instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesser.java @@ -56,6 +56,7 @@ public class SpringBootServiceNameGuesser implements ResourceProvider { Pattern.compile("--spring\\.application\\.name=([a-zA-Z.\\-_]+)"); private final SystemHelper system; + @SuppressWarnings("unused") public SpringBootServiceNameGuesser() { this(new SystemHelper()); } @@ -97,14 +98,14 @@ public Resource createResource(ConfigProperties config) { @Nullable private String findByEnvironmentVariable() { String result = system.getenv("SPRING_APPLICATION_NAME"); - logger.log(Level.FINER, "Checking for SPRING_APPLICATION_NAME in env: " + result); + logger.log(Level.FINER, "Checking for SPRING_APPLICATION_NAME in env: {0}", result); return result; } @Nullable private String findBySystemProperties() { String result = system.getProperty("spring.application.name"); - logger.log(Level.FINER, "Checking for spring.application.name system property: " + result); + logger.log(Level.FINER, "Checking for spring.application.name system property: {0}", result); return result; } @@ -113,7 +114,8 @@ private String findByClasspathApplicationProperties() { String result = readNameFromAppProperties(); logger.log( Level.FINER, - "Checking for spring.application.name in application.properties file: " + result); + "Checking for spring.application.name in application.properties file: {0}", + result); return result; } @@ -125,7 +127,7 @@ private String findByCurrentDirectoryApplicationProperties() { } catch (Exception e) { // expected to fail sometimes } - logger.log(Level.FINER, "Checking application.properties in current dir: " + result); + logger.log(Level.FINER, "Checking application.properties in current dir: {0}", result); return result; } @@ -133,7 +135,7 @@ private String findByCurrentDirectoryApplicationProperties() { private String findByClasspathApplicationYaml() { String result = loadFromClasspath("application.yml", SpringBootServiceNameGuesser::parseNameFromYaml); - logger.log(Level.FINER, "Checking application.yml in classpath: " + result); + logger.log(Level.FINER, "Checking application.yml in classpath: {0}", result); return result; } @@ -145,7 +147,7 @@ private String findByCurrentDirectoryApplicationYaml() { } catch (Exception e) { // expected to fail sometimes } - logger.log(Level.FINER, "Checking application.yml in current dir: " + result); + logger.log(Level.FINER, "Checking application.yml in current dir: {0}", result); return result; } @@ -177,7 +179,7 @@ private String findByCommandlineArgument() { String javaCommand = system.getProperty("sun.java.command"); result = parseNameFromCommandLine(javaCommand); } - logger.log(Level.FINER, "Checking application commandline args: " + result); + logger.log(Level.FINER, "Checking application commandline args: {0}", result); return result; } @@ -259,8 +261,8 @@ InputStream openFile(String filename) throws Exception { } /** - * Attempts to use ProcessHandle to get the full commandline of the current process. Will only - * succeed on java 9+. + * 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 { diff --git a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesserTest.java b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesserTest.java index 3743dfe91d5e..241af2fb532e 100644 --- a/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesserTest.java +++ b/instrumentation/spring/spring-boot-resources/library/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameGuesserTest.java @@ -12,7 +12,6 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.resources.Resource; -import java.io.FileNotFoundException; import java.io.OutputStream; import java.net.URL; import java.nio.file.Files;