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,20 +3,20 @@
|
|
|
3
3
|
* Provides insights, predictions, and optimization recommendations
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { PerformanceMetrics } from
|
|
7
|
-
import { MetricsCollector } from
|
|
6
|
+
import { PerformanceMetrics } from "./PerformanceMonitor.js";
|
|
7
|
+
import { MetricsCollector } from "./MetricsCollector.js";
|
|
8
8
|
|
|
9
9
|
export interface AnalyticsConfig {
|
|
10
10
|
enablePredictiveAnalysis: boolean;
|
|
11
11
|
enableAnomalyDetection: boolean;
|
|
12
12
|
enableTrendAnalysis: boolean;
|
|
13
13
|
lookbackPeriod: number; // in milliseconds
|
|
14
|
-
sensitivityLevel:
|
|
14
|
+
sensitivityLevel: "low" | "medium" | "high";
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export interface PerformanceTrend {
|
|
18
18
|
metric: string;
|
|
19
|
-
direction:
|
|
19
|
+
direction: "improving" | "declining" | "stable";
|
|
20
20
|
changeRate: number; // percentage change
|
|
21
21
|
confidence: number; // 0-1
|
|
22
22
|
prediction: {
|
|
@@ -32,20 +32,20 @@ export interface PerformanceAnomaly {
|
|
|
32
32
|
expectedValue: number;
|
|
33
33
|
actualValue: number;
|
|
34
34
|
deviation: number; // percentage
|
|
35
|
-
severity:
|
|
35
|
+
severity: "minor" | "moderate" | "major" | "critical";
|
|
36
36
|
possibleCauses: string[];
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
export interface PerformanceInsight {
|
|
40
40
|
id: string;
|
|
41
|
-
category:
|
|
42
|
-
priority:
|
|
41
|
+
category: "optimization" | "scaling" | "maintenance" | "alert";
|
|
42
|
+
priority: "low" | "medium" | "high" | "critical";
|
|
43
43
|
title: string;
|
|
44
44
|
description: string;
|
|
45
|
-
impact:
|
|
45
|
+
impact: "performance" | "reliability" | "cost" | "user_experience";
|
|
46
46
|
recommendation: string;
|
|
47
47
|
estimatedImprovement: string;
|
|
48
|
-
implementationEffort:
|
|
48
|
+
implementationEffort: "low" | "medium" | "high";
|
|
49
49
|
relatedMetrics: string[];
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -54,7 +54,7 @@ export interface BenchmarkComparison {
|
|
|
54
54
|
currentValue: number;
|
|
55
55
|
benchmarkValue: number;
|
|
56
56
|
percentile: number; // Where current performance ranks (0-100)
|
|
57
|
-
status:
|
|
57
|
+
status: "excellent" | "good" | "average" | "below_average" | "poor";
|
|
58
58
|
improvement: number; // How much improvement needed to reach next tier
|
|
59
59
|
}
|
|
60
60
|
|
|
@@ -71,44 +71,47 @@ export class PerformanceAnalytics {
|
|
|
71
71
|
// Performance benchmarks (based on industry standards)
|
|
72
72
|
private benchmarks = {
|
|
73
73
|
responseTime: {
|
|
74
|
-
excellent: 200,
|
|
75
|
-
good: 500,
|
|
76
|
-
average: 1000,
|
|
74
|
+
excellent: 200, // <200ms
|
|
75
|
+
good: 500, // 200-500ms
|
|
76
|
+
average: 1000, // 500ms-1s
|
|
77
77
|
below_average: 2000, // 1-2s
|
|
78
|
-
poor: Infinity
|
|
78
|
+
poor: Infinity, // >2s
|
|
79
79
|
},
|
|
80
80
|
cacheHitRate: {
|
|
81
|
-
excellent: 0.95,
|
|
82
|
-
good: 0.85,
|
|
83
|
-
average: 0.
|
|
84
|
-
below_average: 0.
|
|
85
|
-
poor: 0
|
|
81
|
+
excellent: 0.95, // >95%
|
|
82
|
+
good: 0.85, // 85-95%
|
|
83
|
+
average: 0.7, // 70-85%
|
|
84
|
+
below_average: 0.5, // 50-70%
|
|
85
|
+
poor: 0, // <50%
|
|
86
86
|
},
|
|
87
87
|
errorRate: {
|
|
88
88
|
excellent: 0.001, // <0.1%
|
|
89
|
-
good: 0.01,
|
|
90
|
-
average: 0.02,
|
|
89
|
+
good: 0.01, // 0.1-1%
|
|
90
|
+
average: 0.02, // 1-2%
|
|
91
91
|
below_average: 0.05, // 2-5%
|
|
92
|
-
poor: Infinity
|
|
92
|
+
poor: Infinity, // >5%
|
|
93
93
|
},
|
|
94
94
|
memoryUsage: {
|
|
95
|
-
excellent: 50,
|
|
96
|
-
good: 70,
|
|
97
|
-
average: 80,
|
|
95
|
+
excellent: 50, // <50%
|
|
96
|
+
good: 70, // 50-70%
|
|
97
|
+
average: 80, // 70-80%
|
|
98
98
|
below_average: 90, // 80-90%
|
|
99
|
-
poor: 100
|
|
100
|
-
}
|
|
99
|
+
poor: 100, // >90%
|
|
100
|
+
},
|
|
101
101
|
};
|
|
102
102
|
|
|
103
|
-
constructor(
|
|
103
|
+
constructor(
|
|
104
|
+
collector: MetricsCollector,
|
|
105
|
+
config: Partial<AnalyticsConfig> = {},
|
|
106
|
+
) {
|
|
104
107
|
this.collector = collector;
|
|
105
108
|
this.config = {
|
|
106
109
|
enablePredictiveAnalysis: true,
|
|
107
110
|
enableAnomalyDetection: true,
|
|
108
111
|
enableTrendAnalysis: true,
|
|
109
112
|
lookbackPeriod: 24 * 60 * 60 * 1000, // 24 hours
|
|
110
|
-
sensitivityLevel:
|
|
111
|
-
...config
|
|
113
|
+
sensitivityLevel: "medium",
|
|
114
|
+
...config,
|
|
112
115
|
};
|
|
113
116
|
}
|
|
114
117
|
|
|
@@ -117,11 +120,11 @@ export class PerformanceAnalytics {
|
|
|
117
120
|
*/
|
|
118
121
|
addDataPoint(metrics: PerformanceMetrics): void {
|
|
119
122
|
this.historicalData.push(metrics);
|
|
120
|
-
|
|
123
|
+
|
|
121
124
|
// Limit historical data to lookback period
|
|
122
125
|
const cutoff = Date.now() - this.config.lookbackPeriod;
|
|
123
126
|
this.historicalData = this.historicalData.filter(
|
|
124
|
-
data => data.system.uptime > cutoff
|
|
127
|
+
(data) => data.system.uptime > cutoff,
|
|
125
128
|
);
|
|
126
129
|
|
|
127
130
|
// Run analysis on new data
|
|
@@ -139,38 +142,48 @@ export class PerformanceAnalytics {
|
|
|
139
142
|
}
|
|
140
143
|
|
|
141
144
|
const trends: PerformanceTrend[] = [];
|
|
142
|
-
|
|
145
|
+
|
|
143
146
|
// Analyze response time trend
|
|
144
|
-
trends.push(
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
147
|
+
trends.push(
|
|
148
|
+
this.analyzeTrend(
|
|
149
|
+
"responseTime",
|
|
150
|
+
this.historicalData.map((d) => d.requests.averageResponseTime),
|
|
151
|
+
),
|
|
152
|
+
);
|
|
148
153
|
|
|
149
154
|
// Analyze cache hit rate trend
|
|
150
|
-
trends.push(
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
155
|
+
trends.push(
|
|
156
|
+
this.analyzeTrend(
|
|
157
|
+
"cacheHitRate",
|
|
158
|
+
this.historicalData.map((d) => d.cache.hitRate),
|
|
159
|
+
),
|
|
160
|
+
);
|
|
154
161
|
|
|
155
162
|
// Analyze error rate trend
|
|
156
|
-
trends.push(
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
163
|
+
trends.push(
|
|
164
|
+
this.analyzeTrend(
|
|
165
|
+
"errorRate",
|
|
166
|
+
this.historicalData.map((d) =>
|
|
167
|
+
d.requests.total > 0 ? d.requests.failed / d.requests.total : 0,
|
|
168
|
+
),
|
|
169
|
+
),
|
|
170
|
+
);
|
|
162
171
|
|
|
163
172
|
// Analyze memory usage trend
|
|
164
|
-
trends.push(
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
173
|
+
trends.push(
|
|
174
|
+
this.analyzeTrend(
|
|
175
|
+
"memoryUsage",
|
|
176
|
+
this.historicalData.map((d) => d.system.memoryUsage),
|
|
177
|
+
),
|
|
178
|
+
);
|
|
168
179
|
|
|
169
180
|
// Analyze request volume trend
|
|
170
|
-
trends.push(
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
181
|
+
trends.push(
|
|
182
|
+
this.analyzeTrend(
|
|
183
|
+
"requestVolume",
|
|
184
|
+
this.historicalData.map((d) => d.requests.requestsPerSecond),
|
|
185
|
+
),
|
|
186
|
+
);
|
|
174
187
|
|
|
175
188
|
return trends;
|
|
176
189
|
}
|
|
@@ -186,48 +199,51 @@ export class PerformanceAnalytics {
|
|
|
186
199
|
// Cache optimization insights
|
|
187
200
|
if (currentMetrics.cache.hitRate < 0.8) {
|
|
188
201
|
insights.push({
|
|
189
|
-
id:
|
|
190
|
-
category:
|
|
191
|
-
priority:
|
|
192
|
-
title:
|
|
202
|
+
id: "cache-optimization-1",
|
|
203
|
+
category: "optimization",
|
|
204
|
+
priority: "high",
|
|
205
|
+
title: "Improve Cache Hit Rate",
|
|
193
206
|
description: `Current cache hit rate is ${(currentMetrics.cache.hitRate * 100).toFixed(1)}%, which is below optimal performance.`,
|
|
194
|
-
impact:
|
|
195
|
-
recommendation:
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
207
|
+
impact: "performance",
|
|
208
|
+
recommendation:
|
|
209
|
+
"Implement cache warming strategies and optimize TTL values for frequently accessed data.",
|
|
210
|
+
estimatedImprovement: "20-40% reduction in response times",
|
|
211
|
+
implementationEffort: "medium",
|
|
212
|
+
relatedMetrics: ["cacheHitRate", "responseTime"],
|
|
199
213
|
});
|
|
200
214
|
}
|
|
201
215
|
|
|
202
216
|
// Response time insights
|
|
203
217
|
if (currentMetrics.requests.averageResponseTime > 1000) {
|
|
204
218
|
insights.push({
|
|
205
|
-
id:
|
|
206
|
-
category:
|
|
207
|
-
priority:
|
|
208
|
-
title:
|
|
219
|
+
id: "response-time-1",
|
|
220
|
+
category: "optimization",
|
|
221
|
+
priority: "high",
|
|
222
|
+
title: "Reduce Response Times",
|
|
209
223
|
description: `Average response time of ${currentMetrics.requests.averageResponseTime.toFixed(0)}ms is above recommended threshold.`,
|
|
210
|
-
impact:
|
|
211
|
-
recommendation:
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
224
|
+
impact: "user_experience",
|
|
225
|
+
recommendation:
|
|
226
|
+
"Enable aggressive caching, optimize database queries, or consider upgrading server resources.",
|
|
227
|
+
estimatedImprovement: "50-70% reduction in response times",
|
|
228
|
+
implementationEffort: "medium",
|
|
229
|
+
relatedMetrics: ["responseTime", "cacheHitRate"],
|
|
215
230
|
});
|
|
216
231
|
}
|
|
217
232
|
|
|
218
233
|
// Memory usage insights
|
|
219
234
|
if (currentMetrics.system.memoryUsage > 80) {
|
|
220
235
|
insights.push({
|
|
221
|
-
id:
|
|
222
|
-
category:
|
|
223
|
-
priority:
|
|
224
|
-
title:
|
|
236
|
+
id: "memory-usage-1",
|
|
237
|
+
category: "scaling",
|
|
238
|
+
priority: "medium",
|
|
239
|
+
title: "Memory Usage Optimization",
|
|
225
240
|
description: `Memory usage at ${currentMetrics.system.memoryUsage}% is approaching limits.`,
|
|
226
|
-
impact:
|
|
227
|
-
recommendation:
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
241
|
+
impact: "reliability",
|
|
242
|
+
recommendation:
|
|
243
|
+
"Increase cache size limits, implement cache eviction policies, or scale server resources.",
|
|
244
|
+
estimatedImprovement: "Improved system stability",
|
|
245
|
+
implementationEffort: "low",
|
|
246
|
+
relatedMetrics: ["memoryUsage", "cacheSize"],
|
|
231
247
|
});
|
|
232
248
|
}
|
|
233
249
|
|
|
@@ -235,37 +251,43 @@ export class PerformanceAnalytics {
|
|
|
235
251
|
const toolMetrics = currentMetrics.tools;
|
|
236
252
|
if (Object.keys(toolMetrics.toolUsageCount).length > 0) {
|
|
237
253
|
const mostUsed = Object.entries(toolMetrics.toolUsageCount)
|
|
238
|
-
.sort(([,a], [,b]) => b - a)
|
|
254
|
+
.sort(([, a], [, b]) => b - a)
|
|
239
255
|
.slice(0, 3);
|
|
240
256
|
|
|
241
257
|
insights.push({
|
|
242
|
-
id:
|
|
243
|
-
category:
|
|
244
|
-
priority:
|
|
245
|
-
title:
|
|
246
|
-
description: `Most used tools: ${mostUsed.map(([tool]) => tool).join(
|
|
247
|
-
impact:
|
|
248
|
-
recommendation:
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
258
|
+
id: "tool-usage-1",
|
|
259
|
+
category: "optimization",
|
|
260
|
+
priority: "low",
|
|
261
|
+
title: "Optimize Frequently Used Tools",
|
|
262
|
+
description: `Most used tools: ${mostUsed.map(([tool]) => tool).join(", ")}. Consider optimizing these workflows.`,
|
|
263
|
+
impact: "performance",
|
|
264
|
+
recommendation:
|
|
265
|
+
"Create cached workflows or batch operations for frequently used tools.",
|
|
266
|
+
estimatedImprovement: "10-20% reduction in API calls",
|
|
267
|
+
implementationEffort: "high",
|
|
268
|
+
relatedMetrics: ["toolUsage", "requestVolume"],
|
|
252
269
|
});
|
|
253
270
|
}
|
|
254
271
|
|
|
255
272
|
// Trend-based insights
|
|
256
|
-
const responseTimeTrend = trends.find(t => t.metric ===
|
|
257
|
-
if (
|
|
273
|
+
const responseTimeTrend = trends.find((t) => t.metric === "responseTime");
|
|
274
|
+
if (
|
|
275
|
+
responseTimeTrend &&
|
|
276
|
+
responseTimeTrend.direction === "declining" &&
|
|
277
|
+
responseTimeTrend.changeRate > 10
|
|
278
|
+
) {
|
|
258
279
|
insights.push({
|
|
259
|
-
id:
|
|
260
|
-
category:
|
|
261
|
-
priority:
|
|
262
|
-
title:
|
|
280
|
+
id: "trend-response-time-1",
|
|
281
|
+
category: "alert",
|
|
282
|
+
priority: "high",
|
|
283
|
+
title: "Response Time Degradation Detected",
|
|
263
284
|
description: `Response times are declining at ${responseTimeTrend.changeRate.toFixed(1)}% rate.`,
|
|
264
|
-
impact:
|
|
265
|
-
recommendation:
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
285
|
+
impact: "performance",
|
|
286
|
+
recommendation:
|
|
287
|
+
"Investigate recent changes, check WordPress site health, and monitor resource usage.",
|
|
288
|
+
estimatedImprovement: "Prevent further degradation",
|
|
289
|
+
implementationEffort: "medium",
|
|
290
|
+
relatedMetrics: ["responseTime", "errorRate"],
|
|
269
291
|
});
|
|
270
292
|
}
|
|
271
293
|
|
|
@@ -281,43 +303,58 @@ export class PerformanceAnalytics {
|
|
|
281
303
|
const comparisons: BenchmarkComparison[] = [];
|
|
282
304
|
|
|
283
305
|
// Response time benchmark
|
|
284
|
-
comparisons.push(
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
306
|
+
comparisons.push(
|
|
307
|
+
this.createBenchmarkComparison(
|
|
308
|
+
"Response Time",
|
|
309
|
+
currentMetrics.requests.averageResponseTime,
|
|
310
|
+
this.benchmarks.responseTime,
|
|
311
|
+
false, // lower is better
|
|
312
|
+
),
|
|
313
|
+
);
|
|
290
314
|
|
|
291
315
|
// Cache hit rate benchmark
|
|
292
|
-
comparisons.push(
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
Object.
|
|
316
|
+
comparisons.push(
|
|
317
|
+
this.createBenchmarkComparison(
|
|
318
|
+
"Cache Hit Rate",
|
|
319
|
+
currentMetrics.cache.hitRate * 100,
|
|
320
|
+
Object.fromEntries(
|
|
321
|
+
Object.entries(this.benchmarks.cacheHitRate).map(([k, v]) => [
|
|
322
|
+
k,
|
|
323
|
+
v * 100,
|
|
324
|
+
]),
|
|
325
|
+
),
|
|
326
|
+
true, // higher is better
|
|
297
327
|
),
|
|
298
|
-
|
|
299
|
-
));
|
|
328
|
+
);
|
|
300
329
|
|
|
301
330
|
// Error rate benchmark
|
|
302
|
-
const errorRate =
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
331
|
+
const errorRate =
|
|
332
|
+
currentMetrics.requests.total > 0
|
|
333
|
+
? (currentMetrics.requests.failed / currentMetrics.requests.total) * 100
|
|
334
|
+
: 0;
|
|
335
|
+
comparisons.push(
|
|
336
|
+
this.createBenchmarkComparison(
|
|
337
|
+
"Error Rate",
|
|
338
|
+
errorRate,
|
|
339
|
+
Object.fromEntries(
|
|
340
|
+
Object.entries(this.benchmarks.errorRate).map(([k, v]) => [
|
|
341
|
+
k,
|
|
342
|
+
v * 100,
|
|
343
|
+
]),
|
|
344
|
+
),
|
|
345
|
+
false, // lower is better
|
|
310
346
|
),
|
|
311
|
-
|
|
312
|
-
));
|
|
347
|
+
);
|
|
313
348
|
|
|
314
349
|
// Memory usage benchmark
|
|
315
|
-
comparisons.push(
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
350
|
+
comparisons.push(
|
|
351
|
+
this.createBenchmarkComparison(
|
|
352
|
+
"Memory Usage",
|
|
353
|
+
currentMetrics.system.memoryUsage,
|
|
354
|
+
this.benchmarks.memoryUsage,
|
|
355
|
+
false, // lower is better
|
|
356
|
+
),
|
|
357
|
+
);
|
|
321
358
|
|
|
322
359
|
return comparisons;
|
|
323
360
|
}
|
|
@@ -331,7 +368,7 @@ export class PerformanceAnalytics {
|
|
|
331
368
|
currentValue: number;
|
|
332
369
|
predictedValue: number;
|
|
333
370
|
confidence: number;
|
|
334
|
-
trend:
|
|
371
|
+
trend: "improving" | "declining" | "stable";
|
|
335
372
|
}>;
|
|
336
373
|
alerts: string[];
|
|
337
374
|
} {
|
|
@@ -346,26 +383,44 @@ export class PerformanceAnalytics {
|
|
|
346
383
|
for (const trend of trends) {
|
|
347
384
|
const _timeframeMs = timeframeMinutes * 60 * 1000;
|
|
348
385
|
const predictedValue = trend.prediction.nextValue;
|
|
349
|
-
|
|
386
|
+
|
|
350
387
|
predictions.push({
|
|
351
388
|
metric: trend.metric,
|
|
352
389
|
currentValue: this.getCurrentMetricValue(trend.metric),
|
|
353
390
|
predictedValue,
|
|
354
391
|
confidence: trend.confidence,
|
|
355
|
-
trend: trend.direction
|
|
392
|
+
trend: trend.direction,
|
|
356
393
|
});
|
|
357
394
|
|
|
358
395
|
// Generate alerts for concerning predictions
|
|
359
|
-
if (
|
|
360
|
-
|
|
396
|
+
if (
|
|
397
|
+
trend.metric === "responseTime" &&
|
|
398
|
+
predictedValue > 2000 &&
|
|
399
|
+
trend.direction === "declining"
|
|
400
|
+
) {
|
|
401
|
+
alerts.push(
|
|
402
|
+
`Response times predicted to exceed 2s in ${timeframeMinutes} minutes`,
|
|
403
|
+
);
|
|
361
404
|
}
|
|
362
405
|
|
|
363
|
-
if (
|
|
364
|
-
|
|
406
|
+
if (
|
|
407
|
+
trend.metric === "cacheHitRate" &&
|
|
408
|
+
predictedValue < 0.5 &&
|
|
409
|
+
trend.direction === "declining"
|
|
410
|
+
) {
|
|
411
|
+
alerts.push(
|
|
412
|
+
`Cache hit rate predicted to drop below 50% in ${timeframeMinutes} minutes`,
|
|
413
|
+
);
|
|
365
414
|
}
|
|
366
415
|
|
|
367
|
-
if (
|
|
368
|
-
|
|
416
|
+
if (
|
|
417
|
+
trend.metric === "memoryUsage" &&
|
|
418
|
+
predictedValue > 90 &&
|
|
419
|
+
trend.direction === "declining"
|
|
420
|
+
) {
|
|
421
|
+
alerts.push(
|
|
422
|
+
`Memory usage predicted to exceed 90% in ${timeframeMinutes} minutes`,
|
|
423
|
+
);
|
|
369
424
|
}
|
|
370
425
|
}
|
|
371
426
|
|
|
@@ -381,28 +436,28 @@ export class PerformanceAnalytics {
|
|
|
381
436
|
longTerm: PerformanceInsight[];
|
|
382
437
|
estimatedROI: {
|
|
383
438
|
performanceGain: number; // percentage
|
|
384
|
-
implementationCost:
|
|
439
|
+
implementationCost: "low" | "medium" | "high";
|
|
385
440
|
timeToValue: number; // days
|
|
386
441
|
};
|
|
387
442
|
} {
|
|
388
443
|
const insights = this.generateInsights();
|
|
389
|
-
|
|
444
|
+
|
|
390
445
|
const quickWins = insights.filter(
|
|
391
|
-
i =>
|
|
446
|
+
(i) =>
|
|
447
|
+
i.implementationEffort === "low" &&
|
|
448
|
+
["high", "critical"].includes(i.priority),
|
|
392
449
|
);
|
|
393
|
-
|
|
450
|
+
|
|
394
451
|
const mediumTerm = insights.filter(
|
|
395
|
-
i => i.implementationEffort ===
|
|
396
|
-
);
|
|
397
|
-
|
|
398
|
-
const longTerm = insights.filter(
|
|
399
|
-
i => i.implementationEffort === 'high'
|
|
452
|
+
(i) => i.implementationEffort === "medium",
|
|
400
453
|
);
|
|
401
454
|
|
|
455
|
+
const longTerm = insights.filter((i) => i.implementationEffort === "high");
|
|
456
|
+
|
|
402
457
|
// Estimate ROI based on current performance issues
|
|
403
458
|
const currentMetrics = this.collector.collectCurrentMetrics();
|
|
404
459
|
let estimatedGain = 0;
|
|
405
|
-
|
|
460
|
+
|
|
406
461
|
if (currentMetrics.cache.hitRate < 0.8) estimatedGain += 30;
|
|
407
462
|
if (currentMetrics.requests.averageResponseTime > 1000) estimatedGain += 40;
|
|
408
463
|
if (currentMetrics.system.memoryUsage > 80) estimatedGain += 20;
|
|
@@ -413,9 +468,14 @@ export class PerformanceAnalytics {
|
|
|
413
468
|
longTerm,
|
|
414
469
|
estimatedROI: {
|
|
415
470
|
performanceGain: Math.min(estimatedGain, 80), // Cap at 80%
|
|
416
|
-
implementationCost:
|
|
417
|
-
|
|
418
|
-
|
|
471
|
+
implementationCost:
|
|
472
|
+
quickWins.length > 2
|
|
473
|
+
? "low"
|
|
474
|
+
: mediumTerm.length > 2
|
|
475
|
+
? "medium"
|
|
476
|
+
: "high",
|
|
477
|
+
timeToValue: quickWins.length > 0 ? 1 : mediumTerm.length > 0 ? 7 : 30,
|
|
478
|
+
},
|
|
419
479
|
};
|
|
420
480
|
}
|
|
421
481
|
|
|
@@ -424,7 +484,7 @@ export class PerformanceAnalytics {
|
|
|
424
484
|
*/
|
|
425
485
|
getAnomalies(severity?: string): PerformanceAnomaly[] {
|
|
426
486
|
if (severity) {
|
|
427
|
-
return this.detectedAnomalies.filter(a => a.severity === severity);
|
|
487
|
+
return this.detectedAnomalies.filter((a) => a.severity === severity);
|
|
428
488
|
}
|
|
429
489
|
return [...this.detectedAnomalies];
|
|
430
490
|
}
|
|
@@ -449,21 +509,23 @@ export class PerformanceAnalytics {
|
|
|
449
509
|
} {
|
|
450
510
|
const currentMetrics = this.collector.collectCurrentMetrics();
|
|
451
511
|
const performanceScore = this.calculatePerformanceScore(currentMetrics);
|
|
452
|
-
|
|
512
|
+
|
|
453
513
|
return {
|
|
454
514
|
timestamp: new Date().toISOString(),
|
|
455
515
|
summary: {
|
|
456
516
|
overallHealth: this.calculateOverallHealth(performanceScore),
|
|
457
517
|
keyInsights: this.generatedInsights.length,
|
|
458
|
-
criticalAlerts: this.generatedInsights.filter(
|
|
459
|
-
|
|
518
|
+
criticalAlerts: this.generatedInsights.filter(
|
|
519
|
+
(i) => i.priority === "critical",
|
|
520
|
+
).length,
|
|
521
|
+
performanceScore,
|
|
460
522
|
},
|
|
461
523
|
trends: this.analyzeTrends(),
|
|
462
524
|
benchmarks: this.benchmarkPerformance(),
|
|
463
525
|
insights: this.generateInsights(),
|
|
464
526
|
anomalies: this.getAnomalies(),
|
|
465
527
|
predictions: this.predictPerformance(),
|
|
466
|
-
optimizationPlan: this.generateOptimizationPlan()
|
|
528
|
+
optimizationPlan: this.generateOptimizationPlan(),
|
|
467
529
|
};
|
|
468
530
|
}
|
|
469
531
|
|
|
@@ -474,10 +536,14 @@ export class PerformanceAnalytics {
|
|
|
474
536
|
if (values.length < 3) {
|
|
475
537
|
return {
|
|
476
538
|
metric: metricName,
|
|
477
|
-
direction:
|
|
539
|
+
direction: "stable",
|
|
478
540
|
changeRate: 0,
|
|
479
541
|
confidence: 0,
|
|
480
|
-
prediction: {
|
|
542
|
+
prediction: {
|
|
543
|
+
nextValue: values[values.length - 1] || 0,
|
|
544
|
+
timeframe: 0,
|
|
545
|
+
confidence: 0,
|
|
546
|
+
},
|
|
481
547
|
};
|
|
482
548
|
}
|
|
483
549
|
|
|
@@ -485,44 +551,49 @@ export class PerformanceAnalytics {
|
|
|
485
551
|
const n = values.length;
|
|
486
552
|
const x = Array.from({ length: n }, (_, i) => i);
|
|
487
553
|
const y = values;
|
|
488
|
-
|
|
554
|
+
|
|
489
555
|
const sumX = x.reduce((a, b) => a + b, 0);
|
|
490
556
|
const sumY = y.reduce((a, b) => a + b, 0);
|
|
491
557
|
const sumXY = x.map((xi, i) => xi * y[i]).reduce((a, b) => a + b, 0);
|
|
492
|
-
const sumXX = x.map(xi => xi * xi).reduce((a, b) => a + b, 0);
|
|
493
|
-
|
|
558
|
+
const sumXX = x.map((xi) => xi * xi).reduce((a, b) => a + b, 0);
|
|
559
|
+
|
|
494
560
|
const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);
|
|
495
561
|
const intercept = (sumY - slope * sumX) / n;
|
|
496
|
-
|
|
562
|
+
|
|
497
563
|
// Calculate R-squared for confidence
|
|
498
564
|
const yMean = sumY / n;
|
|
499
|
-
const totalSumSquares = y
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
565
|
+
const totalSumSquares = y
|
|
566
|
+
.map((yi) => Math.pow(yi - yMean, 2))
|
|
567
|
+
.reduce((a, b) => a + b, 0);
|
|
568
|
+
const residualSumSquares = y
|
|
569
|
+
.map((yi, i) => {
|
|
570
|
+
const predicted = slope * x[i] + intercept;
|
|
571
|
+
return Math.pow(yi - predicted, 2);
|
|
572
|
+
})
|
|
573
|
+
.reduce((a, b) => a + b, 0);
|
|
574
|
+
|
|
575
|
+
const rSquared = 1 - residualSumSquares / totalSumSquares;
|
|
576
|
+
|
|
507
577
|
// Determine direction and change rate
|
|
508
578
|
const currentValue = values[values.length - 1];
|
|
509
579
|
const previousValue = values[values.length - 2];
|
|
510
|
-
const changeRate =
|
|
511
|
-
|
|
512
|
-
|
|
580
|
+
const changeRate =
|
|
581
|
+
Math.abs((currentValue - previousValue) / previousValue) * 100;
|
|
582
|
+
|
|
583
|
+
let direction: "improving" | "declining" | "stable" = "stable";
|
|
513
584
|
if (Math.abs(slope) > 0.1) {
|
|
514
585
|
// For metrics where lower is better (response time, error rate)
|
|
515
|
-
if ([
|
|
516
|
-
direction = slope < 0 ?
|
|
586
|
+
if (["responseTime", "errorRate", "memoryUsage"].includes(metricName)) {
|
|
587
|
+
direction = slope < 0 ? "improving" : "declining";
|
|
517
588
|
} else {
|
|
518
589
|
// For metrics where higher is better (cache hit rate)
|
|
519
|
-
direction = slope > 0 ?
|
|
590
|
+
direction = slope > 0 ? "improving" : "declining";
|
|
520
591
|
}
|
|
521
592
|
}
|
|
522
593
|
|
|
523
594
|
// Predict next value
|
|
524
595
|
const nextValue = slope * n + intercept;
|
|
525
|
-
|
|
596
|
+
|
|
526
597
|
return {
|
|
527
598
|
metric: metricName,
|
|
528
599
|
direction,
|
|
@@ -531,8 +602,8 @@ export class PerformanceAnalytics {
|
|
|
531
602
|
prediction: {
|
|
532
603
|
nextValue: Math.max(0, nextValue),
|
|
533
604
|
timeframe: 30 * 60 * 1000, // 30 minutes
|
|
534
|
-
confidence: Math.max(0, Math.min(1, rSquared * 0.8)) // Slightly lower confidence for predictions
|
|
535
|
-
}
|
|
605
|
+
confidence: Math.max(0, Math.min(1, rSquared * 0.8)), // Slightly lower confidence for predictions
|
|
606
|
+
},
|
|
536
607
|
};
|
|
537
608
|
}
|
|
538
609
|
|
|
@@ -543,37 +614,38 @@ export class PerformanceAnalytics {
|
|
|
543
614
|
if (this.historicalData.length < 10) return; // Need historical context
|
|
544
615
|
|
|
545
616
|
const recentData = this.historicalData.slice(-10);
|
|
546
|
-
|
|
617
|
+
|
|
547
618
|
// Check response time anomalies
|
|
548
|
-
const responseTimes = recentData.map(d => d.requests.averageResponseTime);
|
|
619
|
+
const responseTimes = recentData.map((d) => d.requests.averageResponseTime);
|
|
549
620
|
this.checkMetricAnomaly(
|
|
550
|
-
|
|
621
|
+
"responseTime",
|
|
551
622
|
metrics.requests.averageResponseTime,
|
|
552
623
|
responseTimes,
|
|
553
|
-
|
|
624
|
+
"Response time spike detected",
|
|
554
625
|
);
|
|
555
626
|
|
|
556
627
|
// Check cache hit rate anomalies
|
|
557
|
-
const hitRates = recentData.map(d => d.cache.hitRate);
|
|
628
|
+
const hitRates = recentData.map((d) => d.cache.hitRate);
|
|
558
629
|
this.checkMetricAnomaly(
|
|
559
|
-
|
|
630
|
+
"cacheHitRate",
|
|
560
631
|
metrics.cache.hitRate,
|
|
561
632
|
hitRates,
|
|
562
|
-
|
|
633
|
+
"Cache hit rate drop detected",
|
|
563
634
|
);
|
|
564
635
|
|
|
565
636
|
// Check error rate anomalies
|
|
566
|
-
const errorRates = recentData.map(d =>
|
|
567
|
-
d.requests.total > 0 ? d.requests.failed / d.requests.total : 0
|
|
637
|
+
const errorRates = recentData.map((d) =>
|
|
638
|
+
d.requests.total > 0 ? d.requests.failed / d.requests.total : 0,
|
|
568
639
|
);
|
|
569
|
-
const currentErrorRate =
|
|
570
|
-
|
|
571
|
-
|
|
640
|
+
const currentErrorRate =
|
|
641
|
+
metrics.requests.total > 0
|
|
642
|
+
? metrics.requests.failed / metrics.requests.total
|
|
643
|
+
: 0;
|
|
572
644
|
this.checkMetricAnomaly(
|
|
573
|
-
|
|
645
|
+
"errorRate",
|
|
574
646
|
currentErrorRate,
|
|
575
647
|
errorRates,
|
|
576
|
-
|
|
648
|
+
"Error rate spike detected",
|
|
577
649
|
);
|
|
578
650
|
}
|
|
579
651
|
|
|
@@ -584,29 +656,32 @@ export class PerformanceAnalytics {
|
|
|
584
656
|
metricName: string,
|
|
585
657
|
currentValue: number,
|
|
586
658
|
historicalValues: number[],
|
|
587
|
-
description: string
|
|
659
|
+
description: string,
|
|
588
660
|
): void {
|
|
589
661
|
if (historicalValues.length < 5) return;
|
|
590
662
|
|
|
591
|
-
const mean =
|
|
592
|
-
|
|
663
|
+
const mean =
|
|
664
|
+
historicalValues.reduce((a, b) => a + b, 0) / historicalValues.length;
|
|
665
|
+
const variance =
|
|
666
|
+
historicalValues.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) /
|
|
667
|
+
historicalValues.length;
|
|
593
668
|
const standardDeviation = Math.sqrt(variance);
|
|
594
669
|
|
|
595
670
|
// Calculate z-score
|
|
596
671
|
const zScore = Math.abs((currentValue - mean) / standardDeviation);
|
|
597
|
-
|
|
672
|
+
|
|
598
673
|
// Determine sensitivity threshold
|
|
599
674
|
let threshold = 2; // Default for medium sensitivity
|
|
600
|
-
if (this.config.sensitivityLevel ===
|
|
601
|
-
if (this.config.sensitivityLevel ===
|
|
675
|
+
if (this.config.sensitivityLevel === "low") threshold = 3;
|
|
676
|
+
if (this.config.sensitivityLevel === "high") threshold = 1.5;
|
|
602
677
|
|
|
603
678
|
if (zScore > threshold) {
|
|
604
679
|
const deviation = ((currentValue - mean) / mean) * 100;
|
|
605
|
-
|
|
606
|
-
let severity:
|
|
607
|
-
if (zScore > 4) severity =
|
|
608
|
-
else if (zScore > 3) severity =
|
|
609
|
-
else if (zScore > 2.5) severity =
|
|
680
|
+
|
|
681
|
+
let severity: "minor" | "moderate" | "major" | "critical" = "minor";
|
|
682
|
+
if (zScore > 4) severity = "critical";
|
|
683
|
+
else if (zScore > 3) severity = "major";
|
|
684
|
+
else if (zScore > 2.5) severity = "moderate";
|
|
610
685
|
|
|
611
686
|
const anomaly: PerformanceAnomaly = {
|
|
612
687
|
timestamp: Date.now(),
|
|
@@ -615,11 +690,14 @@ export class PerformanceAnalytics {
|
|
|
615
690
|
actualValue: currentValue,
|
|
616
691
|
deviation,
|
|
617
692
|
severity,
|
|
618
|
-
possibleCauses: this.generatePossibleCauses(
|
|
693
|
+
possibleCauses: this.generatePossibleCauses(
|
|
694
|
+
metricName,
|
|
695
|
+
currentValue > mean,
|
|
696
|
+
),
|
|
619
697
|
};
|
|
620
698
|
|
|
621
699
|
this.detectedAnomalies.push(anomaly);
|
|
622
|
-
|
|
700
|
+
|
|
623
701
|
// Limit anomaly history
|
|
624
702
|
if (this.detectedAnomalies.length > 100) {
|
|
625
703
|
this.detectedAnomalies = this.detectedAnomalies.slice(-50);
|
|
@@ -630,15 +708,33 @@ export class PerformanceAnalytics {
|
|
|
630
708
|
/**
|
|
631
709
|
* Generate possible causes for anomalies
|
|
632
710
|
*/
|
|
633
|
-
private generatePossibleCauses(
|
|
711
|
+
private generatePossibleCauses(
|
|
712
|
+
metricName: string,
|
|
713
|
+
isIncrease: boolean,
|
|
714
|
+
): string[] {
|
|
634
715
|
const causes: string[] = [];
|
|
635
716
|
|
|
636
|
-
if (metricName ===
|
|
637
|
-
causes.push(
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
717
|
+
if (metricName === "responseTime" && isIncrease) {
|
|
718
|
+
causes.push(
|
|
719
|
+
"High server load",
|
|
720
|
+
"Database performance issues",
|
|
721
|
+
"Network latency",
|
|
722
|
+
"Cache miss increase",
|
|
723
|
+
);
|
|
724
|
+
} else if (metricName === "cacheHitRate" && !isIncrease) {
|
|
725
|
+
causes.push(
|
|
726
|
+
"Cache invalidation event",
|
|
727
|
+
"New data requests",
|
|
728
|
+
"Cache size limit reached",
|
|
729
|
+
"TTL expiration",
|
|
730
|
+
);
|
|
731
|
+
} else if (metricName === "errorRate" && isIncrease) {
|
|
732
|
+
causes.push(
|
|
733
|
+
"WordPress site issues",
|
|
734
|
+
"Authentication problems",
|
|
735
|
+
"Network connectivity",
|
|
736
|
+
"Plugin conflicts",
|
|
737
|
+
);
|
|
642
738
|
}
|
|
643
739
|
|
|
644
740
|
return causes;
|
|
@@ -651,47 +747,64 @@ export class PerformanceAnalytics {
|
|
|
651
747
|
category: string,
|
|
652
748
|
currentValue: number,
|
|
653
749
|
benchmarks: any,
|
|
654
|
-
higherIsBetter: boolean
|
|
750
|
+
higherIsBetter: boolean,
|
|
655
751
|
): BenchmarkComparison {
|
|
656
|
-
let status:
|
|
752
|
+
let status: "excellent" | "good" | "average" | "below_average" | "poor" =
|
|
753
|
+
"poor";
|
|
657
754
|
let percentile = 0;
|
|
658
755
|
let improvement = 0;
|
|
659
756
|
|
|
660
757
|
if (higherIsBetter) {
|
|
661
|
-
if (currentValue >= benchmarks.excellent) status =
|
|
662
|
-
else if (currentValue >= benchmarks.good) status =
|
|
663
|
-
else if (currentValue >= benchmarks.average) status =
|
|
664
|
-
else if (currentValue >= benchmarks.below_average)
|
|
665
|
-
|
|
758
|
+
if (currentValue >= benchmarks.excellent) status = "excellent";
|
|
759
|
+
else if (currentValue >= benchmarks.good) status = "good";
|
|
760
|
+
else if (currentValue >= benchmarks.average) status = "average";
|
|
761
|
+
else if (currentValue >= benchmarks.below_average)
|
|
762
|
+
status = "below_average";
|
|
763
|
+
|
|
666
764
|
// Calculate improvement needed
|
|
667
|
-
if (status !==
|
|
668
|
-
const nextTier =
|
|
669
|
-
status ===
|
|
670
|
-
|
|
671
|
-
|
|
765
|
+
if (status !== "excellent") {
|
|
766
|
+
const nextTier =
|
|
767
|
+
status === "good"
|
|
768
|
+
? benchmarks.excellent
|
|
769
|
+
: status === "average"
|
|
770
|
+
? benchmarks.good
|
|
771
|
+
: status === "below_average"
|
|
772
|
+
? benchmarks.average
|
|
773
|
+
: benchmarks.below_average;
|
|
672
774
|
improvement = nextTier - currentValue;
|
|
673
775
|
}
|
|
674
776
|
} else {
|
|
675
|
-
if (currentValue <= benchmarks.excellent) status =
|
|
676
|
-
else if (currentValue <= benchmarks.good) status =
|
|
677
|
-
else if (currentValue <= benchmarks.average) status =
|
|
678
|
-
else if (currentValue <= benchmarks.below_average)
|
|
679
|
-
|
|
777
|
+
if (currentValue <= benchmarks.excellent) status = "excellent";
|
|
778
|
+
else if (currentValue <= benchmarks.good) status = "good";
|
|
779
|
+
else if (currentValue <= benchmarks.average) status = "average";
|
|
780
|
+
else if (currentValue <= benchmarks.below_average)
|
|
781
|
+
status = "below_average";
|
|
782
|
+
|
|
680
783
|
// Calculate improvement needed
|
|
681
|
-
if (status !==
|
|
682
|
-
const nextTier =
|
|
683
|
-
status ===
|
|
684
|
-
|
|
685
|
-
|
|
784
|
+
if (status !== "excellent") {
|
|
785
|
+
const nextTier =
|
|
786
|
+
status === "good"
|
|
787
|
+
? benchmarks.excellent
|
|
788
|
+
: status === "average"
|
|
789
|
+
? benchmarks.good
|
|
790
|
+
: status === "below_average"
|
|
791
|
+
? benchmarks.average
|
|
792
|
+
: benchmarks.below_average;
|
|
686
793
|
improvement = currentValue - nextTier;
|
|
687
794
|
}
|
|
688
795
|
}
|
|
689
796
|
|
|
690
797
|
// Calculate percentile (simplified)
|
|
691
|
-
percentile =
|
|
692
|
-
status ===
|
|
693
|
-
|
|
694
|
-
|
|
798
|
+
percentile =
|
|
799
|
+
status === "excellent"
|
|
800
|
+
? 95
|
|
801
|
+
: status === "good"
|
|
802
|
+
? 80
|
|
803
|
+
: status === "average"
|
|
804
|
+
? 60
|
|
805
|
+
: status === "below_average"
|
|
806
|
+
? 30
|
|
807
|
+
: 10;
|
|
695
808
|
|
|
696
809
|
return {
|
|
697
810
|
category,
|
|
@@ -699,7 +812,7 @@ export class PerformanceAnalytics {
|
|
|
699
812
|
benchmarkValue: benchmarks.excellent,
|
|
700
813
|
percentile,
|
|
701
814
|
status,
|
|
702
|
-
improvement
|
|
815
|
+
improvement,
|
|
703
816
|
};
|
|
704
817
|
}
|
|
705
818
|
|
|
@@ -708,14 +821,22 @@ export class PerformanceAnalytics {
|
|
|
708
821
|
*/
|
|
709
822
|
private getCurrentMetricValue(metricName: string): number {
|
|
710
823
|
const current = this.collector.collectCurrentMetrics();
|
|
711
|
-
|
|
824
|
+
|
|
712
825
|
switch (metricName) {
|
|
713
|
-
case
|
|
714
|
-
|
|
715
|
-
case
|
|
716
|
-
|
|
717
|
-
case
|
|
718
|
-
|
|
826
|
+
case "responseTime":
|
|
827
|
+
return current.requests.averageResponseTime;
|
|
828
|
+
case "cacheHitRate":
|
|
829
|
+
return current.cache.hitRate;
|
|
830
|
+
case "errorRate":
|
|
831
|
+
return current.requests.total > 0
|
|
832
|
+
? current.requests.failed / current.requests.total
|
|
833
|
+
: 0;
|
|
834
|
+
case "memoryUsage":
|
|
835
|
+
return current.system.memoryUsage;
|
|
836
|
+
case "requestVolume":
|
|
837
|
+
return current.requests.requestsPerSecond;
|
|
838
|
+
default:
|
|
839
|
+
return 0;
|
|
719
840
|
}
|
|
720
841
|
}
|
|
721
842
|
|
|
@@ -724,28 +845,31 @@ export class PerformanceAnalytics {
|
|
|
724
845
|
*/
|
|
725
846
|
private calculatePerformanceScore(metrics: PerformanceMetrics): number {
|
|
726
847
|
let score = 100;
|
|
727
|
-
|
|
848
|
+
|
|
728
849
|
// Response time (30% weight)
|
|
729
850
|
if (metrics.requests.averageResponseTime > 2000) score -= 30;
|
|
730
851
|
else if (metrics.requests.averageResponseTime > 1000) score -= 15;
|
|
731
852
|
else if (metrics.requests.averageResponseTime > 500) score -= 5;
|
|
732
|
-
|
|
853
|
+
|
|
733
854
|
// Error rate (25% weight)
|
|
734
|
-
const errorRate =
|
|
855
|
+
const errorRate =
|
|
856
|
+
metrics.requests.total > 0
|
|
857
|
+
? metrics.requests.failed / metrics.requests.total
|
|
858
|
+
: 0;
|
|
735
859
|
if (errorRate > 0.05) score -= 25;
|
|
736
860
|
else if (errorRate > 0.02) score -= 15;
|
|
737
861
|
else if (errorRate > 0.01) score -= 5;
|
|
738
|
-
|
|
862
|
+
|
|
739
863
|
// Cache performance (25% weight)
|
|
740
864
|
if (metrics.cache.hitRate < 0.5) score -= 25;
|
|
741
865
|
else if (metrics.cache.hitRate < 0.7) score -= 15;
|
|
742
866
|
else if (metrics.cache.hitRate < 0.85) score -= 5;
|
|
743
|
-
|
|
867
|
+
|
|
744
868
|
// System resources (20% weight)
|
|
745
869
|
if (metrics.system.memoryUsage > 90) score -= 20;
|
|
746
870
|
else if (metrics.system.memoryUsage > 80) score -= 10;
|
|
747
871
|
else if (metrics.system.memoryUsage > 70) score -= 5;
|
|
748
|
-
|
|
872
|
+
|
|
749
873
|
return Math.max(0, score);
|
|
750
874
|
}
|
|
751
875
|
|
|
@@ -753,10 +877,10 @@ export class PerformanceAnalytics {
|
|
|
753
877
|
* Calculate overall health status
|
|
754
878
|
*/
|
|
755
879
|
private calculateOverallHealth(score: number): string {
|
|
756
|
-
if (score >= 90) return
|
|
757
|
-
if (score >= 75) return
|
|
758
|
-
if (score >= 60) return
|
|
759
|
-
if (score >= 40) return
|
|
760
|
-
return
|
|
880
|
+
if (score >= 90) return "excellent";
|
|
881
|
+
if (score >= 75) return "good";
|
|
882
|
+
if (score >= 60) return "fair";
|
|
883
|
+
if (score >= 40) return "poor";
|
|
884
|
+
return "critical";
|
|
761
885
|
}
|
|
762
886
|
}
|