UNPKG

adpa-enterprise-framework-automation

Version:

Modular, standards-compliant Node.js/TypeScript automation framework for enterprise requirements, project, and data management. Provides CLI and API for BABOK v3, PMBOK 7th Edition, and DMBOK 2.0 (in progress). Production-ready Express.js API with TypeSpe

145 lines 5.63 kB
/** * Enhanced Metrics Manager with performance optimization */ export class MetricsManager { static instance; providerMetrics = new Map(); MAX_ERROR_TYPES = 50; // Prevent memory bloat from error tracking constructor() { } static getInstance() { if (!MetricsManager.instance) { MetricsManager.instance = new MetricsManager(); } return MetricsManager.instance; } initializeProviderMetrics(provider) { if (!this.providerMetrics.has(provider)) { this.providerMetrics.set(provider, { totalCalls: 0, successfulCalls: 0, failedCalls: 0, totalResponseTime: 0, averageResponseTime: 0, lastUsed: new Date(), rateLimitHits: 0, errors: {} }); } } updateMetrics(provider, success, responseTime, errorType) { this.initializeProviderMetrics(provider); const metrics = this.providerMetrics.get(provider); // Batch update for better performance const updates = { totalCalls: metrics.totalCalls + 1, lastUsed: new Date(), totalResponseTime: metrics.totalResponseTime + responseTime }; Object.assign(metrics, updates); metrics.averageResponseTime = metrics.totalResponseTime / metrics.totalCalls; if (success) { metrics.successfulCalls++; } else { metrics.failedCalls++; if (errorType) { this.trackError(metrics, errorType); } } } trackError(metrics, errorType) { // Prevent memory bloat from too many error types if (Object.keys(metrics.errors).length >= this.MAX_ERROR_TYPES && !metrics.errors[errorType]) { return; } metrics.errors[errorType] = (metrics.errors[errorType] || 0) + 1; if (errorType === 'rate_limit') { metrics.rateLimitHits++; } } getProviderMetrics(provider) { return this.providerMetrics.get(provider); } getAllMetrics() { return new Map(this.providerMetrics); } generatePerformanceReport() { const providers = Array.from(this.providerMetrics.entries()); if (providers.length === 0) { return "# AI Provider Performance Report\n\nNo metrics data available.\n"; } let report = "# AI Provider Performance Report\n\n"; for (const [provider, metrics] of providers) { const successRate = metrics.totalCalls > 0 ? (metrics.successfulCalls / metrics.totalCalls * 100).toFixed(2) : '0.00'; report += `## ${provider.toUpperCase()}\n`; report += `- **Total Calls**: ${metrics.totalCalls}\n`; report += `- **Success Rate**: ${successRate}%\n`; report += `- **Average Response Time**: ${metrics.averageResponseTime.toFixed(2)}ms\n`; report += `- **Rate Limit Hits**: ${metrics.rateLimitHits}\n`; report += `- **Last Used**: ${metrics.lastUsed.toISOString()}\n`; const errorCount = Object.keys(metrics.errors).length; if (errorCount > 0) { report += `- **Error Types**: ${errorCount}\n`; const topErrors = Object.entries(metrics.errors) .sort(([, a], [, b]) => b - a) .slice(0, 5); // Show only top 5 errors if (topErrors.length > 0) { report += `- **Top Errors**:\n`; for (const [errorType, count] of topErrors) { report += ` - ${errorType}: ${count}\n`; } } } report += '\n'; } return report; } // Add performance analysis getPerformanceInsights() { const insights = {}; for (const [provider, metrics] of this.providerMetrics) { const successRate = metrics.totalCalls > 0 ? (metrics.successfulCalls / metrics.totalCalls) : 0; insights[provider] = { performance: successRate >= 0.95 ? 'excellent' : successRate >= 0.90 ? 'good' : successRate >= 0.75 ? 'fair' : 'poor', reliability: metrics.rateLimitHits / Math.max(metrics.totalCalls, 1), avgResponseTime: metrics.averageResponseTime, totalCalls: metrics.totalCalls, recommendation: this.getRecommendation(metrics, successRate) }; } return insights; } getRecommendation(metrics, successRate) { if (successRate < 0.75) { return "Consider switching providers or checking configuration"; } if (metrics.rateLimitHits > metrics.totalCalls * 0.1) { return "Implement rate limiting or upgrade plan"; } if (metrics.averageResponseTime > 10000) { return "Response times are high, consider optimization"; } return "Provider performing well"; } resetMetrics(provider) { if (provider) { this.providerMetrics.delete(provider); } else { this.providerMetrics.clear(); } } // Export metrics for external analysis exportMetrics() { const exported = {}; for (const [provider, metrics] of this.providerMetrics) { exported[provider] = { ...metrics }; } return exported; } } //# sourceMappingURL=MetricsManager.js.map