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

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


The following commit(s) were added to refs/heads/win_metircs by this push:
     new adde97373f6 Add disk & network metrics for windows
adde97373f6 is described below

commit adde97373f6b848b0e4a2b1e3d5da222182f9841
Author: Tian Jiang <[email protected]>
AuthorDate: Thu Oct 16 19:04:34 2025 +0800

    Add disk & network metrics for windows
---
 .../metrics/file/SystemRelatedFileMetrics.java     |   8 +-
 iotdb-core/metrics/core/pom.xml                    |   5 -
 iotdb-core/metrics/interface/pom.xml               |   5 +
 .../disk/AbstractDiskMetricsManager.java           | 111 ++++++++++++++
 .../metricsets/disk/IDiskMetricsManager.java       |   3 +
 .../metricsets/disk/LinuxDiskMetricsManager.java   |  90 +-----------
 .../metricsets/disk/WindowsDiskMetricsManager.java | 160 ++++++++++++++++++++-
 .../metricsets/net/WindowsNetMetricManager.java    |  84 ++++++++++-
 8 files changed, 369 insertions(+), 97 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/file/SystemRelatedFileMetrics.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/file/SystemRelatedFileMetrics.java
index 3fac0d10a16..a225dd63123 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/file/SystemRelatedFileMetrics.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/file/SystemRelatedFileMetrics.java
@@ -31,6 +31,7 @@ import org.apache.iotdb.metrics.utils.SystemType;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import oshi.SystemInfo;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -52,7 +53,9 @@ public class SystemRelatedFileMetrics implements IMetricSet {
 
   @Override
   public void bindTo(AbstractMetricService metricService) {
-    if ((CONFIG.getSystemType() == SystemType.LINUX || CONFIG.getSystemType() 
== SystemType.MAC)
+    if ((CONFIG.getSystemType() == SystemType.LINUX
+            || CONFIG.getSystemType() == SystemType.MAC
+            || CONFIG.getSystemType() == SystemType.WINDOWS)
         && !CONFIG.getPid().isEmpty()) {
       this.getOpenFileNumberCommand =
           new String[] {"/bin/sh", "-c", String.format("lsof -p %s | wc -l", 
CONFIG.getPid())};
@@ -88,6 +91,9 @@ public class SystemRelatedFileMetrics implements IMetricSet {
           }
         }
         fdCount = Long.parseLong(result.toString().trim());
+      } else if (CONFIG.getSystemType() == SystemType.WINDOWS) {
+        SystemInfo systemInfo = new SystemInfo();
+        return 
systemInfo.getOperatingSystem().getCurrentProcess().getOpenFiles();
       }
     } catch (IOException e) {
       LOGGER.warn("Failed to get open file number, because ", e);
diff --git a/iotdb-core/metrics/core/pom.xml b/iotdb-core/metrics/core/pom.xml
index e1513d5fad2..cfbd78b513e 100644
--- a/iotdb-core/metrics/core/pom.xml
+++ b/iotdb-core/metrics/core/pom.xml
@@ -46,10 +46,5 @@
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>
-      <dependency>
-        <groupId>com.github.oshi</groupId>
-        <artifactId>oshi-core</artifactId>
-        <version>6.4.0</version>
-      </dependency>
     </dependencies>
 </project>
diff --git a/iotdb-core/metrics/interface/pom.xml 
b/iotdb-core/metrics/interface/pom.xml
index f0709c62ff2..7dfeab604d8 100644
--- a/iotdb-core/metrics/interface/pom.xml
+++ b/iotdb-core/metrics/interface/pom.xml
@@ -104,6 +104,11 @@
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>com.github.oshi</groupId>
+            <artifactId>oshi-core</artifactId>
+            <version>6.4.0</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git 
a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/AbstractDiskMetricsManager.java
 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/AbstractDiskMetricsManager.java
new file mode 100644
index 00000000000..077a9743c48
--- /dev/null
+++ 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/AbstractDiskMetricsManager.java
@@ -0,0 +1,111 @@
+package org.apache.iotdb.metrics.metricsets.disk;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+public abstract class AbstractDiskMetricsManager implements 
IDiskMetricsManager {
+
+  public static final double BYTES_PER_KB = 1024.0;
+  // Disk IO status structure
+  protected Map<String, Long> lastReadOperationCountForDisk;
+  protected Map<String, Long> lastWriteOperationCountForDisk;
+  protected Map<String, Long> lastReadSizeForDisk;
+  protected Map<String, Long> lastWriteSizeForDisk;
+  protected Map<String, Long> lastReadTimeCostForDisk;
+  protected Map<String, Long> lastWriteTimeCostForDisk;
+  protected Map<String, Long> lastMergedReadCountForDisk;
+  protected Map<String, Long> lastMergedWriteCountForDisk;
+  protected Map<String, Long> lastReadSectorCountForDisk;
+  protected Map<String, Long> lastWriteSectorCountForDisk;
+  protected Map<String, Long> lastIoBusyTimeForDisk;
+  protected Map<String, Long> lastTimeInQueueForDisk;
+  protected Map<String, Long> incrementReadOperationCountForDisk;
+  protected Map<String, Long> incrementWriteOperationCountForDisk;
+  protected Map<String, Long> incrementReadSizeForDisk;
+  protected Map<String, Long> incrementWriteSizeForDisk;
+  protected Map<String, Long> incrementMergedReadOperationCountForDisk;
+  protected Map<String, Long> incrementMergedWriteOperationCountForDisk;
+  protected Map<String, Long> incrementReadTimeCostForDisk;
+  protected Map<String, Long> incrementWriteTimeCostForDisk;
+  protected Map<String, Long> incrementReadSectorCountForDisk;
+  protected Map<String, Long> incrementWriteSectorCountForDisk;
+  protected Map<String, Long> incrementIoBusyTimeForDisk;
+  protected Map<String, Long> incrementTimeInQueueForDisk;
+  protected long lastUpdateTime = 0L;
+  protected long updateInterval = 1L;
+  protected Set<String> diskIdSet;
+
+  public AbstractDiskMetricsManager() {}
+
+  protected void init() {
+    collectDiskId();
+    lastReadOperationCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    lastWriteOperationCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    lastReadSizeForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    lastWriteSizeForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    lastReadTimeCostForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    lastWriteTimeCostForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    lastMergedReadCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    lastMergedWriteCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    lastReadSectorCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    lastWriteSectorCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    lastIoBusyTimeForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    lastTimeInQueueForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    incrementReadOperationCountForDisk = new HashMap<>(diskIdSet.size() + 1, 
1);
+    incrementWriteOperationCountForDisk = new HashMap<>(diskIdSet.size() + 1, 
1);
+    incrementReadSizeForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    incrementWriteSizeForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    incrementMergedReadOperationCountForDisk = new HashMap<>(diskIdSet.size() 
+ 1, 1);
+    incrementMergedWriteOperationCountForDisk = new HashMap<>(diskIdSet.size() 
+ 1, 1);
+    incrementReadTimeCostForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    incrementWriteTimeCostForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    incrementReadSectorCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    incrementWriteSectorCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    incrementIoBusyTimeForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+    incrementTimeInQueueForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
+  }
+
+  protected void checkUpdate() {
+    if (System.currentTimeMillis() - lastUpdateTime
+        > IDiskMetricsManager.UPDATE_SMALLEST_INTERVAL) {
+      updateInfo();
+    }
+  }
+
+  @Override
+  public Map<String, Double> getIoUtilsPercentage() {
+    checkUpdate();
+    Map<String, Double> utilsMap = new 
HashMap<>(incrementIoBusyTimeForDisk.size());
+    for (Map.Entry<String, Long> entry : 
incrementIoBusyTimeForDisk.entrySet()) {
+      utilsMap.put(entry.getKey(), ((double) entry.getValue()) / 
updateInterval);
+    }
+    return utilsMap;
+  }
+
+  protected void updateInfo() {
+    long currentTime = System.currentTimeMillis();
+    updateInterval = currentTime - lastUpdateTime;
+    lastUpdateTime = currentTime;
+  }
+
+  protected void updateSingleDiskInfo(
+      String diskId, long currentValue, Map<String, Long> lastMap, Map<String, 
Long> incrementMap) {
+    if (incrementMap != null) {
+      long lastValue = lastMap.getOrDefault(diskId, 0L);
+      if (lastValue != 0) {
+        incrementMap.put(diskId, currentValue - lastValue);
+      } else {
+        incrementMap.put(diskId, 0L);
+      }
+    }
+    lastMap.put(diskId, currentValue);
+  }
+
+  @Override
+  public Set<String> getDiskIds() {
+    return diskIdSet;
+  }
+
+  protected abstract void collectDiskId();
+}
diff --git 
a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/IDiskMetricsManager.java
 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/IDiskMetricsManager.java
index 67c2007965e..83a9f311223 100644
--- 
a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/IDiskMetricsManager.java
+++ 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/IDiskMetricsManager.java
@@ -27,6 +27,9 @@ import java.util.Map;
 import java.util.Set;
 
 public interface IDiskMetricsManager {
+
+  long UPDATE_SMALLEST_INTERVAL = 10000L;
+
   default Map<String, Double> getReadDataSizeForDisk() {
     return Collections.emptyMap();
   }
diff --git 
a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/LinuxDiskMetricsManager.java
 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/LinuxDiskMetricsManager.java
index 730b3490d44..300dac9ecd8 100644
--- 
a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/LinuxDiskMetricsManager.java
+++ 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/LinuxDiskMetricsManager.java
@@ -33,7 +33,6 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Scanner;
-import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -49,7 +48,7 @@ import java.util.stream.Collectors;
  * system call count, write system call count, byte attempt to read, byte 
attempt to write,
  * cancelled write byte.
  */
-public class LinuxDiskMetricsManager implements IDiskMetricsManager {
+public class LinuxDiskMetricsManager extends AbstractDiskMetricsManager {
   private static final Logger LOGGER = 
LoggerFactory.getLogger(LinuxDiskMetricsManager.class);
 
   @SuppressWarnings("squid:S1075")
@@ -74,34 +73,7 @@ public class LinuxDiskMetricsManager implements 
IDiskMetricsManager {
   private static final int DISK_IO_TOTAL_TIME_OFFSET = 13;
   private static final int DISK_TIME_IN_QUEUE_OFFSET = 14;
   private static final int DEFAULT_SECTOR_SIZE = 512;
-  private static final double BYTES_PER_KB = 1024.0;
-  private static final long UPDATE_SMALLEST_INTERVAL = 10000L;
-  private Set<String> diskIdSet;
   private final Map<String, Integer> diskSectorSizeMap;
-  private long lastUpdateTime = 0L;
-  private long updateInterval = 1L;
-
-  // Disk IO status structure
-  private final Map<String, Long> lastReadOperationCountForDisk;
-  private final Map<String, Long> lastWriteOperationCountForDisk;
-  private final Map<String, Long> lastReadTimeCostForDisk;
-  private final Map<String, Long> lastWriteTimeCostForDisk;
-  private final Map<String, Long> lastMergedReadCountForDisk;
-  private final Map<String, Long> lastMergedWriteCountForDisk;
-  private final Map<String, Long> lastReadSectorCountForDisk;
-  private final Map<String, Long> lastWriteSectorCountForDisk;
-  private final Map<String, Long> lastIoBusyTimeForDisk;
-  private final Map<String, Long> lastTimeInQueueForDisk;
-  private final Map<String, Long> incrementReadOperationCountForDisk;
-  private final Map<String, Long> incrementWriteOperationCountForDisk;
-  private final Map<String, Long> incrementMergedReadOperationCountForDisk;
-  private final Map<String, Long> incrementMergedWriteOperationCountForDisk;
-  private final Map<String, Long> incrementReadTimeCostForDisk;
-  private final Map<String, Long> incrementWriteTimeCostForDisk;
-  private final Map<String, Long> incrementReadSectorCountForDisk;
-  private final Map<String, Long> incrementWriteSectorCountForDisk;
-  private final Map<String, Long> incrementIoBusyTimeForDisk;
-  private final Map<String, Long> incrementTimeInQueueForDisk;
 
   // Process IO status structure
   private long lastReallyReadSizeForProcess = 0L;
@@ -112,33 +84,13 @@ public class LinuxDiskMetricsManager implements 
IDiskMetricsManager {
   private long lastWriteOpsCountForProcess = 0L;
 
   public LinuxDiskMetricsManager() {
+    init();
     processIoStatusPath =
         String.format(
             "/proc/%s/io", 
MetricConfigDescriptor.getInstance().getMetricConfig().getPid());
-    collectDiskId();
     // leave one entry to avoid hashmap resizing
     diskSectorSizeMap = new HashMap<>(diskIdSet.size() + 1, 1);
     collectDiskInfo();
-    lastReadOperationCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    lastWriteOperationCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    lastReadTimeCostForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    lastWriteTimeCostForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    lastMergedReadCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    lastMergedWriteCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    lastReadSectorCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    lastWriteSectorCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    lastIoBusyTimeForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    lastTimeInQueueForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    incrementReadOperationCountForDisk = new HashMap<>(diskIdSet.size() + 1, 
1);
-    incrementWriteOperationCountForDisk = new HashMap<>(diskIdSet.size() + 1, 
1);
-    incrementMergedReadOperationCountForDisk = new HashMap<>(diskIdSet.size() 
+ 1, 1);
-    incrementMergedWriteOperationCountForDisk = new HashMap<>(diskIdSet.size() 
+ 1, 1);
-    incrementReadTimeCostForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    incrementWriteTimeCostForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    incrementReadSectorCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    incrementWriteSectorCountForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    incrementIoBusyTimeForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
-    incrementTimeInQueueForDisk = new HashMap<>(diskIdSet.size() + 1, 1);
   }
 
   @Override
@@ -184,15 +136,6 @@ public class LinuxDiskMetricsManager implements 
IDiskMetricsManager {
     return lastWriteTimeCostForDisk;
   }
 
-  @Override
-  public Map<String, Double> getIoUtilsPercentage() {
-    Map<String, Double> utilsMap = new HashMap<>(diskIdSet.size());
-    for (Map.Entry<String, Long> entry : 
incrementIoBusyTimeForDisk.entrySet()) {
-      utilsMap.put(entry.getKey(), ((double) entry.getValue()) / 
updateInterval);
-    }
-    return utilsMap;
-  }
-
   @Override
   public Map<String, Double> getAvgReadCostTimeOfEachOpsForDisk() {
     Map<String, Double> avgReadTimeCostMap = new HashMap<>(diskIdSet.size());
@@ -318,11 +261,7 @@ public class LinuxDiskMetricsManager implements 
IDiskMetricsManager {
   }
 
   @Override
-  public Set<String> getDiskIds() {
-    return diskIdSet;
-  }
-
-  private void collectDiskId() {
+  protected void collectDiskId() {
     File diskIdFolder = new File(DISK_ID_PATH);
     if (!diskIdFolder.exists()) {
       return;
@@ -355,10 +294,9 @@ public class LinuxDiskMetricsManager implements 
IDiskMetricsManager {
     }
   }
 
-  private void updateInfo() {
-    long currentTime = System.currentTimeMillis();
-    updateInterval = currentTime - lastUpdateTime;
-    lastUpdateTime = currentTime;
+  @Override
+  protected void updateInfo() {
+    super.updateInfo();
     updateDiskInfo();
     updateProcessInfo();
   }
@@ -430,15 +368,7 @@ public class LinuxDiskMetricsManager implements 
IDiskMetricsManager {
       Map<String, Long> lastMap,
       Map<String, Long> incrementMap) {
     long currentValue = Long.parseLong(diskInfo[offset]);
-    if (incrementMap != null) {
-      long lastValue = lastMap.getOrDefault(diskId, 0L);
-      if (lastValue != 0) {
-        incrementMap.put(diskId, currentValue - lastValue);
-      } else {
-        incrementMap.put(diskId, 0L);
-      }
-    }
-    lastMap.put(diskId, currentValue);
+    updateSingleDiskInfo(diskId, currentValue, lastMap, incrementMap);
   }
 
   private void updateProcessInfo() {
@@ -469,10 +399,4 @@ public class LinuxDiskMetricsManager implements 
IDiskMetricsManager {
       LOGGER.error("Meets error while updating process io info", e);
     }
   }
-
-  private void checkUpdate() {
-    if (System.currentTimeMillis() - lastUpdateTime > 
UPDATE_SMALLEST_INTERVAL) {
-      updateInfo();
-    }
-  }
 }
diff --git 
a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/WindowsDiskMetricsManager.java
 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/WindowsDiskMetricsManager.java
index 651d731dc84..b8961bd9b9c 100644
--- 
a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/WindowsDiskMetricsManager.java
+++ 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/disk/WindowsDiskMetricsManager.java
@@ -19,26 +19,172 @@
 
 package org.apache.iotdb.metrics.metricsets.disk;
 
+import oshi.SystemInfo;
+import oshi.hardware.HWDiskStore;
+import oshi.software.os.OSProcess;
+
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
-import oshi.SystemInfo;
+import java.util.stream.Collectors;
 
 /** Disk Metrics Manager for Windows system, not implemented yet. */
-public class WindowsDiskMetricsManager implements IDiskMetricsManager {
+@SuppressWarnings({"rawtypes", "unchecked"})
+public class WindowsDiskMetricsManager extends AbstractDiskMetricsManager {
 
-  private final SystemInfo systemInfo =  new SystemInfo();
+  private final SystemInfo systemInfo = new SystemInfo();
+  private final OSProcess thisProcess;
+  private List<HWDiskStore> diskStores;
+
+  public WindowsDiskMetricsManager() {
+    thisProcess = systemInfo.getOperatingSystem().getCurrentProcess();
+    diskStores = systemInfo.getHardware().getDiskStores();
+    init();
+  }
 
   @Override
   public Map<String, Double> getReadDataSizeForDisk() {
+    checkUpdate();
     Map<String, Double> result = new HashMap<>();
-    systemInfo.getHardware().getDiskStores().forEach(disk -> {
-      result.put(disk.getName(), (double) disk.getReadBytes());
-    });
+    diskStores.forEach(
+        disk -> {
+          result.put(this.getDisplayName(disk), (double) disk.getReadBytes() / 
BYTES_PER_KB);
+        });
     return result;
   }
 
   @Override
   public Map<String, Double> getWriteDataSizeForDisk() {
-    return IDiskMetricsManager.super.getWriteDataSizeForDisk();
+    checkUpdate();
+    Map<String, Double> result = new HashMap<>();
+    diskStores.forEach(
+        disk -> {
+          result.put(this.getDisplayName(disk), (double) disk.getWriteBytes() 
/ BYTES_PER_KB);
+        });
+    return result;
+  }
+
+  @Override
+  public Map<String, Long> getReadOperationCountForDisk() {
+    checkUpdate();
+    Map<String, Long> result = new HashMap<>();
+    diskStores.forEach(
+        disk -> {
+          result.put(this.getDisplayName(disk), disk.getReads());
+        });
+    return result;
+  }
+
+  @Override
+  public Map<String, Long> getWriteOperationCountForDisk() {
+    checkUpdate();
+    Map<String, Long> result = new HashMap<>();
+    diskStores.forEach(
+        disk -> {
+          result.put(this.getDisplayName(disk), disk.getWrites());
+        });
+    return result;
+  }
+
+  private Map<String, Long> getTransferTimesForDisk() {
+    checkUpdate();
+    Map<String, Long> result = new HashMap<>();
+    diskStores.forEach(
+        disk -> {
+          result.put(this.getDisplayName(disk), disk.getTransferTime());
+        });
+    return result;
+  }
+
+  @Override
+  public Map<String, Double> getQueueSizeForDisk() {
+    checkUpdate();
+    Map<String, Double> result = new HashMap<>();
+    diskStores.forEach(
+        disk -> {
+          result.put(this.getDisplayName(disk), (double) 
disk.getCurrentQueueLength());
+        });
+    return result;
+  }
+
+  @Override
+  public double getActualReadDataSizeForProcess() {
+    return thisProcess.getBytesRead() / BYTES_PER_KB;
+  }
+
+  @Override
+  public double getActualWriteDataSizeForProcess() {
+    return thisProcess.getBytesWritten() / BYTES_PER_KB;
+  }
+
+  @Override
+  public Map<String, Double> getAvgSizeOfEachReadForDisk() {
+    checkUpdate();
+    Map<String, Double> result = new 
HashMap<>(incrementReadSizeForDisk.size());
+    for (Map.Entry<String, Long> incrementReadSize : 
incrementReadSizeForDisk.entrySet()) {
+      // use Long.max to avoid NaN
+      long readOpsCount =
+          Long.max(
+              
incrementReadOperationCountForDisk.getOrDefault(incrementReadSize.getKey(), 
1L), 1L);
+      result.put(
+          incrementReadSize.getKey(), ((double) incrementReadSize.getValue()) 
/ readOpsCount);
+    }
+    return result;
+  }
+
+  @Override
+  public Map<String, Double> getAvgSizeOfEachWriteForDisk() {
+    checkUpdate();
+    Map<String, Double> result = new 
HashMap<>(incrementWriteSizeForDisk.size());
+    for (Map.Entry<String, Long> incrementReadSize : 
incrementWriteSizeForDisk.entrySet()) {
+      // use Long.max to avoid NaN
+      long readOpsCount =
+          Long.max(
+              
incrementWriteOperationCountForDisk.getOrDefault(incrementReadSize.getKey(), 
1L), 1L);
+      result.put(
+          incrementReadSize.getKey(), ((double) incrementReadSize.getValue()) 
/ readOpsCount);
+    }
+    return result;
+  }
+
+  protected void updateInfo() {
+    super.updateInfo();
+    updateDiskInfo();
+  }
+
+  private void updateDiskInfo() {
+    diskStores = systemInfo.getHardware().getDiskStores();
+
+    Map[] currentMapArray = {
+      getTransferTimesForDisk(), getReadDataSizeForDisk(), 
getWriteDataSizeForDisk(),
+    };
+    Map[] lastMapArray = {
+      lastIoBusyTimeForDisk, lastReadSizeForDisk, lastWriteSizeForDisk,
+    };
+    Map[] incrementMapArray = {
+      incrementIoBusyTimeForDisk, incrementReadSizeForDisk, 
incrementWriteSizeForDisk,
+    };
+
+    for (int i = 0; i < currentMapArray.length; i++) {
+      Map map = currentMapArray[i];
+      int finalI = i;
+      map.forEach(
+          (key, value) -> {
+            updateSingleDiskInfo(
+                (String) key,
+                ((Number) value).longValue(),
+                lastMapArray[finalI],
+                incrementMapArray[finalI]);
+          });
+    }
+  }
+
+  private String getDisplayName(HWDiskStore disk) {
+    return disk.getName() + "-" + disk.getModel();
+  }
+
+  @Override
+  protected void collectDiskId() {
+    diskIdSet = 
diskStores.stream().map(this::getDisplayName).collect(Collectors.toSet());
   }
 }
diff --git 
a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/net/WindowsNetMetricManager.java
 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/net/WindowsNetMetricManager.java
index c3ecb4b8d50..b8497ec0c16 100644
--- 
a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/net/WindowsNetMetricManager.java
+++ 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/net/WindowsNetMetricManager.java
@@ -19,4 +19,86 @@
 
 package org.apache.iotdb.metrics.metricsets.net;
 
-public class WindowsNetMetricManager implements INetMetricManager {}
+import oshi.SystemInfo;
+import oshi.hardware.NetworkIF;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public class WindowsNetMetricManager implements INetMetricManager {
+  private final SystemInfo systemInfo = new SystemInfo();
+  private final int pid;
+
+  public WindowsNetMetricManager() {
+    this.pid = 
systemInfo.getOperatingSystem().getCurrentProcess().getProcessID();
+  }
+
+  @Override
+  public Map<String, Long> getReceivedByte() {
+    Map<String, Long> result = new HashMap<>();
+    systemInfo
+        .getHardware()
+        .getNetworkIFs()
+        .forEach(
+            (networkIF) -> {
+              result.put(networkIF.getDisplayName(), networkIF.getBytesRecv());
+            });
+    return result;
+  }
+
+  @Override
+  public Map<String, Long> getTransmittedBytes() {
+    Map<String, Long> result = new HashMap<>();
+    systemInfo
+        .getHardware()
+        .getNetworkIFs()
+        .forEach(
+            (networkIF) -> {
+              result.put(networkIF.getDisplayName(), networkIF.getBytesSent());
+            });
+    return result;
+  }
+
+  @Override
+  public Map<String, Long> getReceivedPackets() {
+    Map<String, Long> result = new HashMap<>();
+    systemInfo
+        .getHardware()
+        .getNetworkIFs()
+        .forEach(
+            (networkIF) -> {
+              result.put(networkIF.getDisplayName(), 
networkIF.getPacketsRecv());
+            });
+    return result;
+  }
+
+  @Override
+  public Map<String, Long> getTransmittedPackets() {
+    Map<String, Long> result = new HashMap<>();
+    systemInfo
+        .getHardware()
+        .getNetworkIFs()
+        .forEach(
+            (networkIF) -> {
+              result.put(networkIF.getDisplayName(), 
networkIF.getPacketsSent());
+            });
+    return result;
+  }
+
+  @Override
+  public Set<String> getIfaceSet() {
+    return systemInfo.getHardware().getNetworkIFs().stream()
+        .map(NetworkIF::getDisplayName)
+        .collect(Collectors.toSet());
+  }
+
+  @Override
+  public int getConnectionNum() {
+    return (int)
+        
systemInfo.getOperatingSystem().getInternetProtocolStats().getConnections().stream()
+            .filter(conn -> conn.getowningProcessId() == pid)
+            .count();
+  }
+}

Reply via email to