@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,506 @@
|
|
|
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
|
+
import { execSync } from 'child_process';
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import { PERF_OUTPUT_DIR } from '../azure-infra/terraform-generator.js';
|
|
11
|
+
/**
|
|
12
|
+
* Auto-detect VM information from Terraform state
|
|
13
|
+
*/
|
|
14
|
+
function detectVMFromTerraform(resourceGroup, terraformDir) {
|
|
15
|
+
try {
|
|
16
|
+
// Find Terraform directory
|
|
17
|
+
let tfDir = terraformDir;
|
|
18
|
+
if (!tfDir) {
|
|
19
|
+
const perfOutDir = PERF_OUTPUT_DIR;
|
|
20
|
+
const terraformBaseDir = path.join(perfOutDir, 'terraform');
|
|
21
|
+
if (fs.existsSync(terraformBaseDir)) {
|
|
22
|
+
const dirs = fs.readdirSync(terraformBaseDir);
|
|
23
|
+
const matchingDir = dirs.find(d => d.includes(resourceGroup));
|
|
24
|
+
if (matchingDir) {
|
|
25
|
+
tfDir = path.join(terraformBaseDir, matchingDir);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (!tfDir || !fs.existsSync(tfDir)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
// Read terraform.tfstate
|
|
33
|
+
const stateFile = path.join(tfDir, 'terraform.tfstate');
|
|
34
|
+
if (!fs.existsSync(stateFile)) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const state = JSON.parse(fs.readFileSync(stateFile, 'utf-8'));
|
|
38
|
+
// Find VM resource
|
|
39
|
+
const resources = state.resources || [];
|
|
40
|
+
const vmResource = resources.find((r) => r.type === 'azurerm_linux_virtual_machine' || r.type === 'azurerm_windows_virtual_machine');
|
|
41
|
+
if (vmResource && vmResource.instances && vmResource.instances[0]) {
|
|
42
|
+
const instance = vmResource.instances[0];
|
|
43
|
+
return {
|
|
44
|
+
vmName: instance.attributes.name,
|
|
45
|
+
vmId: instance.attributes.id
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
console.error(`Failed to detect VM from Terraform: ${error}`);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Analyze metric value and determine status
|
|
57
|
+
*/
|
|
58
|
+
function analyzeMetricValue(metricName, value, maximum) {
|
|
59
|
+
let status = 'normal';
|
|
60
|
+
let analysis = '';
|
|
61
|
+
switch (metricName) {
|
|
62
|
+
case 'cpu':
|
|
63
|
+
if (value > 90) {
|
|
64
|
+
status = 'critical';
|
|
65
|
+
analysis = `⚠️ CRITICAL: CPU usage averaged ${value.toFixed(1)}% - VM is severely CPU-constrained. This will significantly impact test accuracy. Consider using a larger VM size.`;
|
|
66
|
+
}
|
|
67
|
+
else if (value > 75) {
|
|
68
|
+
status = 'warning';
|
|
69
|
+
analysis = `⚠️ WARNING: CPU usage averaged ${value.toFixed(1)}% - VM is near capacity. Test results may be affected. Consider scaling up for production tests.`;
|
|
70
|
+
}
|
|
71
|
+
else if (value > 50) {
|
|
72
|
+
status = 'normal';
|
|
73
|
+
analysis = `✅ CPU usage averaged ${value.toFixed(1)}% - Healthy utilization. VM has adequate capacity for the test workload.`;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
status = 'normal';
|
|
77
|
+
analysis = `✅ CPU usage averaged ${value.toFixed(1)}% - Excellent headroom. VM is well-sized for this workload.`;
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
case 'memory':
|
|
81
|
+
if (value > 90) {
|
|
82
|
+
status = 'critical';
|
|
83
|
+
analysis = `⚠️ CRITICAL: Memory usage at ${value.toFixed(1)}% - VM is memory-constrained. This will cause swapping and severely impact performance. Increase VM memory immediately.`;
|
|
84
|
+
}
|
|
85
|
+
else if (value > 80) {
|
|
86
|
+
status = 'warning';
|
|
87
|
+
analysis = `⚠️ WARNING: Memory usage at ${value.toFixed(1)}% - VM is running low on memory. Consider using a memory-optimized VM size.`;
|
|
88
|
+
}
|
|
89
|
+
else if (value > 60) {
|
|
90
|
+
status = 'normal';
|
|
91
|
+
analysis = `✅ Memory usage at ${value.toFixed(1)}% - Healthy utilization. VM has adequate memory for operations.`;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
status = 'normal';
|
|
95
|
+
analysis = `✅ Memory usage at ${value.toFixed(1)}% - Excellent headroom. Sufficient memory for test operations.`;
|
|
96
|
+
}
|
|
97
|
+
break;
|
|
98
|
+
case 'network':
|
|
99
|
+
const mbps = value / (1024 * 1024 * 8); // Convert bytes to Mbps
|
|
100
|
+
if (mbps > 800) {
|
|
101
|
+
status = 'warning';
|
|
102
|
+
analysis = `⚠️ WARNING: Network throughput peaked at ${mbps.toFixed(0)} Mbps - Approaching VM network limits. May cause throttling.`;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
status = 'normal';
|
|
106
|
+
analysis = `✅ Network throughput averaged ${mbps.toFixed(0)} Mbps - Within normal bounds.`;
|
|
107
|
+
}
|
|
108
|
+
break;
|
|
109
|
+
case 'disk':
|
|
110
|
+
const iops = value;
|
|
111
|
+
if (iops > 3000) {
|
|
112
|
+
status = 'warning';
|
|
113
|
+
analysis = `⚠️ WARNING: Disk IOPS peaked at ${iops.toFixed(0)} - May be approaching disk performance limits.`;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
status = 'normal';
|
|
117
|
+
analysis = `✅ Disk performance averaged ${iops.toFixed(0)} IOPS - Within acceptable range.`;
|
|
118
|
+
}
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
return { status, analysis };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Fetch VM metrics from Azure Monitor
|
|
125
|
+
*/
|
|
126
|
+
export async function getVMMetrics(config) {
|
|
127
|
+
const { resourceGroup, vmName: providedVmName, timeRange = '1h', startTime, endTime, metrics = ['all'], terraformDir } = config;
|
|
128
|
+
try {
|
|
129
|
+
// Auto-detect VM if not provided
|
|
130
|
+
let vmName = providedVmName;
|
|
131
|
+
if (!vmName) {
|
|
132
|
+
const detected = detectVMFromTerraform(resourceGroup, terraformDir);
|
|
133
|
+
if (!detected) {
|
|
134
|
+
return {
|
|
135
|
+
success: false,
|
|
136
|
+
resourceGroup,
|
|
137
|
+
vmName: 'unknown',
|
|
138
|
+
timeRange,
|
|
139
|
+
startTime: '',
|
|
140
|
+
endTime: '',
|
|
141
|
+
metrics: {},
|
|
142
|
+
anomalies: [],
|
|
143
|
+
summary: '',
|
|
144
|
+
error: 'Could not detect VM name. Please provide vmName or ensure Terraform state exists.'
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
vmName = detected.vmName;
|
|
148
|
+
}
|
|
149
|
+
// Determine time range
|
|
150
|
+
let timeFilter = '';
|
|
151
|
+
if (startTime && endTime) {
|
|
152
|
+
timeFilter = `--start-time "${startTime}" --end-time "${endTime}"`;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
const now = new Date();
|
|
156
|
+
const past = new Date(now);
|
|
157
|
+
switch (timeRange) {
|
|
158
|
+
case '1h':
|
|
159
|
+
past.setHours(past.getHours() - 1);
|
|
160
|
+
break;
|
|
161
|
+
case '6h':
|
|
162
|
+
past.setHours(past.getHours() - 6);
|
|
163
|
+
break;
|
|
164
|
+
case '24h':
|
|
165
|
+
past.setHours(past.getHours() - 24);
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
timeFilter = `--start-time "${past.toISOString()}" --end-time "${now.toISOString()}"`;
|
|
169
|
+
}
|
|
170
|
+
const metricsToFetch = metrics.includes('all')
|
|
171
|
+
? ['cpu', 'memory', 'network', 'disk']
|
|
172
|
+
: metrics;
|
|
173
|
+
const result = {
|
|
174
|
+
success: true,
|
|
175
|
+
resourceGroup,
|
|
176
|
+
vmName,
|
|
177
|
+
timeRange,
|
|
178
|
+
startTime: startTime || '',
|
|
179
|
+
endTime: endTime || '',
|
|
180
|
+
metrics: {},
|
|
181
|
+
anomalies: [],
|
|
182
|
+
summary: ''
|
|
183
|
+
};
|
|
184
|
+
// Create directory for raw metrics data in workspace root
|
|
185
|
+
const timestamp = new Date().toISOString().replace(/:/g, '-').replace(/\..+/, '');
|
|
186
|
+
const workspaceRoot = process.cwd();
|
|
187
|
+
const rawMetricsDir = path.join(workspaceRoot, '.perf-output', 'vm-metrics-raw', `${vmName}-${timestamp}`);
|
|
188
|
+
if (!fs.existsSync(rawMetricsDir)) {
|
|
189
|
+
fs.mkdirSync(rawMetricsDir, { recursive: true });
|
|
190
|
+
}
|
|
191
|
+
console.error(`Saving raw VM metrics to: ${rawMetricsDir}`);
|
|
192
|
+
// Get VM resource ID once for all metrics
|
|
193
|
+
let vmId = '';
|
|
194
|
+
try {
|
|
195
|
+
const vmIdCmd = `az vm show --resource-group "${resourceGroup}" --name "${vmName}" --query "id" -o tsv`;
|
|
196
|
+
vmId = execSync(vmIdCmd, { encoding: 'utf-8' }).trim();
|
|
197
|
+
// Save VM details
|
|
198
|
+
const vmDetailsCmd = `az vm show --resource-group "${resourceGroup}" --name "${vmName}" --output json`;
|
|
199
|
+
const vmDetails = execSync(vmDetailsCmd, { encoding: 'utf-8' });
|
|
200
|
+
fs.writeFileSync(path.join(rawMetricsDir, 'vm-details.json'), vmDetails, 'utf-8');
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
console.error(`Failed to get VM resource ID: ${error}`);
|
|
204
|
+
return {
|
|
205
|
+
...result,
|
|
206
|
+
success: false,
|
|
207
|
+
error: `Failed to get VM resource ID. Ensure VM exists and you have access.`
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
// Fetch CPU metrics
|
|
211
|
+
if (metricsToFetch.includes('cpu') && vmId) {
|
|
212
|
+
try {
|
|
213
|
+
const cpuCmd = `az monitor metrics list \
|
|
214
|
+
--resource "${vmId}" \
|
|
215
|
+
--metric "Percentage CPU" \
|
|
216
|
+
${timeFilter} \
|
|
217
|
+
--interval PT1M \
|
|
218
|
+
--aggregation Average Maximum Minimum \
|
|
219
|
+
--output json`;
|
|
220
|
+
const cpuOutput = execSync(cpuCmd, { encoding: 'utf-8' });
|
|
221
|
+
const cpuData = JSON.parse(cpuOutput);
|
|
222
|
+
// Save raw CPU data
|
|
223
|
+
fs.writeFileSync(path.join(rawMetricsDir, 'cpu-raw.json'), JSON.stringify(cpuData, null, 2), 'utf-8');
|
|
224
|
+
if (cpuData.value && cpuData.value.length > 0) {
|
|
225
|
+
const timeseries = cpuData.value[0].timeseries || [];
|
|
226
|
+
const datapoints = timeseries.flatMap((ts) => ts.data || []);
|
|
227
|
+
const avgValues = datapoints.map((d) => d.average).filter((v) => v !== null);
|
|
228
|
+
const maxValues = datapoints.map((d) => d.maximum).filter((v) => v !== null);
|
|
229
|
+
const minValues = datapoints.map((d) => d.minimum).filter((v) => v !== null);
|
|
230
|
+
const avgCpu = avgValues.length > 0 ? avgValues.reduce((a, b) => a + b, 0) / avgValues.length : 0;
|
|
231
|
+
const maxCpu = maxValues.length > 0 ? Math.max(...maxValues) : 0;
|
|
232
|
+
const minCpu = minValues.length > 0 ? Math.min(...minValues) : 0;
|
|
233
|
+
const cpuAnalysis = analyzeMetricValue('cpu', avgCpu, maxCpu);
|
|
234
|
+
result.metrics.cpu = {
|
|
235
|
+
average: parseFloat(avgCpu.toFixed(2)),
|
|
236
|
+
maximum: parseFloat(maxCpu.toFixed(2)),
|
|
237
|
+
minimum: parseFloat(minCpu.toFixed(2)),
|
|
238
|
+
unit: '%',
|
|
239
|
+
datapoints: datapoints.length,
|
|
240
|
+
status: cpuAnalysis.status,
|
|
241
|
+
analysis: cpuAnalysis.analysis
|
|
242
|
+
};
|
|
243
|
+
if (cpuAnalysis.status !== 'normal') {
|
|
244
|
+
result.anomalies.push(cpuAnalysis.analysis);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
console.error(`Failed to fetch CPU metrics: ${error}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Fetch Memory metrics (Available Memory Bytes)
|
|
253
|
+
if (metricsToFetch.includes('memory') && vmId) {
|
|
254
|
+
try {
|
|
255
|
+
// First, get VM size to determine total memory
|
|
256
|
+
const vmDetailsCmd = `az vm show --ids "${vmId}" --query "hardwareProfile.vmSize" -o tsv`;
|
|
257
|
+
const vmSize = execSync(vmDetailsCmd, { encoding: 'utf-8' }).trim();
|
|
258
|
+
// Map VM sizes to memory in GB (common Azure VM sizes)
|
|
259
|
+
const vmMemoryMap = {
|
|
260
|
+
'Standard_B1s': 1,
|
|
261
|
+
'Standard_B1ms': 2,
|
|
262
|
+
'Standard_B2s': 4,
|
|
263
|
+
'Standard_B2ms': 8,
|
|
264
|
+
'Standard_B4ms': 16,
|
|
265
|
+
'Standard_D2s_v3': 8,
|
|
266
|
+
'Standard_D4s_v3': 16,
|
|
267
|
+
'Standard_D8s_v3': 32,
|
|
268
|
+
'Standard_D16s_v3': 64,
|
|
269
|
+
'Standard_E2s_v3': 16,
|
|
270
|
+
'Standard_E4s_v3': 32,
|
|
271
|
+
'Standard_F2s_v2': 4,
|
|
272
|
+
'Standard_F4s_v2': 8,
|
|
273
|
+
};
|
|
274
|
+
const totalMemoryGB = vmMemoryMap[vmSize] || 2; // Default to 2GB if unknown
|
|
275
|
+
const totalMemoryBytes = totalMemoryGB * 1024 * 1024 * 1024;
|
|
276
|
+
const memCmd = `az monitor metrics list \
|
|
277
|
+
--resource "${vmId}" \
|
|
278
|
+
--metric "Available Memory Bytes" \
|
|
279
|
+
${timeFilter} \
|
|
280
|
+
--interval PT1M \
|
|
281
|
+
--aggregation Average Maximum Minimum \
|
|
282
|
+
--output json`;
|
|
283
|
+
const memOutput = execSync(memCmd, { encoding: 'utf-8' });
|
|
284
|
+
const memData = JSON.parse(memOutput);
|
|
285
|
+
// Save raw memory data with calculation details
|
|
286
|
+
const memoryCalcDetails = {
|
|
287
|
+
vmSize: vmSize,
|
|
288
|
+
totalMemoryGB: totalMemoryGB,
|
|
289
|
+
totalMemoryBytes: totalMemoryBytes,
|
|
290
|
+
rawMetrics: memData
|
|
291
|
+
};
|
|
292
|
+
fs.writeFileSync(path.join(rawMetricsDir, 'memory-raw.json'), JSON.stringify(memoryCalcDetails, null, 2), 'utf-8');
|
|
293
|
+
if (memData.value && memData.value.length > 0) {
|
|
294
|
+
const timeseries = memData.value[0].timeseries || [];
|
|
295
|
+
const datapoints = timeseries.flatMap((ts) => ts.data || []);
|
|
296
|
+
const avgValues = datapoints.map((d) => d.average).filter((v) => v !== null);
|
|
297
|
+
const maxValues = datapoints.map((d) => d.maximum).filter((v) => v !== null);
|
|
298
|
+
const minValues = datapoints.map((d) => d.minimum).filter((v) => v !== null);
|
|
299
|
+
const avgAvailableBytes = avgValues.length > 0 ? avgValues.reduce((a, b) => a + b, 0) / avgValues.length : 0;
|
|
300
|
+
const maxAvailableBytes = maxValues.length > 0 ? Math.max(...maxValues) : 0;
|
|
301
|
+
const minAvailableBytes = minValues.length > 0 ? Math.min(...minValues) : 0;
|
|
302
|
+
// Calculate memory usage percentage: (Total - Available) / Total * 100
|
|
303
|
+
const avgMemoryUsedPercent = ((totalMemoryBytes - avgAvailableBytes) / totalMemoryBytes) * 100;
|
|
304
|
+
const maxMemoryUsedPercent = ((totalMemoryBytes - minAvailableBytes) / totalMemoryBytes) * 100;
|
|
305
|
+
const minMemoryUsedPercent = ((totalMemoryBytes - maxAvailableBytes) / totalMemoryBytes) * 100;
|
|
306
|
+
const memAnalysis = analyzeMetricValue('memory', avgMemoryUsedPercent, maxMemoryUsedPercent);
|
|
307
|
+
result.metrics.memory = {
|
|
308
|
+
average: parseFloat(avgMemoryUsedPercent.toFixed(2)),
|
|
309
|
+
maximum: parseFloat(maxMemoryUsedPercent.toFixed(2)),
|
|
310
|
+
minimum: parseFloat(minMemoryUsedPercent.toFixed(2)),
|
|
311
|
+
unit: '%',
|
|
312
|
+
datapoints: datapoints.length,
|
|
313
|
+
status: memAnalysis.status,
|
|
314
|
+
analysis: memAnalysis.analysis
|
|
315
|
+
};
|
|
316
|
+
if (memAnalysis.status !== 'normal') {
|
|
317
|
+
result.anomalies.push(memAnalysis.analysis);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
console.error(`Failed to fetch memory metrics: ${error}`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// Fetch Network metrics
|
|
326
|
+
if (metricsToFetch.includes('network') && vmId) {
|
|
327
|
+
try {
|
|
328
|
+
const netInCmd = `az monitor metrics list \
|
|
329
|
+
--resource "${vmId}" \
|
|
330
|
+
--metric "Network In Total" \
|
|
331
|
+
${timeFilter} \
|
|
332
|
+
--interval PT1M \
|
|
333
|
+
--aggregation Total Average Maximum \
|
|
334
|
+
--output json`;
|
|
335
|
+
const netOutCmd = `az monitor metrics list \
|
|
336
|
+
--resource "${vmId}" \
|
|
337
|
+
--metric "Network Out Total" \
|
|
338
|
+
${timeFilter} \
|
|
339
|
+
--interval PT1M \
|
|
340
|
+
--aggregation Total Average Maximum \
|
|
341
|
+
--output json`;
|
|
342
|
+
const netInOutput = execSync(netInCmd, { encoding: 'utf-8' });
|
|
343
|
+
const netOutOutput = execSync(netOutCmd, { encoding: 'utf-8' });
|
|
344
|
+
const netInData = JSON.parse(netInOutput);
|
|
345
|
+
const netOutData = JSON.parse(netOutOutput);
|
|
346
|
+
// Save raw network data
|
|
347
|
+
fs.writeFileSync(path.join(rawMetricsDir, 'network-in-raw.json'), JSON.stringify(netInData, null, 2), 'utf-8');
|
|
348
|
+
fs.writeFileSync(path.join(rawMetricsDir, 'network-out-raw.json'), JSON.stringify(netOutData, null, 2), 'utf-8');
|
|
349
|
+
const processNetworkData = (data) => {
|
|
350
|
+
if (data.value && data.value.length > 0) {
|
|
351
|
+
const timeseries = data.value[0].timeseries || [];
|
|
352
|
+
const datapoints = timeseries.flatMap((ts) => ts.data || []);
|
|
353
|
+
const totalValues = datapoints.map((d) => d.total).filter((v) => v !== null);
|
|
354
|
+
const avgValues = datapoints.map((d) => d.average).filter((v) => v !== null);
|
|
355
|
+
const maxValues = datapoints.map((d) => d.maximum).filter((v) => v !== null);
|
|
356
|
+
return {
|
|
357
|
+
total: totalValues.length > 0 ? totalValues.reduce((a, b) => a + b, 0) : 0,
|
|
358
|
+
average: avgValues.length > 0 ? avgValues.reduce((a, b) => a + b, 0) / avgValues.length : 0,
|
|
359
|
+
maximum: maxValues.length > 0 ? Math.max(...maxValues) : 0
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
return { total: 0, average: 0, maximum: 0 };
|
|
363
|
+
};
|
|
364
|
+
const bytesIn = processNetworkData(netInData);
|
|
365
|
+
const bytesOut = processNetworkData(netOutData);
|
|
366
|
+
const netAnalysis = analyzeMetricValue('network', Math.max(bytesIn.maximum, bytesOut.maximum), 0);
|
|
367
|
+
result.metrics.network = {
|
|
368
|
+
bytesIn: {
|
|
369
|
+
total: parseFloat((bytesIn.total / (1024 * 1024)).toFixed(2)),
|
|
370
|
+
average: parseFloat((bytesIn.average / (1024 * 1024)).toFixed(2)),
|
|
371
|
+
maximum: parseFloat((bytesIn.maximum / (1024 * 1024)).toFixed(2)),
|
|
372
|
+
unit: 'MB'
|
|
373
|
+
},
|
|
374
|
+
bytesOut: {
|
|
375
|
+
total: parseFloat((bytesOut.total / (1024 * 1024)).toFixed(2)),
|
|
376
|
+
average: parseFloat((bytesOut.average / (1024 * 1024)).toFixed(2)),
|
|
377
|
+
maximum: parseFloat((bytesOut.maximum / (1024 * 1024)).toFixed(2)),
|
|
378
|
+
unit: 'MB'
|
|
379
|
+
},
|
|
380
|
+
status: netAnalysis.status,
|
|
381
|
+
analysis: netAnalysis.analysis
|
|
382
|
+
};
|
|
383
|
+
if (netAnalysis.status !== 'normal') {
|
|
384
|
+
result.anomalies.push(netAnalysis.analysis);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
catch (error) {
|
|
388
|
+
console.error(`Failed to fetch network metrics: ${error}`);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
// Fetch Disk metrics
|
|
392
|
+
if (metricsToFetch.includes('disk') && vmId) {
|
|
393
|
+
try {
|
|
394
|
+
const diskReadCmd = `az monitor metrics list \
|
|
395
|
+
--resource "${vmId}" \
|
|
396
|
+
--metric "Disk Read Bytes" \
|
|
397
|
+
${timeFilter} \
|
|
398
|
+
--interval PT1M \
|
|
399
|
+
--aggregation Total Average Maximum \
|
|
400
|
+
--output json`;
|
|
401
|
+
const diskWriteCmd = `az monitor metrics list \
|
|
402
|
+
--resource "${vmId}" \
|
|
403
|
+
--metric "Disk Write Bytes" \
|
|
404
|
+
${timeFilter} \
|
|
405
|
+
--interval PT1M \
|
|
406
|
+
--aggregation Total Average Maximum \
|
|
407
|
+
--output json`;
|
|
408
|
+
const diskReadOutput = execSync(diskReadCmd, { encoding: 'utf-8' });
|
|
409
|
+
const diskWriteOutput = execSync(diskWriteCmd, { encoding: 'utf-8' });
|
|
410
|
+
const diskReadData = JSON.parse(diskReadOutput);
|
|
411
|
+
const diskWriteData = JSON.parse(diskWriteOutput);
|
|
412
|
+
// Save raw disk data
|
|
413
|
+
fs.writeFileSync(path.join(rawMetricsDir, 'disk-read-raw.json'), JSON.stringify(diskReadData, null, 2), 'utf-8');
|
|
414
|
+
fs.writeFileSync(path.join(rawMetricsDir, 'disk-write-raw.json'), JSON.stringify(diskWriteData, null, 2), 'utf-8');
|
|
415
|
+
const processDiskData = (data) => {
|
|
416
|
+
if (data.value && data.value.length > 0) {
|
|
417
|
+
const timeseries = data.value[0].timeseries || [];
|
|
418
|
+
const datapoints = timeseries.flatMap((ts) => ts.data || []);
|
|
419
|
+
const totalValues = datapoints.map((d) => d.total).filter((v) => v !== null);
|
|
420
|
+
const avgValues = datapoints.map((d) => d.average).filter((v) => v !== null);
|
|
421
|
+
const maxValues = datapoints.map((d) => d.maximum).filter((v) => v !== null);
|
|
422
|
+
return {
|
|
423
|
+
total: totalValues.length > 0 ? totalValues.reduce((a, b) => a + b, 0) : 0,
|
|
424
|
+
average: avgValues.length > 0 ? avgValues.reduce((a, b) => a + b, 0) / avgValues.length : 0,
|
|
425
|
+
maximum: maxValues.length > 0 ? Math.max(...maxValues) : 0
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
return { total: 0, average: 0, maximum: 0 };
|
|
429
|
+
};
|
|
430
|
+
const readBytes = processDiskData(diskReadData);
|
|
431
|
+
const writeBytes = processDiskData(diskWriteData);
|
|
432
|
+
// Estimate IOPS (very rough - actual IOPS would need operations/sec metric)
|
|
433
|
+
const estimatedReadIOPS = readBytes.average > 0 ? readBytes.average / (4 * 1024) : 0; // Assuming 4KB blocks
|
|
434
|
+
const estimatedWriteIOPS = writeBytes.average > 0 ? writeBytes.average / (4 * 1024) : 0;
|
|
435
|
+
const diskAnalysis = analyzeMetricValue('disk', estimatedReadIOPS + estimatedWriteIOPS, 0);
|
|
436
|
+
result.metrics.disk = {
|
|
437
|
+
readBytes: {
|
|
438
|
+
total: parseFloat((readBytes.total / (1024 * 1024)).toFixed(2)),
|
|
439
|
+
average: parseFloat((readBytes.average / (1024 * 1024)).toFixed(2)),
|
|
440
|
+
maximum: parseFloat((readBytes.maximum / (1024 * 1024)).toFixed(2)),
|
|
441
|
+
unit: 'MB'
|
|
442
|
+
},
|
|
443
|
+
writeBytes: {
|
|
444
|
+
total: parseFloat((writeBytes.total / (1024 * 1024)).toFixed(2)),
|
|
445
|
+
average: parseFloat((writeBytes.average / (1024 * 1024)).toFixed(2)),
|
|
446
|
+
maximum: parseFloat((writeBytes.maximum / (1024 * 1024)).toFixed(2)),
|
|
447
|
+
unit: 'MB'
|
|
448
|
+
},
|
|
449
|
+
iops: {
|
|
450
|
+
read: parseFloat(estimatedReadIOPS.toFixed(0)),
|
|
451
|
+
write: parseFloat(estimatedWriteIOPS.toFixed(0))
|
|
452
|
+
},
|
|
453
|
+
status: diskAnalysis.status,
|
|
454
|
+
analysis: diskAnalysis.analysis
|
|
455
|
+
};
|
|
456
|
+
if (diskAnalysis.status !== 'normal') {
|
|
457
|
+
result.anomalies.push(diskAnalysis.analysis);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
catch (error) {
|
|
461
|
+
console.error(`Failed to fetch disk metrics: ${error}`);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
// Generate summary
|
|
465
|
+
if (result.anomalies.length > 0) {
|
|
466
|
+
result.summary = `⚠️ VM Performance Issues Detected: ${result.anomalies.length} anomal${result.anomalies.length === 1 ? 'y' : 'ies'} found. VM resources may have impacted test accuracy.`;
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
result.summary = `✅ VM Performance Normal: All metrics within acceptable ranges. VM had sufficient capacity for the test workload.`;
|
|
470
|
+
}
|
|
471
|
+
// Save complete results summary
|
|
472
|
+
const summaryData = {
|
|
473
|
+
timestamp: new Date().toISOString(),
|
|
474
|
+
resourceGroup,
|
|
475
|
+
vmName,
|
|
476
|
+
timeRange,
|
|
477
|
+
startTime: startTime || '',
|
|
478
|
+
endTime: endTime || '',
|
|
479
|
+
metrics: result.metrics,
|
|
480
|
+
anomalies: result.anomalies,
|
|
481
|
+
summary: result.summary,
|
|
482
|
+
calculationDetails: {
|
|
483
|
+
note: "Memory usage % = ((Total Memory Bytes - Available Memory Bytes) / Total Memory Bytes) * 100",
|
|
484
|
+
note2: "Raw Azure Monitor data is available in the individual metric files (cpu-raw.json, memory-raw.json, etc.)"
|
|
485
|
+
}
|
|
486
|
+
};
|
|
487
|
+
fs.writeFileSync(path.join(rawMetricsDir, 'summary.json'), JSON.stringify(summaryData, null, 2), 'utf-8');
|
|
488
|
+
console.error(`Raw VM metrics saved to: ${rawMetricsDir}`);
|
|
489
|
+
return result;
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
return {
|
|
493
|
+
success: false,
|
|
494
|
+
resourceGroup,
|
|
495
|
+
vmName: providedVmName || 'unknown',
|
|
496
|
+
timeRange,
|
|
497
|
+
startTime: '',
|
|
498
|
+
endTime: '',
|
|
499
|
+
metrics: {},
|
|
500
|
+
anomalies: [],
|
|
501
|
+
summary: '',
|
|
502
|
+
error: `Failed to fetch VM metrics: ${error.message || error}`
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
//# sourceMappingURL=vm-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vm-metrics.js","sourceRoot":"","sources":["../../../src/tools/cloud-executor/vm-metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JMX Generator - Generate JMeter scripts from Swagger/OpenAPI specifications using Azure OpenAI
|
|
3
|
+
*
|
|
4
|
+
* This module provides direct OpenAI integration for JMX generation, eliminating the need
|
|
5
|
+
* for the Flask backend API.
|
|
6
|
+
*/
|
|
7
|
+
interface GenerateJMXResult {
|
|
8
|
+
success: boolean;
|
|
9
|
+
jmx_script?: string;
|
|
10
|
+
error?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate JMeter JMX script from Swagger/OpenAPI specification
|
|
14
|
+
* @param swaggerContent Swagger/OpenAPI JSON object
|
|
15
|
+
* @param repoName Optional repository name for logging
|
|
16
|
+
* @returns Result object with success status and JMX script or error
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateJMX(swaggerContent: Record<string, any>, repoName?: string): Promise<GenerateJMXResult>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/jmx-generator/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAqG5B"}
|