Ir al contenido

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).

  1. 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.

  2. Agregá el ejemplo que corresponda a tu sistema (abajo).

  3. Probalo con curl o PowerShell: el error aparece en la lista del despliegue.

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.
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 exc

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):

Ventana de terminal
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:

Ventana de terminal
Invoke-RestMethod -Method Post -Uri "https://…/errors/…" -ContentType "application/json" -Body '{"message": "Prueba desde PowerShell", "type": "PruebaError", "level": "error"}'