Skip to content

Commit d7bcc24

Browse files
committed
Add support for escaping declarative config env var substitution
1 parent 31869a3 commit d7bcc24

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfiguration.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public final class FileConfiguration {
5151

5252
private static final Logger logger = Logger.getLogger(FileConfiguration.class.getName());
5353
private static final Pattern ENV_VARIABLE_REFERENCE =
54-
Pattern.compile("\\$\\{([a-zA-Z_][a-zA-Z0-9_]*)(:-([^\n}]*))?}");
54+
Pattern.compile("\\${1,2}\\{([a-zA-Z_][a-zA-Z0-9_]*)(:-([^\n}]*))?}");
5555
private static final ComponentLoader DEFAULT_COMPONENT_LOADER =
5656
SpiHelper.serviceComponentLoader(FileConfiguration.class.getClassLoader());
5757

@@ -317,13 +317,22 @@ private Object constructValueObject(Node node) {
317317
ScalarStyle scalarStyle = ((ScalarNode) node).getScalarStyle();
318318
do {
319319
MatchResult matchResult = matcher.toMatchResult();
320-
String envVarKey = matcher.group(1);
321-
String defaultValue = matcher.group(3);
322-
if (defaultValue == null) {
323-
defaultValue = "";
320+
newVal.append(val, offset, matchResult.start());
321+
322+
String ref = val.substring(matchResult.start(), matchResult.end());
323+
// $$ indicates that env var reference is escaped. Strip the leading $.
324+
if (ref.startsWith("$$")) {
325+
newVal.append(ref.substring(1));
326+
} else {
327+
String envVarKey = matcher.group(1);
328+
String defaultValue = matcher.group(3);
329+
if (defaultValue == null) {
330+
defaultValue = "";
331+
}
332+
String replacement = environmentVariables.getOrDefault(envVarKey, defaultValue);
333+
newVal.append(replacement);
324334
}
325-
String replacement = environmentVariables.getOrDefault(envVarKey, defaultValue);
326-
newVal.append(val, offset, matchResult.start()).append(replacement);
335+
327336
offset = matchResult.end();
328337
} while (matcher.find());
329338
if (offset != val.length()) {

sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationParseTest.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,13 @@ private static java.util.stream.Stream<Arguments> envVarSubstitutionArgs() {
656656
Arguments.of("key1: \"${EMPTY_STR}\"\n", mapOf(entry("key1", ""))),
657657
Arguments.of("key1: \"${BOOL}\"\n", mapOf(entry("key1", "true"))),
658658
Arguments.of("key1: \"${INT}\"\n", mapOf(entry("key1", "1"))),
659-
Arguments.of("key1: \"${FLOAT}\"\n", mapOf(entry("key1", "1.1"))));
659+
Arguments.of("key1: \"${FLOAT}\"\n", mapOf(entry("key1", "1.1"))),
660+
// Escaped
661+
Arguments.of("key1: $${STR_1}\n", mapOf(entry("key1", "${STR_1}"))),
662+
Arguments.of("key1: \"$${STR_1}\"\n", mapOf(entry("key1", "${STR_1}"))),
663+
Arguments.of("key1: $${STR_1} ${STR_2}\n", mapOf(entry("key1", "${STR_1} value2"))),
664+
Arguments.of("key1: $${STR_1} $${STR_2}\n", mapOf(entry("key1", "${STR_1} ${STR_2}"))),
665+
Arguments.of("key1: $${NOT_SET:-value1}\n", mapOf(entry("key1", "${NOT_SET:-value1}"))));
660666
}
661667

662668
private static <K, V> Map.Entry<K, V> entry(K key, @Nullable V value) {

0 commit comments

Comments
 (0)