Reportar errores
Cada despliegue puede recibir los errores de su sistema. El CRM los agrupa, avisa los nuevos y los convierte en incidentes o defectos (ver Operación → Errores).
-
En el CRM, entrá a Operación, abrí el despliegue y, en Errores, generá el token. El CRM muestra la URL para mandar errores, una sola vez, con los ejemplos listos para copiar.
-
Agregá el ejemplo que corresponda a tu sistema (abajo).
-
Probalo con
curlo PowerShell: el error aparece en la lista del despliegue.
Qué se manda
Sección titulada «Qué se manda»Un POST con un JSON a la URL del despliegue:
| Campo | Qué es |
|---|---|
message |
El mensaje del error (obligatorio). |
type |
El tipo, por ejemplo ValueError. |
level |
error o critical. |
stacktrace |
La traza completa. |
environment |
production, staging… |
release |
La versión del sistema. |
route |
La ruta o pantalla donde pasó. |
extra |
Cualquier dato más, como objeto. |
- Hasta 64 KB por error y 60 errores por minuto por despliegue; lo que excede se cuenta pero no se guarda.
- Antes de guardar, el CRM borra los valores de campos con nombres de secretos (
password,token,secret,authorization,cookie,api_key) y los encabezados de autenticación. - El CRM responde enseguida, sin esperar a procesarlo.
Python y FastAPI
Sección titulada «Python y FastAPI»import json, logging, traceback, urllib.request
CRM_ERRORS_URL = "https://…/errors/…" # la URL que te dio el CRM
def report_error(exc: BaseException, level: str = "error", **extra) -> None: """Manda un error al CRM; nunca frena a la aplicación.""" body = { "message": str(exc), "type": type(exc).__name__, "level": level, "stacktrace": "".join(traceback.format_exception(exc)), "environment": "production", "release": "1.0.0", "extra": extra, } try: req = urllib.request.Request(CRM_ERRORS_URL, data=json.dumps(body).encode(), headers={"Content-Type": "application/json"}) urllib.request.urlopen(req, timeout=3) except Exception: logging.getLogger(__name__).warning("No se pudo mandar el error al CRM")
# FastAPI: los errores que no se atraparon.# @app.exception_handler(Exception)# async def crm_errors(request, exc):# report_error(exc, route=str(request.url.path))# raise excEn el navegador
Sección titulada «En el navegador»Antes de cerrar el <body>:
<script> (function () { var URL = "https://…/errors/…"; // la URL que te dio el CRM function send(body) { try { var blob = new Blob([JSON.stringify(body)], { type: "text/plain" }); navigator.sendBeacon(URL, blob); } catch (e) {} } window.addEventListener("error", function (e) { var err = e.error || {}; send({ message: e.message, type: err.name, stacktrace: err.stack, route: location.pathname, environment: "production" }); }); window.addEventListener("unhandledrejection", function (e) { var r = e.reason || {}; send({ message: String(r.message || r), type: r.name || "UnhandledRejection", stacktrace: r.stack, route: location.pathname, environment: "production" }); }); })();</script>Va como text/plain a propósito: así el navegador no necesita pedir permiso previo (CORS) para mandarlo.
Con curl (sirve en el cmd de Windows, Git Bash, Linux y Mac):
curl -fsS -m 10 -X POST "https://…/errors/…" -H "Content-Type: application/json" -d "{\"message\": \"Prueba desde curl\", \"type\": \"PruebaError\", \"level\": \"error\"}"En PowerShell, curl es otro comando; usá el suyo:
Invoke-RestMethod -Method Post -Uri "https://…/errors/…" -ContentType "application/json" -Body '{"message": "Prueba desde PowerShell", "type": "PruebaError", "level": "error"}'