Skip to content

原文(日本語に翻訳)

PostToolUse および PostToolUseFailure フックの入力に duration_ms(権限プロンプトとPreToolUseフックを除くツール実行時間)が含まれるようになった

原文(英語)

Hooks: PostToolUse and PostToolUseFailure hook inputs now include duration_ms (tool execution time, excluding permission prompts and PreToolUse hooks)

概要

PostToolUsePostToolUseFailure フックの入力データに duration_ms フィールドが追加され、ツールの実行時間をミリ秒単位で取得できるようになった。この値は権限確認プロンプトや PreToolUse フックの処理時間を除いた純粋なツール実行時間を表す。パフォーマンスモニタリングや遅いツールの検出に活用できる。

基本的な使い方

PostToolUse フックで duration_ms を受け取る例:

python
#!/usr/bin/env python3
import json
import sys

data = json.load(sys.stdin)
tool_name = data["tool_name"]
duration_ms = data["duration_ms"]

print(f"ツール: {tool_name}, 実行時間: {duration_ms}ms", file=sys.stderr)

実践例

ツール実行時間のログを記録する

python
#!/usr/bin/env python3
# .claude/hooks/log-tool-duration.py
import json
import sys
import datetime

data = json.load(sys.stdin)

log_entry = {
    "timestamp": datetime.datetime.now().isoformat(),
    "tool": data["tool_name"],
    "duration_ms": data["duration_ms"],
    "success": data["hook_event_name"] == "PostToolUse"
}

with open("/tmp/claude-tool-timing.log", "a") as f:
    f.write(json.dumps(log_entry) + "\n")

設定ファイルへの登録:

json
// .claude/settings.json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": ".*",
        "hooks": [
          {
            "type": "command",
            "command": "python3 .claude/hooks/log-tool-duration.py"
          }
        ]
      }
    ]
  }
}

遅いツール実行を警告する

python
#!/usr/bin/env python3
# .claude/hooks/warn-slow-tools.py
import json
import sys

SLOW_THRESHOLD_MS = 5000  # 5秒以上を「遅い」とみなす

data = json.load(sys.stdin)
duration_ms = data["duration_ms"]
tool_name = data["tool_name"]

if duration_ms > SLOW_THRESHOLD_MS:
    print(json.dumps({
        "decision": "block",
        "reason": f"{tool_name}の実行に{duration_ms}msかかりました。パフォーマンスを確認してください。"
    }))

失敗したツールの実行時間を追跡する

python
#!/usr/bin/env python3
# .claude/hooks/track-failures.py
import json
import sys

data = json.load(sys.stdin)

# PostToolUseFailure イベントでは失敗情報も含まれる
if data["hook_event_name"] == "PostToolUseFailure":
    print(f"[失敗] {data['tool_name']}: {data['duration_ms']}ms後に失敗", 
          file=sys.stderr)

PostToolUseFailure フックの入力例:

json
{
  "hook_event_name": "PostToolUseFailure",
  "tool_name": "Bash",
  "duration_ms": 1234,
  "tool_input": {
    "command": "some-failing-command"
  }
}

注意点

  • duration_ms は純粋なツール実行時間のみを計測する(権限確認プロンプトや PreToolUse フックの時間は含まれない)
  • 同じツールでも入力内容や環境によって実行時間は大きく変わる
  • PostToolUseFailure フックでも同様に duration_ms が利用可能
  • ログファイルへの書き込みはパフォーマンスに影響する可能性があるため、重要なツールのみに適用することを検討する

関連情報