This is an automated email from the ASF dual-hosted git repository.

tanxinyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 6f7751bc1c1 [IOTDB-6082] Improve disk space metrics (#10925)
6f7751bc1c1 is described below

commit 6f7751bc1c154f4133aba49a2a3118c27a0f81e6
Author: Xiangpeng Hu <[email protected]>
AuthorDate: Wed Aug 23 17:55:45 2023 +0800

    [IOTDB-6082] Improve disk space metrics (#10925)
---
 .../iotdb/confignode/service/ConfigNode.java       |  3 +-
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 15 +++++
 .../db/service/metrics/DataNodeMetricsHelper.java  |  3 +-
 .../metrics/metricsets/system/SystemMetrics.java   | 69 +++++++++++++---------
 4 files changed, 61 insertions(+), 29 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
index 38dc19cfd0b..d8967a2d8ff 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
@@ -274,7 +274,8 @@ public class ConfigNode implements ConfigNodeMBean {
     ArrayList<String> diskDirs = new ArrayList<>();
     diskDirs.add(CONF.getSystemDir());
     diskDirs.add(CONF.getConsensusDir());
-    MetricService.getInstance().addMetricSet(new SystemMetrics(diskDirs));
+    SystemMetrics.getInstance().setDiskDirs(diskDirs);
+    MetricService.getInstance().addMetricSet(SystemMetrics.getInstance());
   }
 
   private void initCpuMetrics() {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index 7ffd5a97d5d..e1c602cbd00 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.db.conf;
 
 import org.apache.iotdb.common.rpc.thrift.TEndPoint;
 import 
org.apache.iotdb.commons.client.property.ClientPoolProperty.DefaultProperty;
+import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.utils.FileUtils;
 import org.apache.iotdb.commons.utils.TestOnly;
@@ -39,6 +40,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.constant
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.TimeIndexLevel;
 import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALMode;
 import org.apache.iotdb.db.utils.datastructure.TVListSortAlgorithm;
+import org.apache.iotdb.metrics.metricsets.system.SystemMetrics;
 import org.apache.iotdb.rpc.RpcTransportFactory;
 import org.apache.iotdb.rpc.RpcUtils;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
@@ -54,6 +56,7 @@ import org.slf4j.LoggerFactory;
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Field;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
@@ -1256,6 +1259,18 @@ public class IoTDBConfig {
       }
     }
     this.tierDataDirs = tierDataDirs;
+    reloadSystemMetrics();
+  }
+
+  void reloadSystemMetrics() {
+    ArrayList<String> diskDirs = new ArrayList<>();
+    diskDirs.add(IoTDBDescriptor.getInstance().getConfig().getSystemDir());
+    diskDirs.add(IoTDBDescriptor.getInstance().getConfig().getConsensusDir());
+    
diskDirs.addAll(Arrays.asList(IoTDBDescriptor.getInstance().getConfig().getDataDirs()));
+    
diskDirs.addAll(Arrays.asList(CommonDescriptor.getInstance().getConfig().getWalDirs()));
+    diskDirs.add(CommonDescriptor.getInstance().getConfig().getSyncDir());
+    diskDirs.add(IoTDBDescriptor.getInstance().getConfig().getSortTmpDir());
+    SystemMetrics.getInstance().setDiskDirs(diskDirs);
   }
 
   // if IOTDB_DATA_HOME is not set, then we keep dataHomeDir prefix being the 
same with IOTDB_HOME
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/DataNodeMetricsHelper.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/DataNodeMetricsHelper.java
index ea188be3cf8..9d76bb9b97d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/DataNodeMetricsHelper.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/DataNodeMetricsHelper.java
@@ -91,7 +91,8 @@ public class DataNodeMetricsHelper {
     
diskDirs.addAll(Arrays.asList(CommonDescriptor.getInstance().getConfig().getWalDirs()));
     diskDirs.add(CommonDescriptor.getInstance().getConfig().getSyncDir());
     diskDirs.add(IoTDBDescriptor.getInstance().getConfig().getSortTmpDir());
-    MetricService.getInstance().addMetricSet(new SystemMetrics(diskDirs));
+    SystemMetrics.getInstance().setDiskDirs(diskDirs);
+    MetricService.getInstance().addMetricSet(SystemMetrics.getInstance());
   }
 
   private static void initCpuMetrics() {
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 39fd1fe5ad8..d61b7b71120 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
@@ -37,22 +37,49 @@ import java.nio.file.FileStore;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
 
 public class SystemMetrics implements IMetricSet {
   private static final Logger logger = 
LoggerFactory.getLogger(SystemMetrics.class);
   private static final String SYSTEM = "system";
   private final com.sun.management.OperatingSystemMXBean osMxBean;
   private final Set<FileStore> fileStores = new HashSet<>();
-  private final ArrayList<String> diskDirs;
+  private final AtomicReference<List<String>> diskDirs =
+      new AtomicReference<>(Collections.emptyList());
 
-  public SystemMetrics(ArrayList<String> diskDirs) {
-    this.diskDirs = diskDirs;
+  public SystemMetrics() {
     this.osMxBean = (OperatingSystemMXBean) 
ManagementFactory.getOperatingSystemMXBean();
   }
 
+  public void setDiskDirs(List<String> diskDirs) {
+    this.diskDirs.set(diskDirs);
+    for (String diskDir : this.diskDirs.get()) {
+      if (!FSUtils.isLocal(diskDir)) {
+        continue;
+      }
+      Path path = Paths.get(diskDir);
+      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", diskDir, 
innerException);
+        }
+      }
+      if (null != fileStore) {
+        fileStores.add(fileStore);
+      }
+    }
+  }
+
   @Override
   public void bindTo(AbstractMetricService metricService) {
     collectSystemCpuInfo(metricService);
@@ -163,28 +190,6 @@ public class SystemMetrics implements IMetricSet {
   }
 
   private void collectSystemDiskInfo(AbstractMetricService metricService) {
-    for (String diskDir : diskDirs) {
-      if (!FSUtils.isLocal(diskDir)) {
-        continue;
-      }
-      Path path = Paths.get(diskDir);
-      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", diskDir, 
innerException);
-        }
-      }
-      if (null != fileStore) {
-        fileStores.add(fileStore);
-      }
-    }
-
     metricService.createAutoGauge(
         SystemMetric.SYS_DISK_TOTAL_SPACE.toString(),
         MetricLevel.CORE,
@@ -213,7 +218,7 @@ public class SystemMetrics implements IMetricSet {
         SystemTag.NAME.toString(),
         SYSTEM);
 
-    diskDirs.clear();
+    diskDirs.get().clear();
     fileStores.clear();
   }
 
@@ -240,4 +245,14 @@ public class SystemMetrics implements IMetricSet {
     }
     return sysFreeSpace;
   }
+
+  public static SystemMetrics getInstance() {
+    return SystemMetricsHolder.INSTANCE;
+  }
+
+  private static class SystemMetricsHolder {
+    private static final SystemMetrics INSTANCE = new SystemMetrics();
+
+    private SystemMetricsHolder() {}
+  }
 }

Reply via email to