From 4089782f6516cf0ebb71446ccd22cfc5b1abf347 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Wed, 9 Feb 2022 16:40:26 -0800 Subject: [PATCH 1/6] Relative to agent jar --- .../configuration/ConfigurationBuilder.java | 6 +- .../configuration/FileStringLookup.java | 12 ++-- .../ConfigurationBuilderTest.java | 15 ++-- .../configuration/ConfigurationTest.java | 70 +++++++++---------- .../configuration/FileStringLookupTest.java | 4 +- 5 files changed, 56 insertions(+), 51 deletions(-) diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java index 5f79095b070..560077ff470 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java @@ -159,7 +159,7 @@ public static Configuration create(Path agentJarPath, RpConfiguration rpConfigur + " so no need to enable it under preview configuration"); } - overlayFromEnv(config); + overlayFromEnv(config, agentJarPath); config.sampling.percentage = roundToNearest(config.sampling.percentage, true); for (SamplingOverride override : config.preview.sampling.overrides) { override.percentage = roundToNearest(override.percentage, true); @@ -355,11 +355,11 @@ public static void logConfigurationWarnMessages() { } // visible for testing - static void overlayFromEnv(Configuration config) throws IOException { + static void overlayFromEnv(Configuration config, Path agentJarPath) throws IOException { // load connection string from a file if connection string is in the format of // "${file:mounted_connection_string_file.txt}" Map stringLookupMap = - Collections.singletonMap(StringLookupFactory.KEY_FILE, FileStringLookup.INSTANCE); + Collections.singletonMap(StringLookupFactory.KEY_FILE, new FileStringLookup(agentJarPath)); StringLookup stringLookup = StringLookupFactory.INSTANCE.interpolatorStringLookup(stringLookupMap, null, false); StringSubstitutor stringSubstitutor = new StringSubstitutor(stringLookup); diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookup.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookup.java index 20609276486..4b8a1032cf1 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookup.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookup.java @@ -25,19 +25,23 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.InvalidPathException; -import java.nio.file.Paths; +import java.nio.file.Path; import javax.annotation.Nullable; import org.apache.commons.text.lookup.StringLookup; final class FileStringLookup implements StringLookup { - static final FileStringLookup INSTANCE = new FileStringLookup(); + private final Path agentJarPath; + + FileStringLookup(Path agentJarPath) { + this.agentJarPath = agentJarPath; + } @Override @Nullable public String lookup(String key) { try { - return new String(Files.readAllBytes(Paths.get(key)), StandardCharsets.UTF_8); + return new String(Files.readAllBytes(agentJarPath.resolve(key)), StandardCharsets.UTF_8); } catch (IOException | InvalidPathException e) { throw new IllegalArgumentException( "Error occurs when reading connection string from the file '" @@ -46,6 +50,4 @@ public String lookup(String key) { e); } } - - private FileStringLookup() {} } diff --git a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilderTest.java b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilderTest.java index 84994cea83b..98587722e4b 100644 --- a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilderTest.java +++ b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilderTest.java @@ -32,6 +32,7 @@ import java.io.Writer; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -168,7 +169,7 @@ void testRpConfigurationOverlayWithEnvVarAndSysPropPopulated() throws Exception void testOverlayWithEnvVarWithGoodFileStringLookupFormat() throws Exception { Configuration configuration = new Configuration(); configuration.connectionString = "${file:" + connectionStringFile.getAbsolutePath() + "}"; - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.connectionString).isEqualTo(CONNECTION_STRING); } @@ -176,23 +177,23 @@ void testOverlayWithEnvVarWithGoodFileStringLookupFormat() throws Exception { void testOverlayWithEnvVarWithBadFileStringLookupFormat() throws Exception { Configuration configuration = new Configuration(); configuration.connectionString = "${file:" + connectionStringFile.getAbsolutePath(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.connectionString).isEqualTo(configuration.connectionString); configuration.connectionString = "${xyz:" + connectionStringFile.getAbsolutePath() + "}"; - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.connectionString).isEqualTo(configuration.connectionString); configuration.connectionString = "file:" + connectionStringFile.getAbsolutePath() + "}"; - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.connectionString).isEqualTo(configuration.connectionString); configuration.connectionString = "file:" + connectionStringFile.getAbsolutePath(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.connectionString).isEqualTo(configuration.connectionString); configuration.connectionString = CONNECTION_STRING; - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.connectionString).isEqualTo(configuration.connectionString); } @@ -206,7 +207,7 @@ void testConnectionStringEnvVarHasHigherPrecedenceOverFileLookup() throws Except configuration.connectionString = "${file:" + connectionStringFile.getAbsolutePath() + "}"; - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.connectionString).isEqualTo(testConnectionString); }); diff --git a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationTest.java b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationTest.java index 298f2d6fa0e..fc39605b7af 100644 --- a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationTest.java +++ b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationTest.java @@ -274,7 +274,7 @@ void shouldOverrideConnectionStringWithEnvVar() throws IOException { "InstrumentationKey=11111111-1111-1111-1111-111111111111"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.connectionString) .isEqualTo("InstrumentationKey=11111111-1111-1111-1111-111111111111"); @@ -287,7 +287,7 @@ void shouldOverrideConnectionStringWithSysProp() throws IOException { "InstrumentationKey=11111111-1111-1111-1111-111111111111"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.connectionString) .isEqualTo("InstrumentationKey=11111111-1111-1111-1111-111111111111"); @@ -303,7 +303,7 @@ void shouldOverrideConnectionStringWithBothEnvVarAndSysProp() throws IOException "InstrumentationKey=22222222-2222-2222-2222-222222222222"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.connectionString) .isEqualTo("InstrumentationKey=22222222-2222-2222-2222-222222222222"); @@ -316,7 +316,7 @@ void shouldOverrideRoleNameWithEnvVar() throws IOException { envVars.set("WEBSITE_SITE_NAME", "Role Name From Website Env"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.role.name).isEqualTo("role name from env"); } @@ -328,7 +328,7 @@ void shouldOverrideRoleNameWithSysProp() throws IOException { envVars.set("WEBSITE_SITE_NAME", "Role Name From Website Env"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.role.name).isEqualTo("role name from sys"); } @@ -341,7 +341,7 @@ void shouldOverrideRoleNameWithBothEnvVarAndSysProp() throws IOException { envVars.set("WEBSITE_SITE_NAME", "Role Name From Website Env"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.role.name).isEqualTo("role name from sys"); } @@ -351,7 +351,7 @@ void shouldOverrideRoleNameWithWebsiteEnvVar() throws IOException { envVars.set("WEBSITE_SITE_NAME", "Role Name From Website Env"); Configuration configuration = loadConfiguration("applicationinsights_NoRole.json"); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.role.name).isEqualTo("Role Name From Website Env"); } @@ -361,7 +361,7 @@ void shouldNotOverrideRoleNameWithWebsiteEnvVar() throws IOException { envVars.set("WEBSITE_SITE_NAME", "Role Name From Website Env"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.role.name).isEqualTo("Something Good"); } @@ -372,7 +372,7 @@ void shouldOverrideRoleNameWithLowercaseWebsiteEnvVarOnAzFn() throws IOException envVars.set("WEBSITE_SITE_NAME", "Role Name From Website Env"); Configuration configuration = loadConfiguration("applicationinsights_NoRole.json"); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.role.name).isEqualTo("role name from website env"); } @@ -384,7 +384,7 @@ void shouldOverrideRoleInstanceWithEnvVar() throws IOException { envVars.set("WEBSITE_INSTANCE_ID", "role instance from website env"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.role.instance).isEqualTo("role instance from env"); } @@ -396,7 +396,7 @@ void shouldOverrideRoleInstanceWithSysProp() throws IOException { envVars.set("WEBSITE_INSTANCE_ID", "role instance from website env"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.role.instance).isEqualTo("role instance from sys"); } @@ -409,7 +409,7 @@ void shouldOverrideRoleInstanceWithBothEnvVarAndSysProp() throws IOException { envVars.set("WEBSITE_INSTANCE_ID", "role instance from website env"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.role.instance).isEqualTo("role instance from sys"); } @@ -419,7 +419,7 @@ void shouldOverrideRoleInstanceWithWebsiteEnvVar() throws IOException { envVars.set("WEBSITE_INSTANCE_ID", "role instance from website env"); Configuration configuration = loadConfiguration("applicationinsights_NoRole.json"); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.role.instance).isEqualTo("role instance from website env"); } @@ -429,7 +429,7 @@ void shouldNotOverrideRoleInstanceWithWebsiteEnvVar() throws IOException { envVars.set("WEBSITE_INSTANCE_ID", "role instance from website env"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.role.instance).isEqualTo("xyz123"); } @@ -439,7 +439,7 @@ void shouldOverrideSamplingPercentage() throws IOException { envVars.set("APPLICATIONINSIGHTS_SAMPLING_PERCENTAGE", "0.25"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.sampling.percentage).isEqualTo(0.25f); } @@ -449,7 +449,7 @@ void shouldOverrideLogCaptureThreshold() throws IOException { envVars.set("APPLICATIONINSIGHTS_INSTRUMENTATION_LOGGING_LEVEL", "TRACE"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.instrumentation.logging.level).isEqualTo("TRACE"); } @@ -462,7 +462,7 @@ void shouldOverrideJmxMetrics() throws IOException { envVars.set("APPLICATIONINSIGHTS_JMX_METRICS", jmxMetricsJson); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); List jmxMetrics = parseJmxMetricsJson(jmxMetricsJson); assertThat(jmxMetrics.size()).isEqualTo(2); @@ -479,7 +479,7 @@ void shouldOverrideSelfDiagnosticsLevel() throws IOException { envVars.set("APPLICATIONINSIGHTS_SELF_DIAGNOSTICS_LEVEL", "DEBUG"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.selfDiagnostics.level).isEqualTo("DEBUG"); } @@ -489,7 +489,7 @@ void shouldOverrideSelfDiagnosticsFilePath() throws IOException { envVars.set("APPLICATIONINSIGHTS_SELF_DIAGNOSTICS_FILE_PATH", "/tmp/ai.log"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.selfDiagnostics.file.path).isEqualTo("/tmp/ai.log"); } @@ -499,7 +499,7 @@ void shouldOverridePreviewSpringIntegrationInstrumentation() throws IOException envVars.set("APPLICATIONINSIGHTS_PREVIEW_INSTRUMENTATION_SPRING_INTEGRATION_ENABLED", "true"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.preview.instrumentation.springIntegration.enabled).isTrue(); } @@ -509,7 +509,7 @@ void shouldOverridePreviewLiveMetricsEnabled() throws IOException { envVars.set("APPLICATIONINSIGHTS_PREVIEW_LIVE_METRICS_ENABLED", "false"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.preview.liveMetrics.enabled).isFalse(); } @@ -519,7 +519,7 @@ void shouldOverrideInstrumentationAzureSdkEnabled() throws IOException { envVars.set("APPLICATIONINSIGHTS_INSTRUMENTATION_AZURE_SDK_ENABLED", "false"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.instrumentation.azureSdk.enabled).isFalse(); } @@ -529,7 +529,7 @@ void shouldOverrideInstrumentationCassandraEnabled() throws IOException { envVars.set("APPLICATIONINSIGHTS_INSTRUMENTATION_CASSANDRA_ENABLED", "false"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.instrumentation.cassandra.enabled).isFalse(); } @@ -539,7 +539,7 @@ void shouldOverrideInstrumentationJdbcEnabled() throws IOException { envVars.set("APPLICATIONINSIGHTS_INSTRUMENTATION_JDBC_ENABLED", "false"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.instrumentation.jdbc.enabled).isFalse(); } @@ -549,7 +549,7 @@ void shouldOverrideInstrumentationJmsEnabled() throws IOException { envVars.set("APPLICATIONINSIGHTS_INSTRUMENTATION_JMS_ENABLED", "false"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.instrumentation.jms.enabled).isFalse(); } @@ -559,7 +559,7 @@ void shouldOverrideInstrumentationKafkaEnabled() throws IOException { envVars.set("APPLICATIONINSIGHTS_INSTRUMENTATION_KAFKA_ENABLED", "false"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.instrumentation.kafka.enabled).isFalse(); } @@ -569,7 +569,7 @@ void shouldOverrideInstrumentationMicrometerEnabled() throws IOException { envVars.set("APPLICATIONINSIGHTS_INSTRUMENTATION_MICROMETER_ENABLED", "false"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.instrumentation.micrometer.enabled).isFalse(); } @@ -579,7 +579,7 @@ void shouldOverrideInstrumentationMongoEnabled() throws IOException { envVars.set("APPLICATIONINSIGHTS_INSTRUMENTATION_MONGO_ENABLED", "false"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.instrumentation.mongo.enabled).isFalse(); } @@ -589,7 +589,7 @@ void shouldOverrideInstrumentationRabbitmqEnabled() throws IOException { envVars.set("APPLICATIONINSIGHTS_INSTRUMENTATION_RABBITMQ_ENABLED", "true"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.instrumentation.rabbitmq.enabled).isTrue(); } @@ -599,7 +599,7 @@ void shouldOverrideInstrumentationRedisEnabled() throws IOException { envVars.set("APPLICATIONINSIGHTS_INSTRUMENTATION_REDIS_ENABLED", "false"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.instrumentation.redis.enabled).isFalse(); } @@ -609,7 +609,7 @@ void shouldOverrideInstrumentationSpringSchedulingEnabled() throws IOException { envVars.set("APPLICATIONINSIGHTS_INSTRUMENTATION_SPRING_SCHEDULING_ENABLED", "false"); Configuration configuration = loadConfiguration(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.instrumentation.springScheduling.enabled).isFalse(); } @@ -619,7 +619,7 @@ void shouldOverrideAadAuthenticationConfig() throws IOException { envVars.set("APPLICATIONINSIGHTS_AUTHENTICATION_STRING", "Authorization=AAD;ClientId=12345678"); Configuration configuration = loadConfiguration("applicationinsights_aadauthenv.json"); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.preview.authentication.enabled).isTrue(); assertThat(configuration.preview.authentication.type) @@ -630,7 +630,7 @@ void shouldOverrideAadAuthenticationConfig() throws IOException { envVars.set("APPLICATIONINSIGHTS_AUTHENTICATION_STRING", "Authorization=AAD;ClientId="); Configuration configuration2 = loadConfiguration("applicationinsights_aadauthenv.json"); - ConfigurationBuilder.overlayFromEnv(configuration2); + ConfigurationBuilder.overlayFromEnv(configuration2, Paths.get(".")); assertThat(configuration2.preview.authentication.enabled).isTrue(); assertThat(configuration2.preview.authentication.type) @@ -647,7 +647,7 @@ void shouldOverrideStatsbeatDisabledConfig() throws IOException { loadConfiguration("applicationinsights_statsbeatdisabledenv.json"); assertThat(configuration.preview.statsbeat.disabled).isFalse(); - ConfigurationBuilder.overlayFromEnv(configuration); + ConfigurationBuilder.overlayFromEnv(configuration, Paths.get(".")); assertThat(configuration.preview.statsbeat.disabled).isTrue(); envVars.set("APPLICATIONINSIGHTS_STATSBEAT_DISABLED", "false"); @@ -655,7 +655,7 @@ void shouldOverrideStatsbeatDisabledConfig() throws IOException { loadConfiguration("applicationinsights_statsbeatdisabledenv.json"); assertThat(configuration2.preview.statsbeat.disabled).isFalse(); - ConfigurationBuilder.overlayFromEnv(configuration2); + ConfigurationBuilder.overlayFromEnv(configuration2, Paths.get(".")); assertThat(configuration2.preview.statsbeat.disabled).isFalse(); } diff --git a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookupTest.java b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookupTest.java index e735547785c..4c78cf8bbc7 100644 --- a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookupTest.java +++ b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookupTest.java @@ -29,6 +29,7 @@ import java.io.IOException; import java.io.Writer; import java.nio.file.Files; +import java.nio.file.Paths; import java.util.Collections; import java.util.Map; import org.apache.commons.text.StringSubstitutor; @@ -57,7 +58,8 @@ public void setup() throws IOException { assertThat(file.exists()).isTrue(); Map stringLookupMap = - Collections.singletonMap(StringLookupFactory.KEY_FILE, FileStringLookup.INSTANCE); + Collections.singletonMap( + StringLookupFactory.KEY_FILE, new FileStringLookup(Paths.get("."))); StringLookup stringLookup = StringLookupFactory.INSTANCE.interpolatorStringLookup(stringLookupMap, null, false); stringSubstitutor = new StringSubstitutor(stringLookup); From e5af160afd9aaf46a4f77c46da51d5cba714cddc Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Wed, 9 Feb 2022 16:59:33 -0800 Subject: [PATCH 2/6] fix --- .../agent/internal/configuration/FileStringLookup.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookup.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookup.java index 4b8a1032cf1..1b25aaa5474 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookup.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookup.java @@ -26,7 +26,6 @@ import java.nio.file.Files; import java.nio.file.InvalidPathException; import java.nio.file.Path; -import javax.annotation.Nullable; import org.apache.commons.text.lookup.StringLookup; final class FileStringLookup implements StringLookup { @@ -38,10 +37,10 @@ final class FileStringLookup implements StringLookup { } @Override - @Nullable public String lookup(String key) { try { - return new String(Files.readAllBytes(agentJarPath.resolve(key)), StandardCharsets.UTF_8); + return new String( + Files.readAllBytes(agentJarPath.resolveSibling(key)), StandardCharsets.UTF_8); } catch (IOException | InvalidPathException e) { throw new IllegalArgumentException( "Error occurs when reading connection string from the file '" From bf5f1bcc713a7c6493c93b94323c1e2a7566f15d Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Wed, 9 Feb 2022 17:01:14 -0800 Subject: [PATCH 3/6] Add test --- .../internal/configuration/FileStringLookupTest.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookupTest.java b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookupTest.java index 4c78cf8bbc7..bcd24fa5bf2 100644 --- a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookupTest.java +++ b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookupTest.java @@ -29,7 +29,6 @@ import java.io.IOException; import java.io.Writer; import java.nio.file.Files; -import java.nio.file.Paths; import java.util.Collections; import java.util.Map; import org.apache.commons.text.StringSubstitutor; @@ -59,7 +58,7 @@ public void setup() throws IOException { assertThat(file.exists()).isTrue(); Map stringLookupMap = Collections.singletonMap( - StringLookupFactory.KEY_FILE, new FileStringLookup(Paths.get("."))); + StringLookupFactory.KEY_FILE, new FileStringLookup(tempFolder.toPath())); StringLookup stringLookup = StringLookupFactory.INSTANCE.interpolatorStringLookup(stringLookupMap, null, false); stringSubstitutor = new StringSubstitutor(stringLookup); @@ -71,12 +70,19 @@ public void cleanup() throws IOException { } @Test - public void testGoodFileLookupFormat() { + public void testGoodAbsoluteFileLookupFormat() { String connectionString = "${file:" + file.getAbsolutePath() + "}"; String value = stringSubstitutor.replace(connectionString); assertThat(value).isEqualTo(CONNECTION_STRING); } + @Test + public void testGoodRelativeFileLookupFormat() { + String connectionString = "${file:" + file.getName() + "}"; + String value = stringSubstitutor.replace(connectionString); + assertThat(value).isEqualTo(CONNECTION_STRING); + } + @Test public void testOtherKeyFileLookupWillFail() { String connectionString = "${xyz:" + file.getAbsolutePath() + "}"; From 5af6d5ece3aa906ef228c13c12bc2ff280f34886 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Wed, 9 Feb 2022 17:05:25 -0800 Subject: [PATCH 4/6] Better --- .../internal/configuration/ConfigurationBuilder.java | 3 ++- .../agent/internal/configuration/FileStringLookup.java | 9 ++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java index 560077ff470..c5bdae76b26 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java @@ -359,7 +359,8 @@ static void overlayFromEnv(Configuration config, Path agentJarPath) throws IOExc // load connection string from a file if connection string is in the format of // "${file:mounted_connection_string_file.txt}" Map stringLookupMap = - Collections.singletonMap(StringLookupFactory.KEY_FILE, new FileStringLookup(agentJarPath)); + Collections.singletonMap( + StringLookupFactory.KEY_FILE, new FileStringLookup(agentJarPath.getParent())); StringLookup stringLookup = StringLookupFactory.INSTANCE.interpolatorStringLookup(stringLookupMap, null, false); StringSubstitutor stringSubstitutor = new StringSubstitutor(stringLookup); diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookup.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookup.java index 1b25aaa5474..a38f05be7f1 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookup.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookup.java @@ -30,17 +30,16 @@ final class FileStringLookup implements StringLookup { - private final Path agentJarPath; + private final Path baseDir; - FileStringLookup(Path agentJarPath) { - this.agentJarPath = agentJarPath; + FileStringLookup(Path baseDir) { + this.baseDir = baseDir; } @Override public String lookup(String key) { try { - return new String( - Files.readAllBytes(agentJarPath.resolveSibling(key)), StandardCharsets.UTF_8); + return new String(Files.readAllBytes(baseDir.resolve(key)), StandardCharsets.UTF_8); } catch (IOException | InvalidPathException e) { throw new IllegalArgumentException( "Error occurs when reading connection string from the file '" From be929a981c608e1ea3a5093a75a1f73c8cea9a3b Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Wed, 9 Feb 2022 17:27:53 -0800 Subject: [PATCH 5/6] Fix tests --- .../agent/internal/configuration/ConfigurationBuilder.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java index c5bdae76b26..9f473049788 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java @@ -159,7 +159,7 @@ public static Configuration create(Path agentJarPath, RpConfiguration rpConfigur + " so no need to enable it under preview configuration"); } - overlayFromEnv(config, agentJarPath); + overlayFromEnv(config, agentJarPath.getParent()); config.sampling.percentage = roundToNearest(config.sampling.percentage, true); for (SamplingOverride override : config.preview.sampling.overrides) { override.percentage = roundToNearest(override.percentage, true); @@ -355,12 +355,11 @@ public static void logConfigurationWarnMessages() { } // visible for testing - static void overlayFromEnv(Configuration config, Path agentJarPath) throws IOException { + static void overlayFromEnv(Configuration config, Path baseDir) throws IOException { // load connection string from a file if connection string is in the format of // "${file:mounted_connection_string_file.txt}" Map stringLookupMap = - Collections.singletonMap( - StringLookupFactory.KEY_FILE, new FileStringLookup(agentJarPath.getParent())); + Collections.singletonMap(StringLookupFactory.KEY_FILE, new FileStringLookup(baseDir)); StringLookup stringLookup = StringLookupFactory.INSTANCE.interpolatorStringLookup(stringLookupMap, null, false); StringSubstitutor stringSubstitutor = new StringSubstitutor(stringLookup); From 634ccc6ea6eb53579e07fe9a6d946fb62204f460 Mon Sep 17 00:00:00 2001 From: Helen Yang Date: Wed, 9 Feb 2022 18:07:26 -0800 Subject: [PATCH 6/6] Add a test --- .../agent/internal/configuration/FileStringLookupTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookupTest.java b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookupTest.java index bcd24fa5bf2..224d5102145 100644 --- a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookupTest.java +++ b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/configuration/FileStringLookupTest.java @@ -126,4 +126,11 @@ public void testThrowIllegalArgumentException() { assertThatThrownBy(() -> stringSubstitutor.replace(connectionString)) .isInstanceOf(IllegalArgumentException.class); } + + @Test + public void testRelativePath() { + String connectionString = "${file:./" + file.getName() + "}"; + String value = stringSubstitutor.replace(connectionString); + assertThat(value).isEqualTo(CONNECTION_STRING); + } }