Observabilidad y logging estructurado
Correlaciona logs redactados, trazas OpenTelemetry, readiness de cola y alertas entre web y workers.
Sincronizado con el commit
2a1a04adel starter.
Usa esta página para que soporte e incidentes sean posibles antes del primer incidente. Sushi SaaS emite JSON a stdout; deliberadamente no elige por ti proveedor de almacenamiento de logs, retención, cuadros de mando ni alertas.
OpenTelemetry es opcional y neutral. Configura OTEL_ENABLED=true, un OTEL_SERVICE_NAME distinto por proceso y endpoint/headers OTLP estándar. Se exportan spans de requests, fetch y jobs; los logs dentro de un span incluyen trace_id y span_id. Sin habilitarlo no tiene efecto.
/api/ready expone conteos sin payload, jobs fallidos/obsoletos y edad del más antiguo. Trabajo fallido o con más de diez minutos degrada la cola sin retirar tráfico; un fallo de dependencia sigue devolviendo 503.
Toma tres decisiones operativas
- Envía stdout al colector de tu plataforma o a Datadog, Better Stack, Grafana u otro servicio. El contrato de la aplicación no cambia.
- Usa
infoen producción salvo durante una investigación concreta.debugaumenta volumen y puede reducir la retención útil. - Decide qué identificadores puede buscar soporte. Los IDs de petición, organización, trabajo, pedido y evento Stripe ayudan; los correos y payloads completos normalmente no.
Está listo para producción cuando: una petición se sigue hasta el proveedor con un ID, un secreto de prueba queda oculto, el usuario recibe un error seguro y traducido, y una alerta abre la consulta de logs que necesita el operador.
Node usa Pino y edge emite el mismo contrato JSON. Los logs van a stdout para la plataforma; la aplicación no gestiona archivos. LOG_LEVEL: debug, info, warn o error.
Propaga el request ID por rutas, servicios, jobs, órdenes/eventos Stripe y proveedores. Registra campos como evento, org_uuid, UUID seguro, job/order, duración y resultado, no solo prosa.
Se redactan authorization, cookies, contraseñas, tokens y claves. No registres cuerpos crudos, URLs firmadas ni exportaciones. respError guarda contexto interno y devuelve error_code traducido; nunca expongas error.message.
Monitoriza readiness, cron, reintentos agotados, webhooks action-required, latencia y 5xx. Correlaciona Slack con IDs; Slack no almacena logs.
Siguiente paso: convierte las señales importantes en alertas accionables con Notificaciones de Slack.