Skip to content

Commit 73f1769

Browse files
committed
init: adding System.getenv forbiddenAPI, ConfigHelper, ParseSupportedConfigurations, and DD_ linting logger
1 parent 640ebc8 commit 73f1769

File tree

32 files changed

+1174
-111
lines changed

32 files changed

+1174
-111
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ spotlessPredeclare {
6666
}
6767
}
6868
apply from: "$rootDir/gradle/spotless.gradle"
69+
apply from: "$rootDir/gradle/logEnvVarUsages.gradle"
6970

7071
def compileTask = tasks.register("compile")
7172

components/environment/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ plugins {
33
id("com.gradleup.shadow")
44
}
55

6+
dependencies {
7+
implementation(project(":components:json"))
8+
implementation("org.slf4j:slf4j-api:1.7.36")
9+
}
10+
611
apply(from = "$rootDir/gradle/java.gradle")
712

813
/*
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package datadog.environment;
2+
3+
import de.thetaphi.forbiddenapis.SuppressForbidden;
4+
import java.util.LinkedHashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
@SuppressForbidden
9+
public class ConfigHelper {
10+
// Parse the supported-configurations JSON once using ParseSupportedConfigurations.
11+
12+
public static Map<String, String> getEnvironmentVariables() {
13+
// TODO: Remove once JSON parsing is separate from data access
14+
ParseSupportedConfigurations.loadSupportedConfigurations("supported-configurations.json");
15+
16+
Map<String, String> env = System.getenv();
17+
Map<String, String> configs = new LinkedHashMap<>();
18+
for (Map.Entry<String, String> entry : env.entrySet()) {
19+
String key = entry.getKey();
20+
String value = entry.getValue();
21+
if (key.startsWith("DD_")
22+
|| key.startsWith("OTEL_")
23+
|| ParseSupportedConfigurations.aliasMapping.containsKey(key)) {
24+
if (ParseSupportedConfigurations.supportedConfigurations.contains(key)) {
25+
configs.put(key, value);
26+
// If this environment variable is the alias of another, and we haven't processed the
27+
// original environment variable yet, handle it here.
28+
} else if (ParseSupportedConfigurations.aliasMapping.containsKey(key)
29+
&& !configs.containsKey(ParseSupportedConfigurations.aliasMapping.get(key))) {
30+
List<String> aliasList =
31+
ParseSupportedConfigurations.aliases.get(
32+
ParseSupportedConfigurations.aliasMapping.get(key));
33+
for (String alias : aliasList) {
34+
if (env.containsKey(alias)) {
35+
configs.put(ParseSupportedConfigurations.aliasMapping.get(key), env.get(alias));
36+
break;
37+
}
38+
}
39+
}
40+
// if (deprecatedConfigurations.containsKey(key)) {
41+
// String warning = "Environment variable " + key + " is deprecated. " +
42+
// (aliasMapping.containsKey(key)
43+
// ? "Please use " + aliasMapping.get(key) + " instead."
44+
// : deprecatedConfigurations.get(key));
45+
// System.err.println(warning); // TODO: REPLACE with log call
46+
// }
47+
} else {
48+
configs.put(key, value);
49+
}
50+
}
51+
return configs;
52+
}
53+
54+
public static String getEnvironmentVariable(String name) {
55+
// TODO: Remove once JSON parsing is separate from data access
56+
ParseSupportedConfigurations.loadSupportedConfigurations("supported-configurations.json");
57+
58+
if ((name.startsWith("DD_")
59+
|| name.startsWith("OTEL_")
60+
|| ParseSupportedConfigurations.aliasMapping.containsKey(name))
61+
&& !ParseSupportedConfigurations.supportedConfigurations.contains(name)) {
62+
throw new IllegalArgumentException(
63+
"Missing " + name + " env/configuration in supported-configurations.json file.");
64+
}
65+
String config = System.getenv(name);
66+
if (config == null && ParseSupportedConfigurations.aliases.containsKey(name)) {
67+
for (String alias : ParseSupportedConfigurations.aliases.get(name)) {
68+
String aliasValue = System.getenv(alias);
69+
if (aliasValue != null) {
70+
return aliasValue;
71+
}
72+
}
73+
}
74+
return config;
75+
}
76+
}

components/environment/src/main/java/datadog/environment/EnvironmentVariables.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ private EnvironmentVariables() {}
3232
*/
3333
public static String getOrDefault(@Nonnull String name, String defaultValue) {
3434
try {
35-
String value = System.getenv(name);
35+
String value = ConfigHelper.getEnvironmentVariable(name);
3636
return value == null ? defaultValue : value;
3737
} catch (SecurityException e) {
3838
return defaultValue;
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package datadog.environment;
2+
3+
import datadog.json.JsonMapper;
4+
import java.io.IOException;
5+
import java.io.InputStream;
6+
import java.util.HashMap;
7+
import java.util.HashSet;
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.Scanner;
11+
import java.util.Set;
12+
import org.slf4j.Logger;
13+
import org.slf4j.LoggerFactory;
14+
15+
// TODO: Make this class run at buildtime and generate a static class with the data
16+
public class ParseSupportedConfigurations {
17+
public static Map<String, Object> fileData;
18+
public static Map<String, String> aliasMapping;
19+
public static Set<String> supportedConfigurations;
20+
public static Map<String, String> deprecatedConfigurations;
21+
public static Map<String, List<String>> aliases;
22+
private static final Logger log = LoggerFactory.getLogger(ParseSupportedConfigurations.class);
23+
24+
public static void loadSupportedConfigurations(String filename) {
25+
String jsonString;
26+
try {
27+
InputStream in =
28+
ParseSupportedConfigurations.class.getClassLoader().getResourceAsStream(filename);
29+
jsonString = new Scanner(in, "UTF-8").useDelimiter("\\A").next();
30+
fileData = JsonMapper.fromJsonToMap(jsonString);
31+
supportedConfigurations =
32+
new HashSet<>(
33+
((Map<String, List<String>>) fileData.get("supportedConfigurations")).keySet());
34+
aliasToConfig();
35+
deprecatedConfigurations = (Map<String, String>) fileData.get("deprecated");
36+
aliases = (Map<String, List<String>>) fileData.get("aliases");
37+
} catch (IOException e) {
38+
throw new RuntimeException("Failed to read " + filename, e);
39+
}
40+
}
41+
42+
private static void aliasToConfig() {
43+
aliasMapping = new HashMap<>();
44+
Map<String, List<String>> aliases = (Map<String, List<String>>) fileData.get("aliases");
45+
for (String env : aliases.keySet()) {
46+
for (String alias : aliases.get(env)) {
47+
if (aliasMapping.containsKey(alias)) {
48+
log.info(
49+
"{} is listed as an alias of {} when it already exists as an alias of {}",
50+
alias,
51+
env,
52+
aliasMapping.get(alias));
53+
} else {
54+
aliasMapping.put(alias, env);
55+
}
56+
}
57+
}
58+
}
59+
}

0 commit comments

Comments
 (0)