Skip to content

Commit 5241d7d

Browse files
authored
Migrate from snakeyaml to snakeyaml-engine (#554)
The main motivation is to get rid of using snakeyaml reflection, which is poorly compatible with GraalVM native builds. snakeyaml-engine is a slimmer version of snakeyaml, but without support for JavaBeans that rely heavily on reflection.
1 parent ecbce97 commit 5241d7d

File tree

5 files changed

+34
-39
lines changed

5 files changed

+34
-39
lines changed

pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
<lombok.version>1.18.32</lombok.version>
6262
<mockito.version>2.28.2</mockito.version>
6363
<slf4j.version>1.7.32</slf4j.version>
64-
<snakeyaml.version>2.0</snakeyaml.version>
64+
<snakeyaml-engine.version>2.9</snakeyaml-engine.version>
6565
<testcontainers.version>1.19.8</testcontainers.version>
6666

6767
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -186,9 +186,9 @@
186186
<version>${slf4j.version}</version>
187187
</dependency>
188188
<dependency>
189-
<groupId>org.yaml</groupId>
190-
<artifactId>snakeyaml</artifactId>
191-
<version>${snakeyaml.version}</version>
189+
<groupId>org.snakeyaml</groupId>
190+
<artifactId>snakeyaml-engine</artifactId>
191+
<version>${snakeyaml-engine.version}</version>
192192
</dependency>
193193
<dependency>
194194
<groupId>javax.management.j2ee</groupId>

src/main/java/org/datadog/jmxfetch/Instance.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
import org.datadog.jmxfetch.service.ConfigServiceNameProvider;
66
import org.datadog.jmxfetch.service.ServiceNameProvider;
77
import org.datadog.jmxfetch.util.InstanceTelemetry;
8-
import org.yaml.snakeyaml.Yaml;
9-
10-
8+
import org.snakeyaml.engine.v2.api.Load;
9+
import org.snakeyaml.engine.v2.api.LoadSettings;
1110

1211
import java.io.File;
1312
import java.io.FileInputStream;
@@ -43,11 +42,12 @@ public class Instance {
4342
public static final String JVM_DIRECT = "jvm_direct";
4443
public static final String ATTRIBUTE = "Attribute: ";
4544

46-
private static final ThreadLocal<Yaml> YAML =
47-
new ThreadLocal<Yaml>() {
45+
private static final ThreadLocal<Load> YAML =
46+
new ThreadLocal<Load>() {
4847
@Override
49-
public Yaml initialValue() {
50-
return new Yaml();
48+
public Load initialValue() {
49+
LoadSettings settings = LoadSettings.builder().build();
50+
return new Load(settings);
5151
}
5252
};
5353

@@ -295,9 +295,9 @@ public static boolean isDirectInstance(Map<String, Object> configInstance) {
295295
}
296296

297297
private void loadDefaultConfig(String configResourcePath) {
298-
List<Map<String, Object>> defaultConf =
299-
(List<Map<String, Object>>)
300-
YAML.get().load(this.getClass().getResourceAsStream(configResourcePath));
298+
InputStream is = this.getClass().getResourceAsStream(configResourcePath);
299+
List<Map<String, Object>> defaultConf = (List<Map<String, Object>>)
300+
YAML.get().loadFromInputStream(is);
301301
for (Map<String, Object> conf : defaultConf) {
302302
configurationList.add(new Configuration(conf));
303303
}
@@ -321,7 +321,7 @@ static void loadMetricConfigFiles(
321321
yamlInputStream = new FileInputStream(yamlPath);
322322
List<Map<String, Object>> confs =
323323
(List<Map<String, Object>>)
324-
YAML.get().load(yamlInputStream);
324+
YAML.get().loadFromInputStream(yamlInputStream);
325325
for (Map<String, Object> conf : confs) {
326326
configurationList.add(new Configuration(conf));
327327
}
@@ -360,7 +360,7 @@ static void loadMetricConfigResources(
360360
try {
361361
Map<String, List<Map<String, Object>>> topYaml =
362362
(Map<String, List<Map<String, Object>>>)
363-
YAML.get().load(inputStream);
363+
YAML.get().loadFromInputStream(inputStream);
364364
List<Map<String, Object>> jmxConf =
365365
topYaml.get("jmx_metrics");
366366
if (jmxConf != null) {

src/main/java/org/datadog/jmxfetch/Status.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55

66
import org.datadog.jmxfetch.util.InstanceTelemetry;
77
import org.datadog.jmxfetch.util.MetadataHelper;
8-
import org.yaml.snakeyaml.Yaml;
8+
import org.snakeyaml.engine.v2.api.Dump;
9+
import org.snakeyaml.engine.v2.api.DumpSettings;
910

1011
import java.io.BufferedOutputStream;
1112
import java.io.File;
@@ -147,16 +148,17 @@ public void addInitFailedCheck(String checkName, String message, String status)
147148
}
148149

149150
private String generateYaml() {
150-
Map<String, Object> status = new HashMap<String, Object>();
151+
Map<String, Object> status = new HashMap<>();
151152
status.put("info", this.info);
152153
status.put("timestamp", System.currentTimeMillis());
153154
status.put("checks", this.instanceStats);
154155
status.put("errors", this.errors);
155-
return new Yaml().dump(status);
156+
DumpSettings settings = DumpSettings.builder().build();
157+
return new Dump(settings).dumpToString(status);
156158
}
157159

158160
private String generateJson() throws IOException {
159-
Map<String, Object> status = new HashMap<String, Object>();
161+
Map<String, Object> status = new HashMap<>();
160162
status.put("info", this.info);
161163
status.put("timestamp", System.currentTimeMillis());
162164
status.put("checks", this.instanceStats);
Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
11
package org.datadog.jmxfetch;
22

3-
import org.yaml.snakeyaml.Yaml;
3+
import org.snakeyaml.engine.v2.api.Load;
4+
import org.snakeyaml.engine.v2.api.LoadSettings;
45

56
import java.io.InputStream;
6-
import java.util.HashMap;
77
import java.util.Map;
88

9-
@SuppressWarnings("unchecked")
109
class YamlParser {
1110

12-
private Map<Object, Object> parsedYaml;
11+
private final Map<Object, Object> parsedYaml;
1312

1413
public YamlParser(InputStream yamlInputStream) {
15-
parsedYaml = (Map<Object, Object>) new Yaml().load(yamlInputStream);
16-
}
17-
18-
public YamlParser(YamlParser other) {
19-
parsedYaml = new HashMap<Object, Object>((Map<Object, Object>) other.getParsedYaml());
14+
LoadSettings settings = LoadSettings.builder().build();
15+
parsedYaml = (Map<Object, Object>) new Load(settings).loadFromInputStream(yamlInputStream);
2016
}
2117

2218
public Object getYamlInstances() {
@@ -26,8 +22,4 @@ public Object getYamlInstances() {
2622
public Object getInitConfig() {
2723
return parsedYaml.get("init_config");
2824
}
29-
30-
public Object getParsedYaml() {
31-
return parsedYaml;
32-
}
3325
}

src/test/java/org/datadog/jmxfetch/StatusTest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
import java.io.FileInputStream;
77
import java.io.IOException;
88
import java.io.InputStream;
9-
import java.util.HashMap;
109
import java.util.List;
1110
import java.util.Map;
1211

1312
import org.datadog.jmxfetch.util.InstanceTelemetry;
1413
import org.junit.Rule;
1514
import org.junit.Test;
1615
import org.junit.rules.TemporaryFolder;
17-
import org.yaml.snakeyaml.Yaml;
16+
import org.snakeyaml.engine.v2.api.Load;
17+
import org.snakeyaml.engine.v2.api.LoadSettings;
1818

1919
public class StatusTest {
2020

@@ -45,12 +45,13 @@ public void TestStatus() throws IOException {
4545
status.addInstanceStats("fake_check", "fake_instance", 10, 3, "fake_message", Status.STATUS_OK, instance);
4646
status.flush();
4747

48-
Yaml yaml = new Yaml();
48+
LoadSettings settings = LoadSettings.builder().build(); //TODO
49+
Load load = new Load(settings);
4950
InputStream inputStream = new FileInputStream(tempFilePath);
5051

51-
HashMap yamlMap = yaml.load(inputStream);
52-
HashMap checks = (HashMap) yamlMap.get("checks");
53-
HashMap initializedChecks = (HashMap) checks.get("initialized_checks");
52+
Map<?, ?> yamlMap = (Map<?, ?>) load.loadFromInputStream(inputStream);
53+
Map<?, ?> checks = (Map<?, ?>) yamlMap.get("checks");
54+
Map<?, ?> initializedChecks = (Map<?, ?>) checks.get("initialized_checks");
5455
List<Map<String, Object>> fakeCheck = (List<Map<String, Object>>) initializedChecks.get("fake_check");
5556
Map<String, Object> stats = fakeCheck.get(0);
5657
assertEquals("fake_instance", stats.get("instance_name"));

0 commit comments

Comments
 (0)