本文主要研究下如何在springboot2新增一个diskspace指标
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;
}
}
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);
}
}
这里我们把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);
}
}
输出
springboot2默认把diskspace作为一个healthIndicator,其阈值默认为10M。这里通过自定义micrometer的metrics,新增diskspace相关指标,这样就可以统一通过metrcis进行监控报警。