This is an automated email from the ASF dual-hosted git repository. spricoder pushed a commit to branch fix/disk-usage-metric-1.2 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 1d36973e9c6ac50c4f58f9c82a011b90163624ef Author: ZhangHongYin <[email protected]> AuthorDate: Thu Oct 12 22:22:45 2023 +0800 Fix SYS_DISK_FREE_SPACE metric and add SYS_AVAILABLE_SPACE metric (#11289) * 1. Optimize the name of method 2. Add remove metric set when leader change * Add remove * Rename * Fix code smell * Fix param name * Fix param name (cherry picked from commit 32a1e10b2e40684bd4cd3d3f88603afddfa58ad2) --- .../impl/DataNodeInternalRPCServiceImpl.java | 10 ++-- .../compaction/execute/utils/CompactionUtils.java | 57 ++++++++++++++++++++++ .../metrics/metricsets/system/SystemMetrics.java | 31 ++++++++++-- .../apache/iotdb/metrics/utils/SystemMetric.java | 1 + 4 files changed, 91 insertions(+), 8 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java index 3be407a8df0..56a9bea9961 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java @@ -1273,10 +1273,10 @@ public class DataNodeInternalRPCServiceImpl implements IDataNodeRPCService.Iface private void sampleDiskLoad(TLoadSample loadSample) { final CommonConfig commonConfig = CommonDescriptor.getInstance().getConfig(); - double freeDisk = + double availableDisk = MetricService.getInstance() .getAutoGauge( - SystemMetric.SYS_DISK_FREE_SPACE.toString(), + SystemMetric.SYS_DISK_AVAILABLE_SPACE.toString(), MetricLevel.CORE, Tag.NAME.toString(), SYSTEM) @@ -1290,9 +1290,9 @@ public class DataNodeInternalRPCServiceImpl implements IDataNodeRPCService.Iface SYSTEM) .value(); - if (freeDisk != 0 && totalDisk != 0) { - double freeDiskRatio = freeDisk / totalDisk; - loadSample.setFreeDiskSpace(freeDisk); + if (availableDisk != 0 && totalDisk != 0) { + double freeDiskRatio = availableDisk / totalDisk; + loadSample.setFreeDiskSpace(availableDisk); loadSample.setDiskUsageRate(1d - freeDiskRatio); // Reset NodeStatus if necessary if (freeDiskRatio < commonConfig.getDiskSpaceWarningThreshold()) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java index a5160b7a3bf..a733d80941d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java @@ -19,13 +19,18 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils; +import org.apache.iotdb.commons.conf.CommonDescriptor; import org.apache.iotdb.commons.conf.IoTDBConstant; +import org.apache.iotdb.commons.service.metric.MetricService; +import org.apache.iotdb.commons.service.metric.enums.Tag; import org.apache.iotdb.db.service.metrics.FileMetrics; import org.apache.iotdb.db.storageengine.dataregion.modification.Modification; import org.apache.iotdb.db.storageengine.dataregion.modification.ModificationFile; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileManager; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.DeviceTimeIndex; +import org.apache.iotdb.metrics.utils.MetricLevel; +import org.apache.iotdb.metrics.utils.SystemMetric; import org.apache.iotdb.tsfile.common.conf.TSFileConfig; import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor; import org.apache.iotdb.tsfile.common.constant.TsFileConstant; @@ -68,6 +73,7 @@ import java.util.Set; public class CompactionUtils { private static final Logger logger = LoggerFactory.getLogger(IoTDBConstant.COMPACTION_LOGGER_NAME); + private static final String SYSTEM = "system"; private CompactionUtils() {} @@ -436,4 +442,55 @@ public class CompactionUtils { } return true; } + + public static void deleteSourceTsFileAndUpdateFileMetrics( + List<TsFileResource> sourceSeqResourceList, List<TsFileResource> sourceUnseqResourceList) { + deleteSourceTsFileAndUpdateFileMetrics(sourceSeqResourceList, true); + deleteSourceTsFileAndUpdateFileMetrics(sourceUnseqResourceList, false); + } + + public static void deleteSourceTsFileAndUpdateFileMetrics( + List<TsFileResource> resources, boolean seq) { + List<TsFileResource> removeResources = new ArrayList<>(); + for (TsFileResource resource : resources) { + if (!resource.remove()) { + logger.warn( + "[Compaction] delete file failed, file path is {}", + resource.getTsFile().getAbsolutePath()); + } else { + logger.info("[Compaction] delete file: {}", resource.getTsFile().getAbsolutePath()); + removeResources.add(resource); + } + } + FileMetrics.getInstance().deleteTsFile(seq, resources); + } + + public static boolean isDiskHasSpace() { + return isDiskHasSpace(0d); + } + + public static boolean isDiskHasSpace(double redundancy) { + double availableDisk = + MetricService.getInstance() + .getAutoGauge( + SystemMetric.SYS_DISK_AVAILABLE_SPACE.toString(), + MetricLevel.CORE, + Tag.NAME.toString(), + SYSTEM) + .value(); + double totalDisk = + MetricService.getInstance() + .getAutoGauge( + SystemMetric.SYS_DISK_TOTAL_SPACE.toString(), + MetricLevel.CORE, + Tag.NAME.toString(), + SYSTEM) + .value(); + + if (availableDisk != 0 && totalDisk != 0) { + return availableDisk / totalDisk + > CommonDescriptor.getInstance().getConfig().getDiskSpaceWarningThreshold() + redundancy; + } + return true; + } } diff --git a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/system/SystemMetrics.java b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/system/SystemMetrics.java index d61b7b71120..dd9054dd9a0 100644 --- a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/system/SystemMetrics.java +++ b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/system/SystemMetrics.java @@ -50,6 +50,7 @@ public class SystemMetrics implements IMetricSet { private final Set<FileStore> fileStores = new HashSet<>(); private final AtomicReference<List<String>> diskDirs = new AtomicReference<>(Collections.emptyList()); + private static final String FAILED_TO_STATISTIC = "Failed to statistic the size of {}, because"; public SystemMetrics() { this.osMxBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); @@ -204,6 +205,13 @@ public class SystemMetrics implements IMetricSet { SystemMetrics::getSystemDiskFreeSpace, SystemTag.NAME.toString(), SYSTEM); + metricService.createAutoGauge( + SystemMetric.SYS_DISK_AVAILABLE_SPACE.toString(), + MetricLevel.CORE, + this, + SystemMetrics::getSystemDiskAvailableSpace, + SystemTag.NAME.toString(), + SYSTEM); } private void removeSystemDiskInfo(AbstractMetricService metricService) { @@ -217,6 +225,11 @@ public class SystemMetrics implements IMetricSet { SystemMetric.SYS_DISK_FREE_SPACE.toString(), SystemTag.NAME.toString(), SYSTEM); + metricService.remove( + MetricType.AUTO_GAUGE, + SystemMetric.SYS_DISK_AVAILABLE_SPACE.toString(), + SystemTag.NAME.toString(), + SYSTEM); diskDirs.get().clear(); fileStores.clear(); @@ -228,7 +241,7 @@ public class SystemMetrics implements IMetricSet { try { sysTotalSpace += fileStore.getTotalSpace(); } catch (IOException e) { - logger.error("Failed to statistic the size of {}, because", fileStore, e); + logger.error(FAILED_TO_STATISTIC, fileStore, e); } } return sysTotalSpace; @@ -238,14 +251,26 @@ public class SystemMetrics implements IMetricSet { long sysFreeSpace = 0L; for (FileStore fileStore : fileStores) { try { - sysFreeSpace += fileStore.getUsableSpace(); + sysFreeSpace += fileStore.getUnallocatedSpace(); } catch (IOException e) { - logger.error("Failed to statistic the size of {}, because", fileStore, e); + logger.error(FAILED_TO_STATISTIC, fileStore, e); } } return sysFreeSpace; } + public long getSystemDiskAvailableSpace() { + long sysAvailableSpace = 0L; + for (FileStore fileStore : fileStores) { + try { + sysAvailableSpace += fileStore.getUsableSpace(); + } catch (IOException e) { + logger.error(FAILED_TO_STATISTIC, fileStore, e); + } + } + return sysAvailableSpace; + } + public static SystemMetrics getInstance() { return SystemMetricsHolder.INSTANCE; } diff --git a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/utils/SystemMetric.java b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/utils/SystemMetric.java index e04586c0f11..2247628169c 100644 --- a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/utils/SystemMetric.java +++ b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/utils/SystemMetric.java @@ -58,6 +58,7 @@ public enum SystemMetric { SYS_COMMITTED_VM_SIZE("sys_committed_vm_size"), SYS_DISK_TOTAL_SPACE("sys_disk_total_space"), SYS_DISK_FREE_SPACE("sys_disk_free_space"), + SYS_DISK_AVAILABLE_SPACE("sys_disk_available_space"), // cpu related MODULE_CPU_USAGE("module_cpu_usage"), POOL_CPU_USAGE("pool_cpu_usage"),
