Run an Arena load test
EnterpriseRun an ArenaJob of type loadtest to replay a project’s scenarios at controlled concurrency against providers or agents, and fail the run when it breaks your SLO thresholds.
Prerequisites
Section titled “Prerequisites”- Arena is an Enterprise feature: the app chart has
enterprise.enabled=true, and any license you install covers load testing. See Install with a License. - A
ReadyArenaProject whose arena config holds the scenarios to replay. - A
Provider, or a deployedAgentRuntime, in the same namespace to load.
Start a load test from the dashboard
Section titled “Start a load test from the dashboard”- Open the project and select Run this project.
- In the dialog, select Load test. The dialog shows concurrency, virtual users, workers, duration, arrivals per second, ramp up and down, a budget and any number of thresholds.
- Tick the providers to load. To load a deployed agent, tick it under Deployed agents; agents are off by default.
- Select Run.
A field you leave blank is omitted from the job, so the defaults apply. Arrivals / s stays disabled until you enter a duration.
After a run finishes, select Rerun profile on its page to repeat the load profile, SLO gates, budget and session recording.
The remaining steps write the same job as YAML, which is the form CI uses.
Create the job
Section titled “Create the job”-
Write the job. The values here are examples; replace the names and numbers with your own.
apiVersion: omnia.altairalabs.ai/v1alpha1kind: ArenaJobmetadata:name: checkout-loadtestnamespace: defaultspec:sourceRef:name: checkout-configtype: loadtesttrials: 500providers:default:- providerRef:name: gpt4-prodworkers:replicas: 4loadTest:concurrency: 20vusPerWorker: 8thresholds:- metric: latency_p95operator: "<"value: "3s"- metric: error_rateoperator: "<"value: "0.01"The job type defaults to
evaluation, so settype: loadtest. The volume isscenarios × providers × trials, andspec.trialsoverrides any per-scenario trial count. -
Choose what to load. Each
providersentry is aproviderRefor anagentRef:providers:default:- agentRef:name: checkout-agentAn
agentRefentry drives the agent’s facade over WebSocket and is the only target that measures time-to-first-token. AproviderRefentry measures total duration only. -
Size the load.
concurrencycaps the work items in flight across all workers, and the cap is divided among the worker pods. Setworkers.replicas × loadTest.vusPerWorkerto at leastconcurrency, or the virtual users become the limit. Both settings default to1, which runs sequentially. -
To hold the load for a length of time instead of draining a fixed matrix, add a duration:
loadTest:concurrency: 20duration: "10m"With a
duration, the workers generate requests from the scenario × provider pool until the clock runs out, andtrialsis ignored. -
To offer a fixed arrival rate instead of holding a fixed concurrency, add
rateto a job that has aduration:loadTest:concurrency: 50duration: "10m"rate: 20concurrencybecomes a safety ceiling. Arrivals the workers cannot keep up with are dropped and counted, never queued; gate on them with anarrival_lagthreshold. -
To ramp the load, add a
rampblock with Go duration strings:loadTest:ramp:up: "2m"down: "30s" -
Gate on SLOs with
loadTest.thresholds. Each rule has ametric, anoperator(<,>,<=,>=) and avalue. Latency and time-to-first-token values are durations ("3s","500ms"), rate metrics are ratios from 0 to 1 ("0.01"), andtotal_costis a number ("50.00"). See the ArenaJob CRD page for every metric and what it needs. -
Cap spend with
budgetLimitat the top ofspec, not underloadTest:spec:budgetLimit: "25.00"budgetCurrency: "USD"The value is a bare decimal with no currency symbol. When the run’s accumulated cost crosses the limit, the run stops, discards the queued work and fails. The cap is a ceiling, so requests already in flight finish.
A
budgetLimitwritten underspec.loadTestis pruned by the API server without an error, and the run has no cap. -
To store the conversations as sessions, set
sessionRecording: true. It isfalseby default, which keeps session-api out of the path of a high-volume run. Adatagenrun records its conversations regardless, because its sessions are its corpus. In a workspace with several service groups, name the one to record into withspec.serviceGroup. -
Apply the job:
Terminal window kubectl apply -f checkout-loadtest.yaml
Verify
Section titled “Verify”The ArenaJob creates an ArenaRun for the execution. Its phase and results are on the run, not on the job.
kubectl get arenarunkubectl get arenarun <run-name> -o yamlFind <run-name> in the first command, or in the job’s status.lastRunRef. In status.result.summary, each threshold appears as a threshold:<metric> entry and thresholds_passed counts them. The run reaches Succeeded when every threshold passes. An enumerated run (no duration) also fails when any item fails.
See Monitor Arena jobs for progress and results.
Troubleshooting
Section titled “Troubleshooting”A threshold reports unavailable and the run passes
Section titled “A threshold reports unavailable and the run passes”A metric that could not be measured passes. A latency percentile needs a latency distribution, which a run keeps when it has a duration or when concurrency or vusPerWorker is above 1. A ttft_* metric also needs an agentRef entry, and arrival_lag needs loadTest.rate. Check that a rule you rely on in CI reports a number.
A threshold reports parse error and the run fails
Section titled “A threshold reports parse error and the run fails”The value cannot be read for its metric, for example "3 seconds" or "$25". Use a duration, a ratio from 0 to 1, or a plain number as listed in step 7.
The run fails with BudgetExceeded
Section titled “The run fails with BudgetExceeded”The run’s cost crossed budgetLimit. status.result.summary holds totalCost and drainedItems, the number of queued items discarded. Raise the limit or reduce the load.
The run fails with ServiceGroupAmbiguous
Section titled “The run fails with ServiceGroupAmbiguous”The workspace has several service groups and the job names none. Set spec.serviceGroup.
The run stays Pending with JobCreationFailed
Section titled “The run stays Pending with JobCreationFailed”With sessionRecording: true, the named service group does not exist or declares no session-api, so the controller cannot create the worker Job and retries with backoff. Fix spec.serviceGroup or the workspace’s service groups.
Related pages
Section titled “Related pages”- ArenaJob CRD: every
spec.loadTestfield, metric and status key - Monitor Arena jobs: track progress and results
- Set up Arena scheduled jobs: run recurring load tests
- Troubleshoot Arena Fleet: diagnose stuck or failing jobs