Skip to content

Commit 4290a96

Browse files
committed
chore: Test ZGC memory pools
1 parent 5213788 commit 4290a96

File tree

7 files changed

+90
-39
lines changed

7 files changed

+90
-39
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,13 @@ public Instance(
244244

245245
Boolean collectDefaultJvmMetrics = (Boolean) instanceMap.get("collect_default_jvm_metrics");
246246
if (collectDefaultJvmMetrics == null || collectDefaultJvmMetrics) {
247-
loadDefaultConfig("default-jmx-metrics.yaml");
247+
// override the test definitions
248+
Object value = instanceMap.get("default-jmx-metrics-definitions");
249+
if (value instanceof String) {
250+
loadDefaultConfig((String) value);
251+
} else {
252+
loadDefaultConfig("default-jmx-metrics.yaml");
253+
}
248254
loadDefaultConfig(gcMetricConfig);
249255
} else {
250256
log.info("collect_default_jvm_metrics is false - not collecting default JVM metrics");

src/main/resources/org/datadog/jmxfetch/default-jmx-metrics.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@
133133
Usage.used:
134134
alias: jvm.gc.eden_size
135135
metric_type: gauge
136+
# Generational ZGC
136137
- include:
137138
domain: java.lang
138139
type: MemoryPool
@@ -197,6 +198,16 @@
197198
Usage.used:
198199
alias: jvm.gc.old_gen_size
199200
metric_type: gauge
201+
# Non-Generational ZGC
202+
- include:
203+
domain: java.lang
204+
type: MemoryPool
205+
name: ZHeap
206+
attribute:
207+
Usage.used:
208+
alias: jvm.gc.old_gen_size
209+
metric_type: gauge
210+
# Generational ZGC
200211
- include:
201212
domain: java.lang
202213
type: MemoryPool

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

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -33,30 +33,6 @@
3333
import org.junit.Rule;
3434
import org.junit.rules.TemporaryFolder;
3535

36-
/**
37-
* Config utility
38-
*/
39-
final class ConfigUtil {
40-
public final Path tempConfdDir;
41-
42-
public ConfigUtil(File file) {
43-
this.tempConfdDir = file.toPath();
44-
}
45-
46-
public Path makeTempYamlConfigFile(String yamlName, List<String> lines) {
47-
try {
48-
return Files.write(
49-
Files.createTempFile(tempConfdDir, yamlName, ".yaml"),
50-
lines,
51-
StandardCharsets.UTF_8
52-
);
53-
} catch (IOException e) {
54-
throw new UncheckedIOException(e);
55-
}
56-
}
57-
}
58-
59-
6036
public class TestCommon {
6137
AppConfig appConfig = spy(AppConfig.builder().build());
6238
App app;
@@ -215,8 +191,16 @@ protected void initApplicationWithYamlLines(Path... yamlConfigs) {
215191
app.init(false);
216192
}
217193

218-
ConfigUtil getConfigUtil() {
219-
return new ConfigUtil(temporaryFolder.getRoot());
194+
public Path makeTempYamlConfigFile(String yamlName, List<String> lines) {
195+
try {
196+
return Files.write(
197+
Files.createTempFile(temporaryFolder.getRoot().toPath(), yamlName, ".yaml"),
198+
lines,
199+
StandardCharsets.UTF_8
200+
);
201+
} catch (IOException e) {
202+
throw new UncheckedIOException(e);
203+
}
220204
}
221205

222206
/** Run a JMXFetch iteration. */

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

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void testJMXDirectBasic() throws Exception {
4949
}
5050

5151
@Test
52-
public void testDefaultOldGC() throws IOException {
52+
public void testDefaultOldGC() {
5353
try (final MisbehavingJMXServer server = new MisbehavingJMXServer.Builder().build()) {
5454
final List<Map<String, Object>> actualMetrics = startAndGetMetrics(server, false);
5555
List<String> gcGenerations = Arrays.asList(
@@ -61,7 +61,7 @@ public void testDefaultOldGC() throws IOException {
6161
}
6262

6363
@Test
64-
public void testDefaultNewGCMetricsUseParallelGC() throws IOException {
64+
public void testDefaultNewGCMetricsUseParallelGC() {
6565
try (final MisbehavingJMXServer server = new MisbehavingJMXServer.Builder().withJDKImage(
6666
JDK_11).appendJavaOpts("-XX:+UseParallelGC").build()) {
6767
final List<Map<String, Object>> actualMetrics = startAndGetMetrics(server, true);
@@ -95,7 +95,7 @@ public void testDefaultNewGCMetricsUseConcMarkSweepGC() throws IOException {
9595
}
9696

9797
@Test
98-
public void testDefaultNewGCMetricsUseG1GC() throws IOException {
98+
public void testDefaultNewGCMetricsUseG1GC() {
9999
try (final MisbehavingJMXServer server = new MisbehavingJMXServer.Builder().withJDKImage(
100100
JDK_17).appendJavaOpts("-XX:+UseG1GC").build()) {
101101
final List<Map<String, Object>> actualMetrics = startAndGetMetrics(server, true);
@@ -112,7 +112,26 @@ public void testDefaultNewGCMetricsUseG1GC() throws IOException {
112112
}
113113

114114
@Test
115-
public void testDefaultNewGCMetricsUseZGC() throws IOException {
115+
public void zgcMemoryPools() {
116+
try (final MisbehavingJMXServer server = new MisbehavingJMXServer.Builder()
117+
.withJDKImage(JDK_17).appendJavaOpts("-XX:+UseZGC").build()) {
118+
List<Map<String, Object>> maps = startAndGetMetrics(server, true, false);
119+
assertMemoryPoolMetric(maps, "jvm.gc.old_gen_size", "ZHeap");
120+
}
121+
}
122+
123+
@Test
124+
public void zgcGenerationalMemoryPools() {
125+
try (final MisbehavingJMXServer server = new MisbehavingJMXServer.Builder()
126+
.withJDKImage(JDK_21).appendJavaOpts("-XX:+UseZGC").appendJavaOpts("-XX:+ZGenerational").build()) {
127+
List<Map<String, Object>> maps = startAndGetMetrics(server, true, false);
128+
assertMemoryPoolMetric(maps, "jvm.gc.eden_size", "ZGC Young Generation");
129+
assertMemoryPoolMetric(maps, "jvm.gc.old_gen_size", "ZGC Old Generation");
130+
}
131+
}
132+
133+
@Test
134+
public void testDefaultNewGCMetricsUseZGC() {
116135
try (final MisbehavingJMXServer server = new MisbehavingJMXServer.Builder().withJDKImage(
117136
JDK_17).appendJavaOpts("-XX:+UseZGC").build()) {
118137
final List<Map<String, Object>> actualMetrics = startAndGetMetrics(server, true);
@@ -129,7 +148,7 @@ public void testDefaultNewGCMetricsUseZGC() throws IOException {
129148
}
130149

131150
@Test
132-
public void testDefaultNewGCMetricsUseGenerationalZGC() throws IOException {
151+
public void testDefaultNewGCMetricsUseGenerationalZGC() {
133152
try (final MisbehavingJMXServer server = new MisbehavingJMXServer.Builder().withJDKImage(
134153
JDK_21).appendJavaOpts("-XX:+UseZGC -XX:+ZGenerational").build()) {
135154
final List<Map<String, Object>> actualMetrics = startAndGetMetrics(server, true);
@@ -149,7 +168,7 @@ public void testDefaultNewGCMetricsUseGenerationalZGC() throws IOException {
149168
}
150169

151170
@Test
152-
public void testDefaultNewGCMetricsIBMJ9Balanced() throws IOException {
171+
public void testDefaultNewGCMetricsIBMJ9Balanced() {
153172
try (final MisbehavingJMXServer server = new MisbehavingJMXServer.Builder().withJDKImage(
154173
JDK_11_OPENJ9).appendJavaOpts("-Xgcpolicy:balanced").build()) {
155174
final List<Map<String, Object>> actualMetrics = startAndGetMetrics(server, true);
@@ -166,7 +185,7 @@ public void testDefaultNewGCMetricsIBMJ9Balanced() throws IOException {
166185
}
167186

168187
@Test
169-
public void testDefaultNewGCMetricsIBMJ9Gencon() throws IOException {
188+
public void testDefaultNewGCMetricsIBMJ9Gencon() {
170189
try (final MisbehavingJMXServer server = new MisbehavingJMXServer.Builder().withJDKImage(
171190
JDK_11_OPENJ9).appendJavaOpts("-Xgcpolicy:gencon").build()) {
172191
final List<Map<String, Object>> actualMetrics = startAndGetMetrics(server, true);
@@ -186,9 +205,19 @@ private List<Map<String, Object>> startAndGetMetrics(
186205
final MisbehavingJMXServer server,
187206
final boolean newGCMetrics
188207
) {
208+
return startAndGetMetrics(server, newGCMetrics, true);
209+
}
210+
211+
private List<Map<String, Object>> startAndGetMetrics(
212+
final MisbehavingJMXServer server,
213+
final boolean newGCMetrics,
214+
boolean useSimplifiedDefaultConfig
215+
) {
216+
String defaultConfig = useSimplifiedDefaultConfig ? "default-jmx-metrics-definitions: simplified-default-jmx-metrics.yaml" : "";
217+
189218
server.start();
190219
this.initApplicationWithYamlLines(
191-
getConfigUtil().makeTempYamlConfigFile(
220+
makeTempYamlConfigFile(
192221
"config",
193222
Arrays.asList(
194223
"init_config:",
@@ -199,6 +228,7 @@ private List<Map<String, Object>> startAndGetMetrics(
199228
" - name: jmxint_container",
200229
" host: " + server.getIp(),
201230
" collect_default_jvm_metrics: true",
231+
" " + defaultConfig,
202232
" max_returned_metrics: 300000",
203233
" port: " + server.getRMIPort()
204234
)
@@ -234,6 +264,26 @@ private static void assertGCMetric(final List<Map<String, Object>> actualMetrics
234264
actualMetrics);
235265
}
236266

267+
private static void assertMemoryPoolMetric(
268+
final List<Map<String, Object>> actualMetrics,
269+
final String expectedMetric,
270+
String poolName
271+
) {
272+
MetricsAssert.assertMetric(
273+
expectedMetric,
274+
-1,
275+
-1,
276+
-1,
277+
Collections.singletonList(String.format("name:%s", poolName)),
278+
Arrays.asList(
279+
"instance:jmxint_container",
280+
"jmx_domain:java.lang",
281+
"type:MemoryPool"),
282+
5,
283+
"gauge",
284+
actualMetrics);
285+
}
286+
237287
/*
238288
This function is needed as the TestGCMetrics.testDefaultOldGC asserts on two metrics that have
239289
different tags. MetricsAssert.assertMetric expects metrics to have unique names so can't be used

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ public void testJMXFetchReconnect() throws IOException {
197197
}
198198

199199
private Path config(String ipAddress, String domain) {
200-
return getConfigUtil().makeTempYamlConfigFile(
200+
return makeTempYamlConfigFile(
201201
"config",
202202
Arrays.asList(
203203
"init_config:",

src/test/java/org/datadog/jmxfetch/util/MetricsAssert.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ public static void assertMetric(
4141
if (mName.equals(name)) {
4242

4343
if (!value.equals(-1)) {
44-
assertEquals((Double) value.doubleValue(), mValue);
44+
assertEquals("Measured value must be equal to value", (Double) value.doubleValue(), mValue);
4545
} else if (!lowerBound.equals(-1) || !upperBound.equals(-1)) {
46-
assertTrue(mValue > (Double) lowerBound.doubleValue());
47-
assertTrue(mValue < (Double) upperBound.doubleValue());
46+
assertTrue("Measured value must be greater than lower bound", mValue > (Double) lowerBound.doubleValue());
47+
assertTrue("Measured value must be lesser than lower bound", mValue < (Double) upperBound.doubleValue());
4848
}
4949

5050
if (countTags != -1) {

src/test/resources/org/datadog/jmxfetch/default-jmx-metrics.yaml renamed to src/test/resources/org/datadog/jmxfetch/simplified-default-jmx-metrics.yaml

File renamed without changes.

0 commit comments

Comments
 (0)