pm-orchestrator-enhancement
Version:
PM Orchestrator Enhancement - Multi-agent parallel execution system
125 lines • 4.73 kB
JavaScript
;
/**
* PM Orchestrator Enhancement - Metrics Collector
*
* タスク実行メトリクスの収集と集計を担当します。
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MetricsCollector = void 0;
const fs_1 = require("fs");
const path_1 = __importDefault(require("path"));
const execution_logger_1 = require("../logger/execution-logger");
/**
* MetricsCollectorクラス
*
* ExecutionLoggerが記録した実行ログからメトリクスを収集・集計します。
* 日次サマリーの保存とメトリクスの取得機能を提供します。
*/
class MetricsCollector {
/**
* コンストラクタ
*
* @param baseDir メトリクスディレクトリのベースパス(デフォルト: カレントディレクトリ)
*/
constructor(baseDir = process.cwd()) {
this.logger = new execution_logger_1.ExecutionLogger(baseDir);
this.metricsDir = path_1.default.join(baseDir, '.pm-orchestrator', 'metrics');
}
/**
* 指定日の日次サマリーを保存します
*
* @param date サマリーの対象日
*/
async saveDailySummary(date) {
// 対象日の開始・終了時刻を設定
const startOfDay = new Date(date);
startOfDay.setHours(0, 0, 0, 0);
const endOfDay = new Date(date);
endOfDay.setHours(23, 59, 59, 999);
// 対象日のログを取得
const logs = await this.logger.getLogsBetween(startOfDay, endOfDay);
// メトリクスを計算
const metrics = this.calculateMetrics(logs);
// メトリクスディレクトリを作成
await fs_1.promises.mkdir(this.metricsDir, { recursive: true });
// 日次サマリーをファイルに保存
const dateStr = date.toISOString().split('T')[0]; // YYYY-MM-DD
const fileName = `daily-summary-${dateStr}.json`;
const filePath = path_1.default.join(this.metricsDir, fileName);
const summary = {
date: dateStr,
metrics,
logCount: logs.length
};
await fs_1.promises.writeFile(filePath, JSON.stringify(summary, null, 2), 'utf-8');
}
/**
* 指定期間のメトリクスを取得します
*
* @param startDate 開始日
* @param endDate 終了日
* @returns メトリクス
*/
async getMetrics(startDate, endDate) {
// 指定期間のログを取得
const logs = await this.logger.getLogsBetween(startDate, endDate);
// メトリクスを計算
return this.calculateMetrics(logs);
}
/**
* ログからメトリクスを計算します(プライベートメソッド)
*
* @param logs 実行ログの配列
* @returns メトリクス
*/
calculateMetrics(logs) {
if (logs.length === 0) {
return {
totalTasks: 0,
successRate: 0,
averageDuration: 0,
averageQualityScore: 0,
errorDistribution: {},
subagentUsage: {}
};
}
// 総タスク数
const totalTasks = logs.length;
// 成功率の計算
const successCount = logs.filter(log => log.status === 'success').length;
const successRate = (successCount / totalTasks) * 100;
// 平均実行時間の計算
const totalDuration = logs.reduce((sum, log) => sum + log.duration, 0);
const averageDuration = totalDuration / totalTasks;
// 平均品質スコアの計算
const totalQualityScore = logs.reduce((sum, log) => sum + log.qualityScore, 0);
const averageQualityScore = totalQualityScore / totalTasks;
// エラー分布の計算
const errorDistribution = {};
logs.forEach(log => {
if (log.errorType) {
errorDistribution[log.errorType] = (errorDistribution[log.errorType] || 0) + 1;
}
});
// サブエージェント使用回数の計算
const subagentUsage = {};
logs.forEach(log => {
log.subagents.forEach(subagent => {
subagentUsage[subagent.name] = (subagentUsage[subagent.name] || 0) + 1;
});
});
return {
totalTasks,
successRate,
averageDuration,
averageQualityScore,
errorDistribution,
subagentUsage
};
}
}
exports.MetricsCollector = MetricsCollector;
//# sourceMappingURL=metrics-collector.js.map