blaze-performance-tester 3.1.24 → 3.1.25
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 +28 -76
- package/dist/index.win32-x64-msvc.node +0 -0
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -467,7 +467,7 @@ function processMetricsTelemetry(requests, durationSec) {
|
|
|
467
467
|
const avgTlsMs = mathUtils.mean(requests.map((r) => r.tlsTimeMs || 0));
|
|
468
468
|
const avgTtfbMs = avgDnsMs + avgTcpMs + avgTlsMs + avgLatencyMs * 0.3;
|
|
469
469
|
let c1xx = 0, c2xx = 0, c3xx = 0, c4xx = 0, c5xx = 0;
|
|
470
|
-
const codeCounts = { 400: 0, 401: 0, 403: 0, 404:
|
|
470
|
+
const codeCounts = { 400: 0, 401: 0, 403: 0, 404: 0, 429: 0, 500: 0, 502: 0, 503: 0, 504: 0 };
|
|
471
471
|
requests.forEach((r) => {
|
|
472
472
|
if (r.statusCode >= 100 && r.statusCode < 200) c1xx++;
|
|
473
473
|
else if (r.statusCode >= 200 && r.statusCode < 300) c2xx++;
|
|
@@ -550,7 +550,7 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
|
|
|
550
550
|
const totalLogCount = semanticReport.clusters.reduce((sum, c) => sum + c.count, 0);
|
|
551
551
|
const uniquePatternsCount = semanticReport.clusters.length;
|
|
552
552
|
logClustersHtml = `
|
|
553
|
-
<div class="card
|
|
553
|
+
<div class="card" style="margin-top: 2rem; background: #131c2e; border: 1px solid #1e293b;">
|
|
554
554
|
<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;">
|
|
555
555
|
\u{1F9E0} Semantic Log Clustering & Error Classification
|
|
556
556
|
</h3>
|
|
@@ -598,7 +598,7 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
|
|
|
598
598
|
const finalLatency = history[history.length - 1]?.avgLatency || cards.ttfb;
|
|
599
599
|
const seoMetrics = calculateSeoImpactMetrics(finalLatency);
|
|
600
600
|
seoImpactSectionHtml = `
|
|
601
|
-
<div class="card
|
|
601
|
+
<div class="card" style="margin-top: 2rem; background: #111a2e; border: 1px solid #1e3a8a;">
|
|
602
602
|
<h3 style="color: #f43f5e; display: flex; align-items: center; gap: 0.6rem; font-size: 1.2rem; border-bottom: 1px solid #1e293b; padding-bottom: 0.5rem;">
|
|
603
603
|
\u{1F50E} SEO Rank Impact & Visibility Loss Predictor
|
|
604
604
|
</h3>
|
|
@@ -621,7 +621,7 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
|
|
|
621
621
|
</div>`;
|
|
622
622
|
}
|
|
623
623
|
const liveAdjusterHtml = `
|
|
624
|
-
<div class="card
|
|
624
|
+
<div class="card" style="margin-top: 2rem; background: #131c2e; border: 1px solid #1e293b;">
|
|
625
625
|
<h3 style="color: #38bdf8; display: flex; align-items: center; gap: 0.5rem; font-size: 1.2rem; margin-bottom: 1rem;">
|
|
626
626
|
\u{1F39B}\uFE0F Live Concurrency Adjuster (Mid-Test Simulation)
|
|
627
627
|
</h3>
|
|
@@ -663,11 +663,6 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
|
|
|
663
663
|
h1 { color: #38bdf8; margin: 0; font-size: 2rem; }
|
|
664
664
|
.meta { color: #94a3b8; font-size: 0.9rem; margin-top: 0.5rem; }
|
|
665
665
|
|
|
666
|
-
/* Persona Controls Styling */
|
|
667
|
-
.persona-toggle-container { background: #131c2e; padding: 0.5rem 1rem; border-radius: 8px; border: 1px solid #1e293b; display: flex; align-items: center; gap: 0.75rem; }
|
|
668
|
-
.persona-btn { background: #090d16; border: 1px solid #1e293b; color: #94a3b8; padding: 0.4rem 1rem; font-size: 0.85rem; font-weight: 600; border-radius: 6px; cursor: pointer; transition: all 0.2s ease; }
|
|
669
|
-
.persona-btn.active { background: #38bdf8; border-color: #38bdf8; color: #0b111e; }
|
|
670
|
-
|
|
671
666
|
.cards-wrapper { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; margin-bottom: 1.5rem; }
|
|
672
667
|
.metric-card { background: #131c2e; border: 1px solid #1e293b; border-radius: 6px; padding: 1.25rem; position: relative; }
|
|
673
668
|
.card-title { font-size: 0.75rem; font-weight: 700; color: #64748b; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.5rem; }
|
|
@@ -720,59 +715,51 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
|
|
|
720
715
|
<h1>\u{1F525} Blaze Core Performance Analysis</h1>
|
|
721
716
|
<div class="meta">Target Script: <code>${config.targetScript}</code></div>
|
|
722
717
|
</div>
|
|
723
|
-
|
|
724
|
-
<!-- Persona View Switcher Selector Elements -->
|
|
725
|
-
<div class="persona-toggle-container">
|
|
726
|
-
<span style="font-size: 0.8rem; color: #64748b; font-weight: bold; text-transform: uppercase;">View Perspective:</span>
|
|
727
|
-
<button class="persona-btn active" onclick="switchPersona('developer', this)">Developer</button>
|
|
728
|
-
<button class="persona-btn" onclick="switchPersona('devops', this)">DevOps</button>
|
|
729
|
-
<button class="persona-btn" onclick="switchPersona('executive', this)">Executive</button>
|
|
730
|
-
</div>
|
|
731
718
|
</div>
|
|
732
719
|
|
|
733
720
|
<div class="cards-wrapper">
|
|
734
|
-
<div class="metric-card
|
|
721
|
+
<div class="metric-card">
|
|
735
722
|
<div class="card-title">Apdex Score (T: 50ms)</div>
|
|
736
723
|
<div class="card-value green">${cards.apdex.toFixed(2)}<span class="card-subtext">(Good)</span></div>
|
|
737
724
|
</div>
|
|
738
|
-
<div class="metric-card
|
|
725
|
+
<div class="metric-card">
|
|
739
726
|
<div class="card-title">Throughput</div>
|
|
740
727
|
<div class="card-value orange">${cards.throughput.toFixed(1)}<span class="unit">/s</span></div>
|
|
741
728
|
</div>
|
|
742
|
-
<div class="metric-card
|
|
729
|
+
<div class="metric-card">
|
|
743
730
|
<div class="card-title">Network Bandwidth</div>
|
|
744
731
|
<div class="card-value purple">${cards.bandwidth.toFixed(2)}<span class="unit">MB/s</span></div>
|
|
745
732
|
</div>
|
|
746
|
-
<div class="metric-card
|
|
733
|
+
<div class="metric-card">
|
|
747
734
|
<div class="card-title">Avg Time To First Byte</div>
|
|
748
735
|
<div class="card-value">${cards.ttfb.toFixed(1)}<span class="unit">ms</span></div>
|
|
749
736
|
</div>
|
|
750
|
-
<div class="metric-card
|
|
737
|
+
<div class="metric-card">
|
|
751
738
|
<div class="card-title">DNS Lookup</div>
|
|
752
739
|
<div class="card-value">${cards.dns.toFixed(2)}<span class="unit">ms</span></div>
|
|
753
740
|
</div>
|
|
754
|
-
<div class="metric-card
|
|
741
|
+
<div class="metric-card">
|
|
755
742
|
<div class="card-title">TCP Connect</div>
|
|
756
743
|
<div class="card-value">${cards.tcp.toFixed(2)}<span class="unit">ms</span></div>
|
|
757
744
|
</div>
|
|
758
|
-
<div class="metric-card
|
|
745
|
+
<div class="metric-card">
|
|
759
746
|
<div class="card-title">TLS Handshake</div>
|
|
760
747
|
<div class="card-value">${cards.tls.toFixed(2)}<span class="unit">ms</span></div>
|
|
761
748
|
</div>
|
|
762
|
-
<div class="metric-card
|
|
749
|
+
<div class="metric-card">
|
|
763
750
|
<div class="card-title">Stability (Std Dev)</div>
|
|
764
751
|
<div class="card-value">±${cards.stdDev.toFixed(1)}<span class="unit">ms</span></div>
|
|
765
752
|
</div>
|
|
766
753
|
</div>
|
|
767
754
|
|
|
768
755
|
<div class="top-layout-grid">
|
|
769
|
-
<div class="verdict-box
|
|
756
|
+
<div class="verdict-box">
|
|
770
757
|
<div class="verdict-title">\u{1F916} AI Stress-Testing Agent Verdict</div>
|
|
771
758
|
<div class="verdict-text">${verdictReason}</div>
|
|
772
759
|
<div class="verdict-waves">${waveListItems}</div>
|
|
773
760
|
</div>
|
|
774
761
|
|
|
775
|
-
<div class="gauge-container-box
|
|
762
|
+
<div class="gauge-container-box">
|
|
776
763
|
<div class="gauge-title">Blaze Run Health Score</div>
|
|
777
764
|
<div style="position: relative; width: 140px; height: 140px; display: flex; align-items: center; justify-content: center;">
|
|
778
765
|
<svg width="140" height="140" viewBox="0 0 140 140" style="transform: rotate(-90deg);">
|
|
@@ -788,7 +775,7 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
|
|
|
788
775
|
</div>
|
|
789
776
|
</div>
|
|
790
777
|
|
|
791
|
-
<div class="matrix-box
|
|
778
|
+
<div class="matrix-box">
|
|
792
779
|
<div>
|
|
793
780
|
<div class="matrix-title">\u{1F4CB} HTTP Response Matrix</div>
|
|
794
781
|
<div class="matrix-row">
|
|
@@ -817,28 +804,28 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
|
|
|
817
804
|
</div>
|
|
818
805
|
|
|
819
806
|
<div class="charts-grid">
|
|
820
|
-
<div class="graph-card
|
|
807
|
+
<div class="graph-card">
|
|
821
808
|
<div class="graph-title">\u{1F4CA} Throughput Velocity & Workload Volume</div>
|
|
822
809
|
<div style="height: 280px; position: relative;">
|
|
823
810
|
<canvas id="volumeChart"></canvas>
|
|
824
811
|
</div>
|
|
825
812
|
</div>
|
|
826
813
|
|
|
827
|
-
<div class="graph-card
|
|
814
|
+
<div class="graph-card">
|
|
828
815
|
<div class="graph-title">\u{1F504} Active Concurrency (VUs) vs. TTF Trend</div>
|
|
829
816
|
<div style="height: 280px; position: relative;">
|
|
830
817
|
<canvas id="concurrencyChart"></canvas>
|
|
831
818
|
</div>
|
|
832
819
|
</div>
|
|
833
820
|
|
|
834
|
-
<div class="graph-card
|
|
821
|
+
<div class="graph-card">
|
|
835
822
|
<div class="graph-title">\u{1F369} HTTP Status Code Proportions</div>
|
|
836
823
|
<div style="height: 280px; position: relative;">
|
|
837
824
|
<canvas id="statusDonutChart"></canvas>
|
|
838
825
|
</div>
|
|
839
826
|
</div>
|
|
840
827
|
|
|
841
|
-
<div class="graph-card
|
|
828
|
+
<div class="graph-card">
|
|
842
829
|
<div class="graph-title">\u{1F4C8} Time-to-First-Byte Scatter Plot</div>
|
|
843
830
|
<div style="height: 280px; position: relative;">
|
|
844
831
|
<canvas id="ttfbScatterChart"></canvas>
|
|
@@ -846,7 +833,7 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
|
|
|
846
833
|
</div>
|
|
847
834
|
</div>
|
|
848
835
|
|
|
849
|
-
<div class="card
|
|
836
|
+
<div class="card">
|
|
850
837
|
<h3>Telemetry Matrix Logs</h3>
|
|
851
838
|
<table>
|
|
852
839
|
<thead>
|
|
@@ -894,39 +881,8 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
|
|
|
894
881
|
simThroughput.textContent = (baseThroughput * Math.min(factor, 2.5)).toFixed(0) + '/s';
|
|
895
882
|
});
|
|
896
883
|
}
|
|
897
|
-
|
|
898
|
-
// Global register tracking charts for explicit redraw logic execution
|
|
899
|
-
const activeCharts = [];
|
|
900
|
-
|
|
901
|
-
function switchPersona(persona, targetBtn) {
|
|
902
|
-
if (targetBtn) {
|
|
903
|
-
document.querySelectorAll('.persona-btn').forEach(btn => btn.classList.remove('active'));
|
|
904
|
-
targetBtn.classList.add('active');
|
|
905
|
-
}
|
|
906
|
-
|
|
907
|
-
// Hide all dynamic viewport configurations
|
|
908
|
-
const layouts = ['.p-dev', '.p-devops', '.p-exec'];
|
|
909
|
-
layouts.forEach(selector => {
|
|
910
|
-
document.querySelectorAll(selector).forEach(el => el.style.display = 'none');
|
|
911
|
-
});
|
|
912
|
-
|
|
913
|
-
// Target current selector views for block visibility execution
|
|
914
|
-
document.querySelectorAll('.p-' + persona).forEach(el => {
|
|
915
|
-
if (el.tagName === 'TR') el.style.display = 'table-row';
|
|
916
|
-
else if (el.classList.contains('metric-card')) el.style.display = 'block';
|
|
917
|
-
else el.style.display = '';
|
|
918
|
-
});
|
|
919
|
-
|
|
920
|
-
// AUTO-REFRESH IMPLEMENTATION: Triggers sizing layout re-calculations on unhidden canvases
|
|
921
|
-
activeCharts.forEach(chart => {
|
|
922
|
-
if (chart) {
|
|
923
|
-
chart.resize();
|
|
924
|
-
chart.update('active');
|
|
925
|
-
}
|
|
926
|
-
});
|
|
927
|
-
}
|
|
928
884
|
|
|
929
|
-
|
|
885
|
+
new Chart(document.getElementById('volumeChart'), {
|
|
930
886
|
type: 'bar',
|
|
931
887
|
data: {
|
|
932
888
|
labels: labels,
|
|
@@ -936,9 +892,9 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
|
|
|
936
892
|
]
|
|
937
893
|
},
|
|
938
894
|
options: { responsive: true, maintainAspectRatio: false, scales: { x: { grid: { color: '#1e293b' } }, y: { stacked: true, grid: { color: '#1e293b' } } } }
|
|
939
|
-
})
|
|
895
|
+
});
|
|
940
896
|
|
|
941
|
-
|
|
897
|
+
new Chart(document.getElementById('concurrencyChart'), {
|
|
942
898
|
type: 'line',
|
|
943
899
|
data: {
|
|
944
900
|
labels: labels,
|
|
@@ -948,26 +904,22 @@ function exportHtmlDashboard(history, config, verdictReason, semanticReport, res
|
|
|
948
904
|
]
|
|
949
905
|
},
|
|
950
906
|
options: { responsive: true, maintainAspectRatio: false }
|
|
951
|
-
})
|
|
907
|
+
});
|
|
952
908
|
|
|
953
|
-
|
|
909
|
+
new Chart(document.getElementById('statusDonutChart'), {
|
|
954
910
|
type: 'doughnut',
|
|
955
911
|
data: {
|
|
956
912
|
labels: ['Success', 'Client Err', 'Server Err'],
|
|
957
913
|
datasets: [{ data: [${responseMatrix.total2xx}, ${responseMatrix.total4xx}, ${responseMatrix.total5xx}], backgroundColor: ['#4ade80', '#fde047', '#f87171'] }]
|
|
958
914
|
},
|
|
959
915
|
options: { responsive: true, maintainAspectRatio: false }
|
|
960
|
-
})
|
|
916
|
+
});
|
|
961
917
|
|
|
962
|
-
|
|
918
|
+
new Chart(document.getElementById('ttfbScatterChart'), {
|
|
963
919
|
type: 'scatter',
|
|
964
920
|
data: { datasets: [{ label: 'Processing Delay', data: ${JSON.stringify(scatterPoints)}, backgroundColor: '#a855f7' }] },
|
|
965
921
|
options: { responsive: true, maintainAspectRatio: false }
|
|
966
|
-
})
|
|
967
|
-
|
|
968
|
-
// Bootstrapped configuration state defaults dashboard load view to Developer
|
|
969
|
-
document.querySelectorAll('.p-devops, .p-exec').forEach(el => el.style.display = 'none');
|
|
970
|
-
document.querySelectorAll('.p-dev').forEach(el => el.style.display = '');
|
|
922
|
+
});
|
|
971
923
|
</script></body></html>`;
|
|
972
924
|
try {
|
|
973
925
|
fs.writeFileSync(config.outputHtml, htmlContent, "utf-8");
|
|
Binary file
|