序
本文主要研究下如何在springboot2新增一个diskspace指标
disk health indicator
DiskSpaceHealthIndicatorProperties
spring-boot-actuator-autoconfigure-2.0.1.RELEASE-sources.jar!/org/springframework/boot/actuate/autoconfigure/system/DiskSpaceHealthIndicatorProperties.java
/**
* External configuration properties for {@link DiskSpaceHealthIndicator}.
*
* @author Andy Wilkinson
* @since 1.2.0
*/
@ConfigurationProperties(prefix = "management.health.diskspace")
public class DiskSpaceHealthIndicatorProperties {
private static final int MEGABYTES = 1024 * 1024;
private static final int DEFAULT_THRESHOLD = 10 * MEGABYTES;
/**
* Path used to compute the available disk space.
*/
private File path = new File(".");
/**
* Minimum disk space, in bytes, that should be available.
*/
private long threshold = DEFAULT_THRESHOLD;
public File getPath() {
return this.path;
}
public void setPath(File path) {
Assert.isTrue(path.exists(), () -> "Path '" + path + "' does not exist");
Assert.isTrue(path.canRead(), () -> "Path '" + path + "' cannot be read");
this.path = path;
}
public long getThreshold() {
return this.threshold;
}
public void setThreshold(long threshold) {
Assert.isTrue(threshold >= 0, "threshold must be greater than 0");
this.threshold = threshold;
}
}
DiskSpaceHealthIndicator
spring-boot-actuator-2.0.1.RELEASE-sources.jar!/org/springframework/boot/actuate/system/DiskSpaceHealthIndicator.java
/**
* A {@link HealthIndicator} that checks available disk space and reports a status of
* {@link Status#DOWN} when it drops below a configurable threshold.
*
* @author Mattias Severson
* @author Andy Wilkinson
* @since 2.0.0
*/
public class DiskSpaceHealthIndicator extends AbstractHealthIndicator {
private static final Log logger = LogFactory.getLog(DiskSpaceHealthIndicator.class);
private final File path;
private final long threshold;
/**
* Create a new {@code DiskSpaceHealthIndicator} instance.
* @param path the Path used to compute the available disk space
* @param threshold the minimum disk space that should be available (in bytes)
*/
public DiskSpaceHealthIndicator(File path, long threshold) {
super("DiskSpace health check failed");
this.path = path;
this.threshold = threshold;
}
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
long diskFreeInBytes = this.path.getUsableSpace();
if (diskFreeInBytes >= this.threshold) {
builder.up();
}
else {
logger.warn(String.format(
"Free disk space below threshold. "
+ "Available: %d bytes (threshold: %d bytes)",
diskFreeInBytes, this.threshold));
builder.down();
}
builder.withDetail("total", this.path.getTotalSpace())
.withDetail("free", diskFreeInBytes)
.withDetail("threshold", this.threshold);
}
}
metrics
这里我们把disk的health indicator转为metrics
@Component
public class DiskMetrics implements MeterBinder {
private File rootFilePath;
public DiskMetrics() {
this.rootFilePath = new File(".");
}
@Override
public void bindTo(MeterRegistry registry) {
Gauge.builder("diskspace.total", rootFilePath, c -> c.getTotalSpace())
.register(registry);
Gauge.builder("diskspace.free", rootFilePath, c -> c.getFreeSpace())
.register(registry);
Gauge.builder("diskspace.usage", rootFilePath, c -> {
long totalDiskSpace = rootFilePath.getTotalSpace();
if (totalDiskSpace == 0) {
return 0.0;
}
long usedDiskSpace = totalDiskSpace - rootFilePath.getFreeSpace();
return Double.valueOf(usedDiskSpace) / totalDiskSpace * 100;
})
.register(registry);
}
}
输出
- /actuator/metrics
{
"names": [
"jvm.memory.committed",
"jvm.buffer.memory.used",
"jvm.gc.memory.allocated",
"jvm.memory.used",
"jvm.gc.max.data.size",
"logback.events",
"system.cpu.count",
"jvm.memory.max",
"jvm.buffer.total.capacity",
"jvm.buffer.count",
"process.files.max",
"jvm.threads.daemon",
"process.start.time",
"diskspace.usage",
"jvm.gc.live.data.size",
"process.files.open",
"process.cpu.usage",
"process.uptime",
"system.load.average.1m",
"statsd.queue.size",
"statsd.queue.capacity",
"http.server.requests",
"system.cpu.usage",
"diskspace.free",
"jvm.threads.live",
"jvm.classes.loaded",
"jvm.classes.unloaded",
"jvm.threads.peak",
"jvm.gc.pause",
"jvm.gc.memory.promoted",
"diskspace.total"
]
}
- /actuator/metrics/diskspace.usage
{
"name": "diskspace.usage",
"measurements": [
{
"statistic": "VALUE",
"value": 96.99886102691765
}
],
"availableTags": []
}
小结
springboot2默认把diskspace作为一个healthIndicator,其阈值默认为10M。这里通过自定义micrometer的metrics,新增diskspace相关指标,这样就可以统一通过metrcis进行监控报警。