reSARch

reSARch

sysstat の sa バイナリを単体で解析する CLI。異変の検知、SVG グラフ、sar / sadf 互換出力を、Linux・macOS・Windows のどれでも実行できます

対応プラットフォーム

Linux macOS Windows

CI Release License

English | 日本語

--- Linux で採取した `sa` ファイルを、手元の PC で調べるためのツールです。解析する PC に `sar` / `sadf` をインストールする必要はありません。 `sar` のログ (`/var/log/sa/saXX`) は C 構造体をそのまま書き出した形式で、読むには通常、互換性のある世代・アーキテクチャの sysstat が必要です。reSARch は対応形式のバイト列を直接読み、構造体の配置をファイルを書いたホストの ABI に合わせて解釈します。設計の要点は [docs/architecture.ja.md](docs/architecture.ja.md) にあります。 ## 機能 - **sar / sadf 互換の出力**: 本家 sysstat 12.8.0 の書式によるテキスト・JSON・CSV・XML。再起動とコメントのレコードも出力。`--sar-profile` で RHEL / CentOS 7 の `sar` の書式にも切り替え可能 - **TUI**: 記録されたすべての activity を端末上の表とグラフで閲覧 - **分析**: 異変の検知、期間集計、複数ホストの比較、検知した箇所の SVG グラフ - **登録済み 28 形式**: sysstat 2.2 から 12.8 系までの読み取り。big-endian・32 bit のホストが書いたファイルにも対応 ([旧形式の制限](docs/formats.ja.md)あり) - **採取と検証**: 各ディストリビューションのパッケージと sysstat 公式リリースのイメージによる自動採取・検証 ([出力の検証方法](docs/verification.ja.md)) ## 動作環境 Linux 上の sysstat で採取した `sa` ファイルを用意してください。reSARch は保存済みのファイルを解析します。新しく採取する場合は、Linux 上の sysstat か同梱の[採取スクリプト](docs/development.ja.md#実際の-sa-ファイルを採取する)を使います。TUI には対話端末が必要です。 ## インストール ### Homebrew (macOS/Linux) ```bash brew install owayo/re-sar-ch/re-sar-ch ``` ### winget (Windows) ```powershell winget install owayo.reSARch ``` ### Cargo Rust 1.98 以上が必要です。 ```bash cargo install --git https://github.com/owayo/re-sar-ch --bin resarch --locked ``` ### GitHub Releases から [Releases](https://github.com/owayo/re-sar-ch/releases/latest) から自分の環境のアーカイブを取得して展開し、`resarch` を `PATH` の通った場所に置きます。各リリースには、取得したファイルを確かめるための `SHA256SUMS` も添付しています。 | プラットフォーム | ファイル | |---|---| | Linux (x86_64) | `resarch-x86_64-unknown-linux-gnu.tar.gz` | | Linux (x86_64, musl) | `resarch-x86_64-unknown-linux-musl.tar.gz` | | Linux (ARM64) | `resarch-aarch64-unknown-linux-gnu.tar.gz` | | macOS (Intel) | `resarch-x86_64-apple-darwin.tar.gz` | | macOS (Apple Silicon) | `resarch-aarch64-apple-darwin.tar.gz` | | Windows (x86_64) | `resarch-x86_64-pc-windows-msvc.zip` | macOS でブラウザから取得した場合は、実行の前に隔離属性を外します: `xattr -d com.apple.quarantine resarch`。 ### ソースから [mise](https://mise.jdx.dev/) が必要です (Rust のツールチェーンは `mise.toml` で固定しています)。 ```bash git clone https://github.com/owayo/re-sar-ch.git cd re-sar-ch make install ``` `make install` は `/usr/local/bin` に入れます。場所を変えるときは `INSTALL_PATH` を指定します (例: `make install INSTALL_PATH="$HOME/.local/bin"`)。 `make install` は、Claude Code と Codex 向けの resarch スキルも `~/.claude/skills/resarch` と `~/.codex/skills/resarch` に書き出します。`make install SKILL_TARGETS=` とするとスキルを入れず、`make install-bin` はバイナリだけを入れます。ほかの方法で入れた場合は、`resarch skill-install` でスキルを書き出します ([AI エージェントから使う](#ai-エージェントから使う))。 winget でインストールすると、`PATH` への登録も自動で行われます。インストール後は、変更を反映するために新しいターミナルを開いてください。 ## クイックスタート インストール後、`sa01` を手元のファイルのパスに置き換えて実行します。Linux 以外で解析する場合は、採取元からファイルをコピーしてください。 ```bash resarch info sa01 # ファイルの形式と記録項目を確認 resarch -u -f sa01 # CPU 使用率を表示 resarch detect sa01 # 調査する時刻と指標の候補を表示 ``` 記録された統計の種類 (CPU、メモリなど) を **activity**、CPU やデバイスなど個々の対象を **item** と呼びます。コマンドやオプションは `resarch --help`、`resarch detect --help` で確認できます。 ## 使い方 ### `sar` と同じ引数で使う サブコマンドを省略すると、`sar` 互換の引数で保存済みファイルを読み取ります。出力は、入力ファイルの世代によらず sysstat 12.8.0 の書式です。 ```bash resarch -u -f sa01 # CPU 使用率 resarch -r -f sa01 # メモリ resarch -n DEV,EDEV -f sa01 # ネットワークインターフェース resarch -u -P ALL -s 09:00:00 -e 18:00:00 -f sa01 resarch sar -A -f sa01 # sar 互換コマンド resarch sadf -j sa01 # sadf 互換 JSON resarch sadf -g sa01 600 12 -- -u > cpu.svg # 起動区間ごとに CPU を最大12点描画 resarch --sar-profile sysstat-10.1.5-el7 -u -f sa01 # RHEL/CentOS 7 の sar と同じ出力 ``` 本家の癖もそのまま再現します。`-I` には数値を直接渡せず、`-P ALL` と `-P all` は区別され、`-h` はヘルプではなく `--pretty --human` の意味です。`-s` に一致した最初のレコードは差分計算の基準になり、表示されません。対応するオプション、出力プロファイル、`sar` が参照する環境変数は [docs/compatibility.ja.md](docs/compatibility.ja.md) にまとめています。 ### sa バイナリを sar テキストへ保存する ```bash resarch sa2sar sa13 -o sar13 # 全項目・平均・再起動・コメントを保存 resarch sa2sar sa13 --utc -o sar13-utc # UTC の時刻で保存 resarch sa2sar sa13 --sar-profile sysstat-10.1.5-el7 -o sar13 # RHEL/CentOS 7 の sa2 が書くテキスト ``` 既定は `sar -A -C -t -f sa13` 相当で、採取元のホストが記録した時刻を使います。`-o` を省略するか `-o -` を指定すると標準出力へ書き出します。保存先に既存のファイルがあっても上書きせず、変換に失敗した場合も書きかけのファイルを残しません。 el7 の `sa2sar` 出力を保存済みの `sar` テキストとバイト単位で比べるときは、日付の設定を揃えてください。保存済みテキストの先頭行が `YYYY-MM-DD` なら `S_TIME_FORMAT=ISO` を指定します。変わるのは先頭行の日付だけで、統計値は変わりません。 ### 独自のサブコマンド ```bash resarch identify sa01 sa02 # どの sysstat が書いたファイルか resarch info sa01 # 世代・ABI・activity 一覧 resarch show sa01 --activity cpu,disk --format table resarch show sa01 --format ndjson # エージェントやパイプラインへ流すとき resarch summarize sa01 sa02 sa03 --from 09:00 --to 18:00 # 各日のローカル 9〜18 時を集計 resarch compare --host app1=app1/sa01 --host app2=app2/sa01 ``` 独自サブコマンドは時刻を実行環境のローカルタイムゾーンで表示し、`--from` / `--to` の `hh:mm[:ss]` も同じタイムゾーンで解釈します。基準は `--timezone ` (`local` / `utc` / `Asia/Tokyo` のような IANA 名) で変えられます。`summarize` と `compare` の `--from` / `--to` は、集計期間そのものを絞ります。 日内の範囲はファイル内の各日に適用し、窓へ入り直す最初のサンプルを差分の基準にします。夏時間で同じ時刻の窓が繰り返される場合も同じです。`summarize` / `compare` の形式は `--format table` / `json` / `ndjson` です。`show` の互換形式では `--timezone` / `--utc` を外してください。`sar` はローカル時刻、`sadf-*` は UTC で表示と絞り込みを行います。 ### 異変の当たりを付ける ```bash resarch detect sa01 # いつ・何に異変があったか resarch detect sa01 --verbose # 検出ごとの内訳と考えられる解釈まで出す resarch detect sa13 --svg-dir charts # 検知した箇所を SVG で保存 ``` `resarch detect` は、何を探せばよいか分からなくても、調査の手がかりになる時刻と指標を報告します。値の意味に基づく固定条件、入力ファイルの中央値とばらつき (MAD) からの逸脱、前後の時間窓の水準差を調べ、条件に当たった箇所をエピソードにまとめます。確信度のパーセントは出さず、比較基準そのものが疑わしいときはそう明記し、評価できなかった系列も理由とともに列挙します。報告は日本語と英語で出せます (`--lang`)。 ### 対話的に閲覧する (TUI) ```bash resarch tui sa01 resarch tui sa01 --activity cpu,disk,memory # activity を絞って開く ``` 収録されている activity がタブになり、選んだ item の時系列を表とグラフで読めます。`?` でキー操作の一覧が出ます。通常画面で `Esc` を押すと終了します。`—` は値が無いことを表し、0 ではありません。欠測のところではグラフの線も切れます。MEMORY タブでは、メモリ使用率の 3 つの見積もり (buffers/cache を除く・MemAvailable 基準・buffers/cache を含む) を 1 つのグラフで比べられます。読み方は [docs/usage.ja.md](docs/usage.ja.md#メモリの使用量をどう読むか) にあります。 ![メモリ使用状況を時系列グラフと表で表示した TUI](docs/images/tui.png) 画像は以前の版の画面です。現在は `Esc` で終了し (画像の表示は `q`)、MEMORY タブを開くと使用率を比べる 3 本の線が出ます (画像は `kbmemfree` の 1 本)。 `tui --lenient` で切断された入力を開くと、完全な先行サンプルを保持し、画面に不完全な入力と明示して非ゼロで終了します。独自出力では、経過時間が正でないカウンタのレートは値なし (`non_positive_elapsed`) になり、ゲージの瞬時値は保持されます。 item・列選択画面は、端末を縮めた場合も現在の画面サイズに収まります。極端な有限値は描画座標を縮尺変換し、軸の目盛は元の単位で示します。独自出力の NaN・無限大は `not_finite` とし、派生値は値なし、生値の文字列は保持します。 ### コマンド一覧 | 目的 | コマンド | |---|---| | `sar` 互換の表示 | `resarch sar` (サブコマンド省略可) | | `sadf` 互換の出力・旧形式の変換 | `resarch sadf` | | 全項目の `sar` テキストを保存 | `resarch sa2sar` | | 表や JSON などで閲覧 | `resarch show` | | 端末で対話的に閲覧 | `resarch tui` | | 異変を検知 | `resarch detect` | | 指標と検知を HTML で対話的に確認 | `resarch report sa01 -o report.html` | | 期間を集計 | `resarch summarize` | | 複数ホストを比較 | `resarch compare` | | ヘッダと記録項目を確認 | `resarch info` | | 生成元の sysstat を判別 | `resarch identify` | | AI エージェント向けスキルを配置 | `resarch skill-install` | 各コマンドの末尾に `--help` を付けるとオプションを確認できます (`sar` 互換コマンドは `resarch sar --help`)。TUI のキー操作、`detect` の報告、SVG グラフ、旧形式の変換など、各コマンドの詳細は [docs/usage.ja.md](docs/usage.ja.md) にあります。 ## AI エージェントから使う `resarch` は自分のコマンドを説明するスキルを同梱しています。エージェントが「いつ使うか」と、それ以上に「**返ってきたものをどう読むか**」を知るためのものです。 ```bash resarch skill-install claude # ~/.claude/skills/resarch/SKILL.md resarch skill-install codex # ~/.codex/skills/resarch/SKILL.md ``` スキル本文はバイナリに埋め込んであるので、リリースバイナリを 1 本置くだけで完結します (チェックアウトもネットワークも要りません)。スキルの大半は `detect` の出力をどう読むかの説明で、エージェントが検知結果から過度な結論を導かないようにしています。**独自出力の空の値は 0 を意味しない**ことや、`--from` / `--to` がサブコマンドごとに何を絞るのかも明記しています。 ## 対応形式 登録済みの 28 種類の形式識別値すべてに対応しています。範囲は sysstat 2.2 (`0x015d`) から 12.8 系 (`0x2175`) までで、Red Hat のベンダー派生 `0x1170` や、big-endian・32 bit のホストが書いたファイルも読めます。登録済み全形式への対応と、歴史上の全リリースの検証完了は別の話で、旧形式には項目と ABI の制限があります。詳しくは [docs/formats.ja.md](docs/formats.ja.md) を参照してください。 ## 出力の正確さをどう検証しているか 本家 `sysstat` がテストスイートに持っている期待出力を、全件・1 行ずつ reSARch の出力と突き合わせています。対象は 21 ケースです。 | 比較結果 | 件数 | |---|---:| | 全文一致 | 16 | | マスクして一致 | 4 | | 不一致 | 0 | | 比較不能 | 1 | マスクしている 4 件で伏せているのは、`A_DISK` のデバイス名の列だけです。本家はこの名前を、読んだホストの `/dev` / `/sys` で解決するためです。このほか、sysstat 公式リリース 181 版、ディストリビューションのパッケージ 5 種類、CentOS の RPM 11 リリースで `sa` ファイルを採取しました。どれも末尾まで読み切れることを確かめています。詳細と各表記の意味は [docs/verification.ja.md](docs/verification.ja.md) を参照してください。 ## 開発 [mise](https://mise.jdx.dev/) が必要です。ツールの版は `mise.toml` で固定しています。 ```bash make setup # ツールチェーン (mise) と依存を取得する make ci # CI と同じ検査 (書き換えない) ``` | コマンド | 説明 | |---|---| | `make setup` | ツールチェーン (mise) と依存を取得する | | `make build` | デバッグ版をビルドする | | `make release` | リリース版をビルドする | | `make run` | デバッグ版を実行する (引数は ARGS="...") | | `make test` | テストを実行する | | `make lint` | clippy を警告ゼロで通す | | `make fmt` | コードを整形する (書き換える) | | `make fmt-check` | 整形済みかを確かめる (書き換えない) | | `make check` | 整形と静的検査 (書き換えない) | | `make ci` | CI と同じ検査 (書き換えない) | | `make install` | リリース版を INSTALL_PATH (既定 /usr/local/bin) に入れる | | `make uninstall` | INSTALL_PATH から取り除く | | `make clean` | ビルド成果物を消す | `make` でターゲットの一覧を表示します。リリースは GitHub Actions で行います (**Actions → Release → Run workflow**)。 mise を使わない場合は `SYSTEM_TOOLS=1` を付けると PATH 上のツールを使います。その場合、版が CI と一致するとは限りません。本家のデータを使う適合テスト、読み書きの境界テスト、保存済み `sar` テキストとの照合、採取とリリースの手順は [docs/development.ja.md](docs/development.ja.md) にあります。 変更履歴は [CHANGELOG.md](CHANGELOG.md) を参照してください。不具合は [GitHub Issues](https://github.com/owayo/re-sar-ch/issues) へ、`resarch --version` の結果、実行コマンド、エラー内容を添えて報告してください。 ## ライセンス [MIT](LICENSE) 本家 sysstat は GPL なので、そのテストデータも期待出力もこのリポジトリには同梱していません。`make fixtures` が適合テストのときだけ取得します。`tests/fixtures/` は独自に書き起こしたテストデータで、本体と同じ MIT ライセンスです。実採取した `testdata/sysstat-live/` のファイルの来歴と扱いは[スナップショットの注意事項](testdata/sysstat-live/README.md)を参照してください。