com um clique
wae-apm
WAE (Workers Analytics Engine) のAPMログを解析し、パフォーマンスレポートを出力する。
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Menu
WAE (Workers Analytics Engine) のAPMログを解析し、パフォーマンスレポートを出力する。
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Baseado na classificação ocupacional SOC
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のレートリミットは不要だった(リフレッシュトークンは推測不可能なので)。