wrapture — monkey patching y observabilidad en un solo mecanismo

Publicado el 16 de September de 2026 en Programación

Simon Willison ha publicado una nota recomendando wrapture, la nueva librería de Graham Dumpleton (el autor de wrapt y autowrapt). Se lanzó el 31 de agosto y está en beta antes de 1.0.0, pero ya es muy usable. Su lema: "Wrap anything, capture everything, change nothing".

Documentación de wrapture

Qué es

wrapture (wrapt + capture) es una librería Python para enlazar bindings a puntos de llamada arbitrarios, sin modificar el código observado. Un solo mecanismo con tres usos:

  1. Monkey patching: ciclo de vida y vocabulario de comportamiento limpio sobre wrapt.wrap_object(): stub, fallo, transformación de argumentos o resultados, y reversión con detección honesta de parches desplazados.
  2. Testing unitario: observa y asevera cómo fluyeron las llamadas por el grafo real (anidamiento, orden, argumentos y retornos) e interviene opcionalmente. A diferencia de un Mock de unittest.mock (que fabrica valores y no ve llamadas que un objeto se hace a sí mismo), wrapture observa el código real y ofrece stub() y mock() estrictos.
  3. Tracing ad-hoc: adjunta bindings a una aplicación en ejecución —incluso una que no puedes modificar— y emite un trace estructurado y anidado.

Lo que me llama la atención

Configuración sin tocar código: con un archivo wrapture.toml que nombra los métodos y un sink, basta con:

python -m wrapture manage.py runserver

Y con autowrapt instalado, ni siquiera el lanzador:

AUTOWRAPT_BOOTSTRAP=wrapture python manage.py runserver

Export a OpenTelemetry: los mismos eventos registrados se pueden enviar a cualquier backend OTLP como traces, métricas y logs correlacionados con una tabla [otel] en la config, con identidad de trace propagada por cabeceras W3C traceparent entre servicios.

Instrumentación empaquetada: el paquete wrapture-instrumentation cubre flask, django, fastapi, starlette, aiohttp, httpx, requests, sqlalchemy, sqlite3, grpc, jinja2, uvicorn y más.

Ejemplo mínimo

place = wrapture.binding(OrderService, "place")
charge = wrapture.binding(Gateway, "charge")
record = wrapture.binding(Ledger, "record")

with wrapture.timeline(place, charge, record) as tape:
    OrderService().place(500)

print(tape.tree())

Ninguna de las clases sabe que está siendo observada.

Graham publica tutoriales casi a diario y hay workshops interactivos en JupyterLab. La idea de que un monkey patch de test pueda crecer hasta convertirse en observabilidad de producción sin reescribir código me parece una navaja suiza que dará juego durante años.

Fuente original: Don't sleep on wrapture — Simon Willison