[IOTDB-4395] fix size statistic of disk. (#7342)
diff --git a/server/src/main/java/org/apache/iotdb/db/service/metrics/predefined/SystemMetrics.java b/server/src/main/java/org/apache/iotdb/db/service/metrics/predefined/SystemMetrics.java
index 96f7625..94fe584 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/metrics/predefined/SystemMetrics.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/metrics/predefined/SystemMetrics.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.db.service.metrics.predefined;
import org.apache.iotdb.commons.concurrent.threadpool.ScheduledExecutorUtil;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.service.metrics.enums.Metric;
import org.apache.iotdb.db.service.metrics.enums.Tag;
import org.apache.iotdb.metrics.AbstractMetricService;
@@ -28,18 +29,28 @@
import org.apache.iotdb.metrics.utils.MetricType;
import com.sun.management.OperatingSystemMXBean;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import java.io.File;
+import java.io.IOException;
import java.lang.management.ManagementFactory;
+import java.nio.file.FileStore;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashSet;
+import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class SystemMetrics implements IMetricSet {
+ private static final Logger logger = LoggerFactory.getLogger(SystemMetrics.class);
private com.sun.management.OperatingSystemMXBean osMXBean;
private Future<?> currentServiceFuture;
private final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
+ private final Set<FileStore> fileStores = new HashSet<>();
private long systemDiskTotalSpace = 0L;
private long systemDiskFreeSpace = 0L;
@@ -167,6 +178,26 @@
}
private void collectSystemDiskInfo(AbstractMetricService metricService) {
+ String[] dataDirs = IoTDBDescriptor.getInstance().getConfig().getDataDirs();
+ for (String dataDir : dataDirs) {
+ Path path = Paths.get(dataDir);
+ FileStore fileStore = null;
+ try {
+ fileStore = Files.getFileStore(path);
+ } catch (IOException e) {
+ // check parent if path is not exists
+ path = path.getParent();
+ try {
+ fileStore = Files.getFileStore(path);
+ } catch (IOException innerException) {
+ logger.error("Failed to get storage path of {}, because", dataDir, innerException);
+ }
+ }
+ if (null != fileStore) {
+ fileStores.add(fileStore);
+ }
+ }
+
metricService.getOrCreateAutoGauge(
Metric.SYS_DISK_TOTAL_SPACE.toString(),
MetricLevel.CORE,
@@ -184,6 +215,7 @@
}
private void removeSystemDiskInfo(AbstractMetricService metricService) {
+ fileStores.clear();
metricService.remove(
MetricType.GAUGE, Metric.SYS_DISK_TOTAL_SPACE.toString(), Tag.NAME.toString(), "system");
metricService.remove(
@@ -191,12 +223,16 @@
}
private void collect() {
- File[] files = File.listRoots();
long sysTotalSpace = 0L;
long sysFreeSpace = 0L;
- for (File file : files) {
- sysTotalSpace += file.getTotalSpace();
- sysFreeSpace += file.getFreeSpace();
+
+ for (FileStore fileStore : fileStores) {
+ try {
+ sysTotalSpace += fileStore.getTotalSpace();
+ sysFreeSpace += fileStore.getUsableSpace();
+ } catch (IOException e) {
+ logger.error("Failed to statistic the size of {}, because", fileStore, e);
+ }
}
systemDiskTotalSpace = sysTotalSpace;
systemDiskFreeSpace = sysFreeSpace;