in apm-agent-core/src/main/java/co/elastic/apm/agent/metrics/builtin/SystemMetrics.java [96:180]
void bindTo(MetricRegistry metricRegistry) {
// J9 always returns -1 on the first call
metricRegistry.addUnlessNan("system.cpu.total.norm.pct", Labels.EMPTY, new DoubleSupplier() {
@Override
public double get() {
return invoke(systemCpuUsage);
}
});
metricRegistry.addUnlessNan("system.process.cpu.total.norm.pct", Labels.EMPTY, new DoubleSupplier() {
@Override
public double get() {
return invoke(processCpuUsage);
}
});
if (memInfoFile.canRead()) {
metricRegistry.addUnlessNan("system.memory.actual.free", Labels.EMPTY, new DoubleSupplier() {
final List<WildcardMatcher> relevantLines = Arrays.asList(
caseSensitiveMatcher("MemAvailable:*kB"),
caseSensitiveMatcher("MemFree:*kB"),
caseSensitiveMatcher("Buffers:*kB"),
caseSensitiveMatcher("Cached:*kB"));
@Override
public double get() {
Map<String, Long> memInfo = new HashMap<>();
try (BufferedReader fileReader = new BufferedReader(new FileReader(memInfoFile))) {
for (String memInfoLine = fileReader.readLine(); memInfoLine != null && !memInfoLine.isEmpty(); memInfoLine = fileReader.readLine()) {
if (WildcardMatcher.isAnyMatch(relevantLines, memInfoLine)) {
final String[] memInfoSplit = StringUtils.split(memInfoLine, ' ');
memInfo.put(memInfoSplit[0], Long.parseLong(memInfoSplit[1]) * 1024);
}
}
if (memInfo.containsKey("MemAvailable:")) {
return memInfo.get("MemAvailable:");
} else if (memInfo.containsKey("MemFree:")) {
return memInfo.get("MemFree:") + memInfo.get("Buffers:") + memInfo.get("Cached:");
} else {
return Double.NaN;
}
} catch (Exception e) {
return Double.NaN;
}
}
});
metricRegistry.addUnlessNan("system.memory.total", Labels.EMPTY, new DoubleSupplier() {
@Override
public double get() {
try (BufferedReader fileReader = new BufferedReader(new FileReader(memInfoFile))) {
for (String memInfoLine = fileReader.readLine(); memInfoLine != null && !memInfoLine.isEmpty(); memInfoLine = fileReader.readLine()) {
if (memInfoLine.startsWith("MemTotal:")) {
final String[] memInfoSplit = StringUtils.split(memInfoLine, ' ');
return Long.parseLong(memInfoSplit[1]) * 1024;
}
}
return Double.NaN;
} catch (Exception e) {
return Double.NaN;
}
}
});
} else {
metricRegistry.addUnlessNan("system.memory.actual.free", Labels.EMPTY, new DoubleSupplier() {
@Override
public double get() {
return invoke(freeMemory);
}
});
metricRegistry.addUnlessNan("system.memory.total", Labels.EMPTY, new DoubleSupplier() {
@Override
public double get() {
return invoke(totalMemory);
}
});
}
metricRegistry.addUnlessNegative("system.process.memory.size", Labels.EMPTY, new DoubleSupplier() {
@Override
public double get() {
return invoke(virtualProcessMemory);
}
});
}