Skip to content
Talk to our solutions team

Operations

Tenant scripts are isolated at the process level, not merely by runtime sandbox. A runaway script consumes its own process’s quota and is killed there; it does not degrade the service or another tenant.

This is why the block exists as a service rather than a library linked into every caller. A sandbox inside the calling process still shares that process’s memory limits and scheduler.

Enforced per execution:

  • CPU — how much compute one execution may consume
  • Memory — the ceiling before the execution is terminated
  • Wall-clock — the timeout

Set these for the worst script you will accept, not the typical one. Limits exist for the pathological case, and a generous timeout is how a hung script becomes a capacity problem.

Runtime choice is an operational decision as much as an authoring one:

RuntimeStartupNotes
CEL, exprFastestSingle expressions; cannot loop indefinitely
Lua, StarlarkFastSmall, predictable footprint
JavaScript (Goja)ModeratePure Go, no external dependency
JavaScript (V8)Slower start, faster runWorth it for heavy compute, not for hooks
Go (Yaegi)SlowerInterpreted Go
WebAssemblyFast runCompiled elsewhere; the artifact is opaque to review

For a hook on a request path, startup cost dominates and CEL or Lua is usually right. For a batch transform, run speed dominates and V8 may pay for itself.

A script exceeds its quota. Terminated, and the caller receives an error. This is working as intended — the alternative is the script deciding the service’s resource policy.

A script hangs on a network call. The wall-clock limit catches it. Scripts making outbound calls should carry their own timeouts too; relying on the execution timeout means a slow dependency consumes the whole budget.

A namespace is unavailable. The script fails on the call rather than silently no-op’ing. Usually the invoking context did not bind that namespace — see Namespace Reference.

Async results are not collected. Submitted executions produce results someone must retrieve. Unread results accumulate.

SignalWhy it matters
Quota terminations by tenantA script that outgrew its limits, or one misbehaving
p99 execution time by runtimeRuntime choice mismatched to the workload
Async queue depthSubmissions outpacing execution, or results uncollected
Namespace denial rateScripts written against namespaces they are not granted
Process restart rateScripts crashing their sandbox rather than exiting cleanly

Namespace denials are the most informative signal for a platform team. A rising rate usually means authors expect a capability the invoking context does not grant — either the binding is too narrow, or the script belongs in a different context.