Skip to main content
Glama
PerformanceHelpers.ts10.6 kB
/** * Performance Helper Utilities * Extracted helper functions for performance metrics formatting and calculations */ import type { PerformanceMetrics } from "@/performance/PerformanceMonitor.js"; import type { BenchmarkComparison, PerformanceAnomaly } from "@/performance/PerformanceAnalytics.js"; /** * Performance alert interface */ export interface PerformanceAlert { severity: string; category: string; message: string; metric: string; actualValue: number; threshold: number; timestamp: number; } /** * Calculate overall health status from metrics */ export function calculateHealthStatus(metrics: PerformanceMetrics): string { let score = 100; if (metrics.requests.averageResponseTime > 2000) score -= 30; else if (metrics.requests.averageResponseTime > 1000) score -= 15; const errorRate = metrics.requests.failed / Math.max(metrics.requests.total, 1); if (errorRate > 0.05) score -= 30; else if (errorRate > 0.02) score -= 15; if (metrics.cache.hitRate < 0.7) score -= 25; else if (metrics.cache.hitRate < 0.85) score -= 10; if (metrics.system.memoryUsage > 85) score -= 15; if (score >= 90) return "Excellent"; if (score >= 75) return "Good"; if (score >= 60) return "Fair"; if (score >= 40) return "Poor"; return "Critical"; } /** * Calculate performance score from metrics */ export function calculatePerformanceScore(metrics: PerformanceMetrics): number { let score = 100; // Response time scoring if (metrics.requests.averageResponseTime > 3000) score -= 40; else if (metrics.requests.averageResponseTime > 1500) score -= 25; else if (metrics.requests.averageResponseTime > 800) score -= 10; // Error rate scoring const errorRate = metrics.requests.failed / Math.max(metrics.requests.total, 1); if (errorRate > 0.1) score -= 30; else if (errorRate > 0.05) score -= 20; else if (errorRate > 0.02) score -= 10; // Cache performance scoring if (metrics.cache.hitRate < 0.5) score -= 20; else if (metrics.cache.hitRate < 0.75) score -= 10; else if (metrics.cache.hitRate < 0.9) score -= 5; // System resource scoring if (metrics.system.memoryUsage > 90) score -= 10; else if (metrics.system.memoryUsage > 80) score -= 5; return Math.max(0, Math.min(100, score)); } /** * Calculate cache efficiency rating */ export function calculateCacheEfficiency(cacheMetrics: PerformanceMetrics["cache"]): string { const efficiency = cacheMetrics.hitRate * 100 + (cacheMetrics.totalSize > 0 ? 10 : 0) - (cacheMetrics.evictions > 100 ? 10 : 0); if (efficiency >= 95) return "Excellent"; if (efficiency >= 85) return "Good"; if (efficiency >= 70) return "Fair"; return "Poor"; } /** * Format uptime in human-readable format */ export function formatUptime(uptimeMs: number): string { const seconds = Math.floor(uptimeMs / 1000); const minutes = Math.floor(seconds / 60); const hours = Math.floor(minutes / 60); const days = Math.floor(hours / 24); if (days > 0) return `${days}d ${hours % 24}h ${minutes % 60}m`; if (hours > 0) return `${hours}h ${minutes % 60}m`; if (minutes > 0) return `${minutes}m ${seconds % 60}s`; return `${seconds}s`; } /** * Parse timeframe string to milliseconds */ export function parseTimeframe(timeframe: string): number { const map: Record<string, number> = { "1h": 60 * 60 * 1000, "6h": 6 * 60 * 60 * 1000, "12h": 12 * 60 * 60 * 1000, "24h": 24 * 60 * 60 * 1000, "7d": 7 * 24 * 60 * 60 * 1000, "30d": 30 * 24 * 60 * 60 * 1000, }; return map[timeframe] || map["24h"]; } /** * Extract metric value from data point */ export function extractMetricValue(dataPoint: PerformanceMetrics, metric: string): number { switch (metric) { case "responseTime": return dataPoint.requests.averageResponseTime; case "cacheHitRate": return dataPoint.cache.hitRate * 100; case "errorRate": return (dataPoint.requests.failed / Math.max(dataPoint.requests.total, 1)) * 100; case "memoryUsage": return dataPoint.system.memoryUsage; case "requestVolume": return dataPoint.requests.requestsPerSecond; default: return 0; } } /** * Process historical data for charting */ export function processHistoricalDataForChart( data: PerformanceMetrics[], requestedMetrics?: string[], ): Record<string, unknown> { if (!data.length) return {}; const allMetrics = ["responseTime", "cacheHitRate", "errorRate", "memoryUsage", "requestVolume"]; const metricsToProcess = requestedMetrics || allMetrics; const result: Record<string, unknown> = {}; for (const metric of metricsToProcess) { result[metric] = data.map((point, index) => ({ timestamp: point.system.uptime, value: extractMetricValue(point, metric), index, })); } return result; } /** * Calculate average of number array */ export function calculateAverage(values: number[]): number { if (values.length === 0) return 0; return values.reduce((sum, val) => sum + val, 0) / values.length; } /** * Format benchmark status with emoji */ export function formatBenchmarkStatus(status: string): string { const statusMap: Record<string, string> = { excellent: "🟢 Excellent", good: "🟡 Good", average: "🟠 Average", below_average: "🔴 Below Average", poor: "⚫ Poor", }; return statusMap[status] || status; } /** * Get benchmark improvement description */ export function getBenchmarkImprovementDescription(benchmark: BenchmarkComparison): string { const improvements: Record<string, string> = { "Response Time": `Reduce by ${benchmark.improvement.toFixed(0)}ms`, "Cache Hit Rate": `Increase by ${benchmark.improvement.toFixed(1)}%`, "Error Rate": `Reduce by ${benchmark.improvement.toFixed(2)}%`, "Memory Usage": `Reduce by ${benchmark.improvement.toFixed(0)}%`, }; return improvements[benchmark.category] || `Improve by ${benchmark.improvement}`; } /** * Calculate overall ranking from benchmarks */ export function calculateOverallRanking(benchmarks: BenchmarkComparison[]): { percentile: number; status: string } { const statuses = benchmarks.map((b) => b.status); const excellentCount = statuses.filter((s) => s === "excellent").length; const goodCount = statuses.filter((s) => s === "good").length; const percentile = ((excellentCount + goodCount * 0.8) / statuses.length) * 100; let status = "Needs Improvement"; if (percentile >= 90) status = "Top Performer"; else if (percentile >= 75) status = "Above Average"; else if (percentile >= 50) status = "Average"; return { percentile: Math.round(percentile), status }; } /** * Format alert message */ export function formatAlertMessage(alert: PerformanceAlert): string { return `${alert.severity.toUpperCase()}: ${alert.message} (${alert.metric}: ${alert.actualValue} vs threshold: ${alert.threshold})`; } /** * Format anomaly description */ export function formatAnomalyDescription(anomaly: PerformanceAnomaly): string { const direction = anomaly.actualValue > anomaly.expectedValue ? "higher" : "lower"; return `${anomaly.metric} is ${Math.abs(anomaly.deviation).toFixed(1)}% ${direction} than expected (${anomaly.expectedValue.toFixed(2)} vs ${anomaly.actualValue.toFixed(2)})`; } /** * Calculate alert status from summaries */ export function calculateAlertStatus( alertSummary: { critical: number; error: number; warning: number }, anomalySummary: { critical: number; major: number; moderate: number; minor: number; }, ): string { const critical = alertSummary.critical + anomalySummary.critical; const high = alertSummary.error + anomalySummary.major; if (critical > 0) return "Critical Issues Detected"; if (high > 2) return "High Priority Issues"; if (alertSummary.warning + anomalySummary.moderate > 5) return "Performance Warnings"; return "System Healthy"; } /** * Format priority with emoji */ export function formatPriority(priority: string): string { const map: Record<string, string> = { critical: "🔴 Critical", high: "🟠 High", medium: "🟡 Medium", low: "🟢 Low", }; return map[priority] || priority; } /** * Format effort with emoji */ export function formatEffort(effort: string): string { const map: Record<string, string> = { low: "⚡ Low Effort", medium: "⚖️ Medium Effort", high: "🏋️ High Effort", }; return map[effort] || effort; } /** * Calculate estimated impact from recommendations */ export function calculateEstimatedImpact(recommendations: Array<{ priority: string }>): string { const highImpact = recommendations.filter((r) => ["critical", "high"].includes(r.priority)).length; const totalImpact = recommendations.length; if (highImpact >= 3) return "Significant Performance Gains Expected"; if (totalImpact >= 5) return "Moderate Performance Improvements"; if (totalImpact > 0) return "Minor Performance Optimizations"; return "System Already Optimized"; } /** * Convert metrics data to CSV format */ export function convertToCSV(data: { currentMetrics: PerformanceMetrics }): string { const metrics = data.currentMetrics; const csv = [ "Metric,Value,Unit", `Total Requests,${metrics.requests.total},count`, `Average Response Time,${metrics.requests.averageResponseTime.toFixed(0)},ms`, `Success Rate,${((metrics.requests.successful / Math.max(metrics.requests.total, 1)) * 100).toFixed(1)},%`, `Cache Hit Rate,${(metrics.cache.hitRate * 100).toFixed(1)},%`, `Cache Size,${metrics.cache.totalSize},entries`, `Memory Usage,${metrics.system.memoryUsage},percent`, `Uptime,${metrics.system.uptime},ms`, ]; return csv.join("\n"); } /** * Create summary report from data */ export function createSummaryReport(data: { currentMetrics: PerformanceMetrics; analytics?: { insights?: unknown[] }; }): Record<string, unknown> { const metrics = data.currentMetrics; return { summary: `Performance Report - ${new Date().toISOString()}`, overallHealth: calculateHealthStatus(metrics), keyMetrics: { averageResponseTime: `${metrics.requests.averageResponseTime.toFixed(0)}ms`, cacheEfficiency: `${(metrics.cache.hitRate * 100).toFixed(1)}%`, systemLoad: `${metrics.system.memoryUsage}%`, errorRate: `${((metrics.requests.failed / Math.max(metrics.requests.total, 1)) * 100).toFixed(2)}%`, }, recommendations: data.analytics?.insights?.slice(0, 3) || [], nextSteps: "Review detailed metrics and implement high-priority optimizations", }; }

Implementation Reference

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/docdyhr/mcp-wordpress'

If you have feedback or need assistance with the MCP directory API, please join our Discord server