void bindTo()

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);
            }
        });
    }