2026-05-17 19:36:46 +07:00

278 lines
9.0 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>WalkGuide — k6 Load Test Report</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Segoe UI', system-ui, sans-serif; background: #0f172a; color: #e2e8f0; padding: 24px; }
h1 { font-size: 2rem; color: #38bdf8; margin-bottom: 4px; }
h2 { font-size: 1.2rem; color: #7dd3fc; margin: 32px 0 12px; border-bottom: 1px solid #1e3a5f; padding-bottom: 6px; }
p { color: #94a3b8; margin-bottom: 8px; }
.header { margin-bottom: 32px; }
.header .meta { color: #64748b; font-size: 0.85rem; margin-top: 4px; }
/* Key Metrics Grid */
.key-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 16px; margin-bottom: 24px; }
.key-card { background: #1e293b; border-radius: 10px; padding: 18px; border: 1px solid #334155; }
.key-card .klabel { font-size: 0.75rem; color: #64748b; text-transform: uppercase; letter-spacing: 0.05em; }
.key-card .kvalue { font-size: 1.5rem; font-weight: 700; color: #f0f9ff; margin: 6px 0 2px; }
.key-card .kdesc { font-size: 0.72rem; color: #475569; }
/* WalkGuide Metric Cards */
.wg-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 12px; }
.metric-card { background: #1e293b; border-radius: 8px; padding: 14px; border: 1px solid #1e3a5f; text-align: center; }
.metric-label { font-size: 0.85rem; color: #94a3b8; margin-bottom: 6px; }
.metric-p95 { font-size: 1.6rem; font-weight: 700; color: #38bdf8; }
.metric-sub { font-size: 0.7rem; color: #475569; margin-top: 2px; }
.metric-avg { font-size: 0.72rem; color: #64748b; margin-top: 4px; }
/* Tables */
table { width: 100%; border-collapse: collapse; margin-bottom: 24px; font-size: 0.88rem; }
th { background: #1e3a5f; color: #7dd3fc; text-align: left; padding: 10px 12px; }
td { padding: 9px 12px; border-bottom: 1px solid #1e293b; color: #cbd5e1; }
tr:nth-child(even) td { background: #0f1f35; }
code { background: #1e293b; padding: 2px 6px; border-radius: 4px; font-size: 0.82rem; color: #38bdf8; }
/* Badges */
.badge { padding: 3px 10px; border-radius: 12px; font-size: 0.78rem; font-weight: 600; }
.badge.pass { background: #064e3b; color: #34d399; }
.badge.fail { background: #450a0a; color: #f87171; }
.badge.skip { background: #1e293b; color: #94a3b8; }
footer { margin-top: 40px; text-align: center; color: #334155; font-size: 0.78rem; }
</style>
</head>
<body>
<div class="header">
<h1>🦺 WalkGuide — k6 Load Test Report</h1>
<p>Spring Boot Backend Performance Benchmark — Pillar 3</p>
<div class="meta">
Generated: 2026-05-17T12:00:40.918Z |
Input: auth-flow-local.ndjson |
Total Data Points: 25767
</div>
</div>
<h2>📊 Key Metrics (Pillar 3 — 5 Required)</h2>
<div class="key-grid">
<div class="key-card">
<div class="klabel">1. Throughput</div>
<div class="kvalue">7.6 req/s</div>
<div class="kdesc">Requests per second</div>
</div>
<div class="key-card">
<div class="klabel">2. p95 Latency</div>
<div class="kvalue">4337.39 ms</div>
<div class="kdesc">95th percentile response time</div>
</div>
<div class="key-card">
<div class="klabel">3. Error Rate</div>
<div class="kvalue">91.00%</div>
<div class="kdesc">Non-2xx responses | FAIL</div>
</div>
<div class="key-card">
<div class="klabel">4. DB Query Time</div>
<div class="kvalue">N/A</div>
<div class="kdesc">Estimated via write endpoint p95</div>
</div>
<div class="key-card">
<div class="klabel">5. JVM Heap</div>
<div class="kvalue">N/A</div>
<div class="kdesc">Spring Actuator jvm.memory.used</div>
</div>
</div>
<h2>🏃 WalkGuide Endpoint Latency Breakdown</h2>
<div class="wg-grid">
<div class="metric-card">
<div class="metric-label">🔐 Auth</div>
<div class="metric-p95">4337.39 ms</div>
<div class="metric-sub">p95 | threshold < 800ms</div>
<div class="metric-avg">avg: 1561.80 ms | p99: 14100.70 ms</div>
</div>
<div class="metric-card">
<div class="metric-label">📍 Location</div>
<div class="metric-p95">N/A</div>
<div class="metric-sub">p95 | threshold < 300ms</div>
<div class="metric-avg">avg: N/A | p99: N/A</div>
</div>
<div class="metric-card">
<div class="metric-label">🚧 Obstacle</div>
<div class="metric-p95">N/A</div>
<div class="metric-sub">p95 | threshold < 400ms</div>
<div class="metric-avg">avg: N/A | p99: N/A</div>
</div>
<div class="metric-card">
<div class="metric-label">🚨 SOS</div>
<div class="metric-p95">N/A</div>
<div class="metric-sub">p95 | threshold < 200ms</div>
<div class="metric-avg">avg: N/A | p99: N/A</div>
</div>
<div class="metric-card">
<div class="metric-label">📬 Notif</div>
<div class="metric-p95">N/A</div>
<div class="metric-sub">p95 | threshold < 500ms</div>
<div class="metric-avg">avg: N/A | p99: N/A</div>
</div>
<div class="metric-card">
<div class="metric-label">📊 Timeline</div>
<div class="metric-p95">N/A</div>
<div class="metric-sub">p95 | threshold < 1000ms</div>
<div class="metric-avg">avg: N/A | p99: N/A</div>
</div>
<div class="metric-card">
<div class="metric-label">🔗 Pairing</div>
<div class="metric-p95">N/A</div>
<div class="metric-sub">p95 | threshold < 600ms</div>
<div class="metric-avg">avg: N/A | p99: N/A</div>
</div>
</div>
<h2>✅ Threshold Evaluation</h2>
<table>
<thead>
<tr><th>Check</th><th>Metric</th><th>Threshold</th><th>Actual</th><th>Result</th></tr>
</thead>
<tbody>
<tr>
<td>p95 overall < 500ms</td>
<td><code>http_req_duration</code></td>
<td>500 ms</td>
<td>4337.39 ms</td>
<td><span class="badge fail">❌ FAIL</span></td>
</tr>
<tr>
<td>error rate < 1%</td>
<td><code>http_req_failed</code></td>
<td>0.01 rate</td>
<td>0.91 rate</td>
<td><span class="badge fail">❌ FAIL</span></td>
</tr>
<tr>
<td>SOS p95 < 200ms</td>
<td><code>walkguide_sos_latency_ms</code></td>
<td>200</td>
<td>N/A</td>
<td><span class="badge skip">SKIP</span></td>
</tr>
<tr>
<td>Location p95 < 300ms</td>
<td><code>walkguide_location_latency_ms</code></td>
<td>300</td>
<td>N/A</td>
<td><span class="badge skip">SKIP</span></td>
</tr>
<tr>
<td>Obstacle p95 < 400ms</td>
<td><code>walkguide_obstacle_latency_ms</code></td>
<td>400</td>
<td>N/A</td>
<td><span class="badge skip">SKIP</span></td>
</tr>
<tr>
<td>Auth p95 < 800ms</td>
<td><code>walkguide_auth_latency_ms</code></td>
<td>800 ms</td>
<td>4337.39 ms</td>
<td><span class="badge fail">❌ FAIL</span></td>
</tr>
<tr>
<td>Timeline p95 < 1000ms</td>
<td><code>walkguide_timeline_latency_ms</code></td>
<td>1000</td>
<td>N/A</td>
<td><span class="badge skip">SKIP</span></td>
</tr>
<tr>
<td>Notification p95 < 500ms</td>
<td><code>walkguide_notif_latency_ms</code></td>
<td>500</td>
<td>N/A</td>
<td><span class="badge skip">SKIP</span></td>
</tr>
</tbody>
</table>
<h2>📋 Per-Endpoint Latency (ms)</h2>
<table>
<thead>
<tr><th>Endpoint</th><th>Requests</th><th>Avg</th><th>p95</th><th>p99</th><th>Max</th></tr>
</thead>
<tbody>
<tr>
<td><code>ping</code></td>
<td>1</td>
<td>3.94</td>
<td>3.94</td>
<td>3.94</td>
<td>3.94</td>
</tr>
<tr>
<td><code>register</code></td>
<td>671</td>
<td>1699.42</td>
<td>7210.31</td>
<td>15759.89</td>
<td>19152.15</td>
</tr>
<tr>
<td><code>login</code></td>
<td>669</td>
<td>1388.84</td>
<td>3959.58</td>
<td>5613.18</td>
<td>6717.96</td>
</tr>
<tr>
<td><code>refresh_token</code></td>
<td>30</td>
<td>2340.89</td>
<td>4381.74</td>
<td>4742.54</td>
<td>4742.54</td>
</tr>
<tr>
<td><code>fcm_token</code></td>
<td>30</td>
<td>23.79</td>
<td>49.51</td>
<td>182.63</td>
<td>182.63</td>
</tr>
<tr>
<td><code>logout</code></td>
<td>30</td>
<td>2748.74</td>
<td>4722.46</td>
<td>5408.53</td>
<td>5408.53</td>
</tr>
</tbody>
</table>
<footer>
WalkGuide AI — Integrated Mobile Application Project Final Exam |
Generated by html-reporter.js
</footer>
</body>
</html>