@performance-agent/mcp-server 1.0.1 → 1.0.6
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 +400 -25
- package/dist/index.d.ts +14 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +783 -47
- package/dist/index.js.map +1 -1
- package/dist/prompts/jmx_prompt.txt +262 -0
- package/dist/prompts/prompts/jmx_prompt.txt +262 -0
- package/dist/tools/azure-infra/config-parser.d.ts +14 -0
- package/dist/tools/azure-infra/config-parser.d.ts.map +1 -0
- package/dist/tools/azure-infra/config-parser.js +361 -0
- package/dist/tools/azure-infra/config-parser.js.map +1 -0
- package/dist/tools/azure-infra/index.d.ts +52 -0
- package/dist/tools/azure-infra/index.d.ts.map +1 -0
- package/dist/tools/azure-infra/index.js +448 -0
- package/dist/tools/azure-infra/index.js.map +1 -0
- package/dist/tools/azure-infra/terraform-generator.d.ts +19 -0
- package/dist/tools/azure-infra/terraform-generator.d.ts.map +1 -0
- package/dist/tools/azure-infra/terraform-generator.js +458 -0
- package/dist/tools/azure-infra/terraform-generator.js.map +1 -0
- package/dist/tools/azure-infra/types.d.ts +123 -0
- package/dist/tools/azure-infra/types.d.ts.map +1 -0
- package/dist/tools/azure-infra/types.js +95 -0
- package/dist/tools/azure-infra/types.js.map +1 -0
- package/dist/tools/cloud-executor/index.d.ts +78 -0
- package/dist/tools/cloud-executor/index.d.ts.map +1 -0
- package/dist/tools/cloud-executor/index.js +528 -0
- package/dist/tools/cloud-executor/index.js.map +1 -0
- package/dist/tools/cloud-executor/result-analyzer.d.ts +65 -0
- package/dist/tools/cloud-executor/result-analyzer.d.ts.map +1 -0
- package/dist/tools/cloud-executor/result-analyzer.js +367 -0
- package/dist/tools/cloud-executor/result-analyzer.js.map +1 -0
- package/dist/tools/cloud-executor/vm-metrics.d.ts +87 -0
- package/dist/tools/cloud-executor/vm-metrics.d.ts.map +1 -0
- package/dist/tools/cloud-executor/vm-metrics.js +506 -0
- package/dist/tools/cloud-executor/vm-metrics.js.map +1 -0
- package/dist/tools/jmx-generator/index.d.ts +20 -0
- package/dist/tools/jmx-generator/index.d.ts.map +1 -0
- package/dist/tools/jmx-generator/index.js +115 -0
- package/dist/tools/jmx-generator/index.js.map +1 -0
- package/dist/tools/jmx-generator/sanitizer.d.ts +19 -0
- package/dist/tools/jmx-generator/sanitizer.d.ts.map +1 -0
- package/dist/tools/jmx-generator/sanitizer.js +166 -0
- package/dist/tools/jmx-generator/sanitizer.js.map +1 -0
- package/package.json +5 -2
- package/scripts/copy-prompts.js +46 -0
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Test Result Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Provides detailed analysis of JMeter test results including:
|
|
5
|
+
* - Request statistics (throughput, response times, error rates)
|
|
6
|
+
* - Performance trends over time
|
|
7
|
+
* - Azure VM metrics during test execution (CPU, memory, disk, network)
|
|
8
|
+
*/
|
|
9
|
+
import { execSync } from 'child_process';
|
|
10
|
+
import * as fs from 'fs';
|
|
11
|
+
import { getVMMetrics } from './vm-metrics.js';
|
|
12
|
+
/**
|
|
13
|
+
* Execute a command and return output
|
|
14
|
+
*/
|
|
15
|
+
function runCommand(command, options = {}) {
|
|
16
|
+
try {
|
|
17
|
+
const result = execSync(command, {
|
|
18
|
+
encoding: 'utf-8',
|
|
19
|
+
timeout: options.timeout || 60000,
|
|
20
|
+
cwd: options.cwd,
|
|
21
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
22
|
+
});
|
|
23
|
+
return result.trim();
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
throw new Error(`Command failed: ${command}\n${error.message}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parse JTL file and extract detailed statistics
|
|
31
|
+
*/
|
|
32
|
+
function parseJTLFile(jtlPath) {
|
|
33
|
+
const content = fs.readFileSync(jtlPath, 'utf-8');
|
|
34
|
+
const lines = content.split('\n').filter(line => line.trim() && !line.startsWith('timeStamp'));
|
|
35
|
+
const requests = [];
|
|
36
|
+
const responseTimes = [];
|
|
37
|
+
let totalBytes = 0;
|
|
38
|
+
let successCount = 0;
|
|
39
|
+
let failCount = 0;
|
|
40
|
+
let minTime = Infinity;
|
|
41
|
+
let maxTime = 0;
|
|
42
|
+
let minTimestamp = Infinity;
|
|
43
|
+
let maxTimestamp = 0;
|
|
44
|
+
lines.forEach(line => {
|
|
45
|
+
const parts = line.split(',');
|
|
46
|
+
if (parts.length >= 4) {
|
|
47
|
+
const timestamp = parseInt(parts[0], 10);
|
|
48
|
+
const elapsed = parseInt(parts[1], 10);
|
|
49
|
+
const label = parts[2];
|
|
50
|
+
const responseCode = parts[3];
|
|
51
|
+
const success = parts[7] === 'true' && (responseCode.startsWith('2') || responseCode.startsWith('3'));
|
|
52
|
+
const bytes = parseInt(parts[9] || '0', 10);
|
|
53
|
+
requests.push({ timestamp, elapsed, label, responseCode, success, bytes });
|
|
54
|
+
responseTimes.push(elapsed);
|
|
55
|
+
totalBytes += bytes;
|
|
56
|
+
if (success)
|
|
57
|
+
successCount++;
|
|
58
|
+
else
|
|
59
|
+
failCount++;
|
|
60
|
+
if (elapsed < minTime)
|
|
61
|
+
minTime = elapsed;
|
|
62
|
+
if (elapsed > maxTime)
|
|
63
|
+
maxTime = elapsed;
|
|
64
|
+
if (timestamp < minTimestamp)
|
|
65
|
+
minTimestamp = timestamp;
|
|
66
|
+
if (timestamp > maxTimestamp)
|
|
67
|
+
maxTimestamp = timestamp;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
const totalRequests = requests.length;
|
|
71
|
+
const testDurationSeconds = totalRequests > 0 ? (maxTimestamp - minTimestamp) / 1000 : 0;
|
|
72
|
+
const throughput = testDurationSeconds > 0 ? totalRequests / testDurationSeconds : 0;
|
|
73
|
+
// Calculate percentiles
|
|
74
|
+
const sortedTimes = [...responseTimes].sort((a, b) => a - b);
|
|
75
|
+
const p50 = sortedTimes[Math.floor(sortedTimes.length * 0.50)] || 0;
|
|
76
|
+
const p90 = sortedTimes[Math.floor(sortedTimes.length * 0.90)] || 0;
|
|
77
|
+
const p95 = sortedTimes[Math.floor(sortedTimes.length * 0.95)] || 0;
|
|
78
|
+
const p99 = sortedTimes[Math.floor(sortedTimes.length * 0.99)] || 0;
|
|
79
|
+
const avgResponseTime = totalRequests > 0 ? responseTimes.reduce((a, b) => a + b, 0) / totalRequests : 0;
|
|
80
|
+
const errorRate = totalRequests > 0 ? (failCount / totalRequests) * 100 : 0;
|
|
81
|
+
return {
|
|
82
|
+
requests,
|
|
83
|
+
summary: {
|
|
84
|
+
totalRequests,
|
|
85
|
+
successfulRequests: successCount,
|
|
86
|
+
failedRequests: failCount,
|
|
87
|
+
errorRate,
|
|
88
|
+
avgResponseTime,
|
|
89
|
+
minResponseTime: minTime === Infinity ? 0 : minTime,
|
|
90
|
+
maxResponseTime: maxTime,
|
|
91
|
+
p50ResponseTime: p50,
|
|
92
|
+
p90ResponseTime: p90,
|
|
93
|
+
p95ResponseTime: p95,
|
|
94
|
+
p99ResponseTime: p99,
|
|
95
|
+
throughput,
|
|
96
|
+
testDurationSeconds,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Group requests by label and calculate per-endpoint statistics
|
|
102
|
+
*/
|
|
103
|
+
function calculateRequestBreakdown(requests) {
|
|
104
|
+
const breakdown = new Map();
|
|
105
|
+
requests.forEach(req => {
|
|
106
|
+
if (!breakdown.has(req.label)) {
|
|
107
|
+
breakdown.set(req.label, {
|
|
108
|
+
label: req.label,
|
|
109
|
+
count: 0,
|
|
110
|
+
totalTime: 0,
|
|
111
|
+
minTime: Infinity,
|
|
112
|
+
maxTime: 0,
|
|
113
|
+
errorCount: 0,
|
|
114
|
+
times: [],
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
const entry = breakdown.get(req.label);
|
|
118
|
+
entry.count++;
|
|
119
|
+
entry.totalTime += req.elapsed;
|
|
120
|
+
entry.times.push(req.elapsed);
|
|
121
|
+
if (req.elapsed < entry.minTime)
|
|
122
|
+
entry.minTime = req.elapsed;
|
|
123
|
+
if (req.elapsed > entry.maxTime)
|
|
124
|
+
entry.maxTime = req.elapsed;
|
|
125
|
+
if (!req.success)
|
|
126
|
+
entry.errorCount++;
|
|
127
|
+
});
|
|
128
|
+
return Array.from(breakdown.values()).map(entry => ({
|
|
129
|
+
label: entry.label,
|
|
130
|
+
count: entry.count,
|
|
131
|
+
avgTime: entry.totalTime / entry.count,
|
|
132
|
+
minTime: entry.minTime === Infinity ? 0 : entry.minTime,
|
|
133
|
+
maxTime: entry.maxTime,
|
|
134
|
+
errorCount: entry.errorCount,
|
|
135
|
+
errorRate: (entry.errorCount / entry.count) * 100,
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Fetch Azure VM metrics during test execution using getVMMetrics tool
|
|
140
|
+
*/
|
|
141
|
+
async function fetchAzureVMMetrics(resourceGroup, vmName, startTime, endTime) {
|
|
142
|
+
try {
|
|
143
|
+
console.error('Fetching VM metrics using getVMMetrics tool...');
|
|
144
|
+
const vmMetricsResult = await getVMMetrics({
|
|
145
|
+
resourceGroup: resourceGroup,
|
|
146
|
+
vmName: vmName,
|
|
147
|
+
timeRange: 'custom',
|
|
148
|
+
startTime: startTime.toISOString(),
|
|
149
|
+
endTime: endTime.toISOString(),
|
|
150
|
+
metrics: ['all']
|
|
151
|
+
});
|
|
152
|
+
if (!vmMetricsResult.success) {
|
|
153
|
+
console.error('Failed to fetch VM metrics:', vmMetricsResult);
|
|
154
|
+
return { available: false };
|
|
155
|
+
}
|
|
156
|
+
const metrics = vmMetricsResult.metrics;
|
|
157
|
+
// Transform VM metrics to match TestResultAnalysis interface
|
|
158
|
+
const cpuUsage = metrics.cpu && metrics.cpu.average !== null ? {
|
|
159
|
+
avg: metrics.cpu.average,
|
|
160
|
+
max: metrics.cpu.maximum || metrics.cpu.average,
|
|
161
|
+
min: metrics.cpu.minimum || metrics.cpu.average,
|
|
162
|
+
} : undefined;
|
|
163
|
+
const memoryUsage = metrics.memory && metrics.memory.average !== null ? {
|
|
164
|
+
avg: metrics.memory.average,
|
|
165
|
+
max: metrics.memory.maximum || metrics.memory.average,
|
|
166
|
+
min: metrics.memory.minimum || metrics.memory.average,
|
|
167
|
+
} : undefined;
|
|
168
|
+
const networkIO = metrics.network ? {
|
|
169
|
+
inboundMBps: metrics.network.bytesIn?.average || 0,
|
|
170
|
+
outboundMBps: metrics.network.bytesOut?.average || 0,
|
|
171
|
+
} : undefined;
|
|
172
|
+
const diskIO = metrics.disk ? {
|
|
173
|
+
readMBps: metrics.disk.readBytes?.average || 0,
|
|
174
|
+
writeMBps: metrics.disk.writeBytes?.average || 0,
|
|
175
|
+
} : undefined;
|
|
176
|
+
return {
|
|
177
|
+
available: cpuUsage !== undefined || memoryUsage !== undefined || networkIO !== undefined || diskIO !== undefined,
|
|
178
|
+
cpuUsage,
|
|
179
|
+
memoryUsage,
|
|
180
|
+
networkIO,
|
|
181
|
+
diskIO,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
console.error('Error fetching VM metrics:', error.message);
|
|
186
|
+
return { available: false };
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Generate insights and recommendations based on test results and VM metrics
|
|
191
|
+
*/
|
|
192
|
+
function generateInsights(summary, requestBreakdown, vmMetrics) {
|
|
193
|
+
const insights = [];
|
|
194
|
+
const recommendations = [];
|
|
195
|
+
// Performance insights
|
|
196
|
+
if (summary.errorRate === 0) {
|
|
197
|
+
insights.push('✅ All requests completed successfully with 0% error rate');
|
|
198
|
+
}
|
|
199
|
+
else if (summary.errorRate < 5) {
|
|
200
|
+
insights.push(`⚠️ Low error rate detected (${summary.errorRate.toFixed(2)}%) - may need investigation`);
|
|
201
|
+
recommendations.push('Investigate failed requests to identify potential issues');
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
insights.push(`❌ High error rate detected (${summary.errorRate.toFixed(2)}%) - requires immediate attention`);
|
|
205
|
+
recommendations.push('Review application logs and error responses to identify root cause');
|
|
206
|
+
}
|
|
207
|
+
// Response time analysis
|
|
208
|
+
if (summary.avgResponseTime < 200) {
|
|
209
|
+
insights.push('⚡ Excellent response times - API is performing very well');
|
|
210
|
+
}
|
|
211
|
+
else if (summary.avgResponseTime < 500) {
|
|
212
|
+
insights.push('✅ Good response times - API performance is acceptable');
|
|
213
|
+
}
|
|
214
|
+
else if (summary.avgResponseTime < 1000) {
|
|
215
|
+
insights.push('⚠️ Moderate response times - consider optimization');
|
|
216
|
+
recommendations.push('Profile slow endpoints and optimize database queries or API calls');
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
insights.push('🐌 Slow response times detected - performance optimization needed');
|
|
220
|
+
recommendations.push('Implement caching, optimize database queries, or scale resources');
|
|
221
|
+
}
|
|
222
|
+
// Percentile analysis
|
|
223
|
+
if (summary.p99ResponseTime > summary.avgResponseTime * 3) {
|
|
224
|
+
insights.push(`📊 High variance in response times (P99: ${summary.p99ResponseTime.toFixed(0)}ms vs Avg: ${summary.avgResponseTime.toFixed(0)}ms)`);
|
|
225
|
+
recommendations.push('Investigate outliers - some requests are taking significantly longer');
|
|
226
|
+
}
|
|
227
|
+
// Throughput analysis
|
|
228
|
+
if (summary.throughput > 0) {
|
|
229
|
+
insights.push(`📈 Throughput: ${summary.throughput.toFixed(2)} requests/second over ${summary.testDurationSeconds.toFixed(0)}s`);
|
|
230
|
+
}
|
|
231
|
+
// Per-endpoint analysis
|
|
232
|
+
if (requestBreakdown) {
|
|
233
|
+
const slowestEndpoint = requestBreakdown.reduce((prev, curr) => curr.avgTime > prev.avgTime ? curr : prev);
|
|
234
|
+
if (slowestEndpoint.avgTime > 1000) {
|
|
235
|
+
insights.push(`🎯 Slowest endpoint: ${slowestEndpoint.label} (${slowestEndpoint.avgTime.toFixed(0)}ms avg)`);
|
|
236
|
+
recommendations.push(`Optimize the ${slowestEndpoint.label} endpoint - it's the bottleneck`);
|
|
237
|
+
}
|
|
238
|
+
const errorEndpoints = requestBreakdown.filter(r => r.errorRate > 0);
|
|
239
|
+
if (errorEndpoints.length > 0) {
|
|
240
|
+
insights.push(`⚠️ ${errorEndpoints.length} endpoint(s) have errors`);
|
|
241
|
+
errorEndpoints.forEach(ep => {
|
|
242
|
+
recommendations.push(`Fix errors in ${ep.label} (${ep.errorRate.toFixed(1)}% error rate)`);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// VM metrics analysis with highlighting for abnormal values
|
|
247
|
+
if (vmMetrics?.available) {
|
|
248
|
+
if (vmMetrics.cpuUsage) {
|
|
249
|
+
const cpuAvg = vmMetrics.cpuUsage.avg.toFixed(1);
|
|
250
|
+
const cpuMax = vmMetrics.cpuUsage.max.toFixed(1);
|
|
251
|
+
if (vmMetrics.cpuUsage.max > 80) {
|
|
252
|
+
insights.push(`🔴 **CRITICAL**: VM CPU Usage - Avg ${cpuAvg}%, Max ${cpuMax}% (VERY HIGH!)`);
|
|
253
|
+
recommendations.push('⚠️ URGENT: CPU utilization exceeded 80% - upgrade to a larger VM size immediately to avoid performance degradation');
|
|
254
|
+
}
|
|
255
|
+
else if (vmMetrics.cpuUsage.avg > 70) {
|
|
256
|
+
insights.push(`🟠 **WARNING**: VM CPU Usage - Avg ${cpuAvg}%, Max ${cpuMax}% (High)`);
|
|
257
|
+
recommendations.push('⚠️ CPU utilization is high - consider upgrading to a larger VM size to maintain headroom');
|
|
258
|
+
}
|
|
259
|
+
else if (vmMetrics.cpuUsage.avg < 20) {
|
|
260
|
+
insights.push(`💻 VM CPU Usage: Avg ${cpuAvg}%, Max ${cpuMax}% (Underutilized)`);
|
|
261
|
+
recommendations.push('💰 CPU utilization is low - consider downsizing VM to reduce costs while maintaining performance');
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
insights.push(`✅ VM CPU Usage: Avg ${cpuAvg}%, Max ${cpuMax}% (Normal)`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (vmMetrics.memoryUsage) {
|
|
268
|
+
const memAvg = vmMetrics.memoryUsage.avg.toFixed(1);
|
|
269
|
+
const memMax = vmMetrics.memoryUsage.max.toFixed(1);
|
|
270
|
+
if (vmMetrics.memoryUsage.max > 90) {
|
|
271
|
+
insights.push(`🔴 **CRITICAL**: VM Memory Usage - Avg ${memAvg}%, Max ${memMax}% (VERY HIGH!)`);
|
|
272
|
+
recommendations.push('⚠️ URGENT: Memory usage exceeded 90% - increase VM memory immediately or risk out-of-memory errors');
|
|
273
|
+
}
|
|
274
|
+
else if (vmMetrics.memoryUsage.avg > 80) {
|
|
275
|
+
insights.push(`🟠 **WARNING**: VM Memory Usage - Avg ${memAvg}%, Max ${memMax}% (High)`);
|
|
276
|
+
recommendations.push('⚠️ Memory usage is high - consider increasing VM memory or optimizing application memory consumption');
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
insights.push(`✅ VM Memory Usage: Avg ${memAvg}%, Max ${memMax}% (Normal)`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
if (vmMetrics.networkIO) {
|
|
283
|
+
const netIn = vmMetrics.networkIO.inboundMBps.toFixed(2);
|
|
284
|
+
const netOut = vmMetrics.networkIO.outboundMBps.toFixed(2);
|
|
285
|
+
if (vmMetrics.networkIO.inboundMBps > 100 || vmMetrics.networkIO.outboundMBps > 100) {
|
|
286
|
+
insights.push(`🟠 **WARNING**: High Network Traffic - ${netIn} MB/s in, ${netOut} MB/s out`);
|
|
287
|
+
recommendations.push('⚠️ Network bandwidth is high - ensure VM network tier can handle the load or consider upgrading');
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
insights.push(`🌐 Network I/O: ${netIn} MB/s in, ${netOut} MB/s out (Normal)`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (vmMetrics.diskIO) {
|
|
294
|
+
const diskRead = vmMetrics.diskIO.readMBps.toFixed(2);
|
|
295
|
+
const diskWrite = vmMetrics.diskIO.writeMBps.toFixed(2);
|
|
296
|
+
if (vmMetrics.diskIO.readMBps > 50 || vmMetrics.diskIO.writeMBps > 50) {
|
|
297
|
+
insights.push(`🟠 **WARNING**: High Disk I/O - ${diskRead} MB/s read, ${diskWrite} MB/s write`);
|
|
298
|
+
recommendations.push('⚠️ Disk I/O is high - consider using Premium SSD or optimizing disk operations');
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
insights.push(`💾 Disk I/O: ${diskRead} MB/s read, ${diskWrite} MB/s write (Normal)`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
insights.push('ℹ️ VM metrics not available - ensure Azure Monitor is enabled and VM has been running during test period');
|
|
307
|
+
recommendations.push('Enable Azure Monitor diagnostics on the VM to collect performance metrics for future tests');
|
|
308
|
+
}
|
|
309
|
+
return { insights, recommendations };
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Main function: Analyze performance test results
|
|
313
|
+
*/
|
|
314
|
+
export async function analyzeTestResults(resultFilePath, resourceGroup, vmName, testStartTime, testEndTime) {
|
|
315
|
+
try {
|
|
316
|
+
// Validate result file exists
|
|
317
|
+
if (!fs.existsSync(resultFilePath)) {
|
|
318
|
+
throw new Error(`Result file not found: ${resultFilePath}`);
|
|
319
|
+
}
|
|
320
|
+
console.error(`Analyzing test results from: ${resultFilePath}`);
|
|
321
|
+
// Parse JTL file
|
|
322
|
+
const { requests, summary } = parseJTLFile(resultFilePath);
|
|
323
|
+
// Calculate per-request breakdown
|
|
324
|
+
const requestBreakdown = calculateRequestBreakdown(requests);
|
|
325
|
+
// Fetch VM metrics if available
|
|
326
|
+
let vmMetrics;
|
|
327
|
+
if (resourceGroup && vmName && testStartTime && testEndTime) {
|
|
328
|
+
console.error('Fetching Azure VM metrics...');
|
|
329
|
+
vmMetrics = await fetchAzureVMMetrics(resourceGroup, vmName, new Date(testStartTime), new Date(testEndTime));
|
|
330
|
+
}
|
|
331
|
+
// Generate insights and recommendations
|
|
332
|
+
const { insights, recommendations } = generateInsights(summary, requestBreakdown, vmMetrics);
|
|
333
|
+
return {
|
|
334
|
+
success: true,
|
|
335
|
+
resultFile: resultFilePath,
|
|
336
|
+
summary,
|
|
337
|
+
requestBreakdown,
|
|
338
|
+
vmMetrics,
|
|
339
|
+
insights,
|
|
340
|
+
recommendations,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
return {
|
|
345
|
+
success: false,
|
|
346
|
+
error: error.message,
|
|
347
|
+
summary: {
|
|
348
|
+
totalRequests: 0,
|
|
349
|
+
successfulRequests: 0,
|
|
350
|
+
failedRequests: 0,
|
|
351
|
+
errorRate: 0,
|
|
352
|
+
avgResponseTime: 0,
|
|
353
|
+
minResponseTime: 0,
|
|
354
|
+
maxResponseTime: 0,
|
|
355
|
+
p50ResponseTime: 0,
|
|
356
|
+
p90ResponseTime: 0,
|
|
357
|
+
p95ResponseTime: 0,
|
|
358
|
+
p99ResponseTime: 0,
|
|
359
|
+
throughput: 0,
|
|
360
|
+
testDurationSeconds: 0,
|
|
361
|
+
},
|
|
362
|
+
insights: [],
|
|
363
|
+
recommendations: [],
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=result-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-analyzer.js","sourceRoot":"","sources":["../../../src/tools/cloud-executor/result-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Azure VM Metrics Fetcher
|
|
3
|
+
*
|
|
4
|
+
* Fetches performance metrics (CPU, Memory, Network, Disk) from Azure Monitor
|
|
5
|
+
* for VMs provisioned during performance testing.
|
|
6
|
+
*/
|
|
7
|
+
export interface VMMetricsConfig {
|
|
8
|
+
resourceGroup: string;
|
|
9
|
+
vmName?: string;
|
|
10
|
+
timeRange?: '1h' | '6h' | '24h' | 'custom';
|
|
11
|
+
startTime?: string;
|
|
12
|
+
endTime?: string;
|
|
13
|
+
metrics?: Array<'cpu' | 'memory' | 'network' | 'disk' | 'all'>;
|
|
14
|
+
terraformDir?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface VMMetrics {
|
|
17
|
+
success: boolean;
|
|
18
|
+
resourceGroup: string;
|
|
19
|
+
vmName: string;
|
|
20
|
+
timeRange: string;
|
|
21
|
+
startTime: string;
|
|
22
|
+
endTime: string;
|
|
23
|
+
metrics: {
|
|
24
|
+
cpu?: {
|
|
25
|
+
average: number;
|
|
26
|
+
maximum: number;
|
|
27
|
+
minimum: number;
|
|
28
|
+
unit: string;
|
|
29
|
+
datapoints: number;
|
|
30
|
+
status: 'normal' | 'warning' | 'critical';
|
|
31
|
+
analysis: string;
|
|
32
|
+
};
|
|
33
|
+
memory?: {
|
|
34
|
+
average: number;
|
|
35
|
+
maximum: number;
|
|
36
|
+
minimum: number;
|
|
37
|
+
unit: string;
|
|
38
|
+
datapoints: number;
|
|
39
|
+
status: 'normal' | 'warning' | 'critical';
|
|
40
|
+
analysis: string;
|
|
41
|
+
};
|
|
42
|
+
network?: {
|
|
43
|
+
bytesIn: {
|
|
44
|
+
total: number;
|
|
45
|
+
average: number;
|
|
46
|
+
maximum: number;
|
|
47
|
+
unit: string;
|
|
48
|
+
};
|
|
49
|
+
bytesOut: {
|
|
50
|
+
total: number;
|
|
51
|
+
average: number;
|
|
52
|
+
maximum: number;
|
|
53
|
+
unit: string;
|
|
54
|
+
};
|
|
55
|
+
status: 'normal' | 'warning' | 'critical';
|
|
56
|
+
analysis: string;
|
|
57
|
+
};
|
|
58
|
+
disk?: {
|
|
59
|
+
readBytes: {
|
|
60
|
+
total: number;
|
|
61
|
+
average: number;
|
|
62
|
+
maximum: number;
|
|
63
|
+
unit: string;
|
|
64
|
+
};
|
|
65
|
+
writeBytes: {
|
|
66
|
+
total: number;
|
|
67
|
+
average: number;
|
|
68
|
+
maximum: number;
|
|
69
|
+
unit: string;
|
|
70
|
+
};
|
|
71
|
+
iops: {
|
|
72
|
+
read: number;
|
|
73
|
+
write: number;
|
|
74
|
+
};
|
|
75
|
+
status: 'normal' | 'warning' | 'critical';
|
|
76
|
+
analysis: string;
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
anomalies: string[];
|
|
80
|
+
summary: string;
|
|
81
|
+
error?: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Fetch VM metrics from Azure Monitor
|
|
85
|
+
*/
|
|
86
|
+
export declare function getVMMetrics(config: VMMetricsConfig): Promise<VMMetrics>;
|
|
87
|
+
//# sourceMappingURL=vm-metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vm-metrics.d.ts","sourceRoot":"","sources":["../../../src/tools/cloud-executor/vm-metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,GAAG,CAAC,EAAE;YACJ,OAAO,EAAE,MAAM,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;YAC1C,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,MAAM,CAAC,EAAE;YACP,OAAO,EAAE,MAAM,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;YAC1C,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,OAAO,CAAC,EAAE;YACR,OAAO,EAAE;gBACP,KAAK,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE,MAAM,CAAC;gBAChB,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;aACd,CAAC;YACF,QAAQ,EAAE;gBACR,KAAK,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE,MAAM,CAAC;gBAChB,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;aACd,CAAC;YACF,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;YAC1C,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,IAAI,CAAC,EAAE;YACL,SAAS,EAAE;gBACT,KAAK,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE,MAAM,CAAC;gBAChB,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;aACd,CAAC;YACF,UAAU,EAAE;gBACV,KAAK,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE,MAAM,CAAC;gBAChB,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;aACd,CAAC;YACF,IAAI,EAAE;gBACJ,IAAI,EAAE,MAAM,CAAC;gBACb,KAAK,EAAE,MAAM,CAAC;aACf,CAAC;YACF,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;YAC1C,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;KACH,CAAC;IACF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA6HD;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAyb9E"}
|