error-detective について
ログやコードのエラー調査を支援する開発スキルです。エラーの詳細やスタックトレースを手掛かりに、繰り返し発生するパターンやイベントを関連付け、原因を調べます。
主な機能
- 01ログ内のエラー検索と集計
- 02反復パターンと急増の検出
- 03複数ログ間のエラー関連付け
- 04スタックトレースの解析
- 05チェックリストに沿った調査
活用シーン
- 01本番環境のAPIエラー調査
- 02直近のログでエラー急増を発見
- 03リクエストやシステムをまたいだ追跡
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ htlin222/ dotfiles --skill error-detectiveインストール後、Claude Code で/error-detectiveを入力して読み込まれたか確認します。
詳細
エラー検出
ログやコードからエラーを見つけて分析します。
使用する場面
- 本番環境のエラーを調査する
- ログのパターンを分析する
- エラーの根本原因を特定する
- システム間のエラーを関連付ける
ログ分析
エラーを見つける
# Recent errors
grep -i "error\|exception\|fatal" /var/log/app.log | tail -100
# Errors with context
grep -B 5 -A 10 "ERROR" /var/log/app.log
# Count by error type
grep -oE "Error: [^:]*" app.log | sort | uniq -c | sort -rn
# Errors in time range
awk '/2024-01-15 14:/ && /ERROR/' app.log
パターンを検出する
# Find repeated errors
grep "ERROR" app.log | cut -d']' -f2 | sort | uniq -c | sort -rn | head -20
# Correlate request IDs
grep "req-12345" *.log | sort -t' ' -k1,2
# Find error spikes
grep "ERROR" app.log | cut -d' ' -f1-2 | uniq -c | sort -rn
スタックトレース分析
スタックトレースを解析する
import re
def parse_stack_trace(log_content: str) -> list[dict]:
pattern = r'(?P<exception>\w+Error|\w+Exception): (?P<message>.*?)\n(?P<trace>(?:\s+at .+\n)+)'
traces = []
for match in re.finditer(pattern, log_content):
traces.append({
'type': match.group('exception'),
'message': match.group('message'),
'trace': match.group('trace').strip().split('\n')
})
return traces
一般的なパターン
| パターン | 示す内容 | 対応 |
|---|---|---|
| NullPointer | null チェックが不足している | 検証を追加する |
| Timeout | 依存先が遅い | タイムアウトとリトライを追加する |
| Connection refused | サービスが停止している | ヘルス状態を確認してリトライする |
| OOM | メモリーリーク | プロファイリングして上限を増やす |
| Rate limit | リクエストが多すぎる | バックオフとキューを追加する |
調査チェックリスト
- 取得 - エラーメッセージとスタックトレースをすべて取得します
- タイムスタンプ - いつ発生し始めましたか?
- 頻度 - どのくらいの頻度ですか?増加していますか?
- 範囲 - すべてのユーザーですか、それとも特定のユーザーですか?
- 変更 - 最近デプロイしましたか?
- 依存関係 - 外部サービスに影響はありますか?
相関クエリ
-- Errors by endpoint
SELECT endpoint, count(*) as errors
FROM logs
WHERE level = 'ERROR' AND time > NOW() - INTERVAL '1 hour'
GROUP BY endpoint ORDER BY errors DESC;
-- Error rate over time
SELECT
date_trunc('minute', time) as minute,
count(*) filter (where level = 'ERROR') as errors,
count(*) as total
FROM logs
WHERE time > NOW() - INTERVAL '1 hour'
GROUP BY minute ORDER BY minute;
例
入力:「API が 500 エラーを返す原因を見つける」 **アクション:**ログで 500 ステータスを検索し、スタックトレースを見つけて、根本原因を特定します
入力:「過去 1 時間のエラーパターンを分析する」 **アクション:**エラーを種類ごとに集計し、急増を見つけて、イベントと関連付けます
コメント
Markdown 対応