vexlo. It runs inside your process, marks functions, captures
their values, and writes records to the spool directory on the same host. The relay daemon
that forwards those records is a separate process, not something inside yours; it is covered
on the relay daemon page.
Requirements
The package ships
py.typed, so mypy and other type checkers read its annotations.
@vexlo.trace and @vexlo.step are typed with typing.ParamSpec, which is what sets the
3.10 floor.
Install from a checkout
vexlo is not yet published on PyPI, so the package is installed from a checkout of the
vexlo-sdk-python repository. Both forms below install the same package.
src/ directory instead, so a change there is picked up by
the next interpreter start without reinstalling.
Below the floor, pip refuses before installing anything. On Python 3.9.6 the same command
ends with:
Verify the install
The two outputs below are from Python 3.14.8. Import the package and print its public surface:The public surface
vexlo.__all__ is the whole public surface. Everything else under vexlo. is private and
changes without notice.
Two exception classes are not exported, and both subclass
VexloError, so a host catches
vexlo.VexloError: ConfigurationError, which init() raises on bad configuration, and
UnsupportedCallable, which a marker raises at decoration over a classmethod, property,
cached_property, or partialmethod object. Those two moments are the only ones that raise
whatever else is configured. A marker, tag(), and flush() raise into the host only under
init(strict=True); see
the never-raise boundary.
Next: initialise the SDK and record a first trace.