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

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

commit cfd7a8ddae1864ee2b5f6b4d40bb6b3d10306919
Author: HTHou <[email protected]>
AuthorDate: Thu Mar 12 16:35:23 2026 +0800

    Fix Windows disk metric parsing
---
 .../metricsets/disk/WindowsDiskMetricsManager.java | 36 +++++++++++++---------
 1 file changed, 21 insertions(+), 15 deletions(-)

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 09a179e00a5..1dff6146da1 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
@@ -56,23 +56,25 @@ public class WindowsDiskMetricsManager implements 
IDiskMetricsManager {
       "Get-CimInstance Win32_PerfFormattedData_PerfDisk_PhysicalDisk | "
           + "Where-Object { $_.Name -ne '_Total' } | "
           + "ForEach-Object { "
-          + "\"$($_.Name)$([char]9)"
-          + "$($_.DiskReadsPerSec)$([char]9)"
-          + "$($_.DiskWritesPerSec)$([char]9)"
-          + "$($_.DiskReadBytesPerSec)$([char]9)"
-          + "$($_.DiskWriteBytesPerSec)$([char]9)"
-          + "$($_.AvgDisksecPerRead)$([char]9)"
-          + "$($_.AvgDisksecPerWrite)$([char]9)"
-          + "$($_.PercentDiskTime)$([char]9)"
-          + "$($_.AvgDiskQueueLength)\" }";
+          + "[string]::Concat("
+          + "$_.Name, [char]9, "
+          + "$_.DiskReadsPerSec, [char]9, "
+          + "$_.DiskWritesPerSec, [char]9, "
+          + "$_.DiskReadBytesPerSec, [char]9, "
+          + "$_.DiskWriteBytesPerSec, [char]9, "
+          + "$_.AvgDisksecPerRead, [char]9, "
+          + "$_.AvgDisksecPerWrite, [char]9, "
+          + "$_.PercentIdleTime, [char]9, "
+          + "$_.AvgDiskQueueLength) }";
   private static final String PROCESS_QUERY_TEMPLATE =
       "Get-CimInstance Win32_PerfFormattedData_PerfProc_Process | "
           + "Where-Object { $_.IDProcess -eq %s } | "
           + "ForEach-Object { "
-          + "\"$($_.IOReadOperationsPerSec)$([char]9)"
-          + "$($_.IOWriteOperationsPerSec)$([char]9)"
-          + "$($_.IOReadBytesPerSec)$([char]9)"
-          + "$($_.IOWriteBytesPerSec)\" }";
+          + "[string]::Concat("
+          + "$_.IOReadOperationsPerSec, [char]9, "
+          + "$_.IOWriteOperationsPerSec, [char]9, "
+          + "$_.IOReadBytesPerSec, [char]9, "
+          + "$_.IOWriteBytesPerSec) }";
 
   private final String processId;
   private final Set<String> diskIdSet = new HashSet<>();
@@ -276,7 +278,7 @@ public class WindowsDiskMetricsManager implements 
IDiskMetricsManager {
       long writeBytesPerSec = parseLong(diskInfo[3]);
       double avgDiskSecPerRead = parseDouble(diskInfo[4]);
       double avgDiskSecPerWrite = parseDouble(diskInfo[5]);
-      double percentDiskTime = parseDouble(diskInfo[6]);
+      double percentIdleTime = parseDouble(diskInfo[6]);
       double avgDiskQueueLength = parseDouble(diskInfo[7]);
 
       long intervalMillis = updateInterval;
@@ -306,7 +308,7 @@ public class WindowsDiskMetricsManager implements 
IDiskMetricsManager {
               avgDiskSecPerWrite,
               writeOpsPerSec,
               intervalMillis));
-      lastIoUtilsPercentageForDisk.put(diskId, percentDiskTime / 100.0);
+      lastIoUtilsPercentageForDisk.put(diskId, clampPercentage(1.0 - 
percentIdleTime / 100.0));
       lastQueueSizeForDisk.put(diskId, avgDiskQueueLength);
       lastAvgReadCostTimeOfEachOpsForDisk.put(diskId, avgDiskSecPerRead * 
1000.0);
       lastAvgWriteCostTimeOfEachOpsForDisk.put(diskId, avgDiskSecPerWrite * 
1000.0);
@@ -427,6 +429,10 @@ public class WindowsDiskMetricsManager implements 
IDiskMetricsManager {
     }
   }
 
+  private double clampPercentage(double value) {
+    return Math.max(0.0, Math.min(1.0, value));
+  }
+
   private List<String> executePowerShell(String command) {
     List<String> result = new ArrayList<>();
     List<String> rawOutput = new ArrayList<>();

Reply via email to