diff --git a/cli/scaletest.go b/cli/scaletest.go index 6330ca6600813..e18f281ea7f9c 100644 --- a/cli/scaletest.go +++ b/cli/scaletest.go @@ -902,10 +902,10 @@ func (r *RootCmd) scaletestWorkspaceTraffic() *clibase.Cmd { _, _ = fmt.Fprintln(inv.Stderr, "\nUploading traces...") if err := closeTracing(ctx); err != nil { _, _ = fmt.Fprintf(inv.Stderr, "\nError uploading traces: %+v\n", err) - // Wait for prometheus metrics to be scraped - _, _ = fmt.Fprintf(inv.Stderr, "Waiting %s for prometheus metrics to be scraped\n", scaletestPrometheusWait) - <-time.After(scaletestPrometheusWait) } + // Wait for prometheus metrics to be scraped + _, _ = fmt.Fprintf(inv.Stderr, "Waiting %s for prometheus metrics to be scraped\n", scaletestPrometheusWait) + <-time.After(scaletestPrometheusWait) }() tracer := tracerProvider.Tracer(scaletestTracerName) diff --git a/scaletest/lib/coder_workspacetraffic.sh b/scaletest/lib/coder_workspacetraffic.sh index 4be16a39fa998..9c53db2a53163 100755 --- a/scaletest/lib/coder_workspacetraffic.sh +++ b/scaletest/lib/coder_workspacetraffic.sh @@ -2,29 +2,68 @@ set -euo pipefail -if [[ $# -lt 1 ]]; then - echo "Usage: $0 " - exit 1 -fi +PROJECT_ROOT="$(git rev-parse --show-toplevel)" +# shellcheck source=scripts/lib.sh +source "${PROJECT_ROOT}/scripts/lib.sh" # Allow toggling verbose output [[ -n ${VERBOSE:-} ]] && set -x -LOADTEST_NAME="$1" -PROJECT_ROOT="$(git rev-parse --show-toplevel)" +SCALETEST_NAME="${SCALETEST_NAME:-}" +SCALETEST_TRAFFIC_BYTES_PER_TICK="${SCALETEST_TRAFFIC_BYTES_PER_TICK:-1024}" +SCALETEST_TRAFFIC_TICK_INTERVAL="${SCALETEST_TRAFFIC_TICK_INTERVAL:-100ms}" + +script_name=$(basename "$0") +args="$(getopt -o "" -l help,name:,traffic-bytes-per-tick:,traffic-tick-interval:, -- "$@")" +eval set -- "$args" +while true; do + case "$1" in + --help) + echo "Usage: $script_name --name [--traffic-bytes-per-tick ] [--traffic-tick-interval --project --num-workspaces --scenario [--dry-run] [--skip-cleanup]" + echo "Usage: $script_name --name --project --num-workspaces --scenario [--dry-run] [--skip-cleanup] [--create-concurrency=]" exit 1 ;; --name) @@ -49,6 +56,14 @@ while true; do SCALETEST_SKIP_CLEANUP=1 shift ;; + --traffic-bytes-per-tick) + SCALETEST_TRAFFIC_BYTES_PER_TICK="$2" + shift 2 + ;; + --traffic-tick-interval) + SCALETEST_TRAFFIC_TICK_INTERVAL="$2" + shift 2 + ;; --) shift break @@ -144,16 +159,21 @@ echo "Creating ${SCALETEST_NUM_WORKSPACES} workspaces." DRY_RUN="$DRY_RUN" "${PROJECT_ROOT}/scaletest/lib/coder_shim.sh" scaletest create-workspaces \ --count "${SCALETEST_NUM_WORKSPACES}" \ --template=kubernetes \ - --concurrency 10 \ + --concurrency "${SCALETEST_CREATE_CONCURRENCY}" \ --no-cleanup echo "Sleeping 10 minutes to establish a baseline measurement." maybedryrun "$DRY_RUN" sleep 600 echo "Sending traffic to workspaces" -maybedryrun "$DRY_RUN" "${PROJECT_ROOT}/scaletest/lib/coder_workspacetraffic.sh" "${SCALETEST_NAME}" +maybedryrun "$DRY_RUN" "${PROJECT_ROOT}/scaletest/lib/coder_workspacetraffic.sh" \ + --name "${SCALETEST_NAME}" \ + --traffic-bytes-per-tick "${SCALETEST_TRAFFIC_BYTES_PER_TICK}" \ + --traffic-tick-interval "${SCALETEST_TRAFFIC_TICK_INTERVAL}" maybedryrun "$DRY_RUN" kubectl --kubeconfig="${KUBECONFIG}" -n "coder-${SCALETEST_NAME}" wait pods coder-scaletest-workspace-traffic --for condition=Ready -maybedryrun "$DRY_RUN" kubectl --kubeconfig="${KUBECONFIG}" -n "coder-${SCALETEST_NAME}" logs -f pod/coder-scaletest-workspace-traffic + +echo "Sleeping 15 minutes for traffic generation" +maybedryrun "$DRY_RUN" sleep 900 echo "Starting pprof" maybedryrun "$DRY_RUN" kubectl -n "coder-${SCALETEST_NAME}" port-forward deployment/coder 6061:6060 & @@ -168,6 +188,7 @@ while ! maybedryrun "$DRY_RUN" timeout 1 bash -c "echo > /dev/tcp/localhost/6061 echo "pprof failed to become ready in time!" exit 1 fi + pprof_attempt_counter+=1 maybedryrun "$DRY_RUN" sleep 3 done diff --git a/scaletest/terraform/main.tf b/scaletest/terraform/main.tf index 280420cecf267..c80478f513b64 100644 --- a/scaletest/terraform/main.tf +++ b/scaletest/terraform/main.tf @@ -31,5 +31,5 @@ terraform { } } - required_version = "~> 1.4.0" + required_version = "~> 1.5.0" }