◉ANTIGRAVITY LABEN
記事一覧/連携・プラグイン
⬡ 連携・プラグイン/2026-07-13上級

無人ランのログを SQLite に流し込み、失敗を横断で数える

Antigravity CLI を無人スケジュールで回すと、ランごとに JSON Lines のログが溜まっていきます。ファイルを grep で追うのをやめ、小さな SQLite に取り込んで「どのステップがいつ落ちるか」を1本のクエリで数える方法を、取り込みスクリプトと診断 SQL、実際の集計結果ごと共有します。

antigravity464sqliteobservability17loggingunattendedoperations7

✦ プレミアム記事

無人で回している Antigravity CLI のタスクが、ある朝から静かに空振りし始めていたのに、気づいたのは3日後でした。各ランは JSON Lines のログを1ファイルずつ吐いていて、logs/ の下には日付とタスク名で名付けられたファイルが 200 個以上。異常を疑って grep -l error logs/*.jsonl を叩いても、返ってくるのは「どのファイルに error という単語が含まれるか」だけです。どのステップが、どの頻度で、いつ落ちているのか——それを知るには結局ファイルを1つずつ開いて目で追うしかありませんでした。

ログは残していました。追えていなかっただけです。原因は保存の仕方ではなく、読み方の側にありました。ランが数十本のうちは grep で足ります。しかし個人開発で複数アプリの雑務をエージェントに預けるようになると、ランは週に数百本まで増えます。その規模になると、必要なのは「検索」ではなく「集計」です。私はこの切り替えに気づくのが遅く、しばらく朝の30分をログ読みに溶かしていました。

散らばった JSON Lines は、増えるほど読めなくなる

JSON Lines は1行1イベントで、追記に強く、壊れにくい良い形式です。ただ「1ラン1ファイル」で貯めていくと、横断的な問いに答えられません。「依存インストールのステップは先週から失敗率が上がっているか」「特定の時間帯だけ落ちていないか」——こうした問いは、ファイル単位では立てられないのです。

grep は行を返しますが、数えてはくれません。grep -c で数えられるのは1ファイル内の出現回数だけで、200 ファイルにまたがる「ステップ別の失敗数ランキング」は作れません。awk と sort を重ねれば近いことはできますが、問いを変えるたびにワンライナーを組み直すことになり、結局は使い捨ての集計に終わります。

必要なのは、問いを何度でも変えられる土台です。イベントを一度だけ構造化して1か所に集め、あとはクエリを差し替えるだけで別の角度から数えられる状態。その土台に、私は追加のサービスを立てずに済む SQLite を選びました。

取り込み先は、小さな SQLite ひとつでいい

観測基盤というと外部の分析サービスを思い浮かべますが、個人開発で回すランのログは、そのほとんどが1ファイルの SQLite に収まります。6 週間ぶん・214 ラン・約 1.9 万イベントを取り込んで、データベースは 18 MB ほど。サーバーもスキーマ移行の仕組みも要らず、sqlite3 ひとつで読み書きできます。

テーブルは2つに分けます。ランの単位(いつ・どのタスク・成功か失敗か)を持つ runs と、ラン内の各ステップの結果を持つ steps です。粒度を分けておくと、「ラン単位の失敗率」と「ステップ単位の失敗率」を別々に数えられます。

テーブル主なカラム役割
runsrun_id / task / started_at / status / duration_ms1ランを1行で表す。集計の起点
stepsrun_id / seq / step / status / duration_ms / errorラン内の各ステップ。失敗箇所の特定に使う

スキーマはこれだけです。run_id で2テーブルを結び、よく使う task と status に複合インデックスを張っておきます。

CREATE TABLE IF NOT EXISTS runs (
  run_id      TEXT PRIMARY KEY,
  task        TEXT NOT NULL,
  started_at  TEXT NOT NULL,      -- ISO8601(UTC)
  status      TEXT NOT NULL,      -- success / failure
  duration_ms INTEGER
);
 
CREATE TABLE IF NOT EXISTS steps (
  run_id      TEXT NOT NULL,
  seq         INTEGER NOT NULL,
  step        TEXT NOT NULL,
  status      TEXT NOT NULL,
  duration_ms INTEGER,
  error       TEXT,
  PRIMARY KEY (run_id, seq)
);
 
CREATE INDEX IF NOT EXISTS idx_runs_task_status  ON runs (task, status);
CREATE INDEX IF NOT EXISTS idx_steps_step_status ON steps (step, status);
✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦散らばった JSON Lines のランログを 40 行のシェルで runs / steps の 2 テーブルに取り込む取り込みスクリプト
✦どのタスクの・どのステップが・いつ落ちるかを数える診断 SQL 6 本と、6 週間ぶんの実集計結果
✦append-only・複合インデックス・週次 VACUUM で壊さずに育てる運用ルール
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 連携・プラグイン2026-05-24
Antigravity サブエージェントの「動いているのに何もしていない」を捕まえる Observability 3層設計
Antigravity サブエージェントを 6 アプリ並行で動かしていると、月に 10 件以上「実行ログは緑なのに成果ゼロ」のサイレント失敗が起きます。Heartbeat / Output Trace / Decision Log を 3 層で重ねて 60 秒以内に検知する実装を、コードと運用数値ごと共有します。
⬡ 連携・プラグイン2026-03-27
Antigravity × OpenTelemetry で可観測性を組み立てる — 計装・サンプリング・カーディナリティ・AI異常検知の実運用メモ
Node.js バックエンドに OpenTelemetry を導入し本番運用した記録。計装オーバーヘッドの実測、テールサンプリング設定、カーディナリティ爆発の回避、AI異常検知を承認制で運用する設計までをまとめました。
⬡ 連携・プラグイン2026-09-05
GOOGLE_GEMINI_BASE_URL を差し替えても、鍵の持ち主は変わりません
Antigravity CLI の宛先を自前のゲートウェイへ向けたとき、手元の API キーがどこまで運ばれるかを受け側で記録しました。クロスホストのリダイレクトで Authorization は落ちるのに API キーヘッダーは残る、という挙動差の実測と、鍵を端末から外すゲートウェイの組み方を書き残します。