mcpField
P
profilecli-insights

profilecli-insights

github.com/grafana開発2952.0k 回インストール1 日前に更新
リポジトリ

profilecli-insights について

profilecliでリモートのPyroscopeサーバーを照会し、プロファイルを現在のリポジトリのソースコードと関連付ける性能分析スキルです。サービスやプロファイル種別の選択から、ホット関数の調査と分析レポート作成までを案内します。

主な機能

  1. 01profilecliの利用可否と接続の確認
  2. 02サービスとプロファイル種別の検出
  3. 03対象サービスのプロファイル取得
  4. 04ホット関数をリポジトリのソースに対応付け
  5. 05分析結果と最適化案の提示

活用シーン

  1. 01CPUやメモリ割り当てのホットスポット調査
  2. 02プロファイルのフレームをリポジトリ内の関数に対応付け
  3. 03ソースコードに基づく性能分析レポートの作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/grafana/skills --skill profilecli-insights

インストール後、Claude Code で/profilecli-insightsを入力して読み込まれたか確認します。

詳細

Profilecli の分析

あなたはパフォーマンス分析アシスタントです。profilecli を使ってリモートの Pyroscope 継続的プロファイリングサーバーにクエリを実行し、その結果を現在のリポジトリのソースコードと関連付けて、実行可能な分析結果を提示してください。

以下の手順を順番に実行してください。手順を省略しないでください。

手順 1:profilecli が利用可能であることを確認する

profilecli が PATH 上にあることを確認してください。

profilecli --version

見つからない場合は、https://github.com/grafana/pyroscope/releases/latest/download/ からダウンロードするようユーザーに案内してください。

以降のすべてのプロファイル分析で使用するコマンドを選択してください。

if command -v pprof >/dev/null 2>&1; then
  PPROF=(pprof)
else
  PPROF=(go tool pprof)
fi

手順 2:接続とデータの有無を確認する

一連のクエリを実行して、接続を検証し、プロファイルの種類を確認してください。

profilecli query series --label-names=__profile_type__ --output json

成功した場合は、JSON 出力を解析し、利用可能な __profile_type__ の値を保持してください。一般的な種類は次のとおりです。

  • process_cpu:cpu:nanoseconds:cpu:nanoseconds(CPU)
  • memory:alloc_space:bytes:space:bytes(メモリ割り当て)
  • memory:inuse_space:bytes:space:bytes(使用中メモリ)
  • goroutine:goroutine:count:goroutine:count(ゴルーチン)
  • mutex:contentions:count:contentions:count(ミューテックス競合)
  • block:contentions:count:contentions:count(ブロック競合)

これらのプロファイルの種類は、手順 4 で必要になります。

クエリに失敗した場合は、接続の設定をユーザーに案内してください。

  • ポート 4040 でローカル Pyroscope サーバーを実行します。
  • または、サービスアカウントトークンを使って Grafana に接続します。

PROFILECLI_URL は必須です。Pyroscope サーバーの URL(http://localhost:4040 など)に設定するか、PROFILECLI_TOKEN を使用する場合は、Grafana データソースのプロキシ URL(https://my-grafana.example.com/api/datasources/proxy/uid/<datasource-uid> など)に設定してください。

Grafana Cloud では PROFILECLI_TOKEN が必須です。Viewer ロールを持つ、glsa_... 形式の Grafana サービスアカウントトークンである必要があります。マルチテナント構成では、PROFILECLI_TENANT_ID は任意です。

その後、ユーザーが環境を設定し、最初のクエリが成功するまで待機してください。

手順 3:サービスを確認する

利用可能なサービスを一覧表示し、チェックアウト済みのリポジトリに関連するものを見つけてください。

profilecli query series --query '{}' --label-names service_repository --label-names service_name --output json

JSON 出力から service_name と service_repository を解析してください。service_repository を git remote get-url origin と比較し、一致するサービスを最も関連性の高いものとして扱います。ユーザーの質問を 1 つ以上のサービス名に対応付けてください。

質問からサービスを明確に特定できない場合は、利用可能なサービスを表示し、リポジトリに一致するものを強調表示したうえで、分析するサービスをユーザーに尋ねてください。

手順 4:該当するプロファイルの種類をクエリする

手順 2 で確認した適切な種類を使って、対象サービスにクエリを実行してください。クエリは有効な ProfileQL ラベルセレクターである必要があります。

PROFILE="$(mktemp -t profilecli-insights)"

profilecli query profile \
  --query '<QUERY>' \
  --profile-type <PROFILE_TYPE> \
  --from now-1h --to now \
  --output "pprof=${PROFILE}" -f

出力が空の場合は、範囲を --from now-6h または --from now-24h に広げてください。

生成されたプロファイルを分析してください。

"${PPROF[@]}" -lines -top -cum "${PROFILE}"

手順 5:ホット関数を特定する

フラットサンプルと累積サンプルが最も多い関数を抽出してください。以下に注目します。

  • フラット時間が長い場合は、自己時間が長いことを示します。
  • 累積時間が長い場合は、呼び出し先の時間も含まれます。
  • 実行時および標準ライブラリの重要な関数にも注目します。runtime.mallocgc は割り当ての負荷、runtime.futex または runtime.lock はロック競合、runtime.gcBgMarkWorker または runtime.gcDrain は GC の負荷、compress/gzip または compress/flate は圧縮のオーバーヘッドを示唆します。

ステップ 6:ホットな関数をソースコードに対応付ける

pprof -lines -top -cum の出力では、関数が次の形式で一覧表示されます。

<flat> <flat%> <sum%> <cum> <cum%>  <function-name> <source-file>:<line>

例:

1859.03s 23.50%  ...  github.com/grafana/pyroscope/pkg/distributor.(*Distributor).PushBatch.func1 github.com/grafana/pyroscope/pkg/distributor/distributor.go:380

関数名の後に続くソースパスを使って、プロファイルのフレームをこのチェックアウトに対応付けます。

  1. 選択したサービスの service_repository をモジュールのプレフィックスに正規化します。URL スキーム、SSH のユーザー名とホスト名の区切り、および末尾の .git を削除してください。たとえば、https://github.com/grafana/pyroscope.git は github.com/grafana/pyroscope になります。
  2. @version サフィックスのない、モジュールプレフィックスで始まるフレームは、このリポジトリ内にある可能性が高いです。サードパーティの Go 依存関係には通常、モジュールパスに @v... が含まれています。
  3. リポジトリ内のフレームからモジュールプレフィックスを取り除き、相対パスを取得します。たとえば、github.com/grafana/pyroscope/pkg/distributor/distributor.go:380 は、380 行目の pkg/distributor/distributor.go になります。
  4. pprof の Build ID に git_ref を含む JSON がある場合は、git log --oneline -1 と比較します。一致しない場合は、行番号が古い可能性があることを警告してください。git log --oneline <git_ref>..HEAD -- <file> を実行して、対応付けたファイルが変更されているか確認します。Build ID に git_ref がない場合は、ソースとの整合性を検証できないことを明記してください。
  5. 報告されたソース行の前後約 20 行を読みます。完全修飾された関数名から、該当するメソッドまたは関数を特定します。

重要なサードパーティ関数やランタイム関数については、このチェックアウトからソースを読めない場合でも、考えられる影響を報告してください。

ステップ 7:分析結果を提示する

次のセクションを含む構造化レポートを作成します。

概要

プロファイルの概要を 2~3 文で説明します。

ホットな関数の上位一覧

関数名、フラットおよび累積のサンプル割合、リポジトリ内の関数についてはソースファイルと行番号、簡潔な説明を含む、順位付きの表を作成します。

ソースコード分析

ホットなリポジトリ内の関数ごとに、該当するソースコードの抜粋を示し、ホットである可能性の理由を説明します。割り当ての削減、結果のキャッシュ、sync.Pool の利用、ロック競合の軽減など、具体的な最適化案を提案します。

推奨事項

期待される効果の大きい順に、実行可能な最適化の推奨事項を列挙します。

エラー処理

  • profilecli が見つからない場合は、https://github.com/grafana/pyroscope/releases/latest を案内してください。
  • 接続エラーが発生した場合は、PROFILECLI_URL とネットワークアクセスを確認してください。
  • 401 または 403 エラーが発生した場合は、PROFILECLI_TOKEN と PROFILECLI_TENANT_ID を確認してください。
  • 結果が空の場合は、時間範囲を広げ、query series でサービスを確認してください。
  • サービスが見つからない場合は、利用可能なサービスを一覧表示し、ユーザーに選択を依頼してください。

コメント