These local-only Artillery scenarios exercise POST /api/workflows/[id]/execute in async mode.
- The app should be running locally, for example with
bun run dev:full - Each scenario needs valid workflow IDs and API keys
- All scenarios default to
http://localhost:3000
The default rates are tuned for these local limits:
ADMISSION_GATE_MAX_INFLIGHT=500DISPATCH_MAX_QUEUE_PER_WORKSPACE=1000DISPATCH_MAX_QUEUE_GLOBAL=50000WORKSPACE_CONCURRENCY_FREE=5WORKSPACE_CONCURRENCY_PRO=50WORKSPACE_CONCURRENCY_TEAM=200WORKSPACE_CONCURRENCY_ENTERPRISE=200
That means the defaults are intentionally aimed at forcing queueing for a Free workspace without overwhelming a single local dev server process.
Use this to ramp traffic into one workflow and observe normal queueing behavior.
Default profile:
- Starts at
2requests per second - Ramps to
8requests per second - Holds there for
20seconds - Good for validating queueing against a Free workspace concurrency of
5
WORKFLOW_ID=<workflow-id> \
SIM_API_KEY=<api-key> \
bun run load:workflow:baselineOptional variables:
BASE_URLWARMUP_DURATIONWARMUP_RATEPEAK_RATEHOLD_DURATION
For higher-plan workspaces, a good local starting point is:
- Pro:
PEAK_RATE=20to40 - Team or Enterprise:
PEAK_RATE=50to100
Use this to send repeated bursts to one workflow in the same workspace.
Default profile:
- Wave 1:
6requests per second for10seconds - Wave 2:
8requests per second for15seconds - Wave 3:
10requests per second for20seconds - Quiet gaps:
5seconds
WORKFLOW_ID=<workflow-id> \
SIM_API_KEY=<api-key> \
bun run load:workflow:wavesOptional variables:
BASE_URLWAVE_ONE_DURATIONWAVE_ONE_RATEQUIET_DURATIONWAVE_TWO_DURATIONWAVE_TWO_RATEWAVE_THREE_DURATIONWAVE_THREE_RATE
Use this to send mixed traffic to two workflows from different workspaces and compare whether one workspace's queue pressure appears to affect the other.
Default profile:
- Total rate:
9requests per second for30seconds - Weight split:
8:1 - In practice this sends heavy pressure to workspace A while still sending a light stream to workspace B
WORKFLOW_ID_A=<workspace-a-workflow-id> \
SIM_API_KEY_A=<workspace-a-api-key> \
WORKFLOW_ID_B=<workspace-b-workflow-id> \
SIM_API_KEY_B=<workspace-b-api-key> \
bun run load:workflow:isolationOptional variables:
BASE_URLISOLATION_DURATIONTOTAL_RATEWORKSPACE_A_WEIGHTWORKSPACE_B_WEIGHT
load:workflowis an alias forload:workflow:baseline- All scenarios send
x-execution-mode: async - Artillery output will show request counts and response codes, which is usually enough for quick local verification
- At these defaults, you should observe queueing behavior before you approach
ADMISSION_GATE_MAX_INFLIGHT=500orDISPATCH_MAX_QUEUE_PER_WORKSPACE=1000 - If you still see lots of
429orETIMEDOUTresponses locally, lower the rates again before increasing durations