- Pass-through by default. With no stages attached (or with the SDK disabled), a VPoint runs the original function directly on a fast path. You can merge instrumentation before any registry exists.
- You choose what to instrument. Varianz doesn’t require instrumenting all your code — annotate the functions that matter: payment charges, external calls, decision points you want to test around.
- Session-scoped control. Stages attach per test session; traffic without a session ID never sees them.
Names
Every VPoint has a name. Give it explicitly, inscope/entity form:
/. The first segment is a logical grouping (often the owning domain or service area); the last is the operation. Under the hood, names canonicalize to a four-part form (org/pkg/scope/entity) with the missing parts derived from your code’s package structure — tests can target a VPoint by any unambiguous suffix on / boundaries. See Naming and routing for the full rules.
Schemas
When a VPoint registers, the SDK derives a schema from the function’s parameter and return types — field names, types, and nested structures. The schema is what makes stages safe: CEL expressions are validated against it before they run, so a typo’d field name or a wrong type is caught at insert time, not in the middle of a test. Where the schema comes from differs by language:
Prefer the static path (annotations, scanner, codegen) — lazily-resolved VPoints don’t exist in the registry until their first call, which means tests need a warmup request before stages can apply. See Build integration.
VPoints in each language
The registration idiom follows each language’s conventions — decorators in Python and TypeScript, a higher-order wrapper in Go, annotations in Java and Kotlin:
For the step-by-step walkthrough, see Instrument a service.
