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<>();
