with one click
wae-apm
WAE (Workers Analytics Engine) のAPMログを解析し、パフォーマンスレポートを出力する。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
WAE (Workers Analytics Engine) のAPMログを解析し、パフォーマンスレポートを出力する。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Codexに専門レビュアーロールを割り当てて並列レビュー。修正は行わない。
サブエージェント1体+Codex1体の軽量クロスレビュー。普段使い向け。修正は行わない。
playwright-cliでブラウザ動作確認を標準化された手順で実施する。
機能開発の一気通貫ワークフロー。
最大6サブエージェントを並列起動し、スコアベースで集約したレビューレポートを出力する。修正は行わない。
レビュー → 修正 → 再レビューを全員LGTMが出るまで回す。デフォルトは /cross-review。
| name | wae-apm |
| description | WAE (Workers Analytics Engine) のAPMログを解析し、パフォーマンスレポートを出力する。 |
Cloudflare Workers Analytics Engine に記録されたAPMログをSQL APIで取得・分析する。
4cd610dc1501d4e5846588d422150e15actiko_api_logs — APIログ(サーバーサイド)actiko_client_errors — クライアントエラー(フロントエンド)書き込み元: apps/backend/middleware/loggerMiddleware.ts
| フィールド | 内容 | 例 |
|---|---|---|
blob1 | ログレベル | info, warn, error |
blob2 | メッセージ | Response sent |
blob3 | リクエストID | a9379bbf |
blob4 | HTTPメソッド | GET, POST, PUT, DELETE, OPTIONS |
blob5 | パス | /users/goals, /auth/token |
blob6 | 機能名 | activity, auth |
blob7 | エラーメッセージ | (エラー時のみ) |
| フィールド | 内容 | 単位 |
|---|---|---|
double1 | HTTPステータスコード | - |
double2 | リクエスト全体の所要時間 | ms |
double3 | DB操作の合計時間 | ms |
double4 | R2操作の合計時間 | ms |
double5 | KV操作の合計時間 | ms |
double6 | 外部API呼び出し時間 | ms |
double7 | 計測スパン数 | 個 |
| フィールド | 内容 |
|---|---|
index1 | ログレベル(blob1と同じ) |
cat "$APPDATA/xdg.config/.wrangler/config/default.toml"
oauth_token の値を取得する。期限切れの場合は npx wrangler whoami を実行してトークンをリフレッシュしてから再取得。
Cloudflare Analytics Engine SQL APIを使用する。
TOKEN="<oauth_token>" && curl -s "https://api.cloudflare.com/client/v4/accounts/4cd610dc1501d4e5846588d422150e15/analytics_engine/sql" -H "Authorization: Bearer $TOKEN" -d "<SQL>"
注意事項:
!= は使えない。代わりに <> を使うdouble2 as duration のようにエイリアスは元名で参照quantileWeighted 等の集計関数はサポートされていない場合がある以下のクエリをすべて実行し、結果をまとめてレポート化する。
SELECT blob5 as path, blob4 as method, count() as cnt, avg(double2) as avg_duration, max(double2) as max_duration, avg(double3) as avg_db_ms, avg(double4) as avg_r2_ms, avg(double5) as avg_kv_ms, avg(double6) as avg_ext_ms FROM actiko_api_logs WHERE blob4 <> 'OPTIONS' AND double2 > 0 GROUP BY path, method ORDER BY avg_duration DESC LIMIT 30
SELECT blob5 as path, blob4 as method, count() as cnt, avg(double2) as avg_duration, avg(double3) as avg_db_ms, max(double2) as max_duration FROM actiko_api_logs WHERE blob4 <> 'OPTIONS' AND double2 > 500 GROUP BY path, method ORDER BY cnt DESC LIMIT 20
SELECT blob5 as path, blob4 as method, count() as cnt FROM actiko_api_logs WHERE blob4 <> 'OPTIONS' AND double1 >= 500 GROUP BY path, method ORDER BY cnt DESC LIMIT 20
SELECT count() as total, avg(double2) as avg_duration, avg(double3) as avg_db_ms, avg(double5) as avg_kv_ms FROM actiko_api_logs WHERE blob4 <> 'OPTIONS' AND double2 > 0
SELECT blob5 as path, blob4 as method, count() as cnt FROM actiko_api_logs WHERE blob4 <> 'OPTIONS' AND double2 > 0 GROUP BY path, method ORDER BY cnt DESC LIMIT 20
SELECT double2, double3, double5, double7, blob3 FROM actiko_api_logs WHERE blob5 = '/auth/token' AND blob4 = 'POST' AND double2 > 1000 ORDER BY double2 DESC LIMIT 15
分析結果をマークダウンテーブルでまとめ、以下の観点でコメントを付与する:
必ず最初にユーザーに分析期間を確認する。デフォルトで全期間を使うと、過去の修正前データが混じって誤った結論を出す。
推奨: 直近24時間、または最新デプロイ以降に絞る。
データセット actiko_client_errors にフロントエンドのエラーが記録されている。
書き込み元: apps/backend/feature/clientError/clientErrorRoute.ts
送信元: packages/frontend-shared/utils/errorReporter.ts
| フィールド | 内容 | 例 |
|---|---|---|
blob1 | エラータイプ | component_error, unhandled_error, network_error |
blob2 | メッセージ | Failed to load Google Identity Services |
blob3 | スタックトレース | Error: Rejected\n at ... |
blob4 | ユーザーID | 0197e001-...(空の場合あり) |
blob5 | 画面(パス) | /daily, /goals(空の場合あり) |
blob6 | プラットフォーム | web, ios, android |
blob7 | アプリバージョン | (現状未設定) |
index1 | エラータイプ(blob1と同じ) | |
double1 | カウント(常に1) |
SELECT blob1 as errorType, blob2 as message, blob3 as stack, blob4 as userId, blob5 as screen, blob6 as platform, timestamp FROM actiko_client_errors ORDER BY timestamp DESC LIMIT 50
SELECT blob1 as errorType, blob2 as message, blob6 as platform, count() as cnt FROM actiko_client_errors GROUP BY errorType, message, platform ORDER BY cnt DESC LIMIT 20
SELECT count() as total FROM actiko_client_errors
component_error: React ErrorBoundaryで捕捉。コンポーネントスタック付きunhandled_error: window.onerror または unhandledrejection で捕捉network_error: スキーマに定義済みだが現状未使用(sync失敗はサイレントリトライのみ)screen が空: getContext未設定の古いビルドからの送信Phase 1で遅いエンドポイントを特定した後、コード側の調査とDB最適化提案を行う。
Phase 1で特定された遅いエンドポイントについて、ルートハンドラ → usecase → repositoryの順にコードを追う。
確認ポイント:
Promise.all で並列化できるDB操作が逐次実行されていないか対象テーブルのスキーマとクエリパターンを突き合わせる。
-- 既存インデックスの確認
SELECT indexname, indexdef FROM pg_indexes WHERE tablename = '<テーブル名>';
-- クエリプランの確認(psqlまたはスクリプト経由)
EXPLAIN ANALYZE <対象クエリ>;
psqlが使えない場合は postgres パッケージでtmpスクリプトを作成して実行。
提案すべきインデックス:
userId + date の複合インデックスWHERE deletedAt IS NULL)各エンドポイントについて以下を出力:
最速の最適化は不要な処理の削除。各処理について「このエンドポイント/この機能は本当に必要か?」を検討する。 例: auth/tokenのレートリミットは不要だった(リフレッシュトークンは推測不可能なので)。