mcp-wordpress 1.2.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +210 -182
- package/dist/cache/CacheInvalidation.d.ts +3 -3
- package/dist/cache/CacheInvalidation.d.ts.map +1 -1
- package/dist/cache/CacheInvalidation.js +119 -119
- package/dist/cache/CacheInvalidation.js.map +1 -1
- package/dist/cache/CacheManager.d.ts +5 -0
- package/dist/cache/CacheManager.d.ts.map +1 -1
- package/dist/cache/CacheManager.js +26 -16
- package/dist/cache/CacheManager.js.map +1 -1
- package/dist/cache/HttpCacheWrapper.d.ts +1 -1
- package/dist/cache/HttpCacheWrapper.d.ts.map +1 -1
- package/dist/cache/HttpCacheWrapper.js +29 -29
- package/dist/cache/HttpCacheWrapper.js.map +1 -1
- package/dist/cache/__tests__/CacheInvalidation.test.js +96 -94
- package/dist/cache/__tests__/CacheInvalidation.test.js.map +1 -1
- package/dist/cache/__tests__/CacheManager.test.js +113 -113
- package/dist/cache/__tests__/CacheManager.test.js.map +1 -1
- package/dist/cache/__tests__/CachedWordPressClient.test.js +102 -99
- package/dist/cache/__tests__/CachedWordPressClient.test.js.map +1 -1
- package/dist/cache/__tests__/HttpCacheWrapper.test.js +98 -95
- package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -1
- package/dist/cache/index.d.ts +7 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +4 -4
- package/dist/cache/index.js.map +1 -1
- package/dist/client/CachedWordPressClient.d.ts +4 -4
- package/dist/client/CachedWordPressClient.d.ts.map +1 -1
- package/dist/client/CachedWordPressClient.js +55 -51
- package/dist/client/CachedWordPressClient.js.map +1 -1
- package/dist/client/api.d.ts +10 -10
- package/dist/client/api.js +158 -158
- package/dist/client/api.js.map +1 -1
- package/dist/client/auth.d.ts +2 -2
- package/dist/client/auth.js +72 -72
- package/dist/client/managers/AuthenticationManager.d.ts +2 -2
- package/dist/client/managers/AuthenticationManager.js +46 -46
- package/dist/client/managers/BaseManager.d.ts +1 -1
- package/dist/client/managers/BaseManager.js +9 -9
- package/dist/client/managers/RequestManager.d.ts +5 -3
- package/dist/client/managers/RequestManager.d.ts.map +1 -1
- package/dist/client/managers/RequestManager.js +39 -19
- package/dist/client/managers/RequestManager.js.map +1 -1
- package/dist/client/managers/index.d.ts +3 -3
- package/dist/client/managers/index.js +3 -3
- package/dist/config/ConfigurationSchema.d.ts +2 -2
- package/dist/config/ConfigurationSchema.d.ts.map +1 -1
- package/dist/config/ConfigurationSchema.js +40 -40
- package/dist/config/ConfigurationSchema.js.map +1 -1
- package/dist/config/ServerConfiguration.d.ts +2 -2
- package/dist/config/ServerConfiguration.js +35 -35
- package/dist/config/ServerConfiguration.js.map +1 -1
- package/dist/docs/DocumentationGenerator.d.ts.map +1 -1
- package/dist/docs/DocumentationGenerator.js +296 -255
- package/dist/docs/DocumentationGenerator.js.map +1 -1
- package/dist/docs/MarkdownFormatter.d.ts +1 -1
- package/dist/docs/MarkdownFormatter.d.ts.map +1 -1
- package/dist/docs/MarkdownFormatter.js +60 -51
- package/dist/docs/MarkdownFormatter.js.map +1 -1
- package/dist/docs/index.d.ts +3 -3
- package/dist/docs/index.d.ts.map +1 -1
- package/dist/docs/index.js +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -16
- package/dist/index.js.map +1 -1
- package/dist/mcp-wordpress-1.3.0.tgz +0 -0
- package/dist/performance/MetricsCollector.d.ts +3 -3
- package/dist/performance/MetricsCollector.d.ts.map +1 -1
- package/dist/performance/MetricsCollector.js +33 -27
- package/dist/performance/MetricsCollector.js.map +1 -1
- package/dist/performance/PerformanceAnalytics.d.ts +12 -12
- package/dist/performance/PerformanceAnalytics.d.ts.map +1 -1
- package/dist/performance/PerformanceAnalytics.js +200 -154
- package/dist/performance/PerformanceAnalytics.js.map +1 -1
- package/dist/performance/PerformanceMonitor.d.ts +5 -5
- package/dist/performance/PerformanceMonitor.d.ts.map +1 -1
- package/dist/performance/PerformanceMonitor.js +53 -52
- package/dist/performance/PerformanceMonitor.js.map +1 -1
- package/dist/performance/index.d.ts +6 -6
- package/dist/performance/index.d.ts.map +1 -1
- package/dist/performance/index.js +3 -3
- package/dist/security/InputValidator.d.ts +1 -1
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +111 -88
- package/dist/security/InputValidator.js.map +1 -1
- package/dist/security/SecurityConfig.d.ts +5 -5
- package/dist/security/SecurityConfig.js +92 -92
- package/dist/security/SecurityConfig.js.map +1 -1
- package/dist/server/ConnectionTester.d.ts +1 -1
- package/dist/server/ConnectionTester.d.ts.map +1 -1
- package/dist/server/ConnectionTester.js +4 -4
- package/dist/server/ConnectionTester.js.map +1 -1
- package/dist/server/ToolRegistry.d.ts +2 -2
- package/dist/server/ToolRegistry.d.ts.map +1 -1
- package/dist/server/ToolRegistry.js +35 -32
- package/dist/server/ToolRegistry.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.js +2 -2
- package/dist/tools/BaseToolManager.js +5 -5
- package/dist/tools/auth.d.ts +2 -2
- package/dist/tools/auth.d.ts.map +1 -1
- package/dist/tools/auth.js +32 -31
- package/dist/tools/auth.js.map +1 -1
- package/dist/tools/cache.d.ts +1 -1
- package/dist/tools/cache.d.ts.map +1 -1
- package/dist/tools/cache.js +71 -71
- package/dist/tools/cache.js.map +1 -1
- package/dist/tools/comments.d.ts +2 -2
- package/dist/tools/comments.d.ts.map +1 -1
- package/dist/tools/comments.js +79 -79
- package/dist/tools/comments.js.map +1 -1
- package/dist/tools/index.d.ts +10 -10
- package/dist/tools/index.js +10 -10
- package/dist/tools/media.d.ts +2 -2
- package/dist/tools/media.js +80 -80
- package/dist/tools/pages.d.ts +2 -2
- package/dist/tools/pages.d.ts.map +1 -1
- package/dist/tools/pages.js +75 -75
- package/dist/tools/pages.js.map +1 -1
- package/dist/tools/performance.d.ts +1 -1
- package/dist/tools/performance.d.ts.map +1 -1
- package/dist/tools/performance.js +311 -287
- package/dist/tools/performance.js.map +1 -1
- package/dist/tools/posts.d.ts +2 -2
- package/dist/tools/posts.d.ts.map +1 -1
- package/dist/tools/posts.js +94 -94
- package/dist/tools/posts.js.map +1 -1
- package/dist/tools/site.d.ts +2 -2
- package/dist/tools/site.d.ts.map +1 -1
- package/dist/tools/site.js +60 -60
- package/dist/tools/site.js.map +1 -1
- package/dist/tools/taxonomies.d.ts +2 -2
- package/dist/tools/taxonomies.js +89 -89
- package/dist/tools/users.d.ts +2 -2
- package/dist/tools/users.js +68 -68
- package/dist/tools/users.js.map +1 -1
- package/dist/types/client.d.ts +13 -13
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/client.js +12 -12
- package/dist/types/client.js.map +1 -1
- package/dist/types/index.d.ts +19 -19
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -3
- package/dist/types/mcp.d.ts +7 -7
- package/dist/types/wordpress.d.ts +21 -21
- package/dist/types/wordpress.d.ts.map +1 -1
- package/dist/utils/debug.d.ts +2 -2
- package/dist/utils/debug.js +28 -28
- package/dist/utils/error.d.ts.map +1 -1
- package/dist/utils/error.js +13 -13
- package/dist/utils/error.js.map +1 -1
- package/dist/utils/toolWrapper.d.ts.map +1 -1
- package/dist/utils/toolWrapper.js +5 -5
- package/dist/utils/toolWrapper.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +41 -31
- package/dist/utils/validation.js.map +1 -1
- package/docs/CACHING.md +36 -2
- package/docs/DOCKER.md +24 -18
- package/docs/PERFORMANCE_MONITORING.md +49 -1
- package/docs/SECURITY_TESTING.md +30 -1
- package/docs/api/README.md +9 -1
- package/docs/api/summary.json +1 -1
- package/docs/contract-testing.md +24 -3
- package/docs/developer/GITHUB_ACTIONS_SETUP.md +8 -2
- package/docs/developer/MAINTENANCE.md +29 -3
- package/docs/developer/MIGRATION_GUIDE.md +13 -1
- package/docs/developer/NPM_AUTH_SETUP.md +13 -2
- package/docs/developer/REFACTORING.md +31 -1
- package/docs/releases/COMMUNITY_ANNOUNCEMENT_v1.1.2.md +18 -7
- package/docs/releases/RELEASE_NOTES_v1.1.2.md +31 -5
- package/docs/user-guides/DOCKER_SETUP.md +264 -0
- package/docs/user-guides/DTX_SETUP.md +327 -0
- package/docs/user-guides/NPM_SETUP.md +109 -0
- package/docs/user-guides/NPX_SETUP.md +281 -0
- package/docs/wordpress-rest-api-authentication-troubleshooting.md +13 -2
- package/package.json +27 -8
- package/src/cache/CacheInvalidation.ts +140 -132
- package/src/cache/CacheManager.ts +40 -29
- package/src/cache/HttpCacheWrapper.ts +105 -68
- package/src/cache/__tests__/CacheInvalidation.test.ts +123 -118
- package/src/cache/__tests__/CacheManager.test.ts +156 -152
- package/src/cache/__tests__/CachedWordPressClient.test.ts +131 -116
- package/src/cache/__tests__/HttpCacheWrapper.test.ts +118 -115
- package/src/cache/index.ts +13 -13
- package/src/client/CachedWordPressClient.ts +90 -80
- package/src/client/api.ts +205 -205
- package/src/client/auth.ts +80 -80
- package/src/client/managers/AuthenticationManager.ts +61 -61
- package/src/client/managers/BaseManager.ts +11 -11
- package/src/client/managers/RequestManager.ts +79 -47
- package/src/client/managers/index.ts +3 -3
- package/src/config/ConfigurationSchema.ts +44 -44
- package/src/config/ServerConfiguration.ts +39 -39
- package/src/docs/DocumentationGenerator.ts +402 -295
- package/src/docs/MarkdownFormatter.ts +94 -69
- package/src/docs/index.ts +4 -4
- package/src/index.ts +24 -21
- package/src/performance/MetricsCollector.ts +90 -58
- package/src/performance/PerformanceAnalytics.ts +386 -262
- package/src/performance/PerformanceMonitor.ts +152 -118
- package/src/performance/index.ts +9 -9
- package/src/security/InputValidator.ts +148 -91
- package/src/security/SecurityConfig.ts +94 -94
- package/src/server/ConnectionTester.ts +21 -15
- package/src/server/ToolRegistry.ts +64 -51
- package/src/server.ts +2 -2
- package/src/tools/BaseToolManager.ts +6 -6
- package/src/tools/auth.ts +42 -37
- package/src/tools/cache.ts +85 -81
- package/src/tools/comments.ts +93 -91
- package/src/tools/index.ts +10 -10
- package/src/tools/media.ts +89 -89
- package/src/tools/pages.ts +89 -87
- package/src/tools/performance.ts +443 -352
- package/src/tools/posts.ts +109 -107
- package/src/tools/site.ts +86 -77
- package/src/tools/taxonomies.ts +102 -102
- package/src/tools/users.ts +77 -77
- package/src/types/client.ts +157 -60
- package/src/types/index.ts +49 -27
- package/src/types/mcp.ts +15 -15
- package/src/types/wordpress.ts +57 -29
- package/src/utils/debug.ts +37 -37
- package/src/utils/error.ts +47 -25
- package/src/utils/toolWrapper.ts +12 -8
- package/src/utils/validation.ts +116 -65
- package/dist/client/WordPressClient.d.ts +0 -81
- package/dist/client/WordPressClient.d.ts.map +0 -1
- package/dist/client/WordPressClient.js +0 -354
- package/dist/client/WordPressClient.js.map +0 -1
- package/dist/performance/AnomalyDetector.d.ts +0 -63
- package/dist/performance/AnomalyDetector.d.ts.map +0 -1
- package/dist/performance/AnomalyDetector.js +0 -222
- package/dist/performance/AnomalyDetector.js.map +0 -1
- package/dist/performance/BenchmarkAnalyzer.d.ts +0 -67
- package/dist/performance/BenchmarkAnalyzer.d.ts.map +0 -1
- package/dist/performance/BenchmarkAnalyzer.js +0 -301
- package/dist/performance/BenchmarkAnalyzer.js.map +0 -1
- package/dist/performance/TrendAnalyzer.d.ts +0 -69
- package/dist/performance/TrendAnalyzer.d.ts.map +0 -1
- package/dist/performance/TrendAnalyzer.js +0 -203
- package/dist/performance/TrendAnalyzer.js.map +0 -1
- package/dist/tools/BaseToolClass.d.ts +0 -76
- package/dist/tools/BaseToolClass.d.ts.map +0 -1
- package/dist/tools/BaseToolClass.js +0 -104
- package/dist/tools/BaseToolClass.js.map +0 -1
- package/dist/tools/base.d.ts +0 -37
- package/dist/tools/base.d.ts.map +0 -1
- package/dist/tools/base.js +0 -60
- package/dist/tools/base.js.map +0 -1
- package/docs/user-guides/CLAUDE_DESKTOP_SETUP.md +0 -187
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* Performance Monitoring MCP Tools for WordPress Server
|
|
3
3
|
* Provides comprehensive performance insights and management
|
|
4
4
|
*/
|
|
5
|
-
import { PerformanceMonitor } from
|
|
6
|
-
import { MetricsCollector } from
|
|
7
|
-
import { PerformanceAnalytics } from
|
|
8
|
-
import { toolWrapper } from
|
|
5
|
+
import { PerformanceMonitor } from "../performance/PerformanceMonitor.js";
|
|
6
|
+
import { MetricsCollector } from "../performance/MetricsCollector.js";
|
|
7
|
+
import { PerformanceAnalytics } from "../performance/PerformanceAnalytics.js";
|
|
8
|
+
import { toolWrapper } from "../utils/toolWrapper.js";
|
|
9
9
|
/**
|
|
10
10
|
* Performance Tools Class
|
|
11
11
|
*/
|
|
@@ -18,17 +18,17 @@ export default class PerformanceTools {
|
|
|
18
18
|
this.monitor = new PerformanceMonitor({
|
|
19
19
|
enableRealTimeMonitoring: true,
|
|
20
20
|
enableHistoricalData: true,
|
|
21
|
-
enableAlerts: true
|
|
21
|
+
enableAlerts: true,
|
|
22
22
|
});
|
|
23
23
|
this.collector = new MetricsCollector(this.monitor, {
|
|
24
24
|
enableRealTime: true,
|
|
25
25
|
enableToolTracking: true,
|
|
26
|
-
enableCacheIntegration: true
|
|
26
|
+
enableCacheIntegration: true,
|
|
27
27
|
});
|
|
28
28
|
this.analytics = new PerformanceAnalytics(this.collector, {
|
|
29
29
|
enablePredictiveAnalysis: true,
|
|
30
30
|
enableAnomalyDetection: true,
|
|
31
|
-
enableTrendAnalysis: true
|
|
31
|
+
enableTrendAnalysis: true,
|
|
32
32
|
});
|
|
33
33
|
// Register clients if provided
|
|
34
34
|
if (clients) {
|
|
@@ -49,197 +49,197 @@ export default class PerformanceTools {
|
|
|
49
49
|
getTools() {
|
|
50
50
|
return [
|
|
51
51
|
{
|
|
52
|
-
name:
|
|
53
|
-
description:
|
|
52
|
+
name: "wp_performance_stats",
|
|
53
|
+
description: "Get real-time performance statistics and metrics",
|
|
54
54
|
parameters: [
|
|
55
55
|
{
|
|
56
|
-
name:
|
|
57
|
-
type:
|
|
58
|
-
description:
|
|
59
|
-
required: false
|
|
56
|
+
name: "site",
|
|
57
|
+
type: "string",
|
|
58
|
+
description: "Specific site ID for multi-site setups (optional for single site)",
|
|
59
|
+
required: false,
|
|
60
60
|
},
|
|
61
61
|
{
|
|
62
|
-
name:
|
|
63
|
-
type:
|
|
64
|
-
description:
|
|
65
|
-
required: false
|
|
62
|
+
name: "category",
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Category of metrics to return (overview, requests, cache, system, tools, all)",
|
|
65
|
+
required: false,
|
|
66
66
|
},
|
|
67
67
|
{
|
|
68
|
-
name:
|
|
69
|
-
type:
|
|
70
|
-
description:
|
|
71
|
-
required: false
|
|
72
|
-
}
|
|
68
|
+
name: "format",
|
|
69
|
+
type: "string",
|
|
70
|
+
description: "Detail level of the response (summary, detailed, raw)",
|
|
71
|
+
required: false,
|
|
72
|
+
},
|
|
73
73
|
],
|
|
74
|
-
handler: this.getPerformanceStats.bind(this)
|
|
74
|
+
handler: this.getPerformanceStats.bind(this),
|
|
75
75
|
},
|
|
76
76
|
{
|
|
77
|
-
name:
|
|
78
|
-
description:
|
|
77
|
+
name: "wp_performance_history",
|
|
78
|
+
description: "Get historical performance data and trends",
|
|
79
79
|
parameters: [
|
|
80
80
|
{
|
|
81
|
-
name:
|
|
82
|
-
type:
|
|
83
|
-
description:
|
|
84
|
-
required: false
|
|
81
|
+
name: "site",
|
|
82
|
+
type: "string",
|
|
83
|
+
description: "Specific site ID for multi-site setups (optional for single site)",
|
|
84
|
+
required: false,
|
|
85
85
|
},
|
|
86
86
|
{
|
|
87
|
-
name:
|
|
88
|
-
type:
|
|
89
|
-
description:
|
|
90
|
-
required: false
|
|
87
|
+
name: "timeframe",
|
|
88
|
+
type: "string",
|
|
89
|
+
description: "Time period for historical data (1h, 6h, 12h, 24h, 7d)",
|
|
90
|
+
required: false,
|
|
91
91
|
},
|
|
92
92
|
{
|
|
93
|
-
name:
|
|
94
|
-
type:
|
|
95
|
-
description:
|
|
96
|
-
required: false
|
|
93
|
+
name: "metrics",
|
|
94
|
+
type: "array",
|
|
95
|
+
description: "Specific metrics to include (responseTime, cacheHitRate, errorRate, memoryUsage, requestVolume)",
|
|
96
|
+
required: false,
|
|
97
97
|
},
|
|
98
98
|
{
|
|
99
|
-
name:
|
|
100
|
-
type:
|
|
101
|
-
description:
|
|
102
|
-
required: false
|
|
103
|
-
}
|
|
99
|
+
name: "includeTrends",
|
|
100
|
+
type: "boolean",
|
|
101
|
+
description: "Include trend analysis (default: true)",
|
|
102
|
+
required: false,
|
|
103
|
+
},
|
|
104
104
|
],
|
|
105
|
-
handler: this.getPerformanceHistory.bind(this)
|
|
105
|
+
handler: this.getPerformanceHistory.bind(this),
|
|
106
106
|
},
|
|
107
107
|
{
|
|
108
|
-
name:
|
|
109
|
-
description:
|
|
108
|
+
name: "wp_performance_benchmark",
|
|
109
|
+
description: "Compare current performance against industry benchmarks",
|
|
110
110
|
parameters: [
|
|
111
111
|
{
|
|
112
|
-
name:
|
|
113
|
-
type:
|
|
114
|
-
description:
|
|
115
|
-
required: false
|
|
112
|
+
name: "site",
|
|
113
|
+
type: "string",
|
|
114
|
+
description: "Specific site ID for multi-site setups (optional for single site)",
|
|
115
|
+
required: false,
|
|
116
116
|
},
|
|
117
117
|
{
|
|
118
|
-
name:
|
|
119
|
-
type:
|
|
120
|
-
description:
|
|
121
|
-
required: false
|
|
118
|
+
name: "category",
|
|
119
|
+
type: "string",
|
|
120
|
+
description: "Benchmark category (response_time, cache_performance, error_rate, system_resources, all)",
|
|
121
|
+
required: false,
|
|
122
122
|
},
|
|
123
123
|
{
|
|
124
|
-
name:
|
|
125
|
-
type:
|
|
126
|
-
description:
|
|
127
|
-
required: false
|
|
128
|
-
}
|
|
124
|
+
name: "includeRecommendations",
|
|
125
|
+
type: "boolean",
|
|
126
|
+
description: "Include improvement recommendations (default: true)",
|
|
127
|
+
required: false,
|
|
128
|
+
},
|
|
129
129
|
],
|
|
130
|
-
handler: this.getBenchmarkComparison.bind(this)
|
|
130
|
+
handler: this.getBenchmarkComparison.bind(this),
|
|
131
131
|
},
|
|
132
132
|
{
|
|
133
|
-
name:
|
|
134
|
-
description:
|
|
133
|
+
name: "wp_performance_alerts",
|
|
134
|
+
description: "Get performance alerts and anomaly detection results",
|
|
135
135
|
parameters: [
|
|
136
136
|
{
|
|
137
|
-
name:
|
|
138
|
-
type:
|
|
139
|
-
description:
|
|
140
|
-
required: false
|
|
137
|
+
name: "site",
|
|
138
|
+
type: "string",
|
|
139
|
+
description: "Specific site ID for multi-site setups (optional for single site)",
|
|
140
|
+
required: false,
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
|
-
name:
|
|
144
|
-
type:
|
|
145
|
-
description:
|
|
146
|
-
required: false
|
|
143
|
+
name: "severity",
|
|
144
|
+
type: "string",
|
|
145
|
+
description: "Filter alerts by severity level (info, warning, error, critical)",
|
|
146
|
+
required: false,
|
|
147
147
|
},
|
|
148
148
|
{
|
|
149
|
-
name:
|
|
150
|
-
type:
|
|
151
|
-
description:
|
|
152
|
-
required: false
|
|
149
|
+
name: "category",
|
|
150
|
+
type: "string",
|
|
151
|
+
description: "Filter alerts by category (performance, cache, system, wordpress)",
|
|
152
|
+
required: false,
|
|
153
153
|
},
|
|
154
154
|
{
|
|
155
|
-
name:
|
|
156
|
-
type:
|
|
157
|
-
description:
|
|
158
|
-
required: false
|
|
155
|
+
name: "limit",
|
|
156
|
+
type: "number",
|
|
157
|
+
description: "Maximum number of alerts to return (default: 20)",
|
|
158
|
+
required: false,
|
|
159
159
|
},
|
|
160
160
|
{
|
|
161
|
-
name:
|
|
162
|
-
type:
|
|
163
|
-
description:
|
|
164
|
-
required: false
|
|
165
|
-
}
|
|
161
|
+
name: "includeAnomalies",
|
|
162
|
+
type: "boolean",
|
|
163
|
+
description: "Include detected anomalies (default: true)",
|
|
164
|
+
required: false,
|
|
165
|
+
},
|
|
166
166
|
],
|
|
167
|
-
handler: this.getPerformanceAlerts.bind(this)
|
|
167
|
+
handler: this.getPerformanceAlerts.bind(this),
|
|
168
168
|
},
|
|
169
169
|
{
|
|
170
|
-
name:
|
|
171
|
-
description:
|
|
170
|
+
name: "wp_performance_optimize",
|
|
171
|
+
description: "Get optimization recommendations and insights",
|
|
172
172
|
parameters: [
|
|
173
173
|
{
|
|
174
|
-
name:
|
|
175
|
-
type:
|
|
176
|
-
description:
|
|
177
|
-
required: false
|
|
174
|
+
name: "site",
|
|
175
|
+
type: "string",
|
|
176
|
+
description: "Specific site ID for multi-site setups (optional for single site)",
|
|
177
|
+
required: false,
|
|
178
178
|
},
|
|
179
179
|
{
|
|
180
|
-
name:
|
|
181
|
-
type:
|
|
182
|
-
description:
|
|
183
|
-
required: false
|
|
180
|
+
name: "focus",
|
|
181
|
+
type: "string",
|
|
182
|
+
description: "Optimization focus area (speed, reliability, efficiency, scaling)",
|
|
183
|
+
required: false,
|
|
184
184
|
},
|
|
185
185
|
{
|
|
186
|
-
name:
|
|
187
|
-
type:
|
|
188
|
-
description:
|
|
189
|
-
required: false
|
|
186
|
+
name: "priority",
|
|
187
|
+
type: "string",
|
|
188
|
+
description: "Implementation timeline (quick_wins, medium_term, long_term, all)",
|
|
189
|
+
required: false,
|
|
190
190
|
},
|
|
191
191
|
{
|
|
192
|
-
name:
|
|
193
|
-
type:
|
|
194
|
-
description:
|
|
195
|
-
required: false
|
|
192
|
+
name: "includeROI",
|
|
193
|
+
type: "boolean",
|
|
194
|
+
description: "Include ROI estimates (default: true)",
|
|
195
|
+
required: false,
|
|
196
196
|
},
|
|
197
197
|
{
|
|
198
|
-
name:
|
|
199
|
-
type:
|
|
200
|
-
description:
|
|
201
|
-
required: false
|
|
202
|
-
}
|
|
198
|
+
name: "includePredictions",
|
|
199
|
+
type: "boolean",
|
|
200
|
+
description: "Include performance predictions (default: true)",
|
|
201
|
+
required: false,
|
|
202
|
+
},
|
|
203
203
|
],
|
|
204
|
-
handler: this.getOptimizationRecommendations.bind(this)
|
|
204
|
+
handler: this.getOptimizationRecommendations.bind(this),
|
|
205
205
|
},
|
|
206
206
|
{
|
|
207
|
-
name:
|
|
208
|
-
description:
|
|
207
|
+
name: "wp_performance_export",
|
|
208
|
+
description: "Export comprehensive performance report",
|
|
209
209
|
parameters: [
|
|
210
210
|
{
|
|
211
|
-
name:
|
|
212
|
-
type:
|
|
213
|
-
description:
|
|
214
|
-
required: false
|
|
211
|
+
name: "site",
|
|
212
|
+
type: "string",
|
|
213
|
+
description: "Specific site ID for multi-site setups (optional for single site)",
|
|
214
|
+
required: false,
|
|
215
215
|
},
|
|
216
216
|
{
|
|
217
|
-
name:
|
|
218
|
-
type:
|
|
219
|
-
description:
|
|
220
|
-
required: false
|
|
217
|
+
name: "format",
|
|
218
|
+
type: "string",
|
|
219
|
+
description: "Export format (json, csv, summary)",
|
|
220
|
+
required: false,
|
|
221
221
|
},
|
|
222
222
|
{
|
|
223
|
-
name:
|
|
224
|
-
type:
|
|
225
|
-
description:
|
|
226
|
-
required: false
|
|
223
|
+
name: "includeHistorical",
|
|
224
|
+
type: "boolean",
|
|
225
|
+
description: "Include historical data (default: true)",
|
|
226
|
+
required: false,
|
|
227
227
|
},
|
|
228
228
|
{
|
|
229
|
-
name:
|
|
230
|
-
type:
|
|
231
|
-
description:
|
|
232
|
-
required: false
|
|
229
|
+
name: "includeAnalytics",
|
|
230
|
+
type: "boolean",
|
|
231
|
+
description: "Include analytics and insights (default: true)",
|
|
232
|
+
required: false,
|
|
233
233
|
},
|
|
234
234
|
{
|
|
235
|
-
name:
|
|
236
|
-
type:
|
|
237
|
-
description:
|
|
238
|
-
required: false
|
|
239
|
-
}
|
|
235
|
+
name: "timeRange",
|
|
236
|
+
type: "string",
|
|
237
|
+
description: "Time range for data export (1h, 6h, 24h, 7d, 30d)",
|
|
238
|
+
required: false,
|
|
239
|
+
},
|
|
240
240
|
],
|
|
241
|
-
handler: this.exportPerformanceReport.bind(this)
|
|
242
|
-
}
|
|
241
|
+
handler: this.exportPerformanceReport.bind(this),
|
|
242
|
+
},
|
|
243
243
|
];
|
|
244
244
|
}
|
|
245
245
|
/**
|
|
@@ -247,7 +247,7 @@ export default class PerformanceTools {
|
|
|
247
247
|
*/
|
|
248
248
|
async getPerformanceStats(params) {
|
|
249
249
|
return toolWrapper(async () => {
|
|
250
|
-
const { site, category =
|
|
250
|
+
const { site, category = "overview", format = "summary" } = params;
|
|
251
251
|
// Get current metrics
|
|
252
252
|
const metrics = this.collector.collectCurrentMetrics();
|
|
253
253
|
// Get site-specific metrics if requested
|
|
@@ -257,7 +257,7 @@ export default class PerformanceTools {
|
|
|
257
257
|
}
|
|
258
258
|
// Filter by category
|
|
259
259
|
const result = {};
|
|
260
|
-
if (category ===
|
|
260
|
+
if (category === "overview" || category === "all") {
|
|
261
261
|
result.overview = {
|
|
262
262
|
overallHealth: this.calculateHealthStatus(metrics),
|
|
263
263
|
performanceScore: this.calculatePerformanceScore(metrics),
|
|
@@ -265,35 +265,35 @@ export default class PerformanceTools {
|
|
|
265
265
|
averageResponseTime: `${metrics.requests.averageResponseTime.toFixed(0)}ms`,
|
|
266
266
|
cacheHitRate: `${(metrics.cache.hitRate * 100).toFixed(1)}%`,
|
|
267
267
|
errorRate: `${((metrics.requests.failed / Math.max(metrics.requests.total, 1)) * 100).toFixed(2)}%`,
|
|
268
|
-
uptime: this.formatUptime(metrics.system.uptime)
|
|
268
|
+
uptime: this.formatUptime(metrics.system.uptime),
|
|
269
269
|
};
|
|
270
270
|
}
|
|
271
|
-
if (category ===
|
|
271
|
+
if (category === "requests" || category === "all") {
|
|
272
272
|
result.requests = {
|
|
273
273
|
...metrics.requests,
|
|
274
274
|
requestsPerSecond: metrics.requests.requestsPerSecond.toFixed(2),
|
|
275
275
|
p50ResponseTime: `${metrics.requests.p50ResponseTime}ms`,
|
|
276
276
|
p95ResponseTime: `${metrics.requests.p95ResponseTime}ms`,
|
|
277
|
-
p99ResponseTime: `${metrics.requests.p99ResponseTime}ms
|
|
277
|
+
p99ResponseTime: `${metrics.requests.p99ResponseTime}ms`,
|
|
278
278
|
};
|
|
279
279
|
}
|
|
280
|
-
if (category ===
|
|
280
|
+
if (category === "cache" || category === "all") {
|
|
281
281
|
result.cache = {
|
|
282
282
|
...metrics.cache,
|
|
283
283
|
hitRate: `${(metrics.cache.hitRate * 100).toFixed(1)}%`,
|
|
284
284
|
memoryUsage: `${metrics.cache.memoryUsageMB.toFixed(1)}MB`,
|
|
285
|
-
efficiency: this.calculateCacheEfficiency(metrics.cache)
|
|
285
|
+
efficiency: this.calculateCacheEfficiency(metrics.cache),
|
|
286
286
|
};
|
|
287
287
|
}
|
|
288
|
-
if (category ===
|
|
288
|
+
if (category === "system" || category === "all") {
|
|
289
289
|
result.system = {
|
|
290
290
|
...metrics.system,
|
|
291
291
|
memoryUsage: `${metrics.system.memoryUsage}%`,
|
|
292
292
|
cpuUsage: `${metrics.system.cpuUsage}%`,
|
|
293
|
-
uptime: this.formatUptime(metrics.system.uptime)
|
|
293
|
+
uptime: this.formatUptime(metrics.system.uptime),
|
|
294
294
|
};
|
|
295
295
|
}
|
|
296
|
-
if (category ===
|
|
296
|
+
if (category === "tools" || category === "all") {
|
|
297
297
|
result.tools = {
|
|
298
298
|
mostUsedTool: metrics.tools.mostUsedTool,
|
|
299
299
|
totalToolCalls: Object.values(metrics.tools.toolUsageCount).reduce((sum, count) => sum + count, 0),
|
|
@@ -301,7 +301,7 @@ export default class PerformanceTools {
|
|
|
301
301
|
.sort(([, a], [, b]) => b - a)
|
|
302
302
|
.slice(0, 5)
|
|
303
303
|
.map(([tool, count]) => ({ tool, count })),
|
|
304
|
-
toolPerformance: format ===
|
|
304
|
+
toolPerformance: format === "detailed" ? metrics.tools.toolPerformance : undefined,
|
|
305
305
|
};
|
|
306
306
|
}
|
|
307
307
|
// Add site-specific data if requested
|
|
@@ -309,7 +309,7 @@ export default class PerformanceTools {
|
|
|
309
309
|
result.siteSpecific = {
|
|
310
310
|
siteId: site,
|
|
311
311
|
cache: siteMetrics.cache,
|
|
312
|
-
client: siteMetrics.client
|
|
312
|
+
client: siteMetrics.client,
|
|
313
313
|
};
|
|
314
314
|
}
|
|
315
315
|
// Add metadata
|
|
@@ -317,12 +317,12 @@ export default class PerformanceTools {
|
|
|
317
317
|
timestamp: new Date().toISOString(),
|
|
318
318
|
category,
|
|
319
319
|
format,
|
|
320
|
-
site: site ||
|
|
321
|
-
monitoringEnabled: true
|
|
320
|
+
site: site || "all",
|
|
321
|
+
monitoringEnabled: true,
|
|
322
322
|
};
|
|
323
323
|
return {
|
|
324
324
|
success: true,
|
|
325
|
-
data: result
|
|
325
|
+
data: result,
|
|
326
326
|
};
|
|
327
327
|
});
|
|
328
328
|
}
|
|
@@ -331,7 +331,7 @@ export default class PerformanceTools {
|
|
|
331
331
|
*/
|
|
332
332
|
async getPerformanceHistory(params) {
|
|
333
333
|
return toolWrapper(async () => {
|
|
334
|
-
const { site, timeframe =
|
|
334
|
+
const { site, timeframe = "24h", metrics: requestedMetrics, includeTrends = true, } = params;
|
|
335
335
|
// Convert timeframe to milliseconds
|
|
336
336
|
const timeframMs = this.parseTimeframe(timeframe);
|
|
337
337
|
const startTime = Date.now() - timeframMs;
|
|
@@ -345,7 +345,7 @@ export default class PerformanceTools {
|
|
|
345
345
|
trends = this.analytics.analyzeTrends();
|
|
346
346
|
// Filter trends by requested metrics
|
|
347
347
|
if (requestedMetrics && Array.isArray(requestedMetrics)) {
|
|
348
|
-
trends = trends.filter(trend => requestedMetrics.includes(trend.metric));
|
|
348
|
+
trends = trends.filter((trend) => requestedMetrics.includes(trend.metric));
|
|
349
349
|
}
|
|
350
350
|
}
|
|
351
351
|
// Process historical data for charting
|
|
@@ -358,17 +358,17 @@ export default class PerformanceTools {
|
|
|
358
358
|
historicalData: chartData,
|
|
359
359
|
trends: trends || [],
|
|
360
360
|
summary: {
|
|
361
|
-
averageResponseTime: this.calculateAverage(historicalData.map(d => d.requests.averageResponseTime)),
|
|
362
|
-
averageCacheHitRate: this.calculateAverage(historicalData.map(d => d.cache.hitRate)),
|
|
363
|
-
averageErrorRate: this.calculateAverage(historicalData.map(d => d.requests.total > 0 ? d.requests.failed / d.requests.total : 0)),
|
|
364
|
-
totalRequests: historicalData.reduce((sum, d) => sum + d.requests.total, 0)
|
|
361
|
+
averageResponseTime: this.calculateAverage(historicalData.map((d) => d.requests.averageResponseTime)),
|
|
362
|
+
averageCacheHitRate: this.calculateAverage(historicalData.map((d) => d.cache.hitRate)),
|
|
363
|
+
averageErrorRate: this.calculateAverage(historicalData.map((d) => d.requests.total > 0 ? d.requests.failed / d.requests.total : 0)),
|
|
364
|
+
totalRequests: historicalData.reduce((sum, d) => sum + d.requests.total, 0),
|
|
365
365
|
},
|
|
366
366
|
metadata: {
|
|
367
367
|
timestamp: new Date().toISOString(),
|
|
368
|
-
site: site ||
|
|
369
|
-
requestedMetrics: requestedMetrics || [
|
|
370
|
-
}
|
|
371
|
-
}
|
|
368
|
+
site: site || "all",
|
|
369
|
+
requestedMetrics: requestedMetrics || ["all"],
|
|
370
|
+
},
|
|
371
|
+
},
|
|
372
372
|
};
|
|
373
373
|
});
|
|
374
374
|
}
|
|
@@ -377,21 +377,21 @@ export default class PerformanceTools {
|
|
|
377
377
|
*/
|
|
378
378
|
async getBenchmarkComparison(params) {
|
|
379
379
|
return toolWrapper(async () => {
|
|
380
|
-
const { site, category =
|
|
380
|
+
const { site, category = "all", includeRecommendations = true } = params;
|
|
381
381
|
// Get benchmark comparisons
|
|
382
382
|
const benchmarks = this.analytics.benchmarkPerformance();
|
|
383
383
|
// Filter by category if specified
|
|
384
384
|
let filteredBenchmarks = benchmarks;
|
|
385
|
-
if (category !==
|
|
385
|
+
if (category !== "all") {
|
|
386
386
|
const categoryMap = {
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
387
|
+
response_time: "Response Time",
|
|
388
|
+
cache_performance: "Cache Hit Rate",
|
|
389
|
+
error_rate: "Error Rate",
|
|
390
|
+
system_resources: "Memory Usage",
|
|
391
391
|
};
|
|
392
392
|
const targetCategory = categoryMap[category];
|
|
393
393
|
if (targetCategory) {
|
|
394
|
-
filteredBenchmarks = benchmarks.filter(b => b.category === targetCategory);
|
|
394
|
+
filteredBenchmarks = benchmarks.filter((b) => b.category === targetCategory);
|
|
395
395
|
}
|
|
396
396
|
}
|
|
397
397
|
// Get recommendations if requested
|
|
@@ -399,35 +399,37 @@ export default class PerformanceTools {
|
|
|
399
399
|
if (includeRecommendations) {
|
|
400
400
|
const insights = this.analytics.generateInsights();
|
|
401
401
|
recommendations = insights
|
|
402
|
-
.filter(insight => insight.category ===
|
|
403
|
-
.map(insight => ({
|
|
402
|
+
.filter((insight) => insight.category === "optimization")
|
|
403
|
+
.map((insight) => ({
|
|
404
404
|
title: insight.title,
|
|
405
405
|
description: insight.description,
|
|
406
406
|
priority: insight.priority,
|
|
407
407
|
estimatedImprovement: insight.estimatedImprovement,
|
|
408
|
-
implementationEffort: insight.implementationEffort
|
|
408
|
+
implementationEffort: insight.implementationEffort,
|
|
409
409
|
}));
|
|
410
410
|
}
|
|
411
411
|
return {
|
|
412
412
|
success: true,
|
|
413
413
|
data: {
|
|
414
|
-
benchmarks: filteredBenchmarks.map(benchmark => ({
|
|
414
|
+
benchmarks: filteredBenchmarks.map((benchmark) => ({
|
|
415
415
|
...benchmark,
|
|
416
416
|
status: this.formatBenchmarkStatus(benchmark.status),
|
|
417
|
-
improvement: benchmark.improvement > 0
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
417
|
+
improvement: benchmark.improvement > 0
|
|
418
|
+
? {
|
|
419
|
+
needed: benchmark.improvement,
|
|
420
|
+
description: this.getBenchmarkImprovementDescription(benchmark),
|
|
421
|
+
}
|
|
422
|
+
: null,
|
|
421
423
|
})),
|
|
422
424
|
overallRanking: this.calculateOverallRanking(benchmarks),
|
|
423
425
|
recommendations: recommendations || [],
|
|
424
426
|
metadata: {
|
|
425
427
|
timestamp: new Date().toISOString(),
|
|
426
428
|
category,
|
|
427
|
-
site: site ||
|
|
428
|
-
benchmarkVersion:
|
|
429
|
-
}
|
|
430
|
-
}
|
|
429
|
+
site: site || "all",
|
|
430
|
+
benchmarkVersion: "2024-industry-standards",
|
|
431
|
+
},
|
|
432
|
+
},
|
|
431
433
|
};
|
|
432
434
|
});
|
|
433
435
|
}
|
|
@@ -436,12 +438,12 @@ export default class PerformanceTools {
|
|
|
436
438
|
*/
|
|
437
439
|
async getPerformanceAlerts(params) {
|
|
438
440
|
return toolWrapper(async () => {
|
|
439
|
-
const { site, severity, category, limit = 20, includeAnomalies = true } = params;
|
|
441
|
+
const { site, severity, category, limit = 20, includeAnomalies = true, } = params;
|
|
440
442
|
// Get alerts from monitor
|
|
441
443
|
let alerts = this.monitor.getAlerts(severity);
|
|
442
444
|
// Filter by category if specified
|
|
443
445
|
if (category) {
|
|
444
|
-
alerts = alerts.filter(alert => alert.category === category);
|
|
446
|
+
alerts = alerts.filter((alert) => alert.category === category);
|
|
445
447
|
}
|
|
446
448
|
// Limit results
|
|
447
449
|
alerts = alerts.slice(-limit);
|
|
@@ -453,42 +455,42 @@ export default class PerformanceTools {
|
|
|
453
455
|
// Calculate alert summary
|
|
454
456
|
const alertSummary = {
|
|
455
457
|
total: alerts.length,
|
|
456
|
-
critical: alerts.filter(a => a.severity ===
|
|
457
|
-
error: alerts.filter(a => a.severity ===
|
|
458
|
-
warning: alerts.filter(a => a.severity ===
|
|
459
|
-
info: alerts.filter(a => a.severity ===
|
|
458
|
+
critical: alerts.filter((a) => a.severity === "critical").length,
|
|
459
|
+
error: alerts.filter((a) => a.severity === "error").length,
|
|
460
|
+
warning: alerts.filter((a) => a.severity === "warning").length,
|
|
461
|
+
info: alerts.filter((a) => a.severity === "info").length,
|
|
460
462
|
};
|
|
461
463
|
const anomalySummary = {
|
|
462
464
|
total: anomalies.length,
|
|
463
|
-
critical: anomalies.filter(a => a.severity ===
|
|
464
|
-
major: anomalies.filter(a => a.severity ===
|
|
465
|
-
moderate: anomalies.filter(a => a.severity ===
|
|
466
|
-
minor: anomalies.filter(a => a.severity ===
|
|
465
|
+
critical: anomalies.filter((a) => a.severity === "critical").length,
|
|
466
|
+
major: anomalies.filter((a) => a.severity === "major").length,
|
|
467
|
+
moderate: anomalies.filter((a) => a.severity === "moderate").length,
|
|
468
|
+
minor: anomalies.filter((a) => a.severity === "minor").length,
|
|
467
469
|
};
|
|
468
470
|
return {
|
|
469
471
|
success: true,
|
|
470
472
|
data: {
|
|
471
|
-
alerts: alerts.map(alert => ({
|
|
473
|
+
alerts: alerts.map((alert) => ({
|
|
472
474
|
...alert,
|
|
473
475
|
timestamp: new Date(alert.timestamp).toISOString(),
|
|
474
|
-
formattedMessage: this.formatAlertMessage(alert)
|
|
476
|
+
formattedMessage: this.formatAlertMessage(alert),
|
|
475
477
|
})),
|
|
476
|
-
anomalies: anomalies.map(anomaly => ({
|
|
478
|
+
anomalies: anomalies.map((anomaly) => ({
|
|
477
479
|
...anomaly,
|
|
478
480
|
timestamp: new Date(anomaly.timestamp).toISOString(),
|
|
479
|
-
formattedDescription: this.formatAnomalyDescription(anomaly)
|
|
481
|
+
formattedDescription: this.formatAnomalyDescription(anomaly),
|
|
480
482
|
})),
|
|
481
483
|
summary: {
|
|
482
484
|
alerts: alertSummary,
|
|
483
485
|
anomalies: anomalySummary,
|
|
484
|
-
overallStatus: this.calculateAlertStatus(alertSummary, anomalySummary)
|
|
486
|
+
overallStatus: this.calculateAlertStatus(alertSummary, anomalySummary),
|
|
485
487
|
},
|
|
486
488
|
metadata: {
|
|
487
489
|
timestamp: new Date().toISOString(),
|
|
488
|
-
filters: { severity, category, site: site ||
|
|
489
|
-
limit
|
|
490
|
-
}
|
|
491
|
-
}
|
|
490
|
+
filters: { severity, category, site: site || "all" },
|
|
491
|
+
limit,
|
|
492
|
+
},
|
|
493
|
+
},
|
|
492
494
|
};
|
|
493
495
|
});
|
|
494
496
|
}
|
|
@@ -497,29 +499,38 @@ export default class PerformanceTools {
|
|
|
497
499
|
*/
|
|
498
500
|
async getOptimizationRecommendations(params) {
|
|
499
501
|
return toolWrapper(async () => {
|
|
500
|
-
const { site, focus =
|
|
502
|
+
const { site, focus = "speed", priority = "all", includeROI = true, includePredictions = true, } = params;
|
|
501
503
|
// Generate optimization plan
|
|
502
504
|
const optimizationPlan = this.analytics.generateOptimizationPlan();
|
|
503
505
|
// Filter by priority
|
|
504
506
|
let recommendations = [];
|
|
505
|
-
if (priority ===
|
|
506
|
-
recommendations.push(...optimizationPlan.quickWins.map(r => ({
|
|
507
|
+
if (priority === "quick_wins" || priority === "all") {
|
|
508
|
+
recommendations.push(...optimizationPlan.quickWins.map((r) => ({
|
|
509
|
+
...r,
|
|
510
|
+
timeline: "quick_wins",
|
|
511
|
+
})));
|
|
507
512
|
}
|
|
508
|
-
if (priority ===
|
|
509
|
-
recommendations.push(...optimizationPlan.mediumTerm.map(r => ({
|
|
513
|
+
if (priority === "medium_term" || priority === "all") {
|
|
514
|
+
recommendations.push(...optimizationPlan.mediumTerm.map((r) => ({
|
|
515
|
+
...r,
|
|
516
|
+
timeline: "medium_term",
|
|
517
|
+
})));
|
|
510
518
|
}
|
|
511
|
-
if (priority ===
|
|
512
|
-
recommendations.push(...optimizationPlan.longTerm.map(r => ({
|
|
519
|
+
if (priority === "long_term" || priority === "all") {
|
|
520
|
+
recommendations.push(...optimizationPlan.longTerm.map((r) => ({
|
|
521
|
+
...r,
|
|
522
|
+
timeline: "long_term",
|
|
523
|
+
})));
|
|
513
524
|
}
|
|
514
525
|
// Filter by focus area
|
|
515
|
-
if (focus !==
|
|
526
|
+
if (focus !== "speed") {
|
|
516
527
|
const focusMap = {
|
|
517
|
-
reliability: [
|
|
518
|
-
efficiency: [
|
|
519
|
-
scaling: [
|
|
528
|
+
reliability: ["reliability"],
|
|
529
|
+
efficiency: ["cost", "performance"],
|
|
530
|
+
scaling: ["performance", "reliability"],
|
|
520
531
|
};
|
|
521
532
|
const targetImpacts = focusMap[focus] || [];
|
|
522
|
-
recommendations = recommendations.filter(r => targetImpacts.includes(r.impact));
|
|
533
|
+
recommendations = recommendations.filter((r) => targetImpacts.includes(r.impact));
|
|
523
534
|
}
|
|
524
535
|
// Get predictions if requested
|
|
525
536
|
let predictions = null;
|
|
@@ -529,10 +540,10 @@ export default class PerformanceTools {
|
|
|
529
540
|
return {
|
|
530
541
|
success: true,
|
|
531
542
|
data: {
|
|
532
|
-
recommendations: recommendations.map(rec => ({
|
|
543
|
+
recommendations: recommendations.map((rec) => ({
|
|
533
544
|
...rec,
|
|
534
545
|
formattedPriority: this.formatPriority(rec.priority),
|
|
535
|
-
formattedEffort: this.formatEffort(rec.implementationEffort)
|
|
546
|
+
formattedEffort: this.formatEffort(rec.implementationEffort),
|
|
536
547
|
})),
|
|
537
548
|
roi: includeROI ? optimizationPlan.estimatedROI : null,
|
|
538
549
|
predictions: predictions || null,
|
|
@@ -541,15 +552,15 @@ export default class PerformanceTools {
|
|
|
541
552
|
quickWins: optimizationPlan.quickWins.length,
|
|
542
553
|
mediumTerm: optimizationPlan.mediumTerm.length,
|
|
543
554
|
longTerm: optimizationPlan.longTerm.length,
|
|
544
|
-
estimatedImpact: this.calculateEstimatedImpact(recommendations)
|
|
555
|
+
estimatedImpact: this.calculateEstimatedImpact(recommendations),
|
|
545
556
|
},
|
|
546
557
|
metadata: {
|
|
547
558
|
timestamp: new Date().toISOString(),
|
|
548
559
|
focus,
|
|
549
560
|
priority,
|
|
550
|
-
site: site ||
|
|
551
|
-
}
|
|
552
|
-
}
|
|
561
|
+
site: site || "all",
|
|
562
|
+
},
|
|
563
|
+
},
|
|
553
564
|
};
|
|
554
565
|
});
|
|
555
566
|
}
|
|
@@ -558,20 +569,20 @@ export default class PerformanceTools {
|
|
|
558
569
|
*/
|
|
559
570
|
async exportPerformanceReport(params) {
|
|
560
571
|
return toolWrapper(async () => {
|
|
561
|
-
const { site, format =
|
|
572
|
+
const { site, format = "json", includeHistorical = true, includeAnalytics = true, timeRange = "24h", } = params;
|
|
562
573
|
// Generate comprehensive analytics report
|
|
563
574
|
const report = this.analytics.exportAnalyticsReport();
|
|
564
575
|
// Add additional data based on parameters
|
|
565
576
|
const exportData = {
|
|
566
577
|
metadata: {
|
|
567
578
|
generatedAt: new Date().toISOString(),
|
|
568
|
-
site: site ||
|
|
579
|
+
site: site || "all",
|
|
569
580
|
timeRange,
|
|
570
581
|
format,
|
|
571
|
-
version:
|
|
582
|
+
version: "1.0.0",
|
|
572
583
|
},
|
|
573
584
|
summary: report.summary,
|
|
574
|
-
currentMetrics: this.collector.collectCurrentMetrics()
|
|
585
|
+
currentMetrics: this.collector.collectCurrentMetrics(),
|
|
575
586
|
};
|
|
576
587
|
if (includeHistorical) {
|
|
577
588
|
const timeframMs = this.parseTimeframe(timeRange);
|
|
@@ -585,13 +596,13 @@ export default class PerformanceTools {
|
|
|
585
596
|
insights: report.insights,
|
|
586
597
|
anomalies: report.anomalies,
|
|
587
598
|
predictions: report.predictions,
|
|
588
|
-
optimizationPlan: report.optimizationPlan
|
|
599
|
+
optimizationPlan: report.optimizationPlan,
|
|
589
600
|
};
|
|
590
601
|
}
|
|
591
602
|
// Add aggregated statistics
|
|
592
603
|
exportData.aggregatedStats = {
|
|
593
604
|
cache: this.collector.getAggregatedCacheStats(),
|
|
594
|
-
client: this.collector.getAggregatedClientStats()
|
|
605
|
+
client: this.collector.getAggregatedClientStats(),
|
|
595
606
|
};
|
|
596
607
|
// Add site comparison if multi-site
|
|
597
608
|
if (!site) {
|
|
@@ -599,10 +610,10 @@ export default class PerformanceTools {
|
|
|
599
610
|
}
|
|
600
611
|
// Format output based on requested format
|
|
601
612
|
let formattedOutput;
|
|
602
|
-
if (format ===
|
|
613
|
+
if (format === "csv") {
|
|
603
614
|
formattedOutput = this.convertToCSV(exportData);
|
|
604
615
|
}
|
|
605
|
-
else if (format ===
|
|
616
|
+
else if (format === "summary") {
|
|
606
617
|
formattedOutput = this.createSummaryReport(exportData);
|
|
607
618
|
}
|
|
608
619
|
else {
|
|
@@ -615,8 +626,8 @@ export default class PerformanceTools {
|
|
|
615
626
|
timestamp: new Date().toISOString(),
|
|
616
627
|
format,
|
|
617
628
|
dataSize: JSON.stringify(exportData).length,
|
|
618
|
-
site: site ||
|
|
619
|
-
}
|
|
629
|
+
site: site || "all",
|
|
630
|
+
},
|
|
620
631
|
};
|
|
621
632
|
});
|
|
622
633
|
}
|
|
@@ -639,14 +650,14 @@ export default class PerformanceTools {
|
|
|
639
650
|
if (metrics.system.memoryUsage > 85)
|
|
640
651
|
score -= 15;
|
|
641
652
|
if (score >= 90)
|
|
642
|
-
return
|
|
653
|
+
return "Excellent";
|
|
643
654
|
if (score >= 75)
|
|
644
|
-
return
|
|
655
|
+
return "Good";
|
|
645
656
|
if (score >= 60)
|
|
646
|
-
return
|
|
657
|
+
return "Fair";
|
|
647
658
|
if (score >= 40)
|
|
648
|
-
return
|
|
649
|
-
return
|
|
659
|
+
return "Poor";
|
|
660
|
+
return "Critical";
|
|
650
661
|
}
|
|
651
662
|
calculatePerformanceScore(metrics) {
|
|
652
663
|
let score = 100;
|
|
@@ -680,16 +691,16 @@ export default class PerformanceTools {
|
|
|
680
691
|
return Math.max(0, Math.min(100, score));
|
|
681
692
|
}
|
|
682
693
|
calculateCacheEfficiency(cacheMetrics) {
|
|
683
|
-
const efficiency =
|
|
694
|
+
const efficiency = cacheMetrics.hitRate * 100 +
|
|
684
695
|
(cacheMetrics.totalSize > 0 ? 10 : 0) -
|
|
685
696
|
(cacheMetrics.evictions > 100 ? 10 : 0);
|
|
686
697
|
if (efficiency >= 95)
|
|
687
|
-
return
|
|
698
|
+
return "Excellent";
|
|
688
699
|
if (efficiency >= 85)
|
|
689
|
-
return
|
|
700
|
+
return "Good";
|
|
690
701
|
if (efficiency >= 70)
|
|
691
|
-
return
|
|
692
|
-
return
|
|
702
|
+
return "Fair";
|
|
703
|
+
return "Poor";
|
|
693
704
|
}
|
|
694
705
|
formatUptime(uptimeMs) {
|
|
695
706
|
const seconds = Math.floor(uptimeMs / 1000);
|
|
@@ -706,38 +717,51 @@ export default class PerformanceTools {
|
|
|
706
717
|
}
|
|
707
718
|
parseTimeframe(timeframe) {
|
|
708
719
|
const map = {
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
720
|
+
"1h": 60 * 60 * 1000,
|
|
721
|
+
"6h": 6 * 60 * 60 * 1000,
|
|
722
|
+
"12h": 12 * 60 * 60 * 1000,
|
|
723
|
+
"24h": 24 * 60 * 60 * 1000,
|
|
724
|
+
"7d": 7 * 24 * 60 * 60 * 1000,
|
|
725
|
+
"30d": 30 * 24 * 60 * 60 * 1000,
|
|
715
726
|
};
|
|
716
|
-
return map[timeframe] || map[
|
|
727
|
+
return map[timeframe] || map["24h"];
|
|
717
728
|
}
|
|
718
729
|
processHistoricalDataForChart(data, requestedMetrics) {
|
|
719
730
|
if (!data.length)
|
|
720
731
|
return {};
|
|
721
|
-
const allMetrics = [
|
|
732
|
+
const allMetrics = [
|
|
733
|
+
"responseTime",
|
|
734
|
+
"cacheHitRate",
|
|
735
|
+
"errorRate",
|
|
736
|
+
"memoryUsage",
|
|
737
|
+
"requestVolume",
|
|
738
|
+
];
|
|
722
739
|
const metricsToProcess = requestedMetrics || allMetrics;
|
|
723
740
|
const result = {};
|
|
724
741
|
for (const metric of metricsToProcess) {
|
|
725
742
|
result[metric] = data.map((point, index) => ({
|
|
726
743
|
timestamp: point.system.uptime,
|
|
727
744
|
value: this.extractMetricValue(point, metric),
|
|
728
|
-
index
|
|
745
|
+
index,
|
|
729
746
|
}));
|
|
730
747
|
}
|
|
731
748
|
return result;
|
|
732
749
|
}
|
|
733
750
|
extractMetricValue(dataPoint, metric) {
|
|
734
751
|
switch (metric) {
|
|
735
|
-
case
|
|
736
|
-
|
|
737
|
-
case
|
|
738
|
-
|
|
739
|
-
case
|
|
740
|
-
|
|
752
|
+
case "responseTime":
|
|
753
|
+
return dataPoint.requests.averageResponseTime;
|
|
754
|
+
case "cacheHitRate":
|
|
755
|
+
return dataPoint.cache.hitRate * 100;
|
|
756
|
+
case "errorRate":
|
|
757
|
+
return ((dataPoint.requests.failed / Math.max(dataPoint.requests.total, 1)) *
|
|
758
|
+
100);
|
|
759
|
+
case "memoryUsage":
|
|
760
|
+
return dataPoint.system.memoryUsage;
|
|
761
|
+
case "requestVolume":
|
|
762
|
+
return dataPoint.requests.requestsPerSecond;
|
|
763
|
+
default:
|
|
764
|
+
return 0;
|
|
741
765
|
}
|
|
742
766
|
}
|
|
743
767
|
calculateAverage(values) {
|
|
@@ -747,97 +771,97 @@ export default class PerformanceTools {
|
|
|
747
771
|
}
|
|
748
772
|
formatBenchmarkStatus(status) {
|
|
749
773
|
const statusMap = {
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
774
|
+
excellent: "🟢 Excellent",
|
|
775
|
+
good: "🟡 Good",
|
|
776
|
+
average: "🟠 Average",
|
|
777
|
+
below_average: "🔴 Below Average",
|
|
778
|
+
poor: "⚫ Poor",
|
|
755
779
|
};
|
|
756
780
|
return statusMap[status] || status;
|
|
757
781
|
}
|
|
758
782
|
getBenchmarkImprovementDescription(benchmark) {
|
|
759
783
|
const improvements = {
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
784
|
+
"Response Time": `Reduce by ${benchmark.improvement.toFixed(0)}ms`,
|
|
785
|
+
"Cache Hit Rate": `Increase by ${benchmark.improvement.toFixed(1)}%`,
|
|
786
|
+
"Error Rate": `Reduce by ${benchmark.improvement.toFixed(2)}%`,
|
|
787
|
+
"Memory Usage": `Reduce by ${benchmark.improvement.toFixed(0)}%`,
|
|
764
788
|
};
|
|
765
|
-
return improvements[benchmark.category] || `Improve by ${benchmark.improvement}
|
|
789
|
+
return (improvements[benchmark.category] || `Improve by ${benchmark.improvement}`);
|
|
766
790
|
}
|
|
767
791
|
calculateOverallRanking(benchmarks) {
|
|
768
|
-
const statuses = benchmarks.map(b => b.status);
|
|
769
|
-
const excellentCount = statuses.filter(s => s ===
|
|
770
|
-
const goodCount = statuses.filter(s => s ===
|
|
792
|
+
const statuses = benchmarks.map((b) => b.status);
|
|
793
|
+
const excellentCount = statuses.filter((s) => s === "excellent").length;
|
|
794
|
+
const goodCount = statuses.filter((s) => s === "good").length;
|
|
771
795
|
const percentile = ((excellentCount + goodCount * 0.8) / statuses.length) * 100;
|
|
772
|
-
let status =
|
|
796
|
+
let status = "Needs Improvement";
|
|
773
797
|
if (percentile >= 90)
|
|
774
|
-
status =
|
|
798
|
+
status = "Top Performer";
|
|
775
799
|
else if (percentile >= 75)
|
|
776
|
-
status =
|
|
800
|
+
status = "Above Average";
|
|
777
801
|
else if (percentile >= 50)
|
|
778
|
-
status =
|
|
802
|
+
status = "Average";
|
|
779
803
|
return { percentile: Math.round(percentile), status };
|
|
780
804
|
}
|
|
781
805
|
formatAlertMessage(alert) {
|
|
782
806
|
return `${alert.severity.toUpperCase()}: ${alert.message} (${alert.metric}: ${alert.actualValue} vs threshold: ${alert.threshold})`;
|
|
783
807
|
}
|
|
784
808
|
formatAnomalyDescription(anomaly) {
|
|
785
|
-
const direction = anomaly.actualValue > anomaly.expectedValue ?
|
|
809
|
+
const direction = anomaly.actualValue > anomaly.expectedValue ? "higher" : "lower";
|
|
786
810
|
return `${anomaly.metric} is ${Math.abs(anomaly.deviation).toFixed(1)}% ${direction} than expected (${anomaly.expectedValue.toFixed(2)} vs ${anomaly.actualValue.toFixed(2)})`;
|
|
787
811
|
}
|
|
788
812
|
calculateAlertStatus(alertSummary, anomalySummary) {
|
|
789
813
|
const critical = alertSummary.critical + anomalySummary.critical;
|
|
790
814
|
const high = alertSummary.error + anomalySummary.major;
|
|
791
815
|
if (critical > 0)
|
|
792
|
-
return
|
|
816
|
+
return "Critical Issues Detected";
|
|
793
817
|
if (high > 2)
|
|
794
|
-
return
|
|
818
|
+
return "High Priority Issues";
|
|
795
819
|
if (alertSummary.warning + anomalySummary.moderate > 5)
|
|
796
|
-
return
|
|
797
|
-
return
|
|
820
|
+
return "Performance Warnings";
|
|
821
|
+
return "System Healthy";
|
|
798
822
|
}
|
|
799
823
|
formatPriority(priority) {
|
|
800
824
|
const map = {
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
825
|
+
critical: "🔴 Critical",
|
|
826
|
+
high: "🟠 High",
|
|
827
|
+
medium: "🟡 Medium",
|
|
828
|
+
low: "🟢 Low",
|
|
805
829
|
};
|
|
806
830
|
return map[priority] || priority;
|
|
807
831
|
}
|
|
808
832
|
formatEffort(effort) {
|
|
809
833
|
const map = {
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
834
|
+
low: "⚡ Low Effort",
|
|
835
|
+
medium: "⚖️ Medium Effort",
|
|
836
|
+
high: "🏋️ High Effort",
|
|
813
837
|
};
|
|
814
838
|
return map[effort] || effort;
|
|
815
839
|
}
|
|
816
840
|
calculateEstimatedImpact(recommendations) {
|
|
817
|
-
const highImpact = recommendations.filter(r => [
|
|
841
|
+
const highImpact = recommendations.filter((r) => ["critical", "high"].includes(r.priority)).length;
|
|
818
842
|
const totalImpact = recommendations.length;
|
|
819
843
|
if (highImpact >= 3)
|
|
820
|
-
return
|
|
844
|
+
return "Significant Performance Gains Expected";
|
|
821
845
|
if (totalImpact >= 5)
|
|
822
|
-
return
|
|
846
|
+
return "Moderate Performance Improvements";
|
|
823
847
|
if (totalImpact > 0)
|
|
824
|
-
return
|
|
825
|
-
return
|
|
848
|
+
return "Minor Performance Optimizations";
|
|
849
|
+
return "System Already Optimized";
|
|
826
850
|
}
|
|
827
851
|
convertToCSV(data) {
|
|
828
852
|
// Simplified CSV conversion for current metrics
|
|
829
853
|
const metrics = data.currentMetrics;
|
|
830
854
|
const csv = [
|
|
831
|
-
|
|
855
|
+
"Metric,Value,Unit",
|
|
832
856
|
`Total Requests,${metrics.requests.total},count`,
|
|
833
857
|
`Average Response Time,${metrics.requests.averageResponseTime.toFixed(0)},ms`,
|
|
834
858
|
`Success Rate,${((metrics.requests.successful / Math.max(metrics.requests.total, 1)) * 100).toFixed(1)},%`,
|
|
835
859
|
`Cache Hit Rate,${(metrics.cache.hitRate * 100).toFixed(1)},%`,
|
|
836
860
|
`Cache Size,${metrics.cache.totalSize},entries`,
|
|
837
861
|
`Memory Usage,${metrics.system.memoryUsage},percent`,
|
|
838
|
-
`Uptime,${metrics.system.uptime},ms
|
|
862
|
+
`Uptime,${metrics.system.uptime},ms`,
|
|
839
863
|
];
|
|
840
|
-
return csv.join(
|
|
864
|
+
return csv.join("\n");
|
|
841
865
|
}
|
|
842
866
|
createSummaryReport(data) {
|
|
843
867
|
const metrics = data.currentMetrics;
|
|
@@ -848,10 +872,10 @@ export default class PerformanceTools {
|
|
|
848
872
|
averageResponseTime: `${metrics.requests.averageResponseTime.toFixed(0)}ms`,
|
|
849
873
|
cacheEfficiency: `${(metrics.cache.hitRate * 100).toFixed(1)}%`,
|
|
850
874
|
systemLoad: `${metrics.system.memoryUsage}%`,
|
|
851
|
-
errorRate: `${((metrics.requests.failed / Math.max(metrics.requests.total, 1)) * 100).toFixed(2)}
|
|
875
|
+
errorRate: `${((metrics.requests.failed / Math.max(metrics.requests.total, 1)) * 100).toFixed(2)}%`,
|
|
852
876
|
},
|
|
853
877
|
recommendations: data.analytics?.insights?.slice(0, 3) || [],
|
|
854
|
-
nextSteps:
|
|
878
|
+
nextSteps: "Review detailed metrics and implement high-priority optimizations",
|
|
855
879
|
};
|
|
856
880
|
}
|
|
857
881
|
startHistoricalDataCollection() {
|