diff --git a/build.gradle b/build.gradle index 21b634d..25ff15c 100644 --- a/build.gradle +++ b/build.gradle @@ -42,6 +42,9 @@ dependencies { // Lombok compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' + + // Virtual Thread 전용 지표 + implementation 'io.micrometer:micrometer-java21' } tasks.named('test') { diff --git a/docs/images/platform-thread-100vu-db-pool.png b/docs/images/platform-thread-100vu-db-pool.png new file mode 100644 index 0000000..a4410dd Binary files /dev/null and b/docs/images/platform-thread-100vu-db-pool.png differ diff --git a/docs/images/platform-thread-100vu-performance.png b/docs/images/platform-thread-100vu-performance.png new file mode 100644 index 0000000..0d29e21 Binary files /dev/null and b/docs/images/platform-thread-100vu-performance.png differ diff --git a/docs/images/virtual-thread-100vu-db-pool.png b/docs/images/virtual-thread-100vu-db-pool.png new file mode 100644 index 0000000..2e32fe4 Binary files /dev/null and b/docs/images/virtual-thread-100vu-db-pool.png differ diff --git a/docs/images/virtual-thread-100vu-metrics.png b/docs/images/virtual-thread-100vu-metrics.png new file mode 100644 index 0000000..9ed7389 Binary files /dev/null and b/docs/images/virtual-thread-100vu-metrics.png differ diff --git a/docs/images/virtual-thread-100vu-performance.png b/docs/images/virtual-thread-100vu-performance.png new file mode 100644 index 0000000..7923169 Binary files /dev/null and b/docs/images/virtual-thread-100vu-performance.png differ diff --git a/monitoring/grafana/dashboards/spring-boot-overview.json b/monitoring/grafana/dashboards/spring-boot-overview.json index 4830605..a3a06b7 100644 --- a/monitoring/grafana/dashboards/spring-boot-overview.json +++ b/monitoring/grafana/dashboards/spring-boot-overview.json @@ -5,8 +5,8 @@ "name": "spring-boot-overview", "namespace": "default", "uid": "d8ff4239-0696-483e-ac21-919126fd4967", - "resourceVersion": "1785489454258011", - "generation": 3, + "resourceVersion": "1785489867760013", + "generation": 4, "creationTimestamp": "2026-07-30T10:33:40Z", "labels": { "grafana.app/deprecatedInternalID": "2113606437945344" @@ -16,11 +16,11 @@ "grafana.app/folder": "eftnup4o0j1tsd", "grafana.app/managedBy": "classic-file-provisioning", "grafana.app/managerId": "System Design Dashboards", - "grafana.app/sourceChecksum": "a22cfc7115886583cf1616d4185209f0", + "grafana.app/sourceChecksum": "dd3f2ae3957746d44c447391e659a68b", "grafana.app/sourcePath": "/var/lib/grafana/dashboards/spring-boot-overview.json", - "grafana.app/sourceTimestamp": "1785489448000", + "grafana.app/sourceTimestamp": "1785489862000", "grafana.app/updatedBy": "access-policy:service", - "grafana.app/updatedTimestamp": "2026-07-31T09:17:34Z", + "grafana.app/updatedTimestamp": "2026-07-31T09:24:27Z", "grafana.app/folderTitle": "System Design", "grafana.app/folderUrl": "/dashboards/f/eftnup4o0j1tsd/system-design" } @@ -290,6 +290,432 @@ } } }, + "panel-11": { + "kind": "Panel", + "spec": { + "data": { + "kind": "QueryGroup", + "spec": { + "queries": [ + { + "kind": "PanelQuery", + "spec": { + "hidden": false, + "query": { + "datasource": { + "name": "prometheus" + }, + "group": "prometheus", + "kind": "DataQuery", + "spec": { + "editorMode": "code", + "expr": "jvm_threads_virtual_live_threads{\n application=\"url-shortener\",\n scheduling_status=\"mounted\"\n}", + "legendFormat": "Mounted", + "range": true + }, + "version": "v0" + }, + "refId": "A" + } + }, + { + "kind": "PanelQuery", + "spec": { + "hidden": false, + "query": { + "datasource": { + "name": "prometheus" + }, + "group": "prometheus", + "kind": "DataQuery", + "spec": { + "editorMode": "code", + "expr": "jvm_threads_virtual_live_threads{\n application=\"url-shortener\",\n scheduling_status=\"queued\"\n}", + "instant": false, + "legendFormat": "Queued", + "range": true + }, + "version": "v0" + }, + "refId": "B" + } + } + ], + "queryOptions": {}, + "transformations": [] + } + }, + "description": "", + "id": 11, + "links": [], + "title": "Virtual Threads Mounted / Queued", + "vizConfig": { + "group": "timeseries", + "kind": "VizConfig", + "spec": { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "options": { + "annotations": { + "clustering": -1, + "multiLane": false + }, + "legend": { + "calcs": [], + "displayMode": "list", + "enableFacetedFilter": false, + "overflow": "ellipsis", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + } + }, + "version": "13.1.1" + } + } + }, + "panel-12": { + "kind": "Panel", + "spec": { + "data": { + "kind": "QueryGroup", + "spec": { + "queries": [ + { + "kind": "PanelQuery", + "spec": { + "hidden": false, + "query": { + "datasource": { + "name": "prometheus" + }, + "group": "prometheus", + "kind": "DataQuery", + "spec": { + "editorMode": "code", + "expr": "jvm_threads_virtual_pool_size_threads{\n application=\"url-shortener\"\n}", + "legendFormat": "Carrier Pool Size", + "range": true + }, + "version": "v0" + }, + "refId": "A" + } + }, + { + "kind": "PanelQuery", + "spec": { + "hidden": false, + "query": { + "datasource": { + "name": "prometheus" + }, + "group": "prometheus", + "kind": "DataQuery", + "spec": { + "editorMode": "code", + "expr": "jvm_threads_virtual_parallelism{\n application=\"url-shortener\"\n}", + "instant": false, + "legendFormat": "Target Parallelism", + "range": true + }, + "version": "v0" + }, + "refId": "B" + } + } + ], + "queryOptions": {}, + "transformations": [] + } + }, + "description": "", + "id": 12, + "links": [], + "title": "Virtual Thread Scheduler", + "vizConfig": { + "group": "timeseries", + "kind": "VizConfig", + "spec": { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "options": { + "annotations": { + "clustering": -1, + "multiLane": false + }, + "legend": { + "calcs": [], + "displayMode": "list", + "enableFacetedFilter": false, + "overflow": "ellipsis", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + } + }, + "version": "13.1.1" + } + } + }, + "panel-13": { + "kind": "Panel", + "spec": { + "data": { + "kind": "QueryGroup", + "spec": { + "queries": [ + { + "kind": "PanelQuery", + "spec": { + "hidden": false, + "query": { + "datasource": { + "name": "prometheus" + }, + "group": "prometheus", + "kind": "DataQuery", + "spec": { + "editorMode": "code", + "expr": "increase(\n jvm_threads_virtual_pinned_seconds_count{\n application=\"url-shortener\"\n }[$__rate_interval]\n)", + "legendFormat": "Pinned Events", + "range": true + }, + "version": "v0" + }, + "refId": "A" + } + }, + { + "kind": "PanelQuery", + "spec": { + "hidden": false, + "query": { + "datasource": { + "name": "prometheus" + }, + "group": "prometheus", + "kind": "DataQuery", + "spec": { + "editorMode": "code", + "expr": "increase(\n jvm_threads_virtual_submit_failed_total{\n application=\"url-shortener\"\n }[$__rate_interval]\n)", + "instant": false, + "legendFormat": "Submit Failed", + "range": true + }, + "version": "v0" + }, + "refId": "B" + } + } + ], + "queryOptions": {}, + "transformations": [] + } + }, + "description": "", + "id": 13, + "links": [], + "title": "Virtual Thread Events", + "vizConfig": { + "group": "timeseries", + "kind": "VizConfig", + "spec": { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "options": { + "annotations": { + "clustering": -1, + "multiLane": false + }, + "legend": { + "calcs": [], + "displayMode": "list", + "enableFacetedFilter": false, + "overflow": "ellipsis", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + } + }, + "version": "13.1.1" + } + } + }, "panel-2": { "kind": "Panel", "spec": { @@ -1422,10 +1848,49 @@ "name": "panel-10" }, "height": 8, - "width": 12, + "width": 24, "x": 0, "y": 24 } + }, + { + "kind": "GridLayoutItem", + "spec": { + "element": { + "kind": "ElementReference", + "name": "panel-11" + }, + "height": 8, + "width": 8, + "x": 0, + "y": 32 + } + }, + { + "kind": "GridLayoutItem", + "spec": { + "element": { + "kind": "ElementReference", + "name": "panel-12" + }, + "height": 8, + "width": 8, + "x": 8, + "y": 32 + } + }, + { + "kind": "GridLayoutItem", + "spec": { + "element": { + "kind": "ElementReference", + "name": "panel-13" + }, + "height": 8, + "width": 8, + "x": 16, + "y": 32 + } } ] } diff --git a/results/thread-comparison/platform-db-only-100vu-1m.txt b/results/thread-comparison/platform-db-only-100vu-1m.txt new file mode 100644 index 0000000..b05734a --- /dev/null +++ b/results/thread-comparison/platform-db-only-100vu-1m.txt @@ -0,0 +1,243 @@ + + /\ Grafana /‾‾/ + /\ / \ |\ __ / / + / \/ \ | |/ / / ‾‾\ + / \ | ( | (‾) | + / __________ \ |_|\_\ \_____/ + + + execution: local + script: /scripts/db-only-redirect.js + output: - + + scenarios: (100.00%) 1 scenario, 100 max VUs, 1m30s max duration (incl. graceful stop): + * default: 100 looping VUs for 1m0s (gracefulStop: 30s) + + +running (0m01.0s), 100/100 VUs, 228 complete and 0 interrupted iterations +default [ 1% ] 100 VUs 0m00.5s/1m0s + +running (0m02.0s), 100/100 VUs, 556 complete and 0 interrupted iterations +default [ 2% ] 100 VUs 0m01.5s/1m0s + +running (0m03.0s), 100/100 VUs, 1386 complete and 0 interrupted iterations +default [ 4% ] 100 VUs 0m02.5s/1m0s + +running (0m04.0s), 100/100 VUs, 2470 complete and 0 interrupted iterations +default [ 6% ] 100 VUs 0m03.5s/1m0s + +running (0m05.0s), 100/100 VUs, 3487 complete and 0 interrupted iterations +default [ 7% ] 100 VUs 0m04.5s/1m0s + +running (0m06.0s), 100/100 VUs, 4700 complete and 0 interrupted iterations +default [ 9% ] 100 VUs 0m05.5s/1m0s + +running (0m07.0s), 100/100 VUs, 5984 complete and 0 interrupted iterations +default [ 11% ] 100 VUs 0m06.5s/1m0s + +running (0m08.0s), 100/100 VUs, 8575 complete and 0 interrupted iterations +default [ 12% ] 100 VUs 0m07.5s/1m0s + +running (0m09.0s), 100/100 VUs, 10722 complete and 0 interrupted iterations +default [ 14% ] 100 VUs 0m08.5s/1m0s + +running (0m10.0s), 100/100 VUs, 13854 complete and 0 interrupted iterations +default [ 16% ] 100 VUs 0m09.5s/1m0s + +running (0m11.0s), 100/100 VUs, 17148 complete and 0 interrupted iterations +default [ 17% ] 100 VUs 0m10.5s/1m0s + +running (0m12.0s), 100/100 VUs, 20169 complete and 0 interrupted iterations +default [ 19% ] 100 VUs 0m11.5s/1m0s + +running (0m13.0s), 100/100 VUs, 23585 complete and 0 interrupted iterations +default [ 21% ] 100 VUs 0m12.5s/1m0s + +running (0m14.0s), 100/100 VUs, 27014 complete and 0 interrupted iterations +default [ 22% ] 100 VUs 0m13.5s/1m0s + +running (0m15.0s), 100/100 VUs, 30712 complete and 0 interrupted iterations +default [ 24% ] 100 VUs 0m14.5s/1m0s + +running (0m16.0s), 100/100 VUs, 34530 complete and 0 interrupted iterations +default [ 26% ] 100 VUs 0m15.5s/1m0s + +running (0m17.0s), 100/100 VUs, 38407 complete and 0 interrupted iterations +default [ 27% ] 100 VUs 0m16.5s/1m0s + +running (0m18.0s), 100/100 VUs, 42544 complete and 0 interrupted iterations +default [ 29% ] 100 VUs 0m17.5s/1m0s + +running (0m19.0s), 100/100 VUs, 47241 complete and 0 interrupted iterations +default [ 31% ] 100 VUs 0m18.5s/1m0s + +running (0m20.0s), 100/100 VUs, 52284 complete and 0 interrupted iterations +default [ 32% ] 100 VUs 0m19.5s/1m0s + +running (0m21.0s), 100/100 VUs, 57971 complete and 0 interrupted iterations +default [ 34% ] 100 VUs 0m20.5s/1m0s + +running (0m22.0s), 100/100 VUs, 64207 complete and 0 interrupted iterations +default [ 36% ] 100 VUs 0m21.5s/1m0s + +running (0m23.0s), 100/100 VUs, 71284 complete and 0 interrupted iterations +default [ 37% ] 100 VUs 0m22.5s/1m0s + +running (0m24.0s), 100/100 VUs, 78151 complete and 0 interrupted iterations +default [ 39% ] 100 VUs 0m23.5s/1m0s + +running (0m25.0s), 100/100 VUs, 85472 complete and 0 interrupted iterations +default [ 41% ] 100 VUs 0m24.5s/1m0s + +running (0m26.0s), 100/100 VUs, 90987 complete and 0 interrupted iterations +default [ 42% ] 100 VUs 0m25.5s/1m0s + +running (0m27.0s), 100/100 VUs, 96809 complete and 0 interrupted iterations +default [ 44% ] 100 VUs 0m26.5s/1m0s + +running (0m28.0s), 100/100 VUs, 103862 complete and 0 interrupted iterations +default [ 46% ] 100 VUs 0m27.5s/1m0s + +running (0m29.0s), 100/100 VUs, 110539 complete and 0 interrupted iterations +default [ 47% ] 100 VUs 0m28.5s/1m0s + +running (0m30.0s), 100/100 VUs, 117461 complete and 0 interrupted iterations +default [ 49% ] 100 VUs 0m29.5s/1m0s + +running (0m31.0s), 100/100 VUs, 124799 complete and 0 interrupted iterations +default [ 51% ] 100 VUs 0m30.5s/1m0s + +running (0m32.0s), 100/100 VUs, 132060 complete and 0 interrupted iterations +default [ 52% ] 100 VUs 0m31.5s/1m0s + +running (0m33.0s), 100/100 VUs, 139253 complete and 0 interrupted iterations +default [ 54% ] 100 VUs 0m32.5s/1m0s + +running (0m34.0s), 100/100 VUs, 146486 complete and 0 interrupted iterations +default [ 56% ] 100 VUs 0m33.5s/1m0s + +running (0m35.0s), 100/100 VUs, 153827 complete and 0 interrupted iterations +default [ 57% ] 100 VUs 0m34.5s/1m0s + +running (0m36.0s), 100/100 VUs, 161086 complete and 0 interrupted iterations +default [ 59% ] 100 VUs 0m35.5s/1m0s + +running (0m37.0s), 100/100 VUs, 168299 complete and 0 interrupted iterations +default [ 61% ] 100 VUs 0m36.5s/1m0s + +running (0m38.0s), 100/100 VUs, 175713 complete and 0 interrupted iterations +default [ 62% ] 100 VUs 0m37.5s/1m0s + +running (0m39.0s), 100/100 VUs, 182415 complete and 0 interrupted iterations +default [ 64% ] 100 VUs 0m38.5s/1m0s + +running (0m40.0s), 100/100 VUs, 189907 complete and 0 interrupted iterations +default [ 66% ] 100 VUs 0m39.5s/1m0s + +running (0m41.0s), 100/100 VUs, 197412 complete and 0 interrupted iterations +default [ 67% ] 100 VUs 0m40.5s/1m0s + +running (0m42.0s), 100/100 VUs, 204556 complete and 0 interrupted iterations +default [ 69% ] 100 VUs 0m41.5s/1m0s + +running (0m43.0s), 100/100 VUs, 211898 complete and 0 interrupted iterations +default [ 71% ] 100 VUs 0m42.5s/1m0s + +running (0m44.0s), 100/100 VUs, 218048 complete and 0 interrupted iterations +default [ 72% ] 100 VUs 0m43.5s/1m0s + +running (0m45.0s), 100/100 VUs, 225053 complete and 0 interrupted iterations +default [ 74% ] 100 VUs 0m44.5s/1m0s + +running (0m46.0s), 100/100 VUs, 232627 complete and 0 interrupted iterations +default [ 76% ] 100 VUs 0m45.5s/1m0s + +running (0m47.0s), 100/100 VUs, 239908 complete and 0 interrupted iterations +default [ 77% ] 100 VUs 0m46.5s/1m0s + +running (0m48.0s), 100/100 VUs, 247172 complete and 0 interrupted iterations +default [ 79% ] 100 VUs 0m47.5s/1m0s + +running (0m49.0s), 100/100 VUs, 254230 complete and 0 interrupted iterations +default [ 81% ] 100 VUs 0m48.5s/1m0s + +running (0m50.0s), 100/100 VUs, 261642 complete and 0 interrupted iterations +default [ 82% ] 100 VUs 0m49.5s/1m0s + +running (0m51.0s), 100/100 VUs, 268800 complete and 0 interrupted iterations +default [ 84% ] 100 VUs 0m50.5s/1m0s + +running (0m52.0s), 100/100 VUs, 276183 complete and 0 interrupted iterations +default [ 86% ] 100 VUs 0m51.5s/1m0s + +running (0m53.0s), 100/100 VUs, 283404 complete and 0 interrupted iterations +default [ 87% ] 100 VUs 0m52.5s/1m0s + +running (0m54.0s), 100/100 VUs, 290584 complete and 0 interrupted iterations +default [ 89% ] 100 VUs 0m53.5s/1m0s + +running (0m55.0s), 100/100 VUs, 298065 complete and 0 interrupted iterations +default [ 91% ] 100 VUs 0m54.5s/1m0s + +running (0m56.0s), 100/100 VUs, 305703 complete and 0 interrupted iterations +default [ 92% ] 100 VUs 0m55.5s/1m0s + +running (0m57.0s), 100/100 VUs, 312708 complete and 0 interrupted iterations +default [ 94% ] 100 VUs 0m56.5s/1m0s + +running (0m58.0s), 100/100 VUs, 320150 complete and 0 interrupted iterations +default [ 96% ] 100 VUs 0m57.5s/1m0s + +running (0m59.0s), 100/100 VUs, 326804 complete and 0 interrupted iterations +default [ 97% ] 100 VUs 0m58.5s/1m0s + +running (1m00.0s), 100/100 VUs, 333603 complete and 0 interrupted iterations +default [ 99% ] 100 VUs 0m59.5s/1m0s + + + █ THRESHOLDS + + checks + ✓ 'rate>0.99' rate=100.00% + + http_req_duration{endpoint:redirect} + ✓ 'p(95)<500' p(95)=50.24ms + + http_req_failed + ✓ 'rate<0.01' rate=0.00% + + + █ TOTAL RESULTS + + checks_total.......: 1012496 16728.477764/s + checks_succeeded...: 100.00% 1012496 out of 1012496 + checks_failed......: 0.00% 0 out of 1012496 + + ✓ 단축 URL 생성 상태는 201이다 + ✓ shortCode가 반환된다 + ✓ 리다이렉트 상태는 302이다 + ✓ Location 헤더가 존재한다 + ✓ 원본 URL이 올바르다 + + HTTP + http_req_duration..............: avg=17.56ms min=543.79µs med=11.83ms p(90)=36.78ms p(95)=50.24ms p(99)=105.4ms max=1.07s + { endpoint:redirect }........: avg=17.56ms min=543.79µs med=11.83ms p(90)=36.78ms p(95)=50.24ms p(99)=105.4ms max=1.07s + { expected_response:true }...: avg=17.56ms min=543.79µs med=11.83ms p(90)=36.78ms p(95)=50.24ms p(99)=105.4ms max=1.07s + http_req_failed................: 0.00% 0 out of 337499 + http_reqs......................: 337499 5576.164762/s + + EXECUTION + iteration_duration.............: avg=17.76ms min=621.79µs med=12.01ms p(90)=37.05ms p(95)=50.47ms p(99)=105.69ms max=1.07s + iterations.....................: 337498 5576.14824/s + vus............................: 100 min=100 max=100 + vus_max........................: 100 min=100 max=100 + + NETWORK + data_received..................: 36 MB 598 kB/s + data_sent......................: 24 MB 402 kB/s + + + + +running (1m00.5s), 000/100 VUs, 337498 complete and 0 interrupted iterations +default ✓ [ 100% ] 100 VUs 1m0s diff --git a/results/thread-comparison/virtual-db-only-100vu-1m.txt b/results/thread-comparison/virtual-db-only-100vu-1m.txt new file mode 100644 index 0000000..a36922f --- /dev/null +++ b/results/thread-comparison/virtual-db-only-100vu-1m.txt @@ -0,0 +1,243 @@ + + /\ Grafana /‾‾/ + /\ / \ |\ __ / / + / \/ \ | |/ / / ‾‾\ + / \ | ( | (‾) | + / __________ \ |_|\_\ \_____/ + + + execution: local + script: /scripts/db-only-redirect.js + output: - + + scenarios: (100.00%) 1 scenario, 100 max VUs, 1m30s max duration (incl. graceful stop): + * default: 100 looping VUs for 1m0s (gracefulStop: 30s) + + +running (0m01.0s), 100/100 VUs, 566 complete and 0 interrupted iterations +default [ 1% ] 100 VUs 0m00.6s/1m0s + +running (0m02.0s), 100/100 VUs, 1557 complete and 0 interrupted iterations +default [ 3% ] 100 VUs 0m01.6s/1m0s + +running (0m03.0s), 100/100 VUs, 2993 complete and 0 interrupted iterations +default [ 4% ] 100 VUs 0m02.6s/1m0s + +running (0m04.0s), 100/100 VUs, 4242 complete and 0 interrupted iterations +default [ 6% ] 100 VUs 0m03.6s/1m0s + +running (0m05.0s), 100/100 VUs, 4826 complete and 0 interrupted iterations +default [ 8% ] 100 VUs 0m04.6s/1m0s + +running (0m06.0s), 100/100 VUs, 5234 complete and 0 interrupted iterations +default [ 9% ] 100 VUs 0m05.6s/1m0s + +running (0m07.0s), 100/100 VUs, 5546 complete and 0 interrupted iterations +default [ 11% ] 100 VUs 0m06.6s/1m0s + +running (0m08.0s), 100/100 VUs, 6587 complete and 0 interrupted iterations +default [ 13% ] 100 VUs 0m07.6s/1m0s + +running (0m09.0s), 100/100 VUs, 8735 complete and 0 interrupted iterations +default [ 14% ] 100 VUs 0m08.6s/1m0s + +running (0m10.0s), 100/100 VUs, 9644 complete and 0 interrupted iterations +default [ 16% ] 100 VUs 0m09.6s/1m0s + +running (0m11.0s), 100/100 VUs, 11868 complete and 0 interrupted iterations +default [ 18% ] 100 VUs 0m10.6s/1m0s + +running (0m12.0s), 100/100 VUs, 14102 complete and 0 interrupted iterations +default [ 19% ] 100 VUs 0m11.6s/1m0s + +running (0m13.0s), 100/100 VUs, 16175 complete and 0 interrupted iterations +default [ 21% ] 100 VUs 0m12.6s/1m0s + +running (0m14.0s), 100/100 VUs, 19073 complete and 0 interrupted iterations +default [ 23% ] 100 VUs 0m13.6s/1m0s + +running (0m15.0s), 100/100 VUs, 21756 complete and 0 interrupted iterations +default [ 24% ] 100 VUs 0m14.6s/1m0s + +running (0m16.0s), 100/100 VUs, 25240 complete and 0 interrupted iterations +default [ 26% ] 100 VUs 0m15.6s/1m0s + +running (0m17.0s), 100/100 VUs, 28832 complete and 0 interrupted iterations +default [ 28% ] 100 VUs 0m16.6s/1m0s + +running (0m18.0s), 100/100 VUs, 31357 complete and 0 interrupted iterations +default [ 29% ] 100 VUs 0m17.6s/1m0s + +running (0m19.0s), 100/100 VUs, 35648 complete and 0 interrupted iterations +default [ 31% ] 100 VUs 0m18.6s/1m0s + +running (0m20.0s), 100/100 VUs, 38411 complete and 0 interrupted iterations +default [ 33% ] 100 VUs 0m19.6s/1m0s + +running (0m21.0s), 100/100 VUs, 42163 complete and 0 interrupted iterations +default [ 34% ] 100 VUs 0m20.6s/1m0s + +running (0m22.0s), 100/100 VUs, 46834 complete and 0 interrupted iterations +default [ 36% ] 100 VUs 0m21.6s/1m0s + +running (0m23.0s), 100/100 VUs, 51104 complete and 0 interrupted iterations +default [ 38% ] 100 VUs 0m22.6s/1m0s + +running (0m24.0s), 100/100 VUs, 55594 complete and 0 interrupted iterations +default [ 39% ] 100 VUs 0m23.6s/1m0s + +running (0m25.0s), 100/100 VUs, 60384 complete and 0 interrupted iterations +default [ 41% ] 100 VUs 0m24.6s/1m0s + +running (0m26.0s), 100/100 VUs, 64476 complete and 0 interrupted iterations +default [ 43% ] 100 VUs 0m25.6s/1m0s + +running (0m27.0s), 100/100 VUs, 68346 complete and 0 interrupted iterations +default [ 44% ] 100 VUs 0m26.6s/1m0s + +running (0m28.0s), 100/100 VUs, 73030 complete and 0 interrupted iterations +default [ 46% ] 100 VUs 0m27.6s/1m0s + +running (0m29.0s), 100/100 VUs, 78182 complete and 0 interrupted iterations +default [ 48% ] 100 VUs 0m28.6s/1m0s + +running (0m30.0s), 100/100 VUs, 83316 complete and 0 interrupted iterations +default [ 49% ] 100 VUs 0m29.6s/1m0s + +running (0m31.0s), 100/100 VUs, 88671 complete and 0 interrupted iterations +default [ 51% ] 100 VUs 0m30.6s/1m0s + +running (0m32.0s), 100/100 VUs, 93801 complete and 0 interrupted iterations +default [ 53% ] 100 VUs 0m31.6s/1m0s + +running (0m33.0s), 100/100 VUs, 98059 complete and 0 interrupted iterations +default [ 54% ] 100 VUs 0m32.6s/1m0s + +running (0m34.0s), 100/100 VUs, 103590 complete and 0 interrupted iterations +default [ 56% ] 100 VUs 0m33.6s/1m0s + +running (0m35.0s), 100/100 VUs, 109255 complete and 0 interrupted iterations +default [ 58% ] 100 VUs 0m34.6s/1m0s + +running (0m36.0s), 100/100 VUs, 114394 complete and 0 interrupted iterations +default [ 59% ] 100 VUs 0m35.6s/1m0s + +running (0m37.0s), 100/100 VUs, 119093 complete and 0 interrupted iterations +default [ 61% ] 100 VUs 0m36.6s/1m0s + +running (0m38.0s), 100/100 VUs, 123853 complete and 0 interrupted iterations +default [ 63% ] 100 VUs 0m37.6s/1m0s + +running (0m39.0s), 100/100 VUs, 128833 complete and 0 interrupted iterations +default [ 64% ] 100 VUs 0m38.6s/1m0s + +running (0m40.0s), 100/100 VUs, 133896 complete and 0 interrupted iterations +default [ 66% ] 100 VUs 0m39.6s/1m0s + +running (0m41.0s), 100/100 VUs, 138997 complete and 0 interrupted iterations +default [ 68% ] 100 VUs 0m40.6s/1m0s + +running (0m42.0s), 100/100 VUs, 144410 complete and 0 interrupted iterations +default [ 69% ] 100 VUs 0m41.6s/1m0s + +running (0m43.0s), 100/100 VUs, 149337 complete and 0 interrupted iterations +default [ 71% ] 100 VUs 0m42.6s/1m0s + +running (0m44.0s), 100/100 VUs, 154201 complete and 0 interrupted iterations +default [ 73% ] 100 VUs 0m43.6s/1m0s + +running (0m45.0s), 100/100 VUs, 159595 complete and 0 interrupted iterations +default [ 74% ] 100 VUs 0m44.6s/1m0s + +running (0m46.0s), 100/100 VUs, 164948 complete and 0 interrupted iterations +default [ 76% ] 100 VUs 0m45.6s/1m0s + +running (0m47.0s), 100/100 VUs, 169244 complete and 0 interrupted iterations +default [ 78% ] 100 VUs 0m46.6s/1m0s + +running (0m48.0s), 100/100 VUs, 174358 complete and 0 interrupted iterations +default [ 79% ] 100 VUs 0m47.6s/1m0s + +running (0m49.0s), 100/100 VUs, 179079 complete and 0 interrupted iterations +default [ 81% ] 100 VUs 0m48.6s/1m0s + +running (0m50.0s), 100/100 VUs, 181655 complete and 0 interrupted iterations +default [ 83% ] 100 VUs 0m49.6s/1m0s + +running (0m51.0s), 100/100 VUs, 186793 complete and 0 interrupted iterations +default [ 84% ] 100 VUs 0m50.6s/1m0s + +running (0m52.0s), 100/100 VUs, 191500 complete and 0 interrupted iterations +default [ 86% ] 100 VUs 0m51.6s/1m0s + +running (0m53.0s), 100/100 VUs, 195963 complete and 0 interrupted iterations +default [ 88% ] 100 VUs 0m52.6s/1m0s + +running (0m54.0s), 100/100 VUs, 201488 complete and 0 interrupted iterations +default [ 89% ] 100 VUs 0m53.6s/1m0s + +running (0m55.0s), 100/100 VUs, 207340 complete and 0 interrupted iterations +default [ 91% ] 100 VUs 0m54.6s/1m0s + +running (0m56.0s), 100/100 VUs, 213037 complete and 0 interrupted iterations +default [ 93% ] 100 VUs 0m55.6s/1m0s + +running (0m57.0s), 100/100 VUs, 218643 complete and 0 interrupted iterations +default [ 94% ] 100 VUs 0m56.6s/1m0s + +running (0m58.0s), 100/100 VUs, 224268 complete and 0 interrupted iterations +default [ 96% ] 100 VUs 0m57.6s/1m0s + +running (0m59.0s), 100/100 VUs, 230154 complete and 0 interrupted iterations +default [ 98% ] 100 VUs 0m58.6s/1m0s + +running (1m00.0s), 100/100 VUs, 235770 complete and 0 interrupted iterations +default [ 99% ] 100 VUs 0m59.6s/1m0s + + + █ THRESHOLDS + + checks + ✓ 'rate>0.99' rate=100.00% + + http_req_duration{endpoint:redirect} + ✓ 'p(95)<500' p(95)=56.38ms + + http_req_failed + ✓ 'rate<0.01' rate=0.00% + + + █ TOTAL RESULTS + + checks_total.......: 714272 11827.787159/s + checks_succeeded...: 100.00% 714272 out of 714272 + checks_failed......: 0.00% 0 out of 714272 + + ✓ 단축 URL 생성 상태는 201이다 + ✓ shortCode가 반환된다 + ✓ 리다이렉트 상태는 302이다 + ✓ Location 헤더가 존재한다 + ✓ 원본 URL이 올바르다 + + HTTP + http_req_duration..............: avg=25.04ms min=553.12µs med=18.73ms p(90)=40.22ms p(95)=56.39ms p(99)=152.11ms max=1.28s + { endpoint:redirect }........: avg=25.04ms min=553.12µs med=18.73ms p(90)=40.22ms p(95)=56.38ms p(99)=152.09ms max=1.28s + { expected_response:true }...: avg=25.04ms min=553.12µs med=18.73ms p(90)=40.22ms p(95)=56.39ms p(99)=152.11ms max=1.28s + http_req_failed................: 0.00% 0 out of 238091 + http_reqs......................: 238091 3942.60124/s + + EXECUTION + iteration_duration.............: avg=25.19ms min=596.04µs med=18.85ms p(90)=40.39ms p(95)=56.6ms p(99)=152.59ms max=1.28s + iterations.....................: 238090 3942.58468/s + vus............................: 100 min=100 max=100 + vus_max........................: 100 min=100 max=100 + + NETWORK + data_received..................: 26 MB 423 kB/s + data_sent......................: 17 MB 284 kB/s + + + + +running (1m00.4s), 000/100 VUs, 238090 complete and 0 interrupted iterations +default ✓ [ 100% ] 100 VUs 1m0s