Mackerel の MCP サーバーがリリースされたので、Mackerel のトレーシング機能のハンズオンの Web アプリケーションを題材に、課題の分析とコードの修正ができるか試してみた。
目次
Claude Code CLI の MCP サーバー設定
MCP サーバーの設定
まず Claude Code CLI に MCP サーバーを追加する。これは claude mcp add コマンドでできる。設定は --scope オプションによって保存される場所が変わる。また、下記のようなオプションにすると、MACKEREL_APIKEY が展開されて保存されることに注意。
claude mcp add mackerel --scope local --env MACKEREL_APIKEY="${MACKEREL_APIKEY}" -- npx -y @mackerel/mcp-server
動作確認
Claude Code CLI を起動して、MCP サーバーが正しく設定されているか確認する
> /mcp
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Manage MCP servers │
│ │
│ ❯ 1. mackerel ✔ connected · Enter to view details │
│ │
│ MCP Config locations (by scope): │
│ • User config (available in all your projects): │
│ • /Users/kga/.claude.json │
│ • Project config (shared via .mcp.json): │
│ • /Users/kga/ghq/github.com/mackerelio/mackerel-handson/tracing/demo/sample-app/ruby/.mcp.json (file does not exist) │
│ • Local config (private to you in this project): │
│ • /Users/kga/.claude.json [project: /Users/kga/ghq/github.com/mackerelio/mackerel-handson/tracing/demo/sample-app/ruby] │
│ │
│ For help configuring MCP servers, see: https://docs.claude.com/en/docs/claude-code/mcp │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Claude が Mackerel API を呼び出せていれば成功。
> Mackerel に登録されているホストの数を教えて
⏺ Mackerel に登録されているホストの数を確認します。
⎿ {
"hosts": [
{
… +750 lines (ctrl+o to expand)
⏺ 4台
トレーシングハンズオンの事前準備
準備のドキュメントを参考に、起動のための事前準備や Mackerel にトレースをエクスポートするための API キーの設定を済ませる。
また、本来のハンズオンでは、コード中に課題の改善のためのコメントが含まれているがカンニングされないようにこれを削除しておく。
Mackerel MCP サーバーを使った課題の解決
ハンズオンのアプリケーションには以下のような課題が含まれている。
- エラーが発生する
- 処理時間が遅い
- N+1 問題が起きている
これを解決させてみる。
手順
2 と 3 を繰り返す。
- ハンズオンアプリケーションを立ち上げる
- エンドポイント(
/products)にアクセスし、Mackerel にトレースをエクスポートする
- Mackerel のトレース詳細画面からトレースIDをコピーし Claude に課題解決を依頼する
課題解決の様子
Claude に以下のように依頼する
このディレクトリに含まれるアプリケーションにはいくつか問題が含まれています。
トレースID 1c8263e7dd735d7b68dcb22f62a37a81 のトレースを Mackerel から取得しその問題を修正してください
エラーが起きているとか、エンドポイントが遅いのような具体的な課題については触れなかったが、まずはエラーを発見し直してくれた。あと、typo も見つけてくれた(試したハンズオンのバージョンが古かった。既に直っています)。
トレースデータから、以下の問題を検出しました:
#### 検出された問題
**問題1: RuntimeError が発生**
- ファイル: `app/controllers/product_controller.rb:32`
- エラー内容: `RuntimeError: Sleep time is too long: 3`
- 原因: `method_sample` メソッドで `n > 2` の場合に例外を発生させている
**問題2: JSON レスポンスのキーにタイポ**
- ファイル: `app/controllers/product_controller.rb:8`
- 誤: `prirce`
- 正: `price`
次のイテレーション
修正を入れたトレースはこれです。さらに改善案を提案してください
a5be924c50c529fbf887596fb3a15c14
**問題1: N+1 クエリ問題(重大)**
- 100個の商品それぞれに対して、個別にカテゴリを取得
- トレースに100個の `SELECT "categories".* FROM "categories" WHERE "categories"."id" = ? LIMIT ?` クエリが存在
- 影響: データベースへの不要なクエリが大量発生し、パフォーマンスが大幅に低下
**問題2: 不要な sleep 処理(中)**
- `method_sample` メソッドで1秒、2秒、3秒の sleep を実行(合計6秒)
- 影響: レスポンス時間が6秒以上増加
**レスポンス時間の内訳**
- リクエスト全体: 約6.3秒
- 初期クエリ: 約0.12秒
- Category N+1 クエリ: 約0.15秒
- method_sample sleep: 6秒
まとめ
**✅ 改善された点**
1. **N+1 クエリが解消**
- カテゴリクエリが1回のみ: `SELECT "categories".* FROM "categories" WHERE "categories"."id" IN (...)`
- 100個のIDをまとめて取得(IN句使用)
2. **レスポンス時間が大幅改善**
- 全体: 約 **46ms**
- 以前: 6.3秒 → **約137倍の高速化!**
3. **DBクエリ数の削減**
- 商品クエリ: 1回
- カテゴリクエリ: 1回
- 合計: **2回**(以前は102回)
ということで、Claude Code CLI と Mackerel MCP サーバーを組み合わせることで、トレースの内容を取得し様々な課題解決を LLM にやってもらうことができた。トレースの一覧やエラー、DBパフォーマンス、HTTPパフォーマンスなども MCP サーバーから取得できるようになるとさらに夢が広がりそう。