Skip to content

feat(activity-monitor): ディスク I/O とネットワーク I/O を追加する (ADR-0048)#59

Open
yahir0 wants to merge 2 commits into
mainfrom
feat/activity-monitor-disk-network-io
Open

feat(activity-monitor): ディスク I/O とネットワーク I/O を追加する (ADR-0048)#59
yahir0 wants to merge 2 commits into
mainfrom
feat/activity-monitor-disk-network-io

Conversation

@yahir0
Copy link
Copy Markdown
Owner

@yahir0 yahir0 commented May 21, 2026

Summary

トップバーのアクティビティモニタを CPU / メモリ / ディスク I/O / ネットワーク I/O の 4 連ゲージに拡張します。クリックで各指標の上位プロセス一覧をポップオーバー表示します。

  • システム全体のレート: ネイティブから累積カウンタを取得し、ViewModel が前回 snapshot との差分 ÷ 経過秒で B/s を計算
  • 上位プロセス: ディスクは `proc_pid_rusage` を 1 秒 2 サンプリング、ネットワークは `nettop -P -L 2 -s 1 -x` の 2 サンプル差分から rate を算出
  • バー表示は対数スケール(1 KB/s → 1 GB/s を 0–100%)、readout は人間可読単位(B/s / KB/s / MB/s / GB/s)

設計の詳細は ADR-0048 と `openspec/changes/extend-activity-monitor-io/` を参照。

構成変更

  • Native (Swift): `MainFlutterWindow.swift` の `SystemMetricsProvider` に IOKit / getifaddrs / proc_pid_rusage / nettop の 4 経路を追加。`getSystemMetrics` / `getTopProcesses` ハンドラを拡張
  • Dart data 層: `SystemMetrics` に累積カウンタ、新規 `SystemMetricsSnapshot`(累積+計算済みレート)、`ProcessMetrics` に `ioBytesPerSec`、`ProcessSortKey` に `disk` / `network`、Repository の `fetchProcesses` を `ProcessSortKey` 引数付きへ
  • ViewModel: 前回値保持で rate 計算 (`_composeSnapshot`)。累積が減少したケースは 0 として扱う
  • UI: `ActivityMonitorBar` を 4 連化、新規 `IoRateFormat` で人間可読単位+対数スケール、ポップオーバーは disk/network のとき I/O 1 列レイアウトに切替
  • l10n: JA/EN に Disk/Network のツールチップ・ポップオーバー見出し・列ラベルを追加

コミット構成

  1. `chore(format)`: 既存ファイルに対する `dart format` の再フォーマット(短い式の 1 行化)。本機能とは無関係
  2. `feat(activity-monitor)`: 本機能の追加 (ADR-0048)

Test plan

  • `fvm dart analyze` クリーン
  • `fvm dart format` クリーン
  • `fvm flutter test`(289 件)すべて pass
  • `fvm flutter build macos --debug` 成功
  • 実機(macOS)で 4 つのゲージが表示・更新されること
  • CPU / メモリ ポップオーバーが従来どおり開閉できること
  • ディスク / ネットワーク ポップオーバーを開くと約 1 秒待った後に上位プロセスが表示されること
  • バーの対数スケールがファイルコピー(ディスク)・大きいダウンロード(ネットワーク)でしっかり伸びること
  • 4 ポップオーバー間で排他切り替えが機能すること
  • 外側クリックでポップオーバーが閉じること

🤖 Generated with Claude Code

yahir0 added 2 commits May 21, 2026 23:27
`fvm dart format` を走らせたところ、近隣ファイルに format 差分があったため
合わせて適用する。`EdgeInsets.fromLTRB(...)` などの短い式が 1 行にまとめ
られるのが主。アクティビティモニタへのディスク/ネットワーク I/O 追加 PR の
副作用として発生した。
ADR-0039 で CPU/メモリの 2 指標だったアクティビティモニタを 4 連ゲージに
拡張し、ディスク I/O とネットワーク I/O のシステム全体レート + 上位プロセス
一覧を表示する。

- ネイティブ (Swift)
  - IOKit `IOBlockStorageDriver` 統計でディスク累積バイト (read/write) を
    合計する `diskIOCounters()` を追加。
  - `getifaddrs` の `if_data` でネットワーク累積バイト (in/out) を loopback
    除外で合計する `networkIOCounters()` を追加。
  - `getSystemMetrics` の戻り値を累積カウンタ込みに拡張。
  - per-process ディスクは `proc_pid_rusage(RUSAGE_INFO_V2)` を 1 秒 2 サン
    プリングして差分から rate を算出 (`diskTopProcesses`)。
  - per-process ネットワークは `nettop -P -L 2 -s 1 -x -J bytes_in,bytes_out`
    をサブプロセス実行して 2 サンプル差分から rate を算出
    (`networkTopProcesses`)。
  - `getTopProcesses` を `sortKey: cpu/memory/disk/network` で経路分岐。

- Dart 側
  - `SystemMetrics` に累積カウンタを 4 つ追加。
  - 新規 `SystemMetricsSnapshot` で「累積カウンタ + 計算済みレート」を保持。
  - `ActivityMonitorViewModel` が前回 snapshot との差分 ÷ 経過秒で
    `diskBytesPerSec` / `networkBytesPerSec` を計算 (ADR-0048 D4)。累積が
    減ったケースは 0 として扱う。
  - `ProcessMetrics` に `ioBytesPerSec` を追加、`ProcessSortKey` に `disk` /
    `network` を追加。
  - Repository の `fetchProcesses` を `ProcessSortKey` 引数付きに変更し、
    ネイティブに `sortKey` を渡す。

- UI
  - `ActivityMonitorBar` を 4 連ゲージ化、`_ActivityGauge` の readout 幅を
    `999 MB/s` に合わせて 60px に拡張。
  - 新規 `IoRateFormat` で人間可読単位 (`B/s` / `KB/s` / `MB/s` / `GB/s`)
    と対数スケール (`1 KB/s → 1 GB/s` を 0–100%) を提供。
  - ポップオーバーは disk/network のとき I/O 列 1 つにレイアウト切替。

- l10n
  - `activityMonitorDiskTooltip` / `activityMonitorNetworkTooltip` /
    `activityMonitorDiskPopoverTitle` / `activityMonitorNetworkPopoverTitle`
    / `activityMonitorColumnIo` を JA/EN に追加。

- テスト / ドキュメント
  - リポジトリ・ViewModel・バー・フォーマッタにテストを追加。
  - ADR-0048 と OpenSpec change (extend-activity-monitor-io) を追加。
  - CLAUDE.md / docs/adr/README.md に ADR-0048 を 1 行追記。
@yahir0
Copy link
Copy Markdown
Owner Author

yahir0 commented May 21, 2026

触ったらクラッシュするのと、デザインがそもそも微妙なので採用するかは保留する。

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