diff --git a/throughput/canvas_rects.txt b/throughput/canvas_rects.txt
new file mode 100644
index 0000000..4fe9e2c
--- /dev/null
+++ b/throughput/canvas_rects.txt
@@ -0,0 +1,1000 @@
+O8:P9
+V6:W7
+D41:E42
+AB24:AC25
+AB43:AC44
+O40:P41
+L22:M23
+E33:F34
+AB22:AC23
+A40:B41
+AD14:AE15
+X15:Y16
+R48:S49
+P39:Q40
+T33:U34
+M13:N14
+S2:T3
+AC20:AD21
+AB51:AC52
+AB2:AC3
+Y3:Z4
+E48:F49
+M36:N37
+O30:P31
+W17:X18
+L21:M22
+B12:C13
+Z2:AA3
+B7:C8
+Z39:AA40
+N41:O42
+J17:K18
+H45:I46
+V11:W12
+T41:U42
+X52:Y53
+H31:I32
+O3:P4
+X2:Y3
+D38:E39
+U46:V47
+O17:P18
+C11:D12
+AA21:AB22
+I12:J13
+B18:C19
+Y44:Z45
+E21:F22
+AA28:AB29
+S5:T6
+E24:F25
+Z4:AA5
+T24:U25
+E17:F18
+F39:G40
+U1:V2
+V4:W5
+E52:F53
+R32:S33
+Q22:R23
+H33:I34
+O54:P55
+A53:B54
+W7:X8
+T29:U30
+M45:N46
+C29:D30
+D20:E21
+AC31:AD32
+C9:D10
+Q38:R39
+W14:X15
+U3:V4
+P52:Q53
+I53:J54
+C42:D43
+L47:M48
+B42:C43
+J21:K22
+M54:N55
+A36:B37
+J34:K35
+C47:D48
+O41:P42
+D32:E33
+S41:T42
+D24:E25
+J40:K41
+O47:P48
+C36:D37
+K38:L39
+C45:D46
+Z10:AA11
+AA38:AB39
+U14:V15
+B17:C18
+J18:K19
+V39:W40
+I8:J9
+B24:C25
+X19:Y20
+C22:D23
+K35:L36
+B25:C26
+F42:G43
+B52:C53
+Y30:Z31
+S23:T24
+U22:V23
+T52:U53
+S7:T8
+U5:V6
+AA18:AB19
+AA12:AB13
+M38:N39
+W48:X49
+AD12:AE13
+I29:J30
+AC2:AD3
+C25:D26
+W13:X14
+M4:N5
+F28:G29
+M10:N11
+AB10:AC11
+K24:L25
+R5:S6
+AA45:AB46
+AC18:AD19
+Y41:Z42
+E31:F32
+P4:Q5
+B11:C12
+T34:U35
+Y1:Z2
+H6:I7
+F5:G6
+AC40:AD41
+E44:F45
+P37:Q38
+C14:D15
+AD10:AE11
+AC30:AD31
+W30:X31
+A2:B3
+AC42:AD43
+X40:Y41
+M41:N42
+AB32:AC33
+Z31:AA32
+Y33:Z34
+N15:O16
+AD25:AE26
+L29:M30
+P38:Q39
+I27:J28
+S30:T31
+S49:T50
+R39:S40
+E50:F51
+H13:I14
+AD34:AE35
+L45:M46
+E11:F12
+AA35:AB36
+AC11:AD12
+R20:S21
+O53:P54
+K40:L41
+L23:M24
+K16:L17
+AA48:AB49
+O51:P52
+M2:N3
+D5:E6
+U21:V22
+O52:P53
+J45:K46
+AD13:AE14
+B50:C51
+A44:B45
+R51:S52
+Z36:AA37
+N25:O26
+U28:V29
+H1:I2
+AD6:AE7
+N3:O4
+N45:O46
+O44:P45
+AA26:AB27
+L35:M36
+AC25:AD26
+R40:S41
+Y2:Z3
+F46:G47
+J47:K48
+S50:T51
+Q25:R26
+E13:F14
+J20:K21
+C30:D31
+S43:T44
+N32:O33
+R43:S44
+Z29:AA30
+X29:Y30
+E8:F9
+P25:Q26
+V22:W23
+G12:H13
+D45:E46
+S53:T54
+AB19:AC20
+J31:K32
+U26:V27
+S26:T27
+J3:K4
+I16:J17
+C13:D14
+E40:F41
+Q11:R12
+R11:S12
+Y39:Z40
+Q2:R3
+J22:K23
+D21:E22
+Z23:AA24
+N29:O30
+B22:C23
+F10:G11
+AA37:AB38
+AC1:AD2
+E37:F38
+P47:Q48
+T45:U46
+X44:Y45
+Y6:Z7
+X53:Y54
+F17:G18
+AB1:AC2
+V20:W21
+AA9:AB10
+V37:W38
+D27:E28
+Q10:R11
+U2:V3
+B20:C21
+Q39:R40
+J53:K54
+Q8:R9
+Q49:R50
+U38:V39
+AD15:AE16
+M30:N31
+G32:H33
+I36:J37
+R16:S17
+D2:E3
+A14:B15
+F14:G15
+AC53:AD54
+J23:K24
+Z14:AA15
+V47:W48
+Q50:R51
+Q40:R41
+P15:Q16
+AB23:AC24
+Z40:AA41
+D13:E14
+M1:N2
+T53:U54
+F23:G24
+M9:N10
+J28:K29
+Y15:Z16
+AD18:AE19
+T26:U27
+R21:S22
+AB8:AC9
+N31:O32
+AC44:AD45
+I51:J52
+X23:Y24
+E29:F30
+K44:L45
+AA31:AB32
+V49:W50
+V36:W37
+W47:X48
+L54:M55
+M19:N20
+Z18:AA19
+J30:K31
+H26:I27
+G18:H19
+W9:X10
+O46:P47
+AC33:AD34
+Y29:Z30
+A19:B20
+S6:T7
+O33:P34
+V18:W19
+Z25:AA26
+R1:S2
+Q6:R7
+K26:L27
+B9:C10
+H53:I54
+T30:U31
+D48:E49
+G35:H36
+P7:Q8
+I4:J5
+L15:M16
+M24:N25
+C46:D47
+J54:K55
+S19:T20
+F16:G17
+X24:Y25
+J27:K28
+K34:L35
+P9:Q10
+G38:H39
+H39:I40
+O18:P19
+AC12:AD13
+K12:L13
+X49:Y50
+R27:S28
+W49:X50
+N7:O8
+B40:C41
+G1:H2
+L7:M8
+Z34:AA35
+AD41:AE42
+Z11:AA12
+H7:I8
+N14:O15
+S12:T13
+AC43:AD44
+S36:T37
+J42:K43
+R47:S48
+H52:I53
+B3:C4
+F29:G30
+T10:U11
+AB20:AC21
+O13:P14
+AD31:AE32
+X50:Y51
+N17:O18
+P23:Q24
+N11:O12
+X54:Y55
+E19:F20
+C48:D49
+P13:Q14
+A29:B30
+R44:S45
+AD2:AE3
+G24:H25
+AC48:AD49
+AD37:AE38
+K18:L19
+AB17:AC18
+X45:Y46
+E46:F47
+I42:J43
+E54:F55
+C5:D6
+V12:W13
+L4:M5
+R25:S26
+AC8:AD9
+J7:K8
+M34:N35
+V29:W30
+E41:F42
+A47:B48
+S1:T2
+M23:N24
+T16:U17
+AD19:AE20
+A8:B9
+L14:M15
+X34:Y35
+T11:U12
+N27:O28
+H3:I4
+G30:H31
+G11:H12
+X36:Y37
+B8:C9
+W10:X11
+C34:D35
+X7:Y8
+S17:T18
+B16:C17
+H54:I55
+U17:V18
+K14:L15
+AA34:AB35
+N39:O40
+U16:V17
+R14:S15
+D1:E2
+S9:T10
+Q18:R19
+N21:O22
+AC23:AD24
+G50:H51
+AB48:AC49
+S27:T28
+R23:S24
+AD22:AE23
+U9:V10
+A24:B25
+H23:I24
+A31:B32
+Y54:Z55
+AC36:AD37
+A1:B2
+D14:E15
+V28:W29
+G8:H9
+H10:I11
+R9:S10
+G26:H27
+AA10:AB11
+AA3:AB4
+I13:J14
+B44:C45
+W51:X52
+G37:H38
+R46:S47
+L34:M35
+P50:Q51
+D50:E51
+AD9:AE10
+AD21:AE22
+L24:M25
+Q51:R52
+V33:W34
+R2:S3
+V44:W45
+B14:C15
+A7:B8
+X12:Y13
+T12:U13
+K51:L52
+Y5:Z6
+N43:O44
+I35:J36
+Q54:R55
+AB39:AC40
+AD53:AE54
+W36:X37
+AA5:AB6
+R6:S7
+I44:J45
+I45:J46
+T6:U7
+L12:M13
+H22:I23
+U37:V38
+R52:S53
+U12:V13
+G13:H14
+X13:Y14
+Q52:R53
+U11:V12
+F2:G3
+N40:O41
+D35:E36
+N10:O11
+H11:I12
+A49:B50
+L53:M54
+K37:L38
+AA1:AB2
+G19:H20
+AD44:AE45
+G22:H23
+T8:U9
+O31:P32
+AC47:AD48
+V26:W27
+B35:C36
+K8:L9
+N12:O13
+E34:F35
+D37:E38
+H44:I45
+O20:P21
+Y12:Z13
+J46:K47
+H50:I51
+I41:J42
+W53:X54
+AB28:AC29
+Q28:R29
+X3:Y4
+T23:U24
+K22:L23
+A30:B31
+T38:U39
+AB33:AC34
+Y35:Z36
+P12:Q13
+N6:O7
+F12:G13
+E42:F43
+W43:X44
+Q16:R17
+O23:P24
+L19:M20
+Q37:R38
+U35:V36
+B15:C16
+S37:T38
+AD48:AE49
+K53:L54
+A22:B23
+C33:D34
+M40:N41
+T42:U43
+H49:I50
+G44:H45
+Z37:AA38
+K23:L24
+AC4:AD5
+AD51:AE52
+M32:N33
+X8:Y9
+H51:I52
+Q46:R47
+P30:Q31
+L33:M34
+I30:J31
+Z21:AA22
+F51:G52
+A27:B28
+E39:F40
+P28:Q29
+X48:Y49
+B45:C46
+O25:P26
+K33:L34
+I14:J15
+D8:E9
+AD35:AE36
+AB50:AC51
+K17:L18
+K19:L20
+V31:W32
+O36:P37
+Q1:R2
+E49:F50
+O43:P44
+W20:X21
+U34:V35
+V17:W18
+F13:G14
+H43:I44
+X1:Y2
+V1:W2
+T31:U32
+AD40:AE41
+J32:K33
+K1:L2
+Q34:R35
+P20:Q21
+AB18:AC19
+B38:C39
+D54:E55
+S32:T33
+M52:N53
+D18:E19
+F41:G42
+T48:U49
+D34:E35
+G45:H46
+P3:Q4
+D4:E5
+P45:Q46
+H4:I5
+M46:N47
+F47:G48
+X21:Y22
+Y51:Z52
+Z15:AA16
+V24:W25
+I28:J29
+L44:M45
+W44:X45
+AD29:AE30
+S52:T53
+A34:B35
+I40:J41
+R45:S46
+J44:K45
+P54:Q55
+I23:J24
+F31:G32
+A42:B43
+N46:O47
+L30:M31
+C43:D44
+W39:X40
+S42:T43
+A11:B12
+AA7:AB8
+I3:J4
+AD23:AE24
+M3:N4
+D33:E34
+AB7:AC8
+S13:T14
+O16:P17
+Y40:Z41
+B49:C50
+B28:C29
+F21:G22
+L10:M11
+Y24:Z25
+M20:N21
+O11:P12
+T37:U38
+AC32:AD33
+K43:L44
+AC7:AD8
+A28:B29
+N19:O20
+P11:Q12
+R19:S20
+Z52:AA53
+N22:O23
+V16:W17
+O42:P43
+AC10:AD11
+AC13:AD14
+H38:I39
+I22:J23
+C12:D13
+AD26:AE27
+AA40:AB41
+I33:J34
+I19:J20
+G48:H49
+S45:T46
+G6:H7
+G2:H3
+AA33:AB34
+E6:F7
+Q44:R45
+T27:U28
+L42:M43
+Z5:AA6
+M5:N6
+J9:K10
+C32:D33
+M47:N48
+J19:K20
+Z32:AA33
+AA46:AB47
+J12:K13
+W25:X26
+Y27:Z28
+Z54:AA55
+F15:G16
+G4:H5
+X39:Y40
+E3:F4
+A5:B6
+A16:B17
+A46:B47
+AB15:AC16
+H30:I31
+O50:P51
+F36:G37
+AD33:AE34
+S25:T26
+I52:J53
+D28:E29
+AB3:AC4
+AD11:AE12
+T17:U18
+F22:G23
+U50:V51
+P16:Q17
+H15:I16
+L9:M10
+W41:X42
+B53:C54
+AC6:AD7
+L16:M17
+AB30:AC31
+L27:M28
+I47:J48
+D44:E45
+T51:U52
+AB45:AC46
+L50:M51
+Q36:R37
+P29:Q30
+D30:E31
+Z26:AA27
+N54:O55
+K15:L16
+I43:J44
+D31:E32
+V48:W49
+X27:Y28
+Y20:Z21
+A54:B55
+R10:S11
+X5:Y6
+A37:B38
+L26:M27
+L5:M6
+G7:H8
+W54:X55
+A52:B53
+B51:C52
+D39:E40
+AC37:AD38
+Y45:Z46
+T18:U19
+R8:S9
+L2:M3
+S38:T39
+V3:W4
+H20:I21
+A15:B16
+N26:O27
+AB42:AC43
+O29:P30
+F7:G8
+L38:M39
+AB34:AC35
+O38:P39
+R24:S25
+P2:Q3
+W31:X32
+N8:O9
+F43:G44
+G51:H52
+T46:U47
+E26:F27
+I21:J22
+U44:V45
+AD42:AE43
+J26:K27
+J13:K14
+X38:Y39
+B26:C27
+AA50:AB51
+G47:H48
+M14:N15
+P42:Q43
+O27:P28
+N49:O50
+H9:I10
+X18:Y19
+V32:W33
+J49:K50
+T13:U14
+G21:H22
+V40:W41
+Z1:AA2
+F37:G38
+W6:X7
+AC46:AD47
+T54:U55
+J2:K3
+X10:Y11
+M35:N36
+B54:C55
+W2:X3
+R18:S19
+M16:N17
+O24:P25
+G27:H28
+Q26:R27
+O12:P13
+Q13:R14
+J41:K42
+S31:T32
+Z38:AA39
+Y16:Z17
+L41:M42
+I2:J3
+T50:U51
+N28:O29
+X47:Y48
+H29:I30
+O37:P38
+E27:F28
+AA17:AB18
+Z28:AA29
+H35:I36
+J11:K12
+S21:T22
+J6:K7
+AA44:AB45
+T47:U48
+P49:Q50
+Q3:R4
+I18:J19
+AC41:AD42
+H8:I9
+Q33:R34
+D46:E47
+L1:M2
+K41:L42
+W28:X29
+AC27:AD28
+E38:F39
+AA6:AB7
+H25:I26
+R36:S37
+N52:O53
+Y49:Z50
+F33:G34
+K11:L12
+AC26:AD27
+G46:H47
+E32:F33
+J48:K49
+K10:L11
+C17:D18
+I24:J25
+U32:V33
+E20:F21
+D42:E43
+V30:W31
+C27:D28
+C20:D21
+E14:F15
+X22:Y23
+U42:V43
+I17:J18
+AC19:AD20
+AB31:AC32
+H40:I41
+H32:I33
+N38:O39
+I50:J51
+Y22:Z23
+G15:H16
+N48:O49
+E45:F46
+AA53:AB54
+W29:X30
+AB26:AC27
+G5:H6
+AB37:AC38
+Y38:Z39
+W3:X4
+V54:W55
+AA14:AB15
+Y31:Z32
+AA52:AB53
+P24:Q25
+D52:E53
+M33:N34
+Y42:Z43
+AD46:AE47
+V46:W47
+S51:T52
+M17:N18
+J25:K26
+E51:F52
+P48:Q49
+W33:X34
+A35:B36
+R35:S36
+D51:E52
+C54:D55
+U53:V54
+M42:N43
+AA11:AB12
+X43:Y44
+M26:N27
+D19:E20
+Q27:R28
+K46:L47
+A39:B40
+Q45:R46
+AA42:AB43
+V7:W8
+AB4:AC5
+AA49:AB50
+Q14:R15
+A48:B49
+N13:O14
+A20:B21
+K28:L29
+F11:G12
+O2:P3
+AC9:AD10
+K20:L21
+G41:H42
+AC34:AD35
+E12:F13
+F19:G20
+F52:G53
+AB38:AC39
+G52:H53
+B32:C33
+U20:V21
+Q19:R20
+R13:S14
+U40:V41
+F27:G28
+Y52:Z53
+N18:O19
+V5:W6
+I37:J38
+F18:G19
+A33:B34
+R38:S39
+B21:C22
+O5:P6
+C35:D36
+Y17:Z18
+E23:F24
+Q7:R8
+Y48:Z49
+A9:B10
+D7:E8
+P35:Q36
+B1:C2
+D6:E7
+L48:M49
+Y53:Z54
+Z47:AA48
+AD38:AE39
+Z48:AA49
+X30:Y31
+Y18:Z19
+R17:S18
+AD52:AE53
+N44:O45
+X14:Y15
+N33:O34
+Z51:AA52
+V41:W42
+F3:G4
+Y25:Z26
+U6:V7
+S33:T34
+T49:U50
+N5:O6
+W18:X19
+B34:C35
+U54:V55
+A3:B4
+U24:V25
+S47:T48
+N24:O25
+Z46:AA47
+R29:S30
+N34:O35
+Z20:AA21
+O15:P16
+P46:Q47
+V34:W35
+I25:J26
+AA25:AB26
+A10:B11
+V53:W54
+S29:T30
+Y47:Z48
+X33:Y34
+Q42:R43
+L28:M29
+A51:B52
+E30:F31
+A26:B27
+W34:X35
+R7:S8
+N47:O48
+AB21:AC22
+F8:G9
+T25:U26
+AD39:AE40
+L49:M50
+X42:Y43
+AB25:AC26
+W16:X17
+D36:E37
+T35:U36
+V42:W43
diff --git a/throughput/request.sh b/throughput/request.sh
index f29b0df..b012e99 100755
--- a/throughput/request.sh
+++ b/throughput/request.sh
@@ -5,8 +5,9 @@ JMETER_CMD="jmeter"
DEFAULT_THREADS=10
DEFAULT_LOOPS=10
-APP_NAME=""
+SAVE_OUTPUT=""
TARGET_URL=""
+TARGET_PORT=5000
THREADS=$DEFAULT_THREADS
LOOPS=$DEFAULT_LOOPS
@@ -16,10 +17,11 @@ show_help() {
echo "Runs a JMeter benchmark test with specified parameters."
echo ""
echo "Required Flags:"
- echo " -o, --output The name of the app or user for organizing results."
+ echo " -o, --output The output location for the benchmark results."
echo " -H, --host The target URL or IP address for the test (e.g., 10.250.22.29)."
echo ""
echo "Optional Flags:"
+ echo " -p, --port The target port for the test. Default: 5000."
echo " -t, --threads Number of concurrent threads (users). Default: ${DEFAULT_THREADS}."
echo " -l, --loops Number of loops each thread will execute. Default: ${DEFAULT_LOOPS}."
echo " -h, --help Display this help message and exit."
@@ -29,7 +31,7 @@ while [[ $# -gt 0 ]]; do
key="$1"
case $key in
-o|--output)
- APP_NAME="$2"
+ SAVE_OUTPUT="$2"
shift
shift
;;
@@ -38,6 +40,11 @@ while [[ $# -gt 0 ]]; do
shift
shift
;;
+ -p|--port)
+ TARGET_PORT="$2"
+ shift
+ shift
+ ;;
-t|--threads)
THREADS="$2"
shift
@@ -60,7 +67,7 @@ while [[ $# -gt 0 ]]; do
esac
done
-if [ -z "$APP_NAME" ] || [ -z "$TARGET_URL" ]; then
+if [ -z "$SAVE_OUTPUT" ] || [ -z "$TARGET_URL" ]; then
echo "ERROR: Missing required arguments."
echo ""
show_help
@@ -68,12 +75,14 @@ if [ -z "$APP_NAME" ] || [ -z "$TARGET_URL" ]; then
fi
# --- Define Output Structure ---
-MAIN_OUTPUT_DIR="./${APP_NAME}"
-RESULT_CSV="${MAIN_OUTPUT_DIR}/${APP_NAME}_benchmark.csv"
-RESULT_DASHBOARD="${MAIN_OUTPUT_DIR}/${APP_NAME}_dashboard"
-JMETER_LOG_FILE="${MAIN_OUTPUT_DIR}/${APP_NAME}_jmeter.log"
+MAIN_OUTPUT_DIR="${SAVE_OUTPUT}"
+FOLDER_NAME=$(basename "$SAVE_OUTPUT")
-echo "--- Preparing for test run: '$APP_NAME' ---"
+RESULT_CSV="${MAIN_OUTPUT_DIR}/${FOLDER_NAME}_benchmark.csv"
+RESULT_DASHBOARD="${MAIN_OUTPUT_DIR}/${FOLDER_NAME}_dashboard"
+JMETER_LOG_FILE="${MAIN_OUTPUT_DIR}/${FOLDER_NAME}_jmeter.log"
+
+echo "--- Preparing for test run: '$FOLDER_NAME' ---"
mkdir -p "$MAIN_OUTPUT_DIR"
echo "Output will be saved in: $MAIN_OUTPUT_DIR"
@@ -98,7 +107,8 @@ $JMETER_CMD -n \
-j "$JMETER_LOG_FILE" \
-Jthreads="$THREADS" \
-Jloops="$LOOPS" \
- -Jurl="$TARGET_URL"
+ -Jurl="$TARGET_URL" \
+ -Jport="$TARGET_PORT"
if [ $? -eq 0 ]; then
echo ""
diff --git a/throughput/stitcher-benchmark.jmx b/throughput/stitcher-benchmark.jmx
index c93b114..68efa02 100644
--- a/throughput/stitcher-benchmark.jmx
+++ b/throughput/stitcher-benchmark.jmx
@@ -5,6 +5,8 @@
+ false
+ false
@@ -18,9 +20,21 @@
+
+ ,
+
+ canvas_rects.txt
+ false
+ false
+ true
+ shareMode.all
+ false
+ canvasRect
+
+
${__P(url, stitchaton.local)}
- 5000
+ ${__P(port, 5000)}
http
/api/image/generate
true
@@ -43,52 +57,6 @@
-
- true
-
-
- // Function to convert a numeric index (1-31) to the SBS Plate Row format (A-AE)
-String indexToRow(int num) {
- if (num <= 0) return "";
- if (num <= 26) {
- // A-Z is ASCII 65-90. 'A' is char 65. So (num - 1) + 65.
- return (char)(num + 64) as String;
- } else {
- // For AA-AE, the first char is 'A'.
- // 27 -> AA, 28 -> AB, etc.
- // The second char is (num - 27) + 65 -> 'A', 'B', etc.
- return "A" + (char)(num - 26 + 64) as String;
- }
-}
-
-// Define the maximum starting indices for a 2x2 grid
-// Max row is AE (31), so max starting row is AD (30)
-// Max col is 55, so max starting col is 54
-int maxStartRowIndex = 30;
-int maxStartCol = 54;
-
-// Generate random starting coordinates
-// nextInt(bound) generates 0 to bound-1, so add 1
-int randomRowStartIndex = new Random().nextInt(maxStartRowIndex) + 1;
-int randomColStart = new Random().nextInt(maxStartCol) + 1;
-
-// Calculate the end coordinates for the 2x2 grid
-String rowStart = indexToRow(randomRowStartIndex);
-String rowEnd = indexToRow(randomRowStartIndex + 1);
-int colEnd = randomColStart + 1;
-
-// Construct the final canvas_rect string
-String canvasRectValue = "${rowStart}${randomColStart}:${rowEnd}${colEnd}";
-
-// Store the generated string in a JMeter variable named "canvasRect"
-// This makes it available to the HTTP Request sampler
-vars.put("canvasRect", canvasRectValue);
-
-// Optional: Log the generated value to see it in the JMeter log (for debugging)
-log.info("Generated canvas_rect: " + canvasRectValue);
- groovy
-
-