@@ -21,6 +21,7 @@ PERFTEST_PATIENTS_WITH_POINTERS ?= 0
2121PERFTEST_POINTERS_PER_PATIENT ?= 0
2222PERFTEST_TYPE_DIST_PROFILE ?= default
2323PERFTEST_CUSTODIAN_DIST_PROFILE ?= default
24+ PERFTEST_TOKEN_REFRESH_PORT ?= 8765
2425
2526export PATH := $(PATH ) :$(PWD ) /.venv/bin
2627export USE_SHARED_RESOURCES := $(shell poetry run python scripts/are_resources_shared_for_stack.py $(TF_WORKSPACE_NAME ) )
@@ -156,20 +157,58 @@ test-performance-prepare:
156157 mkdir -p $(DIST_PATH )
157158 PYTHONPATH=. poetry run python tests/performance/environment.py setup $(TF_WORKSPACE_NAME )
158159
159- test-performance : check-warn test-performance-baseline test-performance-stress # # Run the performance tests
160+ test-performance-internal : check-warn test-performance-baseline-internal test-performance-stress-internal # # Run the performance tests against the internal access points
160161
161- test-performance-baseline :
162- @echo " Running consumer performance baseline test"
163- k6 run --out csv=$(DIST_PATH ) /consumer-baseline.csv tests/performance/consumer/baseline.js -e HOST=$(HOST ) -e ENV_TYPE=$(ENV_TYPE )
164-
165- test-performance-stress :
166- @echo " Running consumer performance stress test"
162+ test-performance-baseline-internal : check-warn # # Run the performance baseline tests for the internal access points
163+ @echo " Running internal consumer performance baseline test"
164+ TEST_CONNECT_MODE=internal \
165+ TEST_STACK_DOMAIN=$(shell terraform -chdir=terraform/infrastructure output -raw domain 2>/dev/null) \
166+ k6 run --out csv=$(DIST_PATH ) /consumer-baseline.csv tests/performance/consumer/baseline.js -e HOST=$(HOST ) -e ENV_TYPE=$(ENV_TYPE )
167+
168+ test-performance-baseline-public : check-warn # # Run the baseline performance tests for the external access points
169+ @echo " Fetching public mode configuration and bearer token..."
170+ @CONFIG_FILE=$$(mktemp /tmp/perf_config_XXXXXX ) ; \
171+ trap " rm -f $$ CONFIG_FILE" EXIT; \
172+ PYTHONPATH=. python3 tests/performance/get_test_config.py $(ENV_TYPE ) 2>&1 | tail -n 1 > $$ CONFIG_FILE; \
173+ PUBLIC_BASE_URL=$$(jq -r '.public_base_url' $$CONFIG_FILE ) ; \
174+ echo " Running consumer performance baseline test against the external access points" ; \
175+ TEST_CONNECT_MODE=public \
176+ TEST_PUBLIC_BASE_URL=$$ PUBLIC_BASE_URL \
177+ TEST_CONFIG_FILE=$$ CONFIG_FILE \
178+ k6 run --out csv=$(DIST_PATH ) /consumer-baseline-public.csv tests/performance/consumer/baseline.js -e ENV_TYPE=$(ENV_TYPE )
179+
180+ test-performance-stress-internal : # # Run the performance stress tests for the internal access points
181+ @echo " Running internal consumer performance stress test"
167182 k6 run --out csv=$(DIST_PATH ) /consumer-stress.csv tests/performance/consumer/stress.js -e HOST=$(HOST ) -e ENV_TYPE=$(ENV_TYPE )
168183
169- test-performance-soak :
170- @echo " Running consumer performance soak test"
184+ test-performance-stress-public : check-warn # # Run the stress performance tests for the external access points
185+ @echo " Fetching public mode configuration and bearer token..."
186+ @CONFIG_FILE=$$(mktemp /tmp/perf_config_XXXXXX ) ; \
187+ trap " rm -f $$ CONFIG_FILE" EXIT; \
188+ PYTHONPATH=. python3 tests/performance/get_test_config.py $(ENV_TYPE ) 2>&1 | tail -n 1 > $$ CONFIG_FILE; \
189+ PUBLIC_BASE_URL=$$(jq -r '.public_base_url' $$CONFIG_FILE ) ; \
190+ echo " Running consumer performance stress test against the external access points" ; \
191+ TEST_CONNECT_MODE=public \
192+ TEST_PUBLIC_BASE_URL=$$ PUBLIC_BASE_URL \
193+ TEST_CONFIG_FILE=$$ CONFIG_FILE \
194+ k6 run --out csv=$(DIST_PATH ) /consumer-stress-public.csv tests/performance/consumer/stress.js -e ENV_TYPE=$(ENV_TYPE )
195+
196+ test-performance-soak-internal :
197+ @echo " Running internal consumer performance soak test"
171198 k6 run --out csv=$(DIST_PATH ) /consumer-soak.csv tests/performance/consumer/soak.js -e HOST=$(HOST ) -e ENV_TYPE=$(ENV_TYPE )
172199
200+ test-performance-soak-public : check-warn # # Run the soak performance tests for the external access points
201+ @echo " Fetching public mode configuration and bearer token..."
202+ @CONFIG_FILE=$$(mktemp /tmp/perf_config_XXXXXX ) ; \
203+ trap " rm -f $$ CONFIG_FILE" EXIT; \
204+ PYTHONPATH=. python3 tests/performance/get_test_config.py $(ENV_TYPE ) 2>&1 | tail -n 1 > $$ CONFIG_FILE; \
205+ PUBLIC_BASE_URL=$$(jq -r '.public_base_url' $$CONFIG_FILE ) ; \
206+ echo " Running consumer performance soak test against the external access points" ; \
207+ TEST_CONNECT_MODE=public \
208+ TEST_PUBLIC_BASE_URL=$$ PUBLIC_BASE_URL \
209+ TEST_CONFIG_FILE=$$ CONFIG_FILE \
210+ k6 run --out csv=$(DIST_PATH ) /consumer-soak-public.csv tests/performance/consumer/soak.js -e ENV_TYPE=$(ENV_TYPE )
211+
173212test-performance-output : # # Process outputs from the performance tests
174213 @echo " Processing performance test outputs"
175214 poetry run python tests/performance/process_results.py baseline $(DIST_PATH ) /consumer-baseline.csv
@@ -254,6 +293,7 @@ generate-models: check-warn ## Generate Pydantic Models
254293
255294
256295perftest-generate-permissions : # # Generate perftest permissions and add to nrlf_permissions
296+ @echo " Generating permissions for performance tests with DIST_PATH=$( DIST_PATH) "
257297 PYTHONPATH=. poetry run python tests/performance/producer/generate_permissions.py --output_dir=" $( DIST_PATH) /nrlf_permissions/K6PerformanceTest"
258298
259299perftest-seed-tables : # # Seed tables and upload generated perftest input files to s3
@@ -270,22 +310,53 @@ perftest-prepare: ## Prepare input files for producer & consumer perf tests
270310 mkdir -p " ${DIST_PATH} /nft"
271311 aws s3 cp " s3://nhsd-nrlf--${ENV} -metadata/performance/seed-pointers-extract-${PERFTEST_TABLE_NAME} .zip" " ${DIST_PATH} /pointer_extract-${PERFTEST_TABLE_NAME} .zip"
272312 unzip " ${DIST_PATH} /pointer_extract-${PERFTEST_TABLE_NAME} .zip"
273- # cp "${DIST_PATH}/nft/seed-pointers-extract-${PERFTEST_TABLE_NAME}.csv" "${DIST_PATH}/seed-pointers-extract.csv"
274313 PYTHONPATH=. poetry run python ./tests/performance/generate_producer_distributions.py
275314
276- perftest-producer : # # Run producer perf tests
315+ perftest-producer-internal : # # Run producer perf tests
277316 @echo " Running producer performance tests with HOST=$( PERFTEST_HOST) and ENV_TYPE=$( ENV_TYPE) and DIST_PATH=$( DIST_PATH) "
278- k6 run tests/performance/producer/perftest.js -e HOST=$(PERFTEST_HOST ) -e ENV_TYPE=$(ENV_TYPE ) -e DIST_PATH=$(DIST_PATH )
279-
280- perftest-consumer : # # Run consumer perf tests
317+ k6 run tests/performance/producer/perftest.js --summary-mode=full --out json=$(DIST_PATH ) /producer-internal-$$(date +%Y%m%d%H%M%S ) .json -e HOST=$(PERFTEST_HOST ) -e ENV_TYPE=$(ENV_TYPE ) -e DIST_PATH=$(DIST_PATH )
318+
319+ perftest-producer-public : check-warn # # Run the producer perftests for the external access points
320+ @echo " Starting token refresher in background with ENV=$( ENV) PERFTEST_TOKEN_REFRESH_PORT=$( PERFTEST_TOKEN_REFRESH_PORT) "
321+ ENV=$(ENV ) TOKEN_REFRESH_PORT=$(PERFTEST_TOKEN_REFRESH_PORT ) PYTHONPATH=. poetry run python ./tests/performance/token_refresher.py &
322+ trap " kill $$ (lsof -t -i :$( PERFTEST_TOKEN_REFRESH_PORT) ) 2>/dev/null" EXIT
323+ @echo " Fetching public mode configuration..."
324+ @CONFIG_FILE=$$(mktemp /tmp/perf_config_XXXXXX ) ; \
325+ trap " rm -f $$ CONFIG_FILE" EXIT; \
326+ PYTHONPATH=. poetry run python tests/performance/get_test_config.py $(ENV_TYPE ) 2>&1 | tail -n 1 > $$ CONFIG_FILE; \
327+ PUBLIC_BASE_URL=$$(jq -r '.public_base_url' $$CONFIG_FILE ) ; \
328+ echo " Running public producer perftests with ENV_TYPE=$( ENV_TYPE) and DIST_PATH=$( DIST_PATH) " ; \
329+ TEST_CONNECT_MODE=public \
330+ TEST_PUBLIC_BASE_URL=$$ PUBLIC_BASE_URL \
331+ TEST_CONFIG_FILE=$$ CONFIG_FILE \
332+ k6 run tests/performance/producer/perftest.js --summary-mode=full --out json=$(DIST_PATH ) /producer-public-$$(date +%Y%m%d%H%M%S ) .json -e ENV_TYPE=$(ENV_TYPE ) -e DIST_PATH=$(DIST_PATH )
333+ kill $$(lsof -t -i :$(PERFTEST_TOKEN_REFRESH_PORT ) )
334+
335+ perftest-consumer-internal :
281336 @echo " Running consumer performance tests with HOST=$( PERFTEST_HOST) and ENV_TYPE=$( ENV_TYPE) and DIST_PATH=$( DIST_PATH) "
282- k6 run tests/performance/consumer/perftest.js -e HOST=$(PERFTEST_HOST ) -e ENV_TYPE=$(ENV_TYPE ) -e DIST_PATH=$(DIST_PATH )
283-
284- perftest-generate-pointer-table-extract : # # Refresh the perf test input files in s3. Can be expensive to run on large tables
285- @echo " Generating pointer table extract with PERFTEST_TABLE_NAME=$( PERFTEST_TABLE_NAME) and DIST_PATH=$( DIST_PATH) "
337+ k6 run tests/performance/consumer/perftest.js --summary-mode=full --out json=$(DIST_PATH ) /consumer-internal-$$(date +%Y%m%d%H%M%S ) .json -e HOST=$(PERFTEST_HOST ) -e ENV_TYPE=$(ENV_TYPE ) -e DIST_PATH=$(DIST_PATH )
338+
339+ perftest-consumer-public : check-warn # # Run the consumer perftests for the external access points
340+ @echo " Starting token refresher in background with ENV=$( ENV) PERFTEST_TOKEN_REFRESH_PORT=$( PERFTEST_TOKEN_REFRESH_PORT) "
341+ ENV=$(ENV ) TOKEN_REFRESH_PORT=$(PERFTEST_TOKEN_REFRESH_PORT ) PYTHONPATH=. poetry run python ./tests/performance/token_refresher.py &
342+ trap " kill $$ (lsof -t -i :$( PERFTEST_TOKEN_REFRESH_PORT) ) 2>/dev/null" EXIT
343+ @echo " Fetching public mode configuration..."
344+ @CONFIG_FILE=$$(mktemp /tmp/perf_config_XXXXXX ) ; \
345+ trap " rm -f $$ CONFIG_FILE" EXIT; \
346+ PYTHONPATH=. poetry run python tests/performance/get_test_config.py $(ENV_TYPE ) 2>&1 | tail -n 1 > $$ CONFIG_FILE; \
347+ PUBLIC_BASE_URL=$$(jq -r '.public_base_url' $$CONFIG_FILE ) ; \
348+ echo " Running public consumer perftests with ENV_TYPE=$( ENV_TYPE) and DIST_PATH=$( DIST_PATH) " ; \
349+ TEST_CONNECT_MODE=public \
350+ TEST_PUBLIC_BASE_URL=$$ PUBLIC_BASE_URL \
351+ TEST_CONFIG_FILE=$$ CONFIG_FILE \
352+ k6 run tests/performance/consumer/perftest.js --summary-mode=full --out json=$(DIST_PATH ) /consumer-public-$$(date +%Y%m%d%H%M%S ) .json -e ENV_TYPE=$(ENV_TYPE ) -e DIST_PATH=$(DIST_PATH )
353+ kill $$(lsof -t -i :$(PERFTEST_TOKEN_REFRESH_PORT ) )
354+
355+ perftest-generate-pointer-table-extract :
356+ @echo " Generating pointer table extract with PERFTEST_TABLE_NAME=$( PERFTEST_TABLE_NAME) and ENV=$( ENV) and DIST_PATH=$( DIST_PATH) "
286357 rm -rf " ${DIST_PATH} /nft"
287358 mkdir -p " ${DIST_PATH} /nft"
288- PYTHONPATH=. poetry run python tests/performance/perftest_environment.py generate_pointer_table_extract --output_dir=" ${DIST_PATH} /nft"
359+ PYTHONPATH=. poetry run python tests/performance/perftest_environment.py generate_pointer_table_extract --output_dir=" ${DIST_PATH} /nft" --extract-size=2000000
289360 ./scripts/get-current-info.sh > " ${DIST_PATH} /nft/info.json"
290361 zip -r " ${DIST_PATH} /pointer_extract-${PERFTEST_TABLE_NAME} .zip" " ${DIST_PATH} /nft"
291362 aws s3 cp " ${DIST_PATH} /pointer_extract-${PERFTEST_TABLE_NAME} .zip" " s3://nhsd-nrlf--${ENV} -metadata/performance/seed-pointers-extract-${PERFTEST_TABLE_NAME} .zip"
0 commit comments