@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.
Files changed (45) hide show
  1. package/README.md +400 -25
  2. package/dist/index.d.ts +14 -4
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +783 -47
  5. package/dist/index.js.map +1 -1
  6. package/dist/prompts/jmx_prompt.txt +262 -0
  7. package/dist/prompts/prompts/jmx_prompt.txt +262 -0
  8. package/dist/tools/azure-infra/config-parser.d.ts +14 -0
  9. package/dist/tools/azure-infra/config-parser.d.ts.map +1 -0
  10. package/dist/tools/azure-infra/config-parser.js +361 -0
  11. package/dist/tools/azure-infra/config-parser.js.map +1 -0
  12. package/dist/tools/azure-infra/index.d.ts +52 -0
  13. package/dist/tools/azure-infra/index.d.ts.map +1 -0
  14. package/dist/tools/azure-infra/index.js +448 -0
  15. package/dist/tools/azure-infra/index.js.map +1 -0
  16. package/dist/tools/azure-infra/terraform-generator.d.ts +19 -0
  17. package/dist/tools/azure-infra/terraform-generator.d.ts.map +1 -0
  18. package/dist/tools/azure-infra/terraform-generator.js +458 -0
  19. package/dist/tools/azure-infra/terraform-generator.js.map +1 -0
  20. package/dist/tools/azure-infra/types.d.ts +123 -0
  21. package/dist/tools/azure-infra/types.d.ts.map +1 -0
  22. package/dist/tools/azure-infra/types.js +95 -0
  23. package/dist/tools/azure-infra/types.js.map +1 -0
  24. package/dist/tools/cloud-executor/index.d.ts +78 -0
  25. package/dist/tools/cloud-executor/index.d.ts.map +1 -0
  26. package/dist/tools/cloud-executor/index.js +528 -0
  27. package/dist/tools/cloud-executor/index.js.map +1 -0
  28. package/dist/tools/cloud-executor/result-analyzer.d.ts +65 -0
  29. package/dist/tools/cloud-executor/result-analyzer.d.ts.map +1 -0
  30. package/dist/tools/cloud-executor/result-analyzer.js +367 -0
  31. package/dist/tools/cloud-executor/result-analyzer.js.map +1 -0
  32. package/dist/tools/cloud-executor/vm-metrics.d.ts +87 -0
  33. package/dist/tools/cloud-executor/vm-metrics.d.ts.map +1 -0
  34. package/dist/tools/cloud-executor/vm-metrics.js +506 -0
  35. package/dist/tools/cloud-executor/vm-metrics.js.map +1 -0
  36. package/dist/tools/jmx-generator/index.d.ts +20 -0
  37. package/dist/tools/jmx-generator/index.d.ts.map +1 -0
  38. package/dist/tools/jmx-generator/index.js +115 -0
  39. package/dist/tools/jmx-generator/index.js.map +1 -0
  40. package/dist/tools/jmx-generator/sanitizer.d.ts +19 -0
  41. package/dist/tools/jmx-generator/sanitizer.d.ts.map +1 -0
  42. package/dist/tools/jmx-generator/sanitizer.js +166 -0
  43. package/dist/tools/jmx-generator/sanitizer.js.map +1 -0
  44. package/package.json +5 -2
  45. 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"}