Skip to content

Commit 1ba60ee

Browse files
authored
Migrate metadata/supported-configurations.json from V1 to V2 Format. (#10078)
* migrating to v2 format * adding tests * updating versions
1 parent f2a8d05 commit 1ba60ee

File tree

6 files changed

+11319
-2145
lines changed

6 files changed

+11319
-2145
lines changed

buildSrc/src/main/kotlin/datadog/gradle/plugin/config/ParseV2SupportedConfigurationsTask.kt

Lines changed: 59 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package datadog.gradle.plugin.config
22

33
import org.gradle.api.DefaultTask
4-
import org.gradle.kotlin.dsl.property
54
import org.gradle.api.model.ObjectFactory
65
import org.gradle.api.tasks.Input
76
import org.gradle.api.tasks.InputFile
@@ -12,6 +11,7 @@ import com.fasterxml.jackson.databind.ObjectMapper
1211
import org.gradle.api.tasks.CacheableTask
1312
import org.gradle.api.tasks.PathSensitive
1413
import org.gradle.api.tasks.PathSensitivity
14+
import org.gradle.kotlin.dsl.property
1515
import java.io.File
1616
import java.io.FileInputStream
1717
import java.io.PrintWriter
@@ -131,11 +131,29 @@ abstract class ParseV2SupportedConfigurationsTask @Inject constructor(
131131
out.println(" public static final Map<String, String> REVERSE_PROPERTY_KEYS_MAP;")
132132
out.println()
133133
out.println(" static {")
134+
out.println(" SUPPORTED = initSupported();")
135+
out.println(" ALIASES = initAliases();")
136+
out.println(" ALIAS_MAPPING = initAliasMapping();")
137+
out.println(" DEPRECATED = initDeprecated();")
138+
out.println(" REVERSE_PROPERTY_KEYS_MAP = initReversePropertyKeysMap();")
139+
out.println(" }")
134140
out.println()
135141

136-
// SUPPORTED
142+
// initSupported() - split into two helper functions to avoid "code too large" error
143+
out.println(" private static Map<String, List<SupportedConfiguration>> initSupported() {")
137144
out.println(" Map<String, List<SupportedConfiguration>> supportedMap = new HashMap<>();")
138-
for ((key, configList) in supported.toSortedMap()) {
145+
out.println(" initSupported1(supportedMap);")
146+
out.println(" initSupported2(supportedMap);")
147+
out.println(" return Collections.unmodifiableMap(supportedMap);")
148+
out.println(" }")
149+
out.println()
150+
151+
val sortedSupported = supported.toSortedMap().entries.toList()
152+
val midpoint = sortedSupported.size / 2
153+
154+
// initSupported1() - first half
155+
out.println(" private static void initSupported1(Map<String, List<SupportedConfiguration>> supportedMap) {")
156+
for ((key, configList) in sortedSupported.take(midpoint)) {
139157
out.print(" supportedMap.put(\"${esc(key)}\", Collections.unmodifiableList(Arrays.asList(")
140158
val configIter = configList.iterator()
141159
while (configIter.hasNext()) {
@@ -151,11 +169,33 @@ abstract class ParseV2SupportedConfigurationsTask @Inject constructor(
151169
}
152170
out.println(")));")
153171
}
154-
out.println(" SUPPORTED = Collections.unmodifiableMap(supportedMap);")
172+
out.println(" }")
155173
out.println()
156174

157-
// ALIASES
158-
out.println(" // Note: This top-level alias mapping will be deprecated once Config Registry is mature enough to understand which version of a config a customer is using")
175+
// initSupported2() - second half
176+
out.println(" private static void initSupported2(Map<String, List<SupportedConfiguration>> supportedMap) {")
177+
for ((key, configList) in sortedSupported.drop(midpoint)) {
178+
out.print(" supportedMap.put(\"${esc(key)}\", Collections.unmodifiableList(Arrays.asList(")
179+
val configIter = configList.iterator()
180+
while (configIter.hasNext()) {
181+
val config = configIter.next()
182+
out.print("new SupportedConfiguration(")
183+
out.print("${escNullableString(config.version)}, ")
184+
out.print("${escNullableString(config.type)}, ")
185+
out.print("${escNullableString(config.default)}, ")
186+
out.print("Arrays.asList(${quoteList(config.aliases)}), ")
187+
out.print("Arrays.asList(${quoteList(config.propertyKeys)})")
188+
out.print(")")
189+
if (configIter.hasNext()) out.print(", ")
190+
}
191+
out.println(")));")
192+
}
193+
out.println(" }")
194+
out.println()
195+
196+
// initAliases()
197+
out.println(" // Note: This top-level alias mapping will be deprecated once Config Registry is mature enough to understand which version of a config a customer is using")
198+
out.println(" private static Map<String, List<String>> initAliases() {")
159199
out.println(" Map<String, List<String>> aliasesMap = new HashMap<>();")
160200
for ((canonical, list) in aliases.toSortedMap()) {
161201
out.printf(
@@ -164,33 +204,37 @@ abstract class ParseV2SupportedConfigurationsTask @Inject constructor(
164204
quoteList(list)
165205
)
166206
}
167-
out.println(" ALIASES = Collections.unmodifiableMap(aliasesMap);")
207+
out.println(" return Collections.unmodifiableMap(aliasesMap);")
208+
out.println(" }")
168209
out.println()
169210

170-
// ALIAS_MAPPING
211+
// initAliasMapping()
212+
out.println(" private static Map<String, String> initAliasMapping() {")
171213
out.println(" Map<String, String> aliasMappingMap = new HashMap<>();")
172214
for ((alias, target) in aliasMapping.toSortedMap()) {
173215
out.printf(" aliasMappingMap.put(\"%s\", \"%s\");\n", esc(alias), esc(target))
174216
}
175-
out.println(" ALIAS_MAPPING = Collections.unmodifiableMap(aliasMappingMap);")
217+
out.println(" return Collections.unmodifiableMap(aliasMappingMap);")
218+
out.println(" }")
176219
out.println()
177220

178-
// DEPRECATED
221+
// initDeprecated()
222+
out.println(" private static Map<String, String> initDeprecated() {")
179223
out.println(" Map<String, String> deprecatedMap = new HashMap<>();")
180224
for ((oldKey, note) in deprecated.toSortedMap()) {
181225
out.printf(" deprecatedMap.put(\"%s\", \"%s\");\n", esc(oldKey), esc(note))
182226
}
183-
out.println(" DEPRECATED = Collections.unmodifiableMap(deprecatedMap);")
227+
out.println(" return Collections.unmodifiableMap(deprecatedMap);")
228+
out.println(" }")
184229
out.println()
185230

186-
// REVERSE_PROPERTY_KEYS_MAP
231+
// initReversePropertyKeysMap()
232+
out.println(" private static Map<String, String> initReversePropertyKeysMap() {")
187233
out.println(" Map<String, String> reversePropertyKeysMapping = new HashMap<>();")
188234
for ((propertyKey, config) in reversePropertyKeysMap.toSortedMap()) {
189235
out.printf(" reversePropertyKeysMapping.put(\"%s\", \"%s\");\n", esc(propertyKey), esc(config))
190236
}
191-
out.println(" REVERSE_PROPERTY_KEYS_MAP = Collections.unmodifiableMap(reversePropertyKeysMapping);")
192-
out.println()
193-
237+
out.println(" return Collections.unmodifiableMap(reversePropertyKeysMapping);")
194238
out.println(" }")
195239
out.println("}")
196240
}

buildSrc/src/main/kotlin/datadog/gradle/plugin/config/SupportedConfigPlugin.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class SupportedConfigPlugin : Plugin<Project> {
1313

1414
private fun generateSupportedConfigurations(targetProject: Project, extension: SupportedTracerConfigurations) {
1515
val generateTask =
16-
targetProject.tasks.register("generateSupportedConfigurations", ParseSupportedConfigurationsTask::class.java) {
16+
targetProject.tasks.register("generateSupportedConfigurations", ParseV2SupportedConfigurationsTask::class.java) {
1717
jsonFile.set(extension.jsonFile)
1818
destinationDirectory.set(extension.destinationDirectory)
1919
className.set(extension.className)
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
package datadog.gradle.plugin.config
2+
3+
import org.gradle.testkit.runner.BuildResult
4+
import org.gradle.testkit.runner.GradleRunner
5+
import org.gradle.testkit.runner.TaskOutcome
6+
import org.junit.jupiter.api.Assertions.assertEquals
7+
import org.junit.jupiter.api.Assertions.assertTrue
8+
import org.junit.jupiter.api.Test
9+
import org.junit.jupiter.api.io.TempDir
10+
import java.io.File
11+
import java.nio.file.Paths
12+
13+
class ParseV2SupportedConfigurationsTest {
14+
@Test
15+
fun `should generate Java file from JSON configuration`(@TempDir projectDir: File) {
16+
val (buildResult, generatedFile) = runGradleTask(projectDir)
17+
18+
assertEquals(TaskOutcome.SUCCESS, buildResult.task(":generateSupportedConfigurations")?.outcome)
19+
20+
assertTrue(generatedFile.exists(), "Generated Java file should exist")
21+
22+
val content = generatedFile.readText()
23+
assertTrue(content.contains("package datadog.test;"))
24+
assertTrue(content.contains("public final class TestGeneratedSupportedConfigurations {"))
25+
26+
assertTrue(content.contains("public static final Map<String, List<SupportedConfiguration>> SUPPORTED;"))
27+
assertTrue(content.contains("public static final Map<String, List<String>> ALIASES;"))
28+
assertTrue(content.contains("public static final Map<String, String> ALIAS_MAPPING;"))
29+
assertTrue(content.contains("public static final Map<String, String> DEPRECATED;"))
30+
assertTrue(content.contains("public static final Map<String, String> REVERSE_PROPERTY_KEYS_MAP;"))
31+
32+
assertTrue(content.contains("private static Map<String, List<SupportedConfiguration>> initSupported()"))
33+
assertTrue(content.contains("private static void initSupported1(Map<String, List<SupportedConfiguration>> supportedMap)"))
34+
assertTrue(content.contains("private static void initSupported2(Map<String, List<SupportedConfiguration>> supportedMap)"))
35+
assertTrue(content.contains("private static Map<String, List<String>> initAliases()"))
36+
assertTrue(content.contains("private static Map<String, String> initAliasMapping()"))
37+
assertTrue(content.contains("private static Map<String, String> initDeprecated()"))
38+
assertTrue(content.contains("private static Map<String, String> initReversePropertyKeysMap()"))
39+
40+
assertContainsSupportedConfig(
41+
content,
42+
key = "DD_ACTION_EXECUTION_ID",
43+
version = "A",
44+
type = "string",
45+
default = "null",
46+
aliases = emptyList(),
47+
propertyKeys = listOf("property.key")
48+
)
49+
50+
assertContainsSupportedConfig(
51+
content,
52+
key = "DD_AGENTLESS_LOG_SUBMISSION_ENABLED",
53+
version = "A",
54+
type = "boolean",
55+
default = "false",
56+
aliases = emptyList()
57+
)
58+
59+
assertContainsSupportedConfig(
60+
content,
61+
key = "DD_AGENTLESS_LOG_SUBMISSION_ENABLED",
62+
version = "B",
63+
type = "boolean",
64+
default = "true",
65+
aliases = listOf("DD_ALIAS")
66+
)
67+
68+
assertTrue(content.contains("""aliasesMap.put("DD_ACTION_EXECUTION_ID", Collections.unmodifiableList(Arrays.asList()))"""))
69+
assertTrue(content.contains("""aliasesMap.put("DD_AGENTLESS_LOG_SUBMISSION_ENABLED", Collections.unmodifiableList(Arrays.asList("DD_ALIAS")))"""))
70+
71+
assertTrue(content.contains("""aliasMappingMap.put("DD_ALIAS", "DD_AGENTLESS_LOG_SUBMISSION_ENABLED")"""))
72+
73+
assertTrue(content.contains("""deprecatedMap.put("old.config", "Use test.config instead")"""))
74+
assertTrue(content.contains("""deprecatedMap.put("legacy.setting", "No longer supported")"""))
75+
76+
assertTrue(content.contains("""reversePropertyKeysMapping.put("property.key", "DD_ACTION_EXECUTION_ID")"""))
77+
}
78+
79+
private fun runGradleTask(projectDir: File): Pair<BuildResult, File> {
80+
val jsonFile = file(projectDir, "test-supported-configurations.json")
81+
jsonFile.writeText(
82+
"""
83+
{
84+
"supportedConfigurations": {
85+
"DD_ACTION_EXECUTION_ID": [
86+
{
87+
"version": "A",
88+
"type": "string",
89+
"default": null,
90+
"aliases": [],
91+
"propertyKeys": ["property.key"]
92+
}
93+
],
94+
"DD_AGENTLESS_LOG_SUBMISSION_ENABLED": [
95+
{
96+
"version": "A",
97+
"type": "boolean",
98+
"default": "false",
99+
"aliases": []
100+
},
101+
{
102+
"version": "B",
103+
"type": "boolean",
104+
"default": "true",
105+
"aliases": ["DD_ALIAS"]
106+
}
107+
]
108+
},
109+
"deprecations": {
110+
"old.config": "Use test.config instead",
111+
"legacy.setting": "No longer supported"
112+
}
113+
}
114+
""".trimIndent()
115+
)
116+
117+
setupGradleProject(projectDir)
118+
119+
val buildResult = GradleRunner.create()
120+
.forwardOutput()
121+
.withPluginClasspath()
122+
.withArguments("generateSupportedConfigurations")
123+
.withProjectDir(projectDir)
124+
.build()
125+
126+
val generatedFile = file(projectDir, "build", "generated", "supportedConfigurations", "datadog", "test", "TestGeneratedSupportedConfigurations.java")
127+
return Pair(buildResult, generatedFile)
128+
}
129+
130+
private fun setupGradleProject(projectDir: File) {
131+
file(projectDir, "settings.gradle.kts").writeText(
132+
"""
133+
rootProject.name = "test-config-project"
134+
""".trimIndent()
135+
)
136+
137+
file(projectDir, "build.gradle.kts").writeText(
138+
"""
139+
plugins {
140+
id("java")
141+
id("dd-trace-java.supported-config-generator")
142+
}
143+
144+
group = "datadog.config.test"
145+
146+
supportedTracerConfigurations {
147+
jsonFile.set(file("test-supported-configurations.json"))
148+
destinationDirectory.set(file("build/generated/supportedConfigurations"))
149+
className.set("datadog.test.TestGeneratedSupportedConfigurations")
150+
}
151+
""".trimIndent()
152+
)
153+
}
154+
155+
private fun file(projectDir: File, vararg parts: String, makeDirectory: Boolean = false): File {
156+
val f = Paths.get(projectDir.absolutePath, *parts).toFile()
157+
158+
if (makeDirectory) {
159+
f.parentFile.mkdirs()
160+
}
161+
162+
return f
163+
}
164+
165+
private fun assertContainsSupportedConfig(
166+
content: String,
167+
key: String,
168+
version: String,
169+
type: String,
170+
default: String,
171+
aliases: List<String>,
172+
propertyKeys: List<String> = emptyList()
173+
) {
174+
val aliasesArray = aliases.joinToString(", ") { "\"$it\"" }
175+
val propertyKeysArray = propertyKeys.joinToString(", ") { "\"$it\"" }
176+
177+
assertTrue(
178+
content.contains("""supportedMap.put("$key""""),
179+
"Should contain supportedMap.put for key: $key"
180+
)
181+
182+
val expectedPattern = buildString {
183+
append("new SupportedConfiguration(")
184+
append("\"$version\", ")
185+
append("\"$type\", ")
186+
append(if (default == "null") "null" else "\"$default\"")
187+
append(", ")
188+
append("Arrays.asList($aliasesArray)")
189+
append(", ")
190+
append("Arrays.asList($propertyKeysArray)")
191+
append(")")
192+
}
193+
194+
assertTrue(
195+
content.contains(expectedPattern),
196+
"Should contain SupportedConfiguration: $expectedPattern"
197+
)
198+
}
199+
}

dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ public static void onEnter(@Advice.Argument(value = 0, readOnly = false) String[
147147
+ "datadog.trace.bootstrap.WeakMapContextStore:build_time,"
148148
+ "datadog.trace.config.inversion.ConfigHelper:rerun,"
149149
+ "datadog.trace.config.inversion.ConfigHelper$StrictnessPolicy:rerun,"
150-
+ "datadog.trace.config.inversion.GeneratedSupportedConfigurations:rerun,"
150+
+ "datadog.trace.config.inversion.GeneratedSupportedConfigurations:build_time,"
151+
+ "datadog.trace.config.inversion.SupportedConfiguration:build_time,"
151152
+ "datadog.trace.instrumentation.guava10.GuavaAsyncResultExtension:build_time,"
152153
+ "datadog.trace.instrumentation.reactivestreams.ReactiveStreamsAsyncResultExtension:build_time,"
153154
+ "datadog.trace.instrumentation.reactor.core.ReactorAsyncResultExtension:build_time,"

0 commit comments

Comments
 (0)