Skip to content

Conversation

@lxdklp
Copy link
Contributor

@lxdklp lxdklp commented Nov 8, 2025

本pr修复了以下问题:

  1. 中文Windows上部分情况下可能会使用gbk返回信息,增加了utf-8解码失败然后回退gbk解码
截屏2025-11-08 20 38 52 截屏2025-11-08 20 39 07
  1. 修复了powershell脚本的错误
  2. 修复了无法获取网卡信息
  3. 修复了无法获取启动时间
截屏2025-11-08 20 41 08

Warning

本pr已知问题:

1.无法获取温度信息,这个可能要依赖Open Hardware Monitor等来获取,需要安装Open Hardware Monitor才行,至少在我的服务器>上无法仅通过powershell获取温度

Summary by CodeRabbit

  • Bug Fixes

    • More reliable SSH output decoding with encoding fallbacks and clearer contextual error messages.
    • Windows metrics (uptime, network I/O, disk I/O) now use two-sample sampling for more accurate speeds.
    • Improved CPU data validation to avoid mismatched or stale metrics.
  • New Features

    • Windows-specific uptime calculation and clearer CPU core reporting.
  • Improvements

    • PowerShell now emits UTF‑8; SSH operation logs include richer context.
  • Refactor

    • Internal sequence handling for CPU, disk, and network simplified for stability.

@coderabbitai
Copy link

coderabbitai bot commented Nov 8, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Adds SSH-safe execution helpers with UTF‑8/GBK decoding fallbacks, refactors Windows PowerShell command generation and dividers to UTF‑8/WMI variants, and updates parsing and TimeSeq models to support multi-processor CPU data and two-sample network/disk deltas with stronger guards.

Changes

Cohort / File(s) Summary
SSH Safety Infrastructure
lib/core/extension/ssh_client.dart, lib/data/helper/ssh_decoder.dart
Added runSafe and execSafe on SSHClientX and new SSHDecoder utility. Decoding uses UTF‑8 primary with GBK fallback for Windows; encoding helper added. Errors wrapped with contextual messages; per-stream decoding handled.
SSH Usage Updates
lib/data/helper/system_detector.dart, lib/data/provider/server/single.dart
Replaced direct client.run/manual decoding with runSafe/execSafe and SSHDecoder.decode; added contextual logging and stack-trace capture; adjusted empty-result/error handling and logging.
Windows Commands Refactor
lib/data/model/app/scripts/cmd_types.dart, lib/data/model/app/scripts/script_consts.dart
Switched Windows commands to WMI/PowerShell JSON two-sample approaches; added uptime command; inserted [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 into Windows PowerShell header and added getWindowsCmdDivider for Windows-specific separators.
Windows Parsing Refactor
lib/data/model/server/windows_parser.dart, lib/data/model/server/server_status_update_req.dart
Added WindowsCpuResult (cores + coreCount); CPU parsing now handles multi-processor aggregation and produces logical-processor entries plus a synthetic summary; network and disk I/O parsing moved to two-sample delta calculations; uptime handling simplified; inline extractors removed.
TimeSeq / Data Model Changes
lib/data/model/server/time_seq.dart, lib/data/model/server/cpu.dart, lib/data/model/server/disk.dart, lib/data/model/server/net_speed.dart
TimeSeq changed to hold lists and updated signatures (pre/now return lists, update takes list); cpu, disk, and net_speed classes updated to new TimeSeq element types; cpu.onUpdate adds guards resetting state on mismatch.

Sequence Diagram

sequenceDiagram
    participant Caller as Caller (detector/provider)
    participant SSHExt as SSHClientX (runSafe / execSafe)
    participant SSHClient as SSH Client
    participant Decoder as SSHDecoder
    participant Parser as Windows Parser / Provider

    rect rgba(200,230,255,0.6)
    note right of SSHExt: runSafe flow
    Caller->>SSHExt: runSafe(command, systemType?, context?)
    SSHExt->>SSHClient: execute command (bytes)
    SSHClient-->>SSHExt: raw bytes
    SSHExt->>Decoder: decode(bytes, isWindows, context)
    Decoder->>Decoder: try UTF‑8 (allowMalformed)
    alt Windows & replacement chars or failure
        Decoder->>Decoder: fallback GBK
    end
    Decoder-->>SSHExt: decoded string
    SSHExt-->>Caller: decoded string or throw (context)
    end

    rect rgba(220,255,220,0.6)
    note right of SSHExt: execSafe flow (stdout/stderr)
    Caller->>SSHExt: execSafe(callback, entry, systemType?, context?)
    SSHExt->>SSHClient: start exec and collect streams
    SSHClient-->>SSHExt: stdout bytes / stderr bytes
    SSHExt->>Decoder: decode(stdout bytes, isWindows, context + " stdout")
    SSHExt->>Decoder: decode(stderr bytes, isWindows, context + " stderr")
    Decoder-->>SSHExt: decoded stdout / stderr
    SSHExt-->>Caller: (stdout, stderr)
    end

    rect rgba(255,245,210,0.6)
    note right of Parser: Windows data flow
    Caller->>SSHExt: execSafe(uptime/net/disk commands)
    SSHExt->>Decoder: decode outputs
    Decoder-->>Parser: decoded strings
    Parser->>Parser: parse CPU (WindowsCpuResult), net/disk two-sample deltas, uptime
    Parser-->>Caller: structured server status updates
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Areas requiring extra attention:

  • lib/data/model/server/windows_parser.dart — multi-processor aggregation and WindowsCpuResult correctness
  • lib/data/model/server/server_status_update_req.dart — two-sample delta math for network/disk and unit conversions
  • lib/core/extension/ssh_client.dart & lib/data/helper/ssh_decoder.dart — encoding fallback behavior and contextual error wrapping
  • lib/data/model/server/time_seq.dart — new list-based TimeSeq semantics and update/merge algorithm
  • Cross-file type changes where TimeSeq generics and WindowsCpuResult are consumed

Poem

🐇 I hopped in to patch SSH with care,

bytes to words with GBK fallback there.
Windows now sings with WMI light,
cores counted fair, deltas taken right.
A bunny-approved refactor — snug and bright. 🥕

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main objective of this PR: fixing the inability to obtain Windows server information through multiple fixes including GBK encoding fallback, PowerShell script corrections, network adapter retrieval, and uptime detection.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a7c808c and 13bfd3d.

📒 Files selected for processing (6)
  • lib/data/model/app/scripts/cmd_types.dart (3 hunks)
  • lib/data/model/server/cpu.dart (1 hunks)
  • lib/data/model/server/disk.dart (1 hunks)
  • lib/data/model/server/net_speed.dart (1 hunks)
  • lib/data/model/server/server_status_update_req.dart (4 hunks)
  • lib/data/model/server/time_seq.dart (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • lib/data/model/server/cpu.dart
  • lib/data/model/server/net_speed.dart
🧰 Additional context used
📓 Path-based instructions (2)
lib/data/model/**/*.dart

📄 CodeRabbit inference engine (CLAUDE.md)

After modifying annotated model files, run: dart run build_runner build --delete-conflicting-outputs

Files:

  • lib/data/model/server/disk.dart
  • lib/data/model/server/server_status_update_req.dart
  • lib/data/model/server/time_seq.dart
  • lib/data/model/app/scripts/cmd_types.dart
lib/data/model/server/**/*.dart

📄 CodeRabbit inference engine (CLAUDE.md)

Place server management models under lib/data/model/server/

Files:

  • lib/data/model/server/disk.dart
  • lib/data/model/server/server_status_update_req.dart
  • lib/data/model/server/time_seq.dart
🧠 Learnings (1)
📚 Learning: 2025-10-08T09:36:41.682Z
Learnt from: CR
Repo: lollipopkit/flutter_server_box PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-10-08T09:36:41.682Z
Learning: Applies to lib/data/model/server/**/*.dart : Place server management models under lib/data/model/server/

Applied to files:

  • lib/data/model/server/disk.dart
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: check
🔇 Additional comments (12)
lib/data/model/server/disk.dart (1)

283-283: LGTM! Generic signature correctly updated.

The change from TimeSeq<List<DiskIOPiece>> to TimeSeq<DiskIOPiece> aligns with the repository-wide TimeSeq refactor. The constructor and all usages of pre/now throughout the class are consistent with the new signature where TimeSeq<T> extends Fifo<List<T>>.

lib/data/model/server/time_seq.dart (2)

40-50: LGTM! Generic refactor eliminates casting issues.

The updated generic constraint T extends TimeSeqIface<T> with Fifo<List<T>> resolves the runtime cast failures flagged in previous reviews. The constructor and accessors now correctly operate on List<T> throughout, eliminating the need for unsafe casts from List<TimeSeqIface> to concrete types like List<SingleCpuCore>.


58-73: LGTM! Alignment logic preserves historical samples.

The implementation correctly addresses the previous concern about overwriting historical data. When list lengths differ, it:

  • Preserves previous samples that still match current elements via same()
  • Only uses current values for genuinely new elements with no prior data
  • Uses removeAt to ensure each previous sample is matched at most once

This prevents zero deltas and division-by-zero errors in downstream speed calculations while still handling dynamic interface/core additions.

lib/data/model/server/server_status_update_req.dart (4)

381-399: LGTM! Correctly handles WindowsCpuResult structure.

The CPU parsing logic properly destructures cpuResult.cores and cpuResult.coreCount, and the brand mapping extracts unique brand names to associate with the total core count. The deduplication via uniqueBrands set ensures clean brand entries.


439-444: LGTM! Simplified uptime parsing.

Using the pre-formatted uptime string directly from PowerShell eliminates client-side parsing complexity and potential edge cases.


556-589: LGTM! Counter rollovers now handled correctly.

The network parsing no longer uses abs() on deltas. Instead, it computes raw deltas (lines 579-580) and skips samples when either delta is negative (line 581), correctly treating counter resets/rollovers as described in the Windows performance counter documentation. This prevents inflated throughput spikes.


597-649: LGTM! Disk counter rollovers handled correctly.

Similar to network parsing, disk I/O parsing now computes raw deltas (lines 625-626), skips samples with negative deltas (line 627), and avoids abs(). This correctly handles disk counter resets and prevents bogus I/O rate spikes when counters wrap.

lib/data/model/app/scripts/cmd_types.dart (5)

182-185: Good addition for multi-processor support.

Adding NumberOfCores and NumberOfLogicalProcessors provides better CPU topology information for systems with multiple processors.


187-196: LGTM! The ToString escaping is correct.

The uptime command correctly calculates uptime in PowerShell and returns a pre-formatted string, avoiding locale-specific date parsing issues. The ToString('00') syntax is correct for PowerShell within the Dart raw string literal—the past review concern about doubled quotes has been resolved.


299-299: Correct use of Windows-specific divider.

The switch to getWindowsCmdDivider aligns with the Windows-specific formatting requirements and UTF-8 console encoding updates mentioned in the PR objectives.


225-238: Two-sample disk I/O parsing verified.

The parsing code in server_status_update_req.dart (lines 612-625) correctly handles the new two-sample JSON format, extracting DiskReadBytesPersec, DiskWriteBytesPersec, and Timestamp_Sys100NS from both samples with proper type safety and rate calculation.


169-180: Parsing code correctly handles the two-sample format.

The rate calculation in server_status_update_req.dart (lines 566-579) properly extracts BytesReceivedPersec, BytesSentPersec, and Timestamp_Sys100NS from both samples, converts the timestamp delta from 100-nanosecond units to seconds (/ 10000000), and computes network rate deltas correctly. The command output structure aligns perfectly with the parsing expectations.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ffda27d and c7ea1c8.

📒 Files selected for processing (10)
  • lib/core/extension/ssh_client.dart (2 hunks)
  • lib/data/helper/ssh_decoder.dart (1 hunks)
  • lib/data/helper/system_detector.dart (3 hunks)
  • lib/data/model/app/scripts/cmd_types.dart (3 hunks)
  • lib/data/model/app/scripts/script_consts.dart (2 hunks)
  • lib/data/model/server/cpu.dart (1 hunks)
  • lib/data/model/server/server_status_update_req.dart (4 hunks)
  • lib/data/model/server/time_seq.dart (1 hunks)
  • lib/data/model/server/windows_parser.dart (2 hunks)
  • lib/data/provider/server/single.dart (6 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
lib/data/model/**/*.dart

📄 CodeRabbit inference engine (CLAUDE.md)

After modifying annotated model files, run: dart run build_runner build --delete-conflicting-outputs

Files:

  • lib/data/model/server/time_seq.dart
  • lib/data/model/server/cpu.dart
  • lib/data/model/server/windows_parser.dart
  • lib/data/model/server/server_status_update_req.dart
  • lib/data/model/app/scripts/cmd_types.dart
  • lib/data/model/app/scripts/script_consts.dart
lib/data/model/server/**/*.dart

📄 CodeRabbit inference engine (CLAUDE.md)

Place server management models under lib/data/model/server/

Files:

  • lib/data/model/server/time_seq.dart
  • lib/data/model/server/cpu.dart
  • lib/data/model/server/windows_parser.dart
  • lib/data/model/server/server_status_update_req.dart
lib/data/provider/**/*.dart

📄 CodeRabbit inference engine (CLAUDE.md)

Organize Riverpod providers by feature under lib/data/provider/

Files:

  • lib/data/provider/server/single.dart
🧠 Learnings (4)
📚 Learning: 2025-10-08T09:36:41.682Z
Learnt from: CR
Repo: lollipopkit/flutter_server_box PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-10-08T09:36:41.682Z
Learning: Applies to lib/data/model/ssh/**/*.dart : Place SSH models under lib/data/model/ssh/

Applied to files:

  • lib/data/helper/ssh_decoder.dart
  • lib/data/helper/system_detector.dart
  • lib/core/extension/ssh_client.dart
  • lib/data/provider/server/single.dart
📚 Learning: 2025-10-08T09:36:41.682Z
Learnt from: CR
Repo: lollipopkit/flutter_server_box PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-10-08T09:36:41.682Z
Learning: Applies to lib/data/model/sftp/**/*.dart : Place SFTP models under lib/data/model/sftp/

Applied to files:

  • lib/data/helper/ssh_decoder.dart
  • lib/data/helper/system_detector.dart
  • lib/core/extension/ssh_client.dart
  • lib/data/provider/server/single.dart
📚 Learning: 2025-10-08T09:36:41.682Z
Learnt from: CR
Repo: lollipopkit/flutter_server_box PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-10-08T09:36:41.682Z
Learning: Applies to lib/data/model/server/**/*.dart : Place server management models under lib/data/model/server/

Applied to files:

  • lib/data/helper/system_detector.dart
  • lib/core/extension/ssh_client.dart
  • lib/data/provider/server/single.dart
📚 Learning: 2025-10-08T09:36:41.682Z
Learnt from: CR
Repo: lollipopkit/flutter_server_box PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-10-08T09:36:41.682Z
Learning: Applies to lib/view/**/*.dart : Prefer widgets/utilities from fl_lib for common UI (e.g., CustomAppBar, context.showRoundDialog, Input, Btnx.cancelOk)

Applied to files:

  • lib/core/extension/ssh_client.dart
🔇 Additional comments (7)
lib/data/model/server/time_seq.dart (1)

59-70: Data loss confirmed: pre is replaced with empty list when sizeDiff > 1, discarding historical state information.

When 2+ items are added or removed (sizeDiff > 1), the code replaces _list[length - 2] with an empty list. Tracing through an example:

  • If pre = [device_A, device_B] and now = [device_A, device_B, device_C, device_D] (2 devices added)
  • Result: _list[length - 2] becomes [], losing the record that A and B existed previously
  • The alternate branch (sizeDiff ≤ 1) would reconcile and preserve this information

The threshold of sizeDiff > 1 is not documented. Why should a single item change be reconciled while 2+ changes result in data erasure? This distinction needs clarification.

Type safety issues confirmed:

  • Line 64: <TimeSeqIface>[] as T and line 69: newPre as T use unsafe casts when T is a more specific list type

Verify the following with the developer:

  1. Is the empty-list replacement intentional when multiple items change, or is this a bug?
  2. What is the business rationale for the sizeDiff > 1 threshold?
  3. In the context of network adapters (NetSpeed), CPU cores (Cpus), or disk I/O (DiskIO), when does this trigger and why is historical data loss acceptable?
lib/data/model/app/scripts/script_consts.dart (2)

32-33: LGTM! Windows-specific divider method is well implemented.

The method correctly uses Write-Host for PowerShell output and maintains consistent formatting with the existing getCmdDivider method.


108-108: Excellent fix for Chinese Windows encoding issues.

Setting the console output encoding to UTF-8 directly addresses the PR objective of handling Chinese Windows environments where outputs may be returned in GBK encoding.

lib/data/model/app/scripts/cmd_types.dart (4)

169-180: Correct use of two-sample approach for performance counters.

The change to WMI-based performance counters with two samples is the proper way to calculate network rates, as these are cumulative counters. The timestamps will allow accurate rate calculation on the client side.

Note: The 1-second sleep will add to overall script execution time. Since both net and diskio commands use this pattern, the total additional latency will be at least 2 seconds if executed sequentially.


184-185: Good addition of core count information.

Adding NumberOfCores and NumberOfLogicalProcessors provides useful CPU topology information and aligns with the PR's goal of improving Windows data collection.


227-240: Consistent two-sample approach for disk I/O counters.

The implementation correctly mirrors the network command's two-sample pattern for cumulative performance counters. This ensures accurate disk I/O rate calculations.


301-301: Correct use of Windows-specific divider.

The change to getWindowsCmdDivider ensures Windows commands use PowerShell's Write-Host instead of echo, maintaining proper command formatting for Windows environments.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c7ea1c8 and a7c808c.

📒 Files selected for processing (6)
  • lib/data/model/app/scripts/cmd_types.dart (3 hunks)
  • lib/data/model/server/cpu.dart (1 hunks)
  • lib/data/model/server/disk.dart (1 hunks)
  • lib/data/model/server/net_speed.dart (1 hunks)
  • lib/data/model/server/server_status_update_req.dart (4 hunks)
  • lib/data/model/server/time_seq.dart (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
lib/data/model/**/*.dart

📄 CodeRabbit inference engine (CLAUDE.md)

After modifying annotated model files, run: dart run build_runner build --delete-conflicting-outputs

Files:

  • lib/data/model/server/disk.dart
  • lib/data/model/server/cpu.dart
  • lib/data/model/server/time_seq.dart
  • lib/data/model/app/scripts/cmd_types.dart
  • lib/data/model/server/net_speed.dart
  • lib/data/model/server/server_status_update_req.dart
lib/data/model/server/**/*.dart

📄 CodeRabbit inference engine (CLAUDE.md)

Place server management models under lib/data/model/server/

Files:

  • lib/data/model/server/disk.dart
  • lib/data/model/server/cpu.dart
  • lib/data/model/server/time_seq.dart
  • lib/data/model/server/net_speed.dart
  • lib/data/model/server/server_status_update_req.dart
🧠 Learnings (1)
📚 Learning: 2025-10-08T09:36:41.682Z
Learnt from: CR
Repo: lollipopkit/flutter_server_box PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-10-08T09:36:41.682Z
Learning: Applies to lib/data/model/server/**/*.dart : Place server management models under lib/data/model/server/

Applied to files:

  • lib/data/model/server/net_speed.dart
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: check
🔇 Additional comments (5)
lib/data/model/app/scripts/cmd_types.dart (5)

187-196: LGTM! Past review concern has been addressed.

The uptime calculation correctly uses ToString('00') with single quotes. In PowerShell, single quotes inside double-quoted strings within $(...) subexpressions are literal and don't require escaping, so this syntax is correct.

The approach of pre-formatting the uptime string in PowerShell avoids the date format parsing issues mentioned in the PR objectives.


299-299: Appropriate use of Windows-specific divider.

The switch to getWindowsCmdDivider aligns with the PR's goal of handling Windows-specific encoding requirements (UTF-8/GBK fallback). This separation enables Windows commands to have different divider formatting or encoding handling compared to Linux/BSD.


225-238: Parsing implementation verified and correct.

The disk I/O parsing in _parseWindowsDiskIO (lib/data/model/server/server_status_update_req.dart:597) correctly handles:

  • Nested JSON structure: extracts the last 2 samples from the array, unwraps the optional 'value' wrapper
  • Delta calculations: computes readDelta = read2 - read1 and writeDelta = write2 - write1 for cumulative counters
  • Rate calculation: converts Timestamp_Sys100NS by dividing by 10,000,000 to get seconds, then uses timeDelta for accurate rates
  • Validation: ensures timeDelta > 0 and deltas are non-negative before creating DiskIOPiece entries

182-185: Parsing logic already handles both single and multiple CPU objects.

Verification of WindowsParser.parseCpu() in lib/data/model/server/windows_parser.dart confirms the method correctly handles both scenarios:

  • Array case (line 111): Explicitly checks if (jsonData is List) for multiple physical processors
  • Single object case (line 156): Explicitly checks else if (jsonData is Map) for single processor

Both branches properly extract and use the new NumberOfCores and NumberOfLogicalProcessors fields (lines 119-120 and 159-160). The implementation distributes load evenly across logical processors and maintains cumulative counters as documented in the comments.


169-180: Well-structured two-sample network I/O collection with robust parsing.

The WMI-based approach with two samples taken 1 second apart enables accurate network rate calculations. The parsing implementation at _parseWindowsNetwork() correctly:

  • Extracts the 2 most recent samples from the JSON array
  • Handles nested structures and validates sample alignment
  • Computes rate deltas between samples
  • Converts Timestamp_Sys100NS (100-nanosecond units) to seconds with proper divisor (10,000,000)
  • Filters out invalid entries (_Total, empty names) and negative deltas

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant