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
|
@@ -3,9 +3,12 @@
|
|
|
3
3
|
* Integrates with existing client and cache systems
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
import {
|
|
7
|
+
PerformanceMonitor,
|
|
8
|
+
PerformanceMetrics,
|
|
9
|
+
} from "./PerformanceMonitor.js";
|
|
10
|
+
import type { CacheStats } from "../cache/CacheManager.js";
|
|
11
|
+
import type { ClientStats } from "../types/client.js";
|
|
9
12
|
|
|
10
13
|
export interface CollectorConfig {
|
|
11
14
|
enableRealTime: boolean;
|
|
@@ -45,7 +48,7 @@ export class MetricsCollector {
|
|
|
45
48
|
|
|
46
49
|
constructor(
|
|
47
50
|
monitor: PerformanceMonitor,
|
|
48
|
-
config: Partial<CollectorConfig> = {}
|
|
51
|
+
config: Partial<CollectorConfig> = {},
|
|
49
52
|
) {
|
|
50
53
|
this.monitor = monitor;
|
|
51
54
|
this.config = {
|
|
@@ -55,7 +58,7 @@ export class MetricsCollector {
|
|
|
55
58
|
enableRequestInterception: true,
|
|
56
59
|
enableCacheIntegration: true,
|
|
57
60
|
enableSystemMetrics: true,
|
|
58
|
-
...config
|
|
61
|
+
...config,
|
|
59
62
|
};
|
|
60
63
|
|
|
61
64
|
if (this.config.enableRealTime) {
|
|
@@ -68,7 +71,7 @@ export class MetricsCollector {
|
|
|
68
71
|
*/
|
|
69
72
|
registerClient(siteId: string, client: any): void {
|
|
70
73
|
this.clientInstances.set(siteId, client);
|
|
71
|
-
|
|
74
|
+
|
|
72
75
|
if (this.config.enableRequestInterception) {
|
|
73
76
|
this.interceptClientRequests(siteId, client);
|
|
74
77
|
}
|
|
@@ -84,14 +87,18 @@ export class MetricsCollector {
|
|
|
84
87
|
/**
|
|
85
88
|
* Start tracking a tool execution
|
|
86
89
|
*/
|
|
87
|
-
startToolExecution(
|
|
90
|
+
startToolExecution(
|
|
91
|
+
toolName: string,
|
|
92
|
+
parameters: any,
|
|
93
|
+
siteId?: string,
|
|
94
|
+
): string {
|
|
88
95
|
const executionId = `${toolName}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
89
|
-
|
|
96
|
+
|
|
90
97
|
this.activeTools.set(executionId, {
|
|
91
98
|
toolName,
|
|
92
99
|
parameters,
|
|
93
100
|
startTime: Date.now(),
|
|
94
|
-
siteId
|
|
101
|
+
siteId,
|
|
95
102
|
});
|
|
96
103
|
|
|
97
104
|
return executionId;
|
|
@@ -105,10 +112,10 @@ export class MetricsCollector {
|
|
|
105
112
|
if (!context) return;
|
|
106
113
|
|
|
107
114
|
const responseTime = Date.now() - context.startTime;
|
|
108
|
-
|
|
115
|
+
|
|
109
116
|
// Record in performance monitor
|
|
110
117
|
this.monitor.recordRequest(responseTime, success, context.toolName);
|
|
111
|
-
|
|
118
|
+
|
|
112
119
|
this.activeTools.delete(executionId);
|
|
113
120
|
}
|
|
114
121
|
|
|
@@ -116,10 +123,10 @@ export class MetricsCollector {
|
|
|
116
123
|
* Record a raw request (bypass tool tracking)
|
|
117
124
|
*/
|
|
118
125
|
recordRawRequest(
|
|
119
|
-
responseTime: number,
|
|
120
|
-
success: boolean,
|
|
126
|
+
responseTime: number,
|
|
127
|
+
success: boolean,
|
|
121
128
|
endpoint: string,
|
|
122
|
-
fromCache: boolean = false
|
|
129
|
+
fromCache: boolean = false,
|
|
123
130
|
): void {
|
|
124
131
|
this.monitor.recordRequest(responseTime, success);
|
|
125
132
|
}
|
|
@@ -130,10 +137,10 @@ export class MetricsCollector {
|
|
|
130
137
|
collectCurrentMetrics(): PerformanceMetrics {
|
|
131
138
|
// Update cache metrics from all registered cache managers
|
|
132
139
|
this.updateCacheMetrics();
|
|
133
|
-
|
|
140
|
+
|
|
134
141
|
// Update client metrics from all registered clients
|
|
135
142
|
this.updateClientMetrics();
|
|
136
|
-
|
|
143
|
+
|
|
137
144
|
// Get current metrics from monitor
|
|
138
145
|
return this.monitor.getMetrics();
|
|
139
146
|
}
|
|
@@ -147,11 +154,11 @@ export class MetricsCollector {
|
|
|
147
154
|
misses: 0,
|
|
148
155
|
evictions: 0,
|
|
149
156
|
totalSize: 0,
|
|
150
|
-
hitRate: 0
|
|
157
|
+
hitRate: 0,
|
|
151
158
|
};
|
|
152
159
|
|
|
153
160
|
for (const [_siteId, cacheManager] of this.cacheManagers) {
|
|
154
|
-
if (cacheManager && typeof cacheManager.getStats ===
|
|
161
|
+
if (cacheManager && typeof cacheManager.getStats === "function") {
|
|
155
162
|
const stats = cacheManager.getStats();
|
|
156
163
|
aggregated.hits += stats.hits || 0;
|
|
157
164
|
aggregated.misses += stats.misses || 0;
|
|
@@ -177,20 +184,20 @@ export class MetricsCollector {
|
|
|
177
184
|
failedRequests: 0,
|
|
178
185
|
averageResponseTime: 0,
|
|
179
186
|
rateLimitHits: 0,
|
|
180
|
-
authFailures: 0
|
|
187
|
+
authFailures: 0,
|
|
181
188
|
};
|
|
182
189
|
|
|
183
190
|
const responseTimes: number[] = [];
|
|
184
191
|
|
|
185
192
|
for (const [_siteId, client] of this.clientInstances) {
|
|
186
|
-
if (client && typeof client.getStats ===
|
|
193
|
+
if (client && typeof client.getStats === "function") {
|
|
187
194
|
const stats = client.getStats();
|
|
188
195
|
aggregated.totalRequests += stats.totalRequests || 0;
|
|
189
196
|
aggregated.successfulRequests += stats.successfulRequests || 0;
|
|
190
197
|
aggregated.failedRequests += stats.failedRequests || 0;
|
|
191
198
|
aggregated.rateLimitHits += stats.rateLimitHits || 0;
|
|
192
199
|
aggregated.authFailures += stats.authFailures || 0;
|
|
193
|
-
|
|
200
|
+
|
|
194
201
|
if (stats.averageResponseTime) {
|
|
195
202
|
responseTimes.push(stats.averageResponseTime);
|
|
196
203
|
}
|
|
@@ -199,7 +206,9 @@ export class MetricsCollector {
|
|
|
199
206
|
|
|
200
207
|
// Calculate overall average response time
|
|
201
208
|
if (responseTimes.length > 0) {
|
|
202
|
-
aggregated.averageResponseTime =
|
|
209
|
+
aggregated.averageResponseTime =
|
|
210
|
+
responseTimes.reduce((sum, time) => sum + time, 0) /
|
|
211
|
+
responseTimes.length;
|
|
203
212
|
}
|
|
204
213
|
|
|
205
214
|
return aggregated;
|
|
@@ -216,13 +225,13 @@ export class MetricsCollector {
|
|
|
216
225
|
const result: any = { isActive: false };
|
|
217
226
|
|
|
218
227
|
const cacheManager = this.cacheManagers.get(siteId);
|
|
219
|
-
if (cacheManager && typeof cacheManager.getStats ===
|
|
228
|
+
if (cacheManager && typeof cacheManager.getStats === "function") {
|
|
220
229
|
result.cache = cacheManager.getStats();
|
|
221
230
|
result.isActive = true;
|
|
222
231
|
}
|
|
223
232
|
|
|
224
233
|
const client = this.clientInstances.get(siteId);
|
|
225
|
-
if (client && typeof client.getStats ===
|
|
234
|
+
if (client && typeof client.getStats === "function") {
|
|
226
235
|
result.client = client.getStats();
|
|
227
236
|
result.isActive = true;
|
|
228
237
|
}
|
|
@@ -235,13 +244,16 @@ export class MetricsCollector {
|
|
|
235
244
|
*/
|
|
236
245
|
compareSitePerformance(): {
|
|
237
246
|
sites: string[];
|
|
238
|
-
comparison: Record<
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
247
|
+
comparison: Record<
|
|
248
|
+
string,
|
|
249
|
+
{
|
|
250
|
+
responseTime: number;
|
|
251
|
+
cacheHitRate: number;
|
|
252
|
+
errorRate: number;
|
|
253
|
+
requestCount: number;
|
|
254
|
+
ranking: number;
|
|
255
|
+
}
|
|
256
|
+
>;
|
|
245
257
|
bestPerforming: string;
|
|
246
258
|
worstPerforming: string;
|
|
247
259
|
} {
|
|
@@ -251,23 +263,28 @@ export class MetricsCollector {
|
|
|
251
263
|
|
|
252
264
|
for (const siteId of sites) {
|
|
253
265
|
const metrics = this.getSiteMetrics(siteId);
|
|
254
|
-
|
|
266
|
+
|
|
255
267
|
const responseTime = metrics.client?.averageResponseTime || 0;
|
|
256
268
|
const cacheHitRate = metrics.cache?.hitRate || 0;
|
|
257
|
-
const errorRate = metrics.client
|
|
258
|
-
?
|
|
269
|
+
const errorRate = metrics.client
|
|
270
|
+
? metrics.client.failedRequests /
|
|
271
|
+
Math.max(metrics.client.totalRequests, 1)
|
|
259
272
|
: 0;
|
|
260
273
|
const requestCount = metrics.client?.totalRequests || 0;
|
|
261
274
|
|
|
262
275
|
// Calculate performance score (lower is better for response time and error rate)
|
|
263
|
-
const score =
|
|
276
|
+
const score =
|
|
277
|
+
responseTime / 1000 +
|
|
278
|
+
errorRate * 100 -
|
|
279
|
+
cacheHitRate * 50 +
|
|
280
|
+
requestCount * 0.001;
|
|
264
281
|
|
|
265
282
|
comparison[siteId] = {
|
|
266
283
|
responseTime,
|
|
267
284
|
cacheHitRate,
|
|
268
285
|
errorRate,
|
|
269
286
|
requestCount,
|
|
270
|
-
ranking: 0 // Will be set after sorting
|
|
287
|
+
ranking: 0, // Will be set after sorting
|
|
271
288
|
};
|
|
272
289
|
|
|
273
290
|
rankings.push({ site: siteId, score });
|
|
@@ -284,8 +301,8 @@ export class MetricsCollector {
|
|
|
284
301
|
return {
|
|
285
302
|
sites,
|
|
286
303
|
comparison,
|
|
287
|
-
bestPerforming: rankings[0]?.site ||
|
|
288
|
-
worstPerforming: rankings[rankings.length - 1]?.site ||
|
|
304
|
+
bestPerforming: rankings[0]?.site || "",
|
|
305
|
+
worstPerforming: rankings[rankings.length - 1]?.site || "",
|
|
289
306
|
};
|
|
290
307
|
}
|
|
291
308
|
|
|
@@ -304,34 +321,49 @@ export class MetricsCollector {
|
|
|
304
321
|
|
|
305
322
|
// Critical issues
|
|
306
323
|
if (metrics.requests.averageResponseTime > 5000) {
|
|
307
|
-
critical.push(
|
|
324
|
+
critical.push(
|
|
325
|
+
"Response times are critically high (>5s). Enable caching immediately.",
|
|
326
|
+
);
|
|
308
327
|
}
|
|
309
328
|
|
|
310
|
-
const errorRate =
|
|
329
|
+
const errorRate =
|
|
330
|
+
metrics.requests.failed / Math.max(metrics.requests.total, 1);
|
|
311
331
|
if (errorRate > 0.1) {
|
|
312
|
-
critical.push(
|
|
332
|
+
critical.push(
|
|
333
|
+
"Error rate is critically high (>10%). Check WordPress connectivity.",
|
|
334
|
+
);
|
|
313
335
|
}
|
|
314
336
|
|
|
315
337
|
// Recommended optimizations
|
|
316
338
|
if (metrics.cache.hitRate < 0.8) {
|
|
317
|
-
recommended.push(
|
|
339
|
+
recommended.push(
|
|
340
|
+
"Cache hit rate is below 80%. Consider cache warming or TTL adjustment.",
|
|
341
|
+
);
|
|
318
342
|
}
|
|
319
343
|
|
|
320
344
|
if (metrics.requests.averageResponseTime > 2000) {
|
|
321
|
-
recommended.push(
|
|
345
|
+
recommended.push(
|
|
346
|
+
"Response times could be improved. Consider enabling more aggressive caching.",
|
|
347
|
+
);
|
|
322
348
|
}
|
|
323
349
|
|
|
324
350
|
if (metrics.system.memoryUsage > 80) {
|
|
325
|
-
recommended.push(
|
|
351
|
+
recommended.push(
|
|
352
|
+
"Memory usage is high. Consider increasing cache size limits or server resources.",
|
|
353
|
+
);
|
|
326
354
|
}
|
|
327
355
|
|
|
328
356
|
// Optional optimizations
|
|
329
357
|
if (metrics.cache.totalSize < 100) {
|
|
330
|
-
optional.push(
|
|
358
|
+
optional.push(
|
|
359
|
+
"Cache utilization is low. Consider pre-warming with frequently accessed data.",
|
|
360
|
+
);
|
|
331
361
|
}
|
|
332
362
|
|
|
333
363
|
if (Object.keys(metrics.tools.toolUsageCount).length > 10) {
|
|
334
|
-
optional.push(
|
|
364
|
+
optional.push(
|
|
365
|
+
"Many tools are being used. Consider creating custom workflows for common operations.",
|
|
366
|
+
);
|
|
335
367
|
}
|
|
336
368
|
|
|
337
369
|
return { critical, recommended, optional };
|
|
@@ -357,10 +389,10 @@ export class MetricsCollector {
|
|
|
357
389
|
siteComparison: this.compareSitePerformance(),
|
|
358
390
|
aggregatedStats: {
|
|
359
391
|
cache: this.getAggregatedCacheStats(),
|
|
360
|
-
client: this.getAggregatedClientStats()
|
|
392
|
+
client: this.getAggregatedClientStats(),
|
|
361
393
|
},
|
|
362
394
|
optimizations: this.generateOptimizationSuggestions(),
|
|
363
|
-
alerts: this.monitor.getAlerts()
|
|
395
|
+
alerts: this.monitor.getAlerts(),
|
|
364
396
|
};
|
|
365
397
|
}
|
|
366
398
|
|
|
@@ -394,23 +426,23 @@ export class MetricsCollector {
|
|
|
394
426
|
* Intercept client requests for automatic tracking
|
|
395
427
|
*/
|
|
396
428
|
private interceptClientRequests(siteId: string, client: any): void {
|
|
397
|
-
if (!client.request || typeof client.request !==
|
|
429
|
+
if (!client.request || typeof client.request !== "function") {
|
|
398
430
|
return;
|
|
399
431
|
}
|
|
400
432
|
|
|
401
433
|
const originalRequest = client.request.bind(client);
|
|
402
|
-
|
|
434
|
+
|
|
403
435
|
client.request = async (...args: any[]) => {
|
|
404
436
|
const startTime = Date.now();
|
|
405
437
|
const requestId = `${siteId}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
406
|
-
|
|
438
|
+
|
|
407
439
|
// Extract metadata
|
|
408
440
|
const metadata: RequestMetadata = {
|
|
409
441
|
siteId,
|
|
410
|
-
endpoint: args[0] ||
|
|
411
|
-
method: args[1] ||
|
|
442
|
+
endpoint: args[0] || "unknown",
|
|
443
|
+
method: args[1] || "GET",
|
|
412
444
|
startTime,
|
|
413
|
-
fromCache: false
|
|
445
|
+
fromCache: false,
|
|
414
446
|
};
|
|
415
447
|
|
|
416
448
|
this.activeRequests.set(requestId, metadata);
|
|
@@ -418,19 +450,19 @@ export class MetricsCollector {
|
|
|
418
450
|
try {
|
|
419
451
|
const result = await originalRequest(...args);
|
|
420
452
|
const responseTime = Date.now() - startTime;
|
|
421
|
-
|
|
453
|
+
|
|
422
454
|
// Check if response came from cache
|
|
423
455
|
const _fromCache = result.cached || false;
|
|
424
|
-
|
|
456
|
+
|
|
425
457
|
this.monitor.recordRequest(responseTime, true);
|
|
426
458
|
this.activeRequests.delete(requestId);
|
|
427
|
-
|
|
459
|
+
|
|
428
460
|
return result;
|
|
429
461
|
} catch (error) {
|
|
430
462
|
const responseTime = Date.now() - startTime;
|
|
431
463
|
this.monitor.recordRequest(responseTime, false);
|
|
432
464
|
this.activeRequests.delete(requestId);
|
|
433
|
-
|
|
465
|
+
|
|
434
466
|
throw error;
|
|
435
467
|
}
|
|
436
468
|
};
|