mcp-wordpress 1.1.7 → 1.2.2
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 +388 -66
- package/dist/cache/CacheInvalidation.d.ts +118 -0
- package/dist/cache/CacheInvalidation.d.ts.map +1 -0
- package/dist/cache/CacheInvalidation.js +349 -0
- package/dist/cache/CacheInvalidation.js.map +1 -0
- package/dist/cache/CacheManager.d.ts +143 -0
- package/dist/cache/CacheManager.d.ts.map +1 -0
- package/dist/cache/CacheManager.js +308 -0
- package/dist/cache/CacheManager.js.map +1 -0
- package/dist/cache/HttpCacheWrapper.d.ts +121 -0
- package/dist/cache/HttpCacheWrapper.d.ts.map +1 -0
- package/dist/cache/HttpCacheWrapper.js +280 -0
- package/dist/cache/HttpCacheWrapper.js.map +1 -0
- package/dist/cache/__tests__/CacheInvalidation.test.d.ts +5 -0
- package/dist/cache/__tests__/CacheInvalidation.test.d.ts.map +1 -0
- package/dist/cache/__tests__/CacheInvalidation.test.js +236 -0
- package/dist/cache/__tests__/CacheInvalidation.test.js.map +1 -0
- package/dist/cache/__tests__/CacheManager.test.d.ts +5 -0
- package/dist/cache/__tests__/CacheManager.test.d.ts.map +1 -0
- package/dist/cache/__tests__/CacheManager.test.js +233 -0
- package/dist/cache/__tests__/CacheManager.test.js.map +1 -0
- package/dist/cache/__tests__/CachedWordPressClient.test.d.ts +5 -0
- package/dist/cache/__tests__/CachedWordPressClient.test.d.ts.map +1 -0
- package/dist/cache/__tests__/CachedWordPressClient.test.js +228 -0
- package/dist/cache/__tests__/CachedWordPressClient.test.js.map +1 -0
- package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts +5 -0
- package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts.map +1 -0
- package/dist/cache/__tests__/HttpCacheWrapper.test.js +296 -0
- package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -0
- package/dist/cache/index.d.ts +12 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +9 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/client/CachedWordPressClient.d.ts +160 -0
- package/dist/client/CachedWordPressClient.d.ts.map +1 -0
- package/dist/client/CachedWordPressClient.js +338 -0
- package/dist/client/CachedWordPressClient.js.map +1 -0
- package/dist/client/WordPressClient.d.ts +81 -0
- package/dist/client/WordPressClient.d.ts.map +1 -0
- package/dist/client/WordPressClient.js +354 -0
- package/dist/client/WordPressClient.js.map +1 -0
- package/dist/config/ConfigurationSchema.d.ts +281 -0
- package/dist/config/ConfigurationSchema.d.ts.map +1 -0
- package/dist/config/ConfigurationSchema.js +205 -0
- package/dist/config/ConfigurationSchema.js.map +1 -0
- package/dist/config/ServerConfiguration.d.ts +38 -0
- package/dist/config/ServerConfiguration.d.ts.map +1 -0
- package/dist/config/ServerConfiguration.js +158 -0
- package/dist/config/ServerConfiguration.js.map +1 -0
- package/dist/docs/DocumentationGenerator.d.ts +184 -0
- package/dist/docs/DocumentationGenerator.d.ts.map +1 -0
- package/dist/docs/DocumentationGenerator.js +735 -0
- package/dist/docs/DocumentationGenerator.js.map +1 -0
- package/dist/docs/MarkdownFormatter.d.ts +84 -0
- package/dist/docs/MarkdownFormatter.d.ts.map +1 -0
- package/dist/docs/MarkdownFormatter.js +448 -0
- package/dist/docs/MarkdownFormatter.js.map +1 -0
- package/dist/docs/index.d.ts +8 -0
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +7 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -212
- package/dist/index.js.map +1 -1
- package/dist/performance/AnomalyDetector.d.ts +63 -0
- package/dist/performance/AnomalyDetector.d.ts.map +1 -0
- package/dist/performance/AnomalyDetector.js +222 -0
- package/dist/performance/AnomalyDetector.js.map +1 -0
- package/dist/performance/BenchmarkAnalyzer.d.ts +67 -0
- package/dist/performance/BenchmarkAnalyzer.d.ts.map +1 -0
- package/dist/performance/BenchmarkAnalyzer.js +301 -0
- package/dist/performance/BenchmarkAnalyzer.js.map +1 -0
- package/dist/performance/MetricsCollector.d.ts +139 -0
- package/dist/performance/MetricsCollector.d.ts.map +1 -0
- package/dist/performance/MetricsCollector.js +320 -0
- package/dist/performance/MetricsCollector.js.map +1 -0
- package/dist/performance/PerformanceAnalytics.d.ts +162 -0
- package/dist/performance/PerformanceAnalytics.d.ts.map +1 -0
- package/dist/performance/PerformanceAnalytics.js +554 -0
- package/dist/performance/PerformanceAnalytics.js.map +1 -0
- package/dist/performance/PerformanceMonitor.d.ts +202 -0
- package/dist/performance/PerformanceMonitor.d.ts.map +1 -0
- package/dist/performance/PerformanceMonitor.js +478 -0
- package/dist/performance/PerformanceMonitor.js.map +1 -0
- package/dist/performance/TrendAnalyzer.d.ts +69 -0
- package/dist/performance/TrendAnalyzer.d.ts.map +1 -0
- package/dist/performance/TrendAnalyzer.js +203 -0
- package/dist/performance/TrendAnalyzer.js.map +1 -0
- package/dist/performance/index.d.ts +11 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/index.js +8 -0
- package/dist/performance/index.js.map +1 -0
- package/dist/security/InputValidator.d.ts +215 -0
- package/dist/security/InputValidator.d.ts.map +1 -0
- package/dist/security/InputValidator.js +278 -0
- package/dist/security/InputValidator.js.map +1 -0
- package/dist/security/SecurityConfig.d.ts +129 -0
- package/dist/security/SecurityConfig.d.ts.map +1 -0
- package/dist/security/SecurityConfig.js +262 -0
- package/dist/security/SecurityConfig.js.map +1 -0
- package/dist/server/ConnectionTester.d.ts +24 -0
- package/dist/server/ConnectionTester.d.ts.map +1 -0
- package/dist/server/ConnectionTester.js +61 -0
- package/dist/server/ConnectionTester.js.map +1 -0
- package/dist/server/ToolRegistry.d.ts +46 -0
- package/dist/server/ToolRegistry.d.ts.map +1 -0
- package/dist/server/ToolRegistry.js +148 -0
- package/dist/server/ToolRegistry.js.map +1 -0
- package/dist/tools/BaseToolClass.d.ts +76 -0
- package/dist/tools/BaseToolClass.d.ts.map +1 -0
- package/dist/tools/BaseToolClass.js +104 -0
- package/dist/tools/BaseToolClass.js.map +1 -0
- package/dist/tools/BaseToolManager.d.ts +26 -0
- package/dist/tools/BaseToolManager.d.ts.map +1 -0
- package/dist/tools/BaseToolManager.js +56 -0
- package/dist/tools/BaseToolManager.js.map +1 -0
- package/dist/tools/base.d.ts +37 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +60 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/cache.d.ts +260 -0
- package/dist/tools/cache.d.ts.map +1 -0
- package/dist/tools/cache.js +237 -0
- package/dist/tools/cache.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/performance.d.ts +63 -0
- package/dist/tools/performance.d.ts.map +1 -0
- package/dist/tools/performance.js +865 -0
- package/dist/tools/performance.js.map +1 -0
- package/dist/types/client.d.ts +1 -0
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/client.js.map +1 -1
- package/dist/utils/toolWrapper.d.ts +4 -0
- package/dist/utils/toolWrapper.d.ts.map +1 -1
- package/dist/utils/toolWrapper.js +11 -0
- package/dist/utils/toolWrapper.js.map +1 -1
- package/dist/utils/validation.d.ts +68 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +185 -0
- package/dist/utils/validation.js.map +1 -0
- package/docs/CACHING.md +340 -0
- package/docs/DOCKER.md +451 -0
- package/docs/PERFORMANCE_MONITORING.md +471 -0
- package/docs/SECURITY_TESTING.md +393 -0
- package/docs/api/README.md +200 -0
- package/docs/api/categories/auth.md +40 -0
- package/docs/api/categories/cache.md +41 -0
- package/docs/api/categories/comment.md +44 -0
- package/docs/api/categories/media.md +43 -0
- package/docs/api/categories/page.md +43 -0
- package/docs/api/categories/performance.md +44 -0
- package/docs/api/categories/post.md +43 -0
- package/docs/api/categories/site.md +43 -0
- package/docs/api/categories/taxonomy.md +47 -0
- package/docs/api/categories/user.md +43 -0
- package/docs/api/openapi.json +3305 -0
- package/docs/api/summary.json +12 -0
- package/docs/api/tools/wp_approve_comment.md +98 -0
- package/docs/api/tools/wp_cache_clear.md +120 -0
- package/docs/api/tools/wp_cache_info.md +119 -0
- package/docs/api/tools/wp_cache_stats.md +119 -0
- package/docs/api/tools/wp_cache_warm.md +119 -0
- package/docs/api/tools/wp_create_application_password.md +102 -0
- package/docs/api/tools/wp_create_category.md +102 -0
- package/docs/api/tools/wp_create_comment.md +128 -0
- package/docs/api/tools/wp_create_page.md +135 -0
- package/docs/api/tools/wp_create_post.md +147 -0
- package/docs/api/tools/wp_create_tag.md +101 -0
- package/docs/api/tools/wp_create_user.md +135 -0
- package/docs/api/tools/wp_delete_application_password.md +101 -0
- package/docs/api/tools/wp_delete_category.md +100 -0
- package/docs/api/tools/wp_delete_comment.md +101 -0
- package/docs/api/tools/wp_delete_media.md +108 -0
- package/docs/api/tools/wp_delete_page.md +108 -0
- package/docs/api/tools/wp_delete_post.md +117 -0
- package/docs/api/tools/wp_delete_tag.md +100 -0
- package/docs/api/tools/wp_delete_user.md +108 -0
- package/docs/api/tools/wp_get_application_passwords.md +103 -0
- package/docs/api/tools/wp_get_auth_status.md +101 -0
- package/docs/api/tools/wp_get_category.md +103 -0
- package/docs/api/tools/wp_get_comment.md +103 -0
- package/docs/api/tools/wp_get_current_user.md +101 -0
- package/docs/api/tools/wp_get_media.md +103 -0
- package/docs/api/tools/wp_get_page.md +103 -0
- package/docs/api/tools/wp_get_page_revisions.md +103 -0
- package/docs/api/tools/wp_get_post.md +112 -0
- package/docs/api/tools/wp_get_post_revisions.md +103 -0
- package/docs/api/tools/wp_get_site_settings.md +108 -0
- package/docs/api/tools/wp_get_tag.md +103 -0
- package/docs/api/tools/wp_get_user.md +103 -0
- package/docs/api/tools/wp_list_categories.md +111 -0
- package/docs/api/tools/wp_list_comments.md +111 -0
- package/docs/api/tools/wp_list_media.md +145 -0
- package/docs/api/tools/wp_list_pages.md +145 -0
- package/docs/api/tools/wp_list_posts.md +156 -0
- package/docs/api/tools/wp_list_tags.md +110 -0
- package/docs/api/tools/wp_list_users.md +111 -0
- package/docs/api/tools/wp_performance_alerts.md +162 -0
- package/docs/api/tools/wp_performance_benchmark.md +160 -0
- package/docs/api/tools/wp_performance_export.md +162 -0
- package/docs/api/tools/wp_performance_history.md +161 -0
- package/docs/api/tools/wp_performance_optimize.md +162 -0
- package/docs/api/tools/wp_performance_stats.md +160 -0
- package/docs/api/tools/wp_search_site.md +99 -0
- package/docs/api/tools/wp_spam_comment.md +98 -0
- package/docs/api/tools/wp_switch_auth_method.md +122 -0
- package/docs/api/tools/wp_test_auth.md +96 -0
- package/docs/api/tools/wp_update_category.md +102 -0
- package/docs/api/tools/wp_update_comment.md +127 -0
- package/docs/api/tools/wp_update_media.md +129 -0
- package/docs/api/tools/wp_update_page.md +135 -0
- package/docs/api/tools/wp_update_post.md +144 -0
- package/docs/api/tools/wp_update_site_settings.md +127 -0
- package/docs/api/tools/wp_update_tag.md +102 -0
- package/docs/api/tools/wp_update_user.md +134 -0
- package/docs/api/tools/wp_upload_media.md +131 -0
- package/docs/api/types/WordPressPost.md +39 -0
- package/docs/contract-testing.md +183 -0
- package/docs/developer/NPM_AUTH_SETUP.md +3 -3
- package/docs/wordpress-rest-api-authentication-troubleshooting.md +218 -0
- package/package.json +84 -64
- package/src/cache/CacheInvalidation.ts +421 -0
- package/src/cache/CacheManager.ts +391 -0
- package/src/cache/HttpCacheWrapper.ts +372 -0
- package/src/cache/__tests__/CacheInvalidation.test.ts +299 -0
- package/src/cache/__tests__/CacheManager.test.ts +300 -0
- package/src/cache/__tests__/CachedWordPressClient.test.ts +304 -0
- package/src/cache/__tests__/HttpCacheWrapper.test.ts +359 -0
- package/src/cache/index.ts +26 -0
- package/src/client/CachedWordPressClient.ts +442 -0
- package/src/config/ConfigurationSchema.ts +246 -0
- package/src/config/ServerConfiguration.ts +215 -0
- package/src/docs/DocumentationGenerator.ts +952 -0
- package/src/docs/MarkdownFormatter.ts +494 -0
- package/src/docs/index.ts +21 -0
- package/src/index.ts +14 -274
- package/src/performance/MetricsCollector.ts +447 -0
- package/src/performance/PerformanceAnalytics.ts +762 -0
- package/src/performance/PerformanceMonitor.ts +649 -0
- package/src/performance/index.ts +28 -0
- package/src/security/InputValidator.ts +319 -0
- package/src/security/SecurityConfig.ts +301 -0
- package/src/server/ConnectionTester.ts +74 -0
- package/src/server/ToolRegistry.ts +194 -0
- package/src/tools/BaseToolManager.ts +66 -0
- package/src/tools/cache.ts +259 -0
- package/src/tools/index.ts +2 -0
- package/src/tools/performance.ts +948 -0
- package/src/types/client.ts +1 -0
- package/src/utils/toolWrapper.ts +11 -0
- package/src/utils/validation.ts +259 -0
|
@@ -0,0 +1,649 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Monitoring System for WordPress MCP Server
|
|
3
|
+
* Collects, analyzes, and reports performance metrics
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface PerformanceMetrics {
|
|
7
|
+
// Request Performance
|
|
8
|
+
requests: {
|
|
9
|
+
total: number;
|
|
10
|
+
successful: number;
|
|
11
|
+
failed: number;
|
|
12
|
+
averageResponseTime: number;
|
|
13
|
+
minResponseTime: number;
|
|
14
|
+
maxResponseTime: number;
|
|
15
|
+
requestsPerSecond: number;
|
|
16
|
+
p50ResponseTime: number;
|
|
17
|
+
p95ResponseTime: number;
|
|
18
|
+
p99ResponseTime: number;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// Cache Performance
|
|
22
|
+
cache: {
|
|
23
|
+
hits: number;
|
|
24
|
+
misses: number;
|
|
25
|
+
hitRate: number;
|
|
26
|
+
totalSize: number;
|
|
27
|
+
memoryUsageMB: number;
|
|
28
|
+
evictions: number;
|
|
29
|
+
averageCacheTime: number;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// System Performance
|
|
33
|
+
system: {
|
|
34
|
+
cpuUsage: number;
|
|
35
|
+
memoryUsage: number;
|
|
36
|
+
uptime: number;
|
|
37
|
+
activeConnections: number;
|
|
38
|
+
concurrentRequests: number;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// WordPress Specific
|
|
42
|
+
wordpress: {
|
|
43
|
+
authSuccessRate: number;
|
|
44
|
+
apiVersion: string;
|
|
45
|
+
siteHealth: 'healthy' | 'warning' | 'critical';
|
|
46
|
+
averageDbResponseTime: number;
|
|
47
|
+
pluginCompatibility: number;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// Tool Usage
|
|
51
|
+
tools: {
|
|
52
|
+
mostUsedTool: string;
|
|
53
|
+
toolUsageCount: Record<string, number>;
|
|
54
|
+
toolPerformance: Record<string, {
|
|
55
|
+
averageTime: number;
|
|
56
|
+
successRate: number;
|
|
57
|
+
callCount: number;
|
|
58
|
+
}>;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface PerformanceAlert {
|
|
63
|
+
id: string;
|
|
64
|
+
timestamp: number;
|
|
65
|
+
severity: 'info' | 'warning' | 'error' | 'critical';
|
|
66
|
+
category: 'performance' | 'cache' | 'system' | 'wordpress';
|
|
67
|
+
message: string;
|
|
68
|
+
metric: string;
|
|
69
|
+
threshold: number;
|
|
70
|
+
actualValue: number;
|
|
71
|
+
suggestion?: string;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface PerformanceConfig {
|
|
75
|
+
collectInterval: number; // Collection interval in ms
|
|
76
|
+
retentionPeriod: number; // Data retention in ms
|
|
77
|
+
alertThresholds: {
|
|
78
|
+
responseTime: number;
|
|
79
|
+
errorRate: number;
|
|
80
|
+
cacheHitRate: number;
|
|
81
|
+
memoryUsage: number;
|
|
82
|
+
cpuUsage: number;
|
|
83
|
+
};
|
|
84
|
+
enableRealTimeMonitoring: boolean;
|
|
85
|
+
enableHistoricalData: boolean;
|
|
86
|
+
enableAlerts: boolean;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Core Performance Monitor class
|
|
91
|
+
*/
|
|
92
|
+
export class PerformanceMonitor {
|
|
93
|
+
private metrics: PerformanceMetrics;
|
|
94
|
+
private historicalData: PerformanceMetrics[] = [];
|
|
95
|
+
private alerts: PerformanceAlert[] = [];
|
|
96
|
+
private config: PerformanceConfig;
|
|
97
|
+
private startTime: number;
|
|
98
|
+
private responseTimes: number[] = [];
|
|
99
|
+
private collectionTimer?: NodeJS.Timeout;
|
|
100
|
+
|
|
101
|
+
constructor(config: Partial<PerformanceConfig> = {}) {
|
|
102
|
+
this.startTime = Date.now();
|
|
103
|
+
this.config = {
|
|
104
|
+
collectInterval: 30000, // 30 seconds
|
|
105
|
+
retentionPeriod: 24 * 60 * 60 * 1000, // 24 hours
|
|
106
|
+
alertThresholds: {
|
|
107
|
+
responseTime: 2000, // 2 seconds
|
|
108
|
+
errorRate: 0.05, // 5%
|
|
109
|
+
cacheHitRate: 0.8, // 80%
|
|
110
|
+
memoryUsage: 80, // 80%
|
|
111
|
+
cpuUsage: 80 // 80%
|
|
112
|
+
},
|
|
113
|
+
enableRealTimeMonitoring: true,
|
|
114
|
+
enableHistoricalData: true,
|
|
115
|
+
enableAlerts: true,
|
|
116
|
+
...config
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
this.metrics = this.initializeMetrics();
|
|
120
|
+
|
|
121
|
+
if (this.config.enableRealTimeMonitoring) {
|
|
122
|
+
this.startCollection();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Initialize empty metrics structure
|
|
128
|
+
*/
|
|
129
|
+
private initializeMetrics(): PerformanceMetrics {
|
|
130
|
+
return {
|
|
131
|
+
requests: {
|
|
132
|
+
total: 0,
|
|
133
|
+
successful: 0,
|
|
134
|
+
failed: 0,
|
|
135
|
+
averageResponseTime: 0,
|
|
136
|
+
minResponseTime: 0,
|
|
137
|
+
maxResponseTime: 0,
|
|
138
|
+
requestsPerSecond: 0,
|
|
139
|
+
p50ResponseTime: 0,
|
|
140
|
+
p95ResponseTime: 0,
|
|
141
|
+
p99ResponseTime: 0
|
|
142
|
+
},
|
|
143
|
+
cache: {
|
|
144
|
+
hits: 0,
|
|
145
|
+
misses: 0,
|
|
146
|
+
hitRate: 0,
|
|
147
|
+
totalSize: 0,
|
|
148
|
+
memoryUsageMB: 0,
|
|
149
|
+
evictions: 0,
|
|
150
|
+
averageCacheTime: 0
|
|
151
|
+
},
|
|
152
|
+
system: {
|
|
153
|
+
cpuUsage: 0,
|
|
154
|
+
memoryUsage: 0,
|
|
155
|
+
uptime: 0,
|
|
156
|
+
activeConnections: 0,
|
|
157
|
+
concurrentRequests: 0
|
|
158
|
+
},
|
|
159
|
+
wordpress: {
|
|
160
|
+
authSuccessRate: 0,
|
|
161
|
+
apiVersion: 'v2',
|
|
162
|
+
siteHealth: 'healthy',
|
|
163
|
+
averageDbResponseTime: 0,
|
|
164
|
+
pluginCompatibility: 100
|
|
165
|
+
},
|
|
166
|
+
tools: {
|
|
167
|
+
mostUsedTool: '',
|
|
168
|
+
toolUsageCount: {},
|
|
169
|
+
toolPerformance: {}
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Record a request performance metric
|
|
176
|
+
*/
|
|
177
|
+
recordRequest(responseTime: number, success: boolean, toolName?: string): void {
|
|
178
|
+
this.metrics.requests.total++;
|
|
179
|
+
|
|
180
|
+
if (success) {
|
|
181
|
+
this.metrics.requests.successful++;
|
|
182
|
+
} else {
|
|
183
|
+
this.metrics.requests.failed++;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Track response times
|
|
187
|
+
this.responseTimes.push(responseTime);
|
|
188
|
+
this.updateResponseTimeMetrics();
|
|
189
|
+
|
|
190
|
+
// Track tool usage
|
|
191
|
+
if (toolName) {
|
|
192
|
+
this.recordToolUsage(toolName, responseTime, success);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Check for alerts
|
|
196
|
+
if (this.config.enableAlerts) {
|
|
197
|
+
this.checkPerformanceAlerts();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Update cache metrics from cache manager
|
|
203
|
+
*/
|
|
204
|
+
updateCacheMetrics(cacheStats: any): void {
|
|
205
|
+
this.metrics.cache = {
|
|
206
|
+
hits: cacheStats.hits || 0,
|
|
207
|
+
misses: cacheStats.misses || 0,
|
|
208
|
+
hitRate: cacheStats.hitRate || 0,
|
|
209
|
+
totalSize: cacheStats.totalSize || 0,
|
|
210
|
+
memoryUsageMB: this.estimateCacheMemoryUsage(cacheStats.totalSize),
|
|
211
|
+
evictions: cacheStats.evictions || 0,
|
|
212
|
+
averageCacheTime: 0.5 // Sub-millisecond average
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Update system metrics
|
|
218
|
+
*/
|
|
219
|
+
updateSystemMetrics(): void {
|
|
220
|
+
const memUsage = process.memoryUsage();
|
|
221
|
+
|
|
222
|
+
this.metrics.system = {
|
|
223
|
+
cpuUsage: this.getCpuUsage(),
|
|
224
|
+
memoryUsage: Math.round((memUsage.heapUsed / memUsage.heapTotal) * 100),
|
|
225
|
+
uptime: Date.now() - this.startTime,
|
|
226
|
+
activeConnections: 1, // Will be updated by connection manager
|
|
227
|
+
concurrentRequests: 0 // Will be updated by request manager
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Get current performance metrics
|
|
233
|
+
*/
|
|
234
|
+
getMetrics(): PerformanceMetrics {
|
|
235
|
+
this.updateSystemMetrics();
|
|
236
|
+
return { ...this.metrics };
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Get historical performance data
|
|
241
|
+
*/
|
|
242
|
+
getHistoricalData(
|
|
243
|
+
startTime?: number,
|
|
244
|
+
endTime?: number
|
|
245
|
+
): PerformanceMetrics[] {
|
|
246
|
+
if (!this.config.enableHistoricalData) {
|
|
247
|
+
return [];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
let data = [...this.historicalData];
|
|
251
|
+
|
|
252
|
+
if (startTime) {
|
|
253
|
+
data = data.filter(m => m.system.uptime >= startTime);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (endTime) {
|
|
257
|
+
data = data.filter(m => m.system.uptime <= endTime);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return data;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Get performance alerts
|
|
265
|
+
*/
|
|
266
|
+
getAlerts(severity?: string): PerformanceAlert[] {
|
|
267
|
+
if (severity) {
|
|
268
|
+
return this.alerts.filter(alert => alert.severity === severity);
|
|
269
|
+
}
|
|
270
|
+
return [...this.alerts];
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Clear alerts
|
|
275
|
+
*/
|
|
276
|
+
clearAlerts(): void {
|
|
277
|
+
this.alerts = [];
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Generate performance insights
|
|
282
|
+
*/
|
|
283
|
+
generateInsights(): {
|
|
284
|
+
summary: string;
|
|
285
|
+
recommendations: string[];
|
|
286
|
+
trends: string[];
|
|
287
|
+
health: 'excellent' | 'good' | 'warning' | 'critical';
|
|
288
|
+
} {
|
|
289
|
+
const current = this.getMetrics();
|
|
290
|
+
const health = this.calculateOverallHealth(current);
|
|
291
|
+
|
|
292
|
+
return {
|
|
293
|
+
summary: this.generateSummary(current),
|
|
294
|
+
recommendations: this.generateRecommendations(current),
|
|
295
|
+
trends: this.generateTrends(),
|
|
296
|
+
health
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Export performance data
|
|
302
|
+
*/
|
|
303
|
+
exportData(format: 'json' | 'csv' = 'json'): string {
|
|
304
|
+
const data = {
|
|
305
|
+
currentMetrics: this.getMetrics(),
|
|
306
|
+
historicalData: this.getHistoricalData(),
|
|
307
|
+
alerts: this.getAlerts(),
|
|
308
|
+
config: this.config,
|
|
309
|
+
generatedAt: new Date().toISOString()
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
if (format === 'csv') {
|
|
313
|
+
return this.convertToCSV(data);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
return JSON.stringify(data, null, 2);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Start automatic metric collection
|
|
321
|
+
*/
|
|
322
|
+
private startCollection(): void {
|
|
323
|
+
this.collectionTimer = setInterval(() => {
|
|
324
|
+
const snapshot = this.getMetrics();
|
|
325
|
+
|
|
326
|
+
if (this.config.enableHistoricalData) {
|
|
327
|
+
this.historicalData.push(snapshot);
|
|
328
|
+
this.cleanupOldData();
|
|
329
|
+
}
|
|
330
|
+
}, this.config.collectInterval);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Stop metric collection
|
|
335
|
+
*/
|
|
336
|
+
stop(): void {
|
|
337
|
+
if (this.collectionTimer) {
|
|
338
|
+
clearInterval(this.collectionTimer);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Record tool usage and performance
|
|
344
|
+
*/
|
|
345
|
+
private recordToolUsage(toolName: string, responseTime: number, success: boolean): void {
|
|
346
|
+
// Update usage count
|
|
347
|
+
this.metrics.tools.toolUsageCount[toolName] =
|
|
348
|
+
(this.metrics.tools.toolUsageCount[toolName] || 0) + 1;
|
|
349
|
+
|
|
350
|
+
// Update performance metrics
|
|
351
|
+
if (!this.metrics.tools.toolPerformance[toolName]) {
|
|
352
|
+
this.metrics.tools.toolPerformance[toolName] = {
|
|
353
|
+
averageTime: responseTime,
|
|
354
|
+
successRate: success ? 1 : 0,
|
|
355
|
+
callCount: 1
|
|
356
|
+
};
|
|
357
|
+
} else {
|
|
358
|
+
const perf = this.metrics.tools.toolPerformance[toolName];
|
|
359
|
+
const totalCalls = perf.callCount + 1;
|
|
360
|
+
|
|
361
|
+
// Update average time
|
|
362
|
+
perf.averageTime = (perf.averageTime * perf.callCount + responseTime) / totalCalls;
|
|
363
|
+
|
|
364
|
+
// Update success rate
|
|
365
|
+
const totalSuccess = perf.successRate * perf.callCount + (success ? 1 : 0);
|
|
366
|
+
perf.successRate = totalSuccess / totalCalls;
|
|
367
|
+
|
|
368
|
+
perf.callCount = totalCalls;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Update most used tool
|
|
372
|
+
const usageCounts = this.metrics.tools.toolUsageCount;
|
|
373
|
+
this.metrics.tools.mostUsedTool = Object.keys(usageCounts)
|
|
374
|
+
.reduce((a, b) => usageCounts[a] > usageCounts[b] ? a : b);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Update response time metrics with percentiles
|
|
379
|
+
*/
|
|
380
|
+
private updateResponseTimeMetrics(): void {
|
|
381
|
+
if (this.responseTimes.length === 0) return;
|
|
382
|
+
|
|
383
|
+
const sorted = [...this.responseTimes].sort((a, b) => a - b);
|
|
384
|
+
const total = this.metrics.requests.total;
|
|
385
|
+
|
|
386
|
+
this.metrics.requests.averageResponseTime =
|
|
387
|
+
this.responseTimes.reduce((sum, time) => sum + time, 0) / this.responseTimes.length;
|
|
388
|
+
|
|
389
|
+
this.metrics.requests.minResponseTime = sorted[0];
|
|
390
|
+
this.metrics.requests.maxResponseTime = sorted[sorted.length - 1];
|
|
391
|
+
|
|
392
|
+
// Calculate percentiles
|
|
393
|
+
this.metrics.requests.p50ResponseTime = this.getPercentile(sorted, 0.5);
|
|
394
|
+
this.metrics.requests.p95ResponseTime = this.getPercentile(sorted, 0.95);
|
|
395
|
+
this.metrics.requests.p99ResponseTime = this.getPercentile(sorted, 0.99);
|
|
396
|
+
|
|
397
|
+
// Calculate requests per second
|
|
398
|
+
const uptime = (Date.now() - this.startTime) / 1000;
|
|
399
|
+
this.metrics.requests.requestsPerSecond = total / uptime;
|
|
400
|
+
|
|
401
|
+
// Limit response time history to prevent memory growth
|
|
402
|
+
if (this.responseTimes.length > 10000) {
|
|
403
|
+
this.responseTimes = this.responseTimes.slice(-5000);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Get percentile value from sorted array
|
|
409
|
+
*/
|
|
410
|
+
private getPercentile(sorted: number[], percentile: number): number {
|
|
411
|
+
const index = Math.ceil(sorted.length * percentile) - 1;
|
|
412
|
+
return sorted[Math.max(0, index)];
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Estimate cache memory usage
|
|
417
|
+
*/
|
|
418
|
+
private estimateCacheMemoryUsage(totalSize: number): number {
|
|
419
|
+
// Rough estimate: ~1KB per cache entry
|
|
420
|
+
return (totalSize * 1024) / (1024 * 1024); // Convert to MB
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Get CPU usage (simplified)
|
|
425
|
+
*/
|
|
426
|
+
private getCpuUsage(): number {
|
|
427
|
+
// Simplified CPU usage estimation
|
|
428
|
+
// In production, use more sophisticated monitoring
|
|
429
|
+
return Math.round(Math.random() * 20 + 10); // 10-30% placeholder
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* Check for performance alerts
|
|
434
|
+
*/
|
|
435
|
+
private checkPerformanceAlerts(): void {
|
|
436
|
+
const thresholds = this.config.alertThresholds;
|
|
437
|
+
|
|
438
|
+
// Response time alert
|
|
439
|
+
if (this.metrics.requests.averageResponseTime > thresholds.responseTime) {
|
|
440
|
+
this.addAlert('warning', 'performance',
|
|
441
|
+
`High response time: ${this.metrics.requests.averageResponseTime}ms`,
|
|
442
|
+
'averageResponseTime', thresholds.responseTime,
|
|
443
|
+
this.metrics.requests.averageResponseTime,
|
|
444
|
+
'Consider enabling caching or optimizing queries'
|
|
445
|
+
);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// Error rate alert
|
|
449
|
+
const errorRate = this.metrics.requests.failed / this.metrics.requests.total;
|
|
450
|
+
if (errorRate > thresholds.errorRate) {
|
|
451
|
+
this.addAlert('error', 'performance',
|
|
452
|
+
`High error rate: ${Math.round(errorRate * 100)}%`,
|
|
453
|
+
'errorRate', thresholds.errorRate, errorRate,
|
|
454
|
+
'Check WordPress connectivity and authentication'
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// Cache hit rate alert
|
|
459
|
+
if (this.metrics.cache.hitRate < thresholds.cacheHitRate) {
|
|
460
|
+
this.addAlert('warning', 'cache',
|
|
461
|
+
`Low cache hit rate: ${Math.round(this.metrics.cache.hitRate * 100)}%`,
|
|
462
|
+
'cacheHitRate', thresholds.cacheHitRate, this.metrics.cache.hitRate,
|
|
463
|
+
'Consider cache warming or adjusting TTL values'
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Add performance alert
|
|
470
|
+
*/
|
|
471
|
+
private addAlert(
|
|
472
|
+
severity: 'info' | 'warning' | 'error' | 'critical',
|
|
473
|
+
category: 'performance' | 'cache' | 'system' | 'wordpress',
|
|
474
|
+
message: string,
|
|
475
|
+
metric: string,
|
|
476
|
+
threshold: number,
|
|
477
|
+
actualValue: number,
|
|
478
|
+
suggestion?: string
|
|
479
|
+
): void {
|
|
480
|
+
const alert: PerformanceAlert = {
|
|
481
|
+
id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
482
|
+
timestamp: Date.now(),
|
|
483
|
+
severity,
|
|
484
|
+
category,
|
|
485
|
+
message,
|
|
486
|
+
metric,
|
|
487
|
+
threshold,
|
|
488
|
+
actualValue,
|
|
489
|
+
...(suggestion && { suggestion })
|
|
490
|
+
};
|
|
491
|
+
|
|
492
|
+
this.alerts.push(alert);
|
|
493
|
+
|
|
494
|
+
// Limit alert history
|
|
495
|
+
if (this.alerts.length > 1000) {
|
|
496
|
+
this.alerts = this.alerts.slice(-500);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* Calculate overall system health
|
|
502
|
+
*/
|
|
503
|
+
private calculateOverallHealth(metrics: PerformanceMetrics): 'excellent' | 'good' | 'warning' | 'critical' {
|
|
504
|
+
let score = 100;
|
|
505
|
+
|
|
506
|
+
// Response time impact
|
|
507
|
+
if (metrics.requests.averageResponseTime > 3000) score -= 30;
|
|
508
|
+
else if (metrics.requests.averageResponseTime > 1000) score -= 15;
|
|
509
|
+
|
|
510
|
+
// Error rate impact
|
|
511
|
+
const errorRate = metrics.requests.failed / metrics.requests.total;
|
|
512
|
+
if (errorRate > 0.1) score -= 40;
|
|
513
|
+
else if (errorRate > 0.05) score -= 20;
|
|
514
|
+
|
|
515
|
+
// Cache performance impact
|
|
516
|
+
if (metrics.cache.hitRate < 0.5) score -= 25;
|
|
517
|
+
else if (metrics.cache.hitRate < 0.8) score -= 10;
|
|
518
|
+
|
|
519
|
+
// System resource impact
|
|
520
|
+
if (metrics.system.memoryUsage > 90) score -= 20;
|
|
521
|
+
else if (metrics.system.memoryUsage > 80) score -= 10;
|
|
522
|
+
|
|
523
|
+
if (score >= 90) return 'excellent';
|
|
524
|
+
if (score >= 75) return 'good';
|
|
525
|
+
if (score >= 50) return 'warning';
|
|
526
|
+
return 'critical';
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* Generate performance summary
|
|
531
|
+
*/
|
|
532
|
+
private generateSummary(metrics: PerformanceMetrics): string {
|
|
533
|
+
const errorRate = metrics.requests.total > 0
|
|
534
|
+
? (metrics.requests.failed / metrics.requests.total * 100).toFixed(1)
|
|
535
|
+
: '0';
|
|
536
|
+
|
|
537
|
+
return `Performance Summary: ${metrics.requests.total} requests processed with ${errorRate}% error rate. ` +
|
|
538
|
+
`Average response time: ${metrics.requests.averageResponseTime.toFixed(0)}ms. ` +
|
|
539
|
+
`Cache hit rate: ${(metrics.cache.hitRate * 100).toFixed(1)}%. ` +
|
|
540
|
+
`System uptime: ${Math.round(metrics.system.uptime / 1000 / 60)} minutes.`;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Generate performance recommendations
|
|
545
|
+
*/
|
|
546
|
+
private generateRecommendations(metrics: PerformanceMetrics): string[] {
|
|
547
|
+
const recommendations: string[] = [];
|
|
548
|
+
|
|
549
|
+
if (metrics.requests.averageResponseTime > 1000) {
|
|
550
|
+
recommendations.push('Enable caching to reduce response times');
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
if (metrics.cache.hitRate < 0.8) {
|
|
554
|
+
recommendations.push('Warm cache with frequently accessed data');
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
if (metrics.system.memoryUsage > 80) {
|
|
558
|
+
recommendations.push('Consider increasing memory allocation or cache size limits');
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
const errorRate = metrics.requests.failed / metrics.requests.total;
|
|
562
|
+
if (errorRate > 0.05) {
|
|
563
|
+
recommendations.push('Review error logs and improve error handling');
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
return recommendations;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
/**
|
|
570
|
+
* Generate trend analysis
|
|
571
|
+
*/
|
|
572
|
+
private generateTrends(): string[] {
|
|
573
|
+
if (this.historicalData.length < 2) {
|
|
574
|
+
return ['Insufficient data for trend analysis'];
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
const trends: string[] = [];
|
|
578
|
+
const recent = this.historicalData.slice(-5);
|
|
579
|
+
|
|
580
|
+
// Response time trend
|
|
581
|
+
const responseTimes = recent.map(d => d.requests.averageResponseTime);
|
|
582
|
+
if (this.isIncreasing(responseTimes)) {
|
|
583
|
+
trends.push('Response times are increasing');
|
|
584
|
+
} else if (this.isDecreasing(responseTimes)) {
|
|
585
|
+
trends.push('Response times are improving');
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
// Cache hit rate trend
|
|
589
|
+
const hitRates = recent.map(d => d.cache.hitRate);
|
|
590
|
+
if (this.isIncreasing(hitRates)) {
|
|
591
|
+
trends.push('Cache performance is improving');
|
|
592
|
+
} else if (this.isDecreasing(hitRates)) {
|
|
593
|
+
trends.push('Cache performance is declining');
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
return trends;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
* Check if values are increasing
|
|
601
|
+
*/
|
|
602
|
+
private isIncreasing(values: number[]): boolean {
|
|
603
|
+
for (let i = 1; i < values.length; i++) {
|
|
604
|
+
if (values[i] <= values[i - 1]) return false;
|
|
605
|
+
}
|
|
606
|
+
return true;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/**
|
|
610
|
+
* Check if values are decreasing
|
|
611
|
+
*/
|
|
612
|
+
private isDecreasing(values: number[]): boolean {
|
|
613
|
+
for (let i = 1; i < values.length; i++) {
|
|
614
|
+
if (values[i] >= values[i - 1]) return false;
|
|
615
|
+
}
|
|
616
|
+
return true;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
/**
|
|
620
|
+
* Convert data to CSV format
|
|
621
|
+
*/
|
|
622
|
+
private convertToCSV(data: any): string {
|
|
623
|
+
// Simplified CSV conversion for metrics
|
|
624
|
+
const metrics = data.currentMetrics;
|
|
625
|
+
const csv = [
|
|
626
|
+
'Metric,Value',
|
|
627
|
+
`Total Requests,${metrics.requests.total}`,
|
|
628
|
+
`Successful Requests,${metrics.requests.successful}`,
|
|
629
|
+
`Failed Requests,${metrics.requests.failed}`,
|
|
630
|
+
`Average Response Time,${metrics.requests.averageResponseTime}`,
|
|
631
|
+
`Cache Hit Rate,${metrics.cache.hitRate}`,
|
|
632
|
+
`Cache Size,${metrics.cache.totalSize}`,
|
|
633
|
+
`Memory Usage,${metrics.system.memoryUsage}%`,
|
|
634
|
+
`Uptime,${metrics.system.uptime}ms`
|
|
635
|
+
];
|
|
636
|
+
|
|
637
|
+
return csv.join('\n');
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/**
|
|
641
|
+
* Clean up old historical data
|
|
642
|
+
*/
|
|
643
|
+
private cleanupOldData(): void {
|
|
644
|
+
const cutoff = Date.now() - this.config.retentionPeriod;
|
|
645
|
+
this.historicalData = this.historicalData.filter(
|
|
646
|
+
data => data.system.uptime > cutoff
|
|
647
|
+
);
|
|
648
|
+
}
|
|
649
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Monitoring System Exports
|
|
3
|
+
* Central export point for all performance monitoring components
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export { PerformanceMonitor } from './PerformanceMonitor.js';
|
|
7
|
+
export { MetricsCollector } from './MetricsCollector.js';
|
|
8
|
+
export { PerformanceAnalytics } from './PerformanceAnalytics.js';
|
|
9
|
+
|
|
10
|
+
export type {
|
|
11
|
+
PerformanceMetrics,
|
|
12
|
+
PerformanceAlert,
|
|
13
|
+
PerformanceConfig
|
|
14
|
+
} from './PerformanceMonitor.js';
|
|
15
|
+
|
|
16
|
+
export type {
|
|
17
|
+
CollectorConfig,
|
|
18
|
+
RequestMetadata,
|
|
19
|
+
ToolExecutionContext
|
|
20
|
+
} from './MetricsCollector.js';
|
|
21
|
+
|
|
22
|
+
export type {
|
|
23
|
+
AnalyticsConfig,
|
|
24
|
+
PerformanceTrend,
|
|
25
|
+
PerformanceAnomaly,
|
|
26
|
+
PerformanceInsight,
|
|
27
|
+
BenchmarkComparison
|
|
28
|
+
} from './PerformanceAnalytics.js';
|