-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsample-report.html
More file actions
40 lines (40 loc) · 13.3 KB
/
Copy pathsample-report.html
File metadata and controls
40 lines (40 loc) · 13.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!doctype html>
<html lang="en"><head><meta charset="utf-8">
<title>ScaleForge — cache-and-async-workers</title>
<style>
body{font-family:'Segoe UI',Arial,sans-serif;margin:0;background:#f3f4f6;color:#111827}
.wrap{max-width:980px;margin:0 auto;padding:28px}
.card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:20px;margin:16px 0}
h1{margin:0 0 4px} h2{font-size:17px;margin:0 0 10px}
table{border-collapse:collapse;width:100%;font-size:13px}
th,td{border-bottom:1px solid #eef2f7;padding:7px 9px;text-align:right}
th:first-child,td:first-child,th:nth-child(2),td:nth-child(2){text-align:left}
th{background:#f9fafb;color:#374151}
tr.warn td{background:#fffbeb} tr.crit td{background:#fef2f2}
ul{padding-left:18px} li{margin:6px 0;font-size:14px}
li.critical{color:#b91c1c} li.warning{color:#b45309} li.ok{color:#047857}
li span{color:#6b7280;font-style:italic}
.kpis{display:flex;gap:14px;flex-wrap:wrap}
.kpi{flex:1;min-width:150px;background:#f9fafb;border-radius:10px;padding:12px}
.kpi b{font-size:20px;display:block} .muted{color:#6b7280;font-size:13px}
</style></head><body><div class="wrap">
<h1>⚖️ ScaleForge report</h1>
<div class="muted">cache-and-async-workers — offered load 200.00 rps
· SLO <span style=color:#059669>MET</span></div>
<div class="card"><div class="kpis">
<div class="kpi"><span class="muted">goodput</span><b>200.00</b>rps</div>
<div class="kpi"><span class="muted">mean</span><b>29.8</b>ms</div>
<div class="kpi"><span class="muted">p99</span><b>137.2</b>ms</div>
<div class="kpi"><span class="muted">errors</span><b>0.0%</b></div>
<div class="kpi"><span class="muted">bottleneck</span><b>worker</b></div>
<div class="kpi"><span class="muted">safe load</span><b>457.4</b>rps</div>
</div></div>
<div class="card"><h2>Topology</h2><svg xmlns="http://www.w3.org/2000/svg" width="720" height="590" font-family="Segoe UI,Arial,sans-serif"><rect width="720" height="590" fill="#f9fafb"/><line x1="360.0" y1="84.0" x2="360.0" y2="140.0" stroke="#9ca3af" stroke-width="1.6" marker-end="url(#arrow)"/><line x1="360.0" y1="194.0" x2="217.0" y2="250.0" stroke="#9ca3af" stroke-width="1.6" marker-end="url(#arrow)"/><line x1="360.0" y1="194.0" x2="503.0" y2="250.0" stroke="#9ca3af" stroke-width="1.6" marker-end="url(#arrow)"/><line x1="217.0" y1="304.0" x2="360.0" y2="470.0" stroke="#9ca3af" stroke-width="1.6" marker-end="url(#arrow)"/><line x1="503.0" y1="304.0" x2="360.0" y2="360.0" stroke="#9ca3af" stroke-width="1.6" marker-end="url(#arrow)"/><line x1="360.0" y1="414.0" x2="360.0" y2="470.0" stroke="#9ca3af" stroke-width="1.6" marker-end="url(#arrow)"/><defs><marker id="arrow" markerWidth="8" markerHeight="8" refX="6" refY="3" orient="auto"><path d="M0,0 L6,3 L0,6 Z" fill="#9ca3af"/></marker></defs><rect x="291.0" y="30.0" rx="8" width="138" height="54" fill="#ffffff" stroke="#2563eb" stroke-width="2"/><rect x="291.0" y="30.0" rx="8" width="138" height="18" fill="#2563eb"/><text x="360.0" y="43.0" text-anchor="middle" font-size="10" fill="#ffffff">gateway</text><text x="360.0" y="68.0" text-anchor="middle" font-size="13" font-weight="600" fill="#111827">gateway</text><text x="360.0" y="80.0" text-anchor="middle" font-size="10" fill="#6b7280">2x16 · 2ms</text><rect x="291.0" y="140.0" rx="8" width="138" height="54" fill="#ffffff" stroke="#059669" stroke-width="2"/><rect x="291.0" y="140.0" rx="8" width="138" height="18" fill="#059669"/><text x="360.0" y="153.0" text-anchor="middle" font-size="10" fill="#ffffff">service</text><text x="360.0" y="178.0" text-anchor="middle" font-size="13" font-weight="600" fill="#111827">api</text><text x="360.0" y="190.0" text-anchor="middle" font-size="10" fill="#6b7280">4x8 · 8ms</text><rect x="148.0" y="250.0" rx="8" width="138" height="54" fill="#ffffff" stroke="#d97706" stroke-width="2"/><rect x="148.0" y="250.0" rx="8" width="138" height="18" fill="#d97706"/><text x="217.0" y="263.0" text-anchor="middle" font-size="10" fill="#ffffff">cache</text><text x="217.0" y="288.0" text-anchor="middle" font-size="13" font-weight="600" fill="#111827">cache</text><text x="217.0" y="300.0" text-anchor="middle" font-size="10" fill="#6b7280">1x32 · 0.5ms</text><rect x="434.0" y="250.0" rx="8" width="138" height="54" fill="#ffffff" stroke="#0891b2" stroke-width="2"/><rect x="434.0" y="250.0" rx="8" width="138" height="18" fill="#0891b2"/><text x="503.0" y="263.0" text-anchor="middle" font-size="10" fill="#ffffff">queue</text><text x="503.0" y="288.0" text-anchor="middle" font-size="13" font-weight="600" fill="#111827">queue</text><text x="503.0" y="300.0" text-anchor="middle" font-size="10" fill="#6b7280">1x1 · 0ms</text><rect x="291.0" y="360.0" rx="8" width="138" height="54" fill="#ffffff" stroke="#db2777" stroke-width="2"/><rect x="291.0" y="360.0" rx="8" width="138" height="18" fill="#db2777"/><text x="360.0" y="373.0" text-anchor="middle" font-size="10" fill="#ffffff">worker</text><text x="360.0" y="398.0" text-anchor="middle" font-size="13" font-weight="600" fill="#111827">worker</text><text x="360.0" y="410.0" text-anchor="middle" font-size="10" fill="#6b7280">3x4 · 60ms</text><rect x="291.0" y="470.0" rx="8" width="138" height="54" fill="#ffffff" stroke="#7c3aed" stroke-width="2"/><rect x="291.0" y="470.0" rx="8" width="138" height="18" fill="#7c3aed"/><text x="360.0" y="483.0" text-anchor="middle" font-size="10" fill="#ffffff">database</text><text x="360.0" y="508.0" text-anchor="middle" font-size="13" font-weight="600" fill="#111827">db</text><text x="360.0" y="520.0" text-anchor="middle" font-size="10" fill="#6b7280">1x24 · 6ms</text></svg></div>
<div class="card"><h2>Components</h2><table>
<tr><th>component</th><th>kind</th><th>in rps</th><th>servers</th><th>util</th><th>wait ms</th><th>p99 ms</th><th>drop</th><th>retry</th></tr>
<tr class='ok'><td>gateway</td><td>gateway</td><td>200.00</td><td>32</td><td>1.2%</td><td>0.0</td><td>9.2</td><td>0.0%</td><td>1.00x</td></tr><tr class='ok'><td>api</td><td>service</td><td>200.00</td><td>32</td><td>5.0%</td><td>0.0</td><td>36.8</td><td>0.0%</td><td>1.00x</td></tr><tr class='ok'><td>cache</td><td>cache</td><td>200.00</td><td>32</td><td>0.3%</td><td>0.0</td><td>2.3</td><td>0.0%</td><td>1.00x</td></tr><tr><td>queue</td><td>queue</td><td>60.00</td><td colspan='6'>pass-through</td></tr><tr class='ok'><td>worker</td><td>worker</td><td>60.00</td><td>12</td><td>30.0%</td><td>0.0</td><td>276.3</td><td>0.0%</td><td>1.00x</td></tr><tr class='ok'><td>db</td><td>database</td><td>120.00</td><td>24</td><td>3.0%</td><td>0.0</td><td>27.6</td><td>0.0%</td><td>1.00x</td></tr></table></div>
<div class="card"><h2>Findings</h2><ul><li class='ok'><b>OK</b> [worker] Primary bottleneck: 'worker' (utilization 30%) on call path gateway -> api -> queue -> worker. <span>Optimizing any other component first will not raise system throughput until this one is relieved.</span></li><li class='ok'><b>OK</b> All components are within SLO and utilization targets.</li></ul></div>
<div class="card"><h2>Load sweep</h2><svg xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320" font-family="Segoe UI,Arial,sans-serif"><rect width="720" height="320" fill="#ffffff"/><text x="360.0" y="24" text-anchor="middle" font-size="15" font-weight="600" fill="#111827">p99 latency vs offered load</text><line x1="56" y1="42.0" x2="570" y2="42.0" stroke="#e5e7eb" stroke-width="1"/><text x="48" y="46.0" text-anchor="end" font-size="11" fill="#6b7280">170.8</text><line x1="56" y1="100.0" x2="570" y2="100.0" stroke="#e5e7eb" stroke-width="1"/><text x="48" y="104.0" text-anchor="end" font-size="11" fill="#6b7280">128.1</text><line x1="56" y1="158.0" x2="570" y2="158.0" stroke="#e5e7eb" stroke-width="1"/><text x="48" y="162.0" text-anchor="end" font-size="11" fill="#6b7280">85.4</text><line x1="56" y1="216.0" x2="570" y2="216.0" stroke="#e5e7eb" stroke-width="1"/><text x="48" y="220.0" text-anchor="end" font-size="11" fill="#6b7280">42.7</text><line x1="56" y1="274.0" x2="570" y2="274.0" stroke="#e5e7eb" stroke-width="1"/><text x="48" y="278.0" text-anchor="end" font-size="11" fill="#6b7280">0.0</text><line x1="56.0" y1="274" x2="56.0" y2="279" stroke="#9ca3af"/><text x="56.0" y="294" text-anchor="middle" font-size="11" fill="#6b7280">50.0</text><line x1="151.2" y1="274" x2="151.2" y2="279" stroke="#9ca3af"/><text x="151.2" y="294" text-anchor="middle" font-size="11" fill="#6b7280">151.9</text><line x1="265.4" y1="274" x2="265.4" y2="279" stroke="#9ca3af"/><text x="265.4" y="294" text-anchor="middle" font-size="11" fill="#6b7280">274.1</text><line x1="360.6" y1="274" x2="360.6" y2="279" stroke="#9ca3af"/><text x="360.6" y="294" text-anchor="middle" font-size="11" fill="#6b7280">375.9</text><line x1="474.8" y1="274" x2="474.8" y2="279" stroke="#9ca3af"/><text x="474.8" y="294" text-anchor="middle" font-size="11" fill="#6b7280">498.1</text><line x1="570.0" y1="274" x2="570.0" y2="279" stroke="#9ca3af"/><text x="570.0" y="294" text-anchor="middle" font-size="11" fill="#6b7280">600.0</text><line x1="56" y1="42" x2="56" y2="274" stroke="#374151"/><line x1="56" y1="274" x2="570" y2="274" stroke="#374151"/><text x="313.0" y="312" text-anchor="middle" font-size="12" fill="#374151">rps</text><text x="14" y="158.0" font-size="12" fill="#374151" transform="rotate(-90 14 158.0)" text-anchor="middle">ms</text><polyline fill="none" stroke="#2563eb" stroke-width="2.2" points="56.0,87.6 75.0,87.6 94.1,87.6 113.1,87.6 132.1,87.6 151.2,87.6 170.2,87.6 189.3,87.6 208.3,87.6 227.3,87.5 246.4,87.5 265.4,87.5 284.4,87.5 303.5,87.5 322.5,87.4 341.6,87.4 360.6,87.3 379.6,87.1 398.7,86.9 417.7,86.6 436.7,86.1 455.8,85.5 474.8,84.6 493.9,83.3 512.9,81.2 531.9,77.8 551.0,71.6 570.0,59.2"/><rect x="584" y="32" width="12" height="12" fill="#2563eb" rx="2"/><text x="600" y="42" font-size="12" fill="#111827">p99 ms</text></svg><svg xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320" font-family="Segoe UI,Arial,sans-serif"><rect width="720" height="320" fill="#ffffff"/><text x="360.0" y="24" text-anchor="middle" font-size="15" font-weight="600" fill="#111827">utilization / error vs offered load</text><line x1="56" y1="42.0" x2="570" y2="42.0" stroke="#e5e7eb" stroke-width="1"/><text x="48" y="46.0" text-anchor="end" font-size="11" fill="#6b7280">97.2</text><line x1="56" y1="100.0" x2="570" y2="100.0" stroke="#e5e7eb" stroke-width="1"/><text x="48" y="104.0" text-anchor="end" font-size="11" fill="#6b7280">72.9</text><line x1="56" y1="158.0" x2="570" y2="158.0" stroke="#e5e7eb" stroke-width="1"/><text x="48" y="162.0" text-anchor="end" font-size="11" fill="#6b7280">48.6</text><line x1="56" y1="216.0" x2="570" y2="216.0" stroke="#e5e7eb" stroke-width="1"/><text x="48" y="220.0" text-anchor="end" font-size="11" fill="#6b7280">24.3</text><line x1="56" y1="274.0" x2="570" y2="274.0" stroke="#e5e7eb" stroke-width="1"/><text x="48" y="278.0" text-anchor="end" font-size="11" fill="#6b7280">0.0</text><line x1="56.0" y1="274" x2="56.0" y2="279" stroke="#9ca3af"/><text x="56.0" y="294" text-anchor="middle" font-size="11" fill="#6b7280">50.0</text><line x1="151.2" y1="274" x2="151.2" y2="279" stroke="#9ca3af"/><text x="151.2" y="294" text-anchor="middle" font-size="11" fill="#6b7280">151.9</text><line x1="265.4" y1="274" x2="265.4" y2="279" stroke="#9ca3af"/><text x="265.4" y="294" text-anchor="middle" font-size="11" fill="#6b7280">274.1</text><line x1="360.6" y1="274" x2="360.6" y2="279" stroke="#9ca3af"/><text x="360.6" y="294" text-anchor="middle" font-size="11" fill="#6b7280">375.9</text><line x1="474.8" y1="274" x2="474.8" y2="279" stroke="#9ca3af"/><text x="474.8" y="294" text-anchor="middle" font-size="11" fill="#6b7280">498.1</text><line x1="570.0" y1="274" x2="570.0" y2="279" stroke="#9ca3af"/><text x="570.0" y="294" text-anchor="middle" font-size="11" fill="#6b7280">600.0</text><line x1="56" y1="42" x2="56" y2="274" stroke="#374151"/><line x1="56" y1="274" x2="570" y2="274" stroke="#374151"/><text x="313.0" y="312" text-anchor="middle" font-size="12" fill="#374151">rps</text><text x="14" y="158.0" font-size="12" fill="#374151" transform="rotate(-90 14 158.0)" text-anchor="middle">%</text><polyline fill="none" stroke="#2563eb" stroke-width="2.2" points="56.0,256.1 75.0,248.8 94.1,241.5 113.1,234.2 132.1,226.9 151.2,219.6 170.2,212.3 189.3,205.0 208.3,197.8 227.3,190.5 246.4,183.2 265.4,175.9 284.4,168.6 303.5,161.3 322.5,154.0 341.6,146.7 360.6,139.4 379.6,132.1 398.7,124.8 417.7,117.5 436.7,110.2 455.8,102.9 474.8,95.7 493.9,88.4 512.9,81.1 531.9,73.8 551.0,66.5 570.0,59.2"/><rect x="584" y="32" width="12" height="12" fill="#2563eb" rx="2"/><text x="600" y="42" font-size="12" fill="#111827">utilization %</text><polyline fill="none" stroke="#dc2626" stroke-width="2.2" points="56.0,274.0 75.0,274.0 94.1,274.0 113.1,274.0 132.1,274.0 151.2,274.0 170.2,274.0 189.3,274.0 208.3,274.0 227.3,274.0 246.4,274.0 265.4,274.0 284.4,274.0 303.5,274.0 322.5,274.0 341.6,274.0 360.6,274.0 379.6,274.0 398.7,274.0 417.7,274.0 436.7,274.0 455.8,274.0 474.8,274.0 493.9,274.0 512.9,274.0 531.9,274.0 551.0,274.0 570.0,274.0"/><rect x="584" y="50" width="12" height="12" fill="#dc2626" rx="2"/><text x="600" y="60" font-size="12" fill="#111827">error %</text></svg></div>
<div class="card"><h2>DES cross-check</h2><p>requests 22100 · success 22100 · failed 0 · goodput 200.72 rps<br>mean 31.8 ms · p95 126.4 ms · p99 228.4 ms</p><h2>Cost</h2><p><b>$730.00/month</b> ($1.408 per 1M requests, reference list prices)</p></div>
<p class="muted">Generated by ScaleForge v1.0.0 · fully offline · no external assets</p>
</div></body></html>