Skip to content

What happens at run time

This page describes what MaxoPerf does with a test’s dependencies from the moment you start a run until it releases them. The per-kind pages cover the choices you make when you bind each one.

When you start a run that has virtual service, tunnel or browser fleet bindings, MaxoPerf records one lease for each of them. Before it starts any runner, it checks every lease once every 5 seconds and brings up what is stopped. While any lease is still waiting, the run page shows a Preparing dependencies banner that names each one.

The phase ends in one of three ways:

  • Every lease is Ready. The runners start with the dependency variables set.
  • A lease cannot come up. The run fails with the cause Dependency unavailable and no runner starts.
  • You cancel the run. MaxoPerf releases the leases and closes out the runners that never started.

The wait is capped at 600 seconds by default. A secret and a dataset have no lease and add no wait.

StateMeaning
PreparingMaxoPerf is waiting for the dependency to come up.
ReadyThe dependency is up and its variables are set for the runners.
FailedThe dependency could not come up, and the run failed.
DegradedA tunnel that was ready went offline during the run.

When the run ends, MaxoPerf releases every lease. A finished run keeps each row’s last state (normally Ready), so the tab records what the run used. It does not show a separate released state.

When the run ends, MaxoPerf releases every lease and stops what the run started:

  • A virtual service or browser fleet the run started is stopped. One that was already running keeps running.
  • When two runs hold the same dependency, the run that started it hands the duty to the other. The last run to release it stops it.
  • A tunnel is never stopped by a run.
  • If a release is missed, a sweep releases the leases of finished runs about five minutes after the run ends.

The run detail page gets a Dependencies tab once the run holds at least one lease. Each row shows the kind, the name, the variables injected, the lease state, a Started by this run badge when it brought the dependency up, and a link:

RowLink
Virtual serviceOpen analytics, limited to the run’s time window
TunnelOpen stats, limited to the run’s time window
Browser fleetOpen sessions
SecretNone. The row shows the variable name only.

Rows for virtual services and tunnels carry the note All traffic during this run, because the service and tunnel pages count every request in that window. If a tunnel goes offline mid-run, a banner reads “Tunnel <name> disconnected during this run”.

The run's Dependencies tab after a passed run. The secret row shows the variable name only.

A VarioTest run or a run with an EUX probe is a composite run. The Dependencies tab lists the leases of every member and adds a Member column that links to the member’s run. Both a member’s own bindings and its master test’s bindings apply:

  • For virtual services, tunnels and browser fleets, a name defined by both is taken from the master test. The master’s Dependencies tab warns about the clash.
  • For secrets, the member’s value wins.
A composite run lists the leases of every member, labeled in the Member column.

Rotating a secret or stopping a service that another test depends on can break that test’s next run without warning. Used by shows what depends on an entity before you touch it. It appears on the secret row (a Used by button), and on the virtual service, tunnel and browser fleet pages. It lists the tests that bind the entity with their variable names and whether each binding is manual or inline, a count of tests you cannot view, and any run holding a live lease on it. The same data is available from the API. See Automate.

  • A tunnel’s expiry (TTL) and a fleet’s lifetime (TTL) are hard caps. The tunnel or fleet ends at that moment even if a run is using it. A tunnel that expires mid-run goes offline, and its lease turns Degraded.
  • A run never stops a tunnel. Only you, through the CLI, console or API, stop one.
  • Runners you add to a live run with Add runners do not receive the run’s injected environment. That covers the dependency variables and secrets. Choose the runner count before you start a run that depends on a virtual service, tunnel or fleet.
  • Within one test, two bindings cannot inject the same variable name. Binding a virtual service, tunnel or fleet under a name another binding on the test already uses is rejected with 409 env_var_conflict.
  • A tunnel and a fleet belong to the workspace they were created in, and a test can only bind a tunnel or fleet from its own workspace.

The run failed with “Dependency unavailable”. Open the run’s failure summary or Dependencies tab. The message names the dependency and the reason:

MessageCause and fix
Virtual service <name> did not come online within 600sThe deploy took too long. Open the service, fix the cause, rerun.
Virtual service <name> entered an error stateThe service failed after the run started it. Redeploy it from its page.
Virtual service <name> is not running and auto-start is disabledStart the service, or turn on Auto-start with the run for the binding.
Tunnel <name> did not come online within 600sYour tunnel client did not connect. Start the client, rerun.
Tunnel <name> was stopped by plan limit; start it manuallyStart the tunnel from its page, then rerun. A plan limit can mean freeing a slot first.
Tunnel <name> was stopped by expiry; start it manuallyThe tunnel passed its TTL. Start it again, then rerun.
<Kind> <name> could not be foundThe dependency was deleted. Rebind or recreate it.

A URL in an engine error looks like [REDACTED]. The runner redacts every injected environment value from the errors it reports, dependency addresses as well as secrets, so a service, tunnel or fleet address can show as [REDACTED]. The run’s Dependencies tab and the entity’s own page still show the real address.

The script says a variable is not set. The variable is only injected when the binding exists on the test the run executes. Check the test’s Dependencies tab for the exact name, and see “Limits” above if the runner was added after the run started.

  • Automate: inspect leases and usage from the API and MCP tools.
  • Worked example: follow one run through the preparing phase.