コード実行のプロファイリング
リクエストの各段階でタイミングを計ることで、直感が証拠に置き換えられます。 所要時間を構造化イベントにすれば、実行、リリース、入力サイズの区分をまたいで関数を比較できます.
期間プロファイルは、どの関数を最初に最適化する価値があるかを示します。
プロジェクトをセットアップする
npm init -y
npm install telemetry-sh
完了した各ステップを計測する
ワークフロー全体で同じ列が機能するように、ステップごとに 1 つのイベントを使用します。あ run_id 1 つのリクエストまたはジョブに属するステップを接続します。
const telemetry = require("telemetry-sh");
const { randomUUID } = require("node:crypto");
telemetry.init(process.env.TELEMETRY_API_KEY);
async function measureStep({ runId, stepName }, operation) {
const startedAt = Date.now();
try {
const result = await operation();
await telemetry.log("profile_step_completed", {
run_id: runId,
step_name: stepName,
status: "success",
duration_ms: Date.now() - startedAt,
release: process.env.APP_RELEASE ?? "unknown",
});
return result;
} catch (error) {
await telemetry.log("profile_step_completed", {
run_id: runId,
step_name: stepName,
status: "error",
duration_ms: Date.now() - startedAt,
error_type: error.constructor?.name ?? "Error",
release: process.env.APP_RELEASE ?? "unknown",
});
throw error;
}
}
async function profileRequest() {
const runId = randomUUID();
const project = await measureStep(
{ runId, stepName: "load_project" },
() => loadProject()
);
return measureStep(
{ runId, stepName: "generate_report" },
() => generateReport(project)
);
}
デフォルトでは、関数の引数、データベース レコード、または例外メッセージのログ記録を避けます。安全なカテゴリ input_size_bucket, cache_status、または query_name 生のコンテンツを保存せずにパフォーマンスを説明できます。
クエリの平均とテール期間
SELECT
step_name,
COUNT(*) AS runs,
ROUND(AVG(duration_ms), 0) AS avg_duration_ms,
ROUND(approx_percentile_cont(duration_ms, 0.95), 0) AS p95_duration_ms,
ROUND(
100.0 * SUM(CASE WHEN status = 'error' THEN 1 ELSE 0 END)
/ NULLIF(COUNT(*), 0),
2
) AS error_rate_pct
FROM profile_step_completed
WHERE timestamp_utc >= now() - INTERVAL '7 days'
GROUP BY step_name
ORDER BY p95_duration_ms DESC;
断続的な遅いステップが表示されたままになるように、平均だけではなく p95 を使用します。分割 release 導入後に個別に検査する run_id 複数の遅いステップが同じリクエストに属している場合の値。
パフォーマンスビューを構築する
以下から始めます:
- ステップごとのp95期間の棒グラフ。
- 最も遅いステップの経時的な p95 の折れ線グラフ。
- リリースごとに分割された結果テーブル。
- エラー行または極端な期間の行にフィルター処理された最近のイベント テーブル。
有用な境界でのプロファイル。ホット ループ内の小さな関数ごとにイベントを発行しないでください。これによりオーバーヘッドが追加され、解釈が難しいデータセットが生成されます。
次のステップ
測定されたワークフローが API リクエストの場合、 API レイテンシ パーセンタイル レシピ 完全な結果の視覚化、ダッシュボードのレイアウト、アラートのデザインを実現します。