blaze-performance-tester 3.0.21 → 3.0.23

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/dist/cli.js CHANGED
@@ -401,30 +401,50 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
401
401
  }).join("");
402
402
  let logClustersHtml = "";
403
403
  if (semanticReport) {
404
+ const totalLogCount = semanticReport.clusters.reduce((sum, c) => sum + c.count, 0);
405
+ const uniquePatternsCount = semanticReport.clusters.length;
404
406
  logClustersHtml = `
405
- <div class="card" style="margin-top: 2rem;">
406
- <h3>\u{1F9E0} Semantic Log Clustering & Error Classification</h3>
407
- <table>
407
+ <div class="card" style="margin-top: 2rem; background: #131c2e; border: 1px solid #1e293b;">
408
+ <h3 style="border-bottom: none; padding-bottom: 0rem; margin-bottom: 0.25rem; display: flex; align-items: center; gap: 0.5rem; color: #ffffff; font-size: 1.2rem;">
409
+ \u{1F9E0} Semantic Log Clustering & Error Classification
410
+ </h3>
411
+ <div style="color: #94a3b8; font-size: 0.9rem; margin-bottom: 1.5rem;">
412
+ Captured <strong style="color: #f8fafc;">${totalLogCount}</strong> raw failures grouped into <strong style="color: #f8fafc;">${uniquePatternsCount}</strong> unique structural patterns.
413
+ </div>
414
+
415
+ <table style="width: 100%; border-collapse: collapse;">
408
416
  <thead>
409
- <tr>
410
- <th style="width: 10%;">Count</th>
411
- <th style="width: 25%;">Classification Category</th>
412
- <th style="width: 10%;">Severity</th>
413
- <th style="width: 55%;">Structural Abstract Blueprint</th>
417
+ <tr style="border-bottom: 1px solid #1e293b;">
418
+ <th style="width: 8%; padding: 0.75rem; text-align: left; color: #64748b; font-size: 0.85rem; font-weight: bold; text-transform: none;">Count</th>
419
+ <th style="width: 22%; padding: 0.75rem; text-align: left; color: #64748b; font-size: 0.85rem; font-weight: bold; text-transform: none;">Classification Category</th>
420
+ <th style="width: 10%; padding: 0.75rem; text-align: left; color: #64748b; font-size: 0.85rem; font-weight: bold; text-transform: none;">Severity</th>
421
+ <th style="width: 60%; padding: 0.75rem; text-align: left; color: #64748b; font-size: 0.85rem; font-weight: bold; text-transform: none;">Structural Abstract Blueprint / Dynamic Log Fingerprint</th>
414
422
  </tr>
415
423
  </thead>
416
424
  <tbody>
417
425
  ${semanticReport.clusters.map((c) => {
418
- let catColor = "#f87171";
419
- if (c.category === "Environment_Infrastructure_Error") catColor = "#fb923c";
426
+ let catColor = "#fb923c";
420
427
  if (c.category === "Authentication_Error") catColor = "#c084fc";
421
- let sevColor = c.severity === "CRITICAL" ? "#dc2626" : "#eab308";
428
+ if (c.category === "Product_Error") catColor = "#f87171";
429
+ if (c.category === "Environment_Infrastructure_Error") catColor = "#fb923c";
430
+ let sevBg = c.severity === "CRITICAL" ? "#dc2626" : "#ea580c";
431
+ const rawTemplate = c.template || "";
432
+ const cleanedTemplate = rawTemplate.replace(/\[\d{4}-\d{2}-\d{2}.*?\]\s*/, "");
422
433
  return `
423
- <tr>
424
- <td><span style="font-size: 1.1rem; font-weight: bold; color: #f8fafc;">${c.count}</span></td>
425
- <td><span style="color: ${catColor}; font-weight: 600;">${c.category}</span></td>
426
- <td><span style="background: ${sevColor}; color: #fff; padding: 0.15rem 0.4rem; border-radius:3px; font-size:0.75rem; font-weight:bold;">${c.severity}</span></td>
427
- <td><code style="color: #cbd5e1; background: #0f172a; padding: 0.3rem 0.5rem; display: block; border-radius: 4px; font-size: 0.85rem;">${c.template}</code></td>
434
+ <tr style="border-bottom: 1px solid #1e293b; vertical-align: top;">
435
+ <td style="padding: 1.25rem 0.75rem; font-size: 1.2rem; font-weight: bold; color: #f8fafc;">${c.count}</td>
436
+ <td style="padding: 1.25rem 0.75rem; color: ${catColor}; font-weight: 600; font-size: 0.95rem;">${c.category}</td>
437
+ <td style="padding: 1.25rem 0.75rem;">
438
+ <span style="background: ${sevBg}; color: #ffffff; padding: 0.2rem 0.5rem; border-radius: 4px; font-size: 0.7rem; font-weight: bold; letter-spacing: 0.05em;">${c.severity}</span>
439
+ </td>
440
+ <td style="padding: 1.25rem 0.75rem;">
441
+ <div style="background: #090d16; border-radius: 4px; padding: 0.6rem 0.8rem; border-left: 3px solid #1e293b; margin-bottom: 0.5rem;">
442
+ <code style="color: #cbd5e1; font-family: monospace; font-size: 0.9rem; white-space: pre-wrap; word-break: break-all;">${cleanedTemplate}</code>
443
+ </div>
444
+ <div style="color: #64748b; font-size: 0.8rem; font-family: monospace; padding-left: 0.2rem; line-height: 1.4;">
445
+ <span style="color: #475569;">Real Example Trace:</span> ${rawTemplate}
446
+ </div>
447
+ </td>
428
448
  </tr>`;
429
449
  }).join("")}
430
450
  </tbody>
@@ -442,7 +462,6 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
442
462
  h1 { color: #38bdf8; margin: 0; font-size: 2rem; }
443
463
  .meta { color: #94a3b8; font-size: 0.9rem; margin-top: 0.5rem; }
444
464
 
445
- /* \u{1F3B4} CARDS DASHBOARD GRID SYSTEM */
446
465
  .cards-wrapper { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; margin-bottom: 1.5rem; }
447
466
  .metric-card { background: #131c2e; border: 1px solid #1e293b; border-radius: 6px; padding: 1.25rem; position: relative; }
448
467
  .card-title { font-size: 0.75rem; font-weight: 700; color: #64748b; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.5rem; }
@@ -472,8 +491,10 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
472
491
  .badge-5xx { background: rgba(220, 38, 38, 0.2); color: #f87171; }
473
492
  .matrix-value { font-size: 1rem; font-weight: bold; color: #ffffff; }
474
493
 
475
- .graph-card { background: #131c2e; border: 1px solid #1e293b; border-radius: 8px; padding: 1.5rem; margin-bottom: 2rem; }
476
- .graph-title { font-size: 1.15rem; font-weight: 700; color: #ffffff; margin-bottom: 1.2rem; display: flex; align-items: center; gap: 0.5rem; }
494
+ /* \u{1F4CA} TWO-COLUMN CHART GRID */
495
+ .charts-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; margin-bottom: 2rem; }
496
+ .graph-card { background: #131c2e; border: 1px solid #1e293b; border-radius: 8px; padding: 1.5rem; }
497
+ .graph-title { font-size: 1.1rem; font-weight: 700; color: #ffffff; margin-bottom: 1.2rem; display: flex; align-items: center; gap: 0.5rem; }
477
498
 
478
499
  .card { background: #131c2e; border: 1px solid #1e293b; border-radius: 8px; padding: 1.5rem; }
479
500
  h3 { margin-top: 0; color: #cbd5e1; border-bottom: 1px solid #1e293b; padding-bottom: 0.5rem; }
@@ -490,7 +511,6 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
490
511
  <div class="meta">Target Script: <code>${config.targetScript}</code></div>
491
512
  </div>
492
513
 
493
- <!-- \u{1F3B4} METRICS CARDS GRID PANEL -->
494
514
  <div class="cards-wrapper">
495
515
  <div class="metric-card">
496
516
  <div class="card-title">Apdex Score (T: 50ms)</div>
@@ -554,11 +574,22 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
554
574
  </div>
555
575
  </div>
556
576
 
557
- <!-- \u{1F4C9} CORRELATION STREAM GRAPH CHART -->
558
- <div class="graph-card">
559
- <div class="graph-title">\u{1F504} Throughput, TTF Trend & Active Threads Concurrency Correlation</div>
560
- <div style="height: 320px; position: relative;">
561
- <canvas id="correlationChart"></canvas>
577
+ <!-- \u{1F4C9} SPLIT CHARTS SYSTEM -->
578
+ <div class="charts-grid">
579
+ <!-- Chart 1: Volume Streams -->
580
+ <div class="graph-card">
581
+ <div class="graph-title">\u{1F4CA} Throughput Velocity & Workload Volume</div>
582
+ <div style="height: 280px; position: relative;">
583
+ <canvas id="volumeChart"></canvas>
584
+ </div>
585
+ </div>
586
+
587
+ <!-- Chart 2: Concurrency & Health Trends -->
588
+ <div class="graph-card">
589
+ <div class="graph-title">\u{1F504} Active Concurrency (VUs) vs. Time-to-Failure (TTF) Trend</div>
590
+ <div style="height: 280px; position: relative;">
591
+ <canvas id="concurrencyChart"></canvas>
592
+ </div>
562
593
  </div>
563
594
  </div>
564
595
 
@@ -595,7 +626,9 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
595
626
 
596
627
  <script>
597
628
  const labels = ${JSON.stringify(labels)};
598
- new Chart(document.getElementById('correlationChart'), {
629
+
630
+ // \u{1F6E0}\uFE0F Chart 1 Setup: Throughput Bar Streams
631
+ new Chart(document.getElementById('volumeChart'), {
599
632
  type: 'bar',
600
633
  data: {
601
634
  labels: labels,
@@ -615,25 +648,45 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
615
648
  stack: 'requests',
616
649
  barPercentage: 0.95,
617
650
  categoryPercentage: 0.95
618
- },
651
+ }
652
+ ]
653
+ },
654
+ options: {
655
+ responsive: true,
656
+ maintainAspectRatio: false,
657
+ plugins: {
658
+ legend: { position: 'top', labels: { color: '#94a3b8', font: { size: 11 } } }
659
+ },
660
+ scales: {
661
+ x: { grid: { color: '#1e293b' }, ticks: { color: '#64748b' } },
662
+ y: { stacked: true, grid: { color: '#1e293b' }, ticks: { color: '#64748b' } }
663
+ }
664
+ }
665
+ });
666
+
667
+ // \u{1F6E0}\uFE0F Chart 2 Setup: Concurrency & TTF Correlated Slopes
668
+ new Chart(document.getElementById('concurrencyChart'), {
669
+ type: 'line',
670
+ data: {
671
+ labels: labels,
672
+ datasets: [
619
673
  {
620
674
  label: 'Active VU Threads',
621
675
  data: ${JSON.stringify(activeThreadsData)},
622
- type: 'line',
623
676
  borderColor: '#38bdf8',
624
- borderWidth: 2,
625
- pointRadius: 3,
626
- fill: false,
677
+ backgroundColor: 'rgba(56, 189, 248, 0.1)',
678
+ borderWidth: 2.5,
679
+ pointRadius: 4,
680
+ fill: true,
627
681
  yAxisID: 'yThreads'
628
682
  },
629
683
  {
630
684
  label: 'Time-to-Failure (TTF) Trend',
631
685
  data: ${JSON.stringify(ttfTrendData)},
632
- type: 'line',
633
686
  borderColor: '#f43f5e',
634
- borderWidth: 1.5,
635
- borderDash: [4, 4],
636
- pointRadius: 0,
687
+ borderWidth: 2,
688
+ borderDash: [5, 5],
689
+ pointRadius: 3,
637
690
  fill: false,
638
691
  yAxisID: 'yTtf'
639
692
  }
@@ -643,16 +696,12 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
643
696
  responsive: true,
644
697
  maintainAspectRatio: false,
645
698
  plugins: {
646
- legend: {
647
- position: 'top',
648
- labels: { color: '#94a3b8', boxWidth: 12, font: { size: 11 } }
649
- }
699
+ legend: { position: 'top', labels: { color: '#94a3b8', font: { size: 11 } } }
650
700
  },
651
701
  scales: {
652
702
  x: { grid: { color: '#1e293b' }, ticks: { color: '#64748b' } },
653
- y: { stacked: true, grid: { color: '#1e293b' }, ticks: { color: '#64748b' }, title: { display: true, text: 'Requests Volume', color: '#64748b' } },
654
- yThreads: { position: 'right', display: true, grid: { drawOnChartArea: false }, ticks: { color: '#38bdf8' }, title: { display: true, text: 'Active Threads', color: '#38bdf8' } },
655
- yTtf: { position: 'right', display: false, grid: { drawOnChartArea: false } }
703
+ yThreads: { position: 'left', grid: { color: '#1e293b' }, ticks: { color: '#38bdf8' }, title: { display: true, text: 'VUs / Threads', color: '#38bdf8' } },
704
+ yTtf: { position: 'right', grid: { drawOnChartArea: false }, ticks: { color: '#f43f5e' }, title: { display: true, text: 'TTF Index / Latency ms', color: '#f43f5e' } }
656
705
  }
657
706
  }
658
707
  });
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blaze-performance-tester",
3
- "version": "3.0.21",
3
+ "version": "3.0.23",
4
4
  "description": "A high-performance, multi-threaded load testing engine built with Rust and QuickJS.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",