public class SystemLevelMetrics implements MeterBinder {
@Override
public void bindTo(MeterRegistry registry) {
OperatingSystemMXBean osBean =
(OperatingSystemMXBean) java.lang.management.ManagementFactory
.getOperatingSystemMXBean();
Gauge.builder("system.total.memory.bytes", osBean,
OperatingSystemMXBean::getTotalMemorySize)
.tags("type", "system-level")
.description("Total OS Memory").register(registry);
Gauge.builder("system.free.memory.bytes", osBean,
OperatingSystemMXBean::getFreeMemorySize)
.tags("type", "system-level")
.description("Total Free OS Memory").register(registry);
Gauge.builder("system.cpu.load.percentage", osBean,
item -> Double.valueOf(item.getCpuLoad() * 100).intValue())
.tags("type", "system-level")
.description("Aggregate CPU Usage").register(registry);
}
@PreDestroy
public void unregister() {
final List<Meter> meters = MeterAccess.getMeterRegistry().getMeters();
for (final Meter meter : meters) {
if ("system-level".equals(meter.getId().getTag("type"))) {
MeterAccess.getMeterRegistry().remove(meter);
}
}
}
}