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

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

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

antigravity431sqliteobservability17logging2unattendedoperations6

プレミアム記事

無人で回している 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テーブルを結び、よく使う taskstatus に複合インデックスを張っておきます。

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-07-08
成功し続ける自動化が、いつの間にか価値を失うとき — 成果の痩せを検出して畳む設計
スケジュール実行の緑のログは、しばしば最も油断ならない嘘をつきます。成功しているのに価値を失った自動化を、成果台帳と評価器で炙り出し、畳む・直す・残すを判断する設計を実コードとともに整理します。
連携・プラグイン2026-05-19
Antigravity から wrangler tail を呼ばせて Cloudflare Workers の障害切り分けを3週間任せた所感
6サイトを Cloudflare Workers で運用していて、エラー対応が朝の時間を侵食していました。Antigravity に wrangler tail を呼ばせ、ログ判読と一次切り分けを3週間任せた記録です。任せた範囲、任せなかった範囲、想定外だった挙動を率直にまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →