Logs y Trazas
Swisblade provee observabilidad integrada para cada proyecto. Los logs y trazas distribuidas se recopilan automaticamente, sin necesidad de cambios en el codigo.
Logs
Recopilacion automatica
El stdout/stderr de cada contenedor se captura y almacena automaticamente. No necesitas configurar una libreria de logging ni un sistema de reenvio de logs.
Ver logs
Ve a Proyecto -> Logs en el dashboard para ver:
- Streaming de logs en tiempo real para contenedores en ejecucion
- Logs historicos filtrables por servicio
- Logs de despliegue con salida de compilacion
Formato de logs
Los logs de tu aplicacion se capturan tal cual. Para mejores resultados, usa logging estructurado (JSON):
console.log(JSON.stringify({
level: "info",
message: "Order created",
orderId: "12345",
userId: "user-789"
}));
Los logs estructurados son mas faciles de buscar y filtrar en el dashboard.
Trazas distribuidas
Que son las trazas?
Una traza sigue una peticion individual mientras fluye a traves de tus servicios. Por ejemplo, una peticion a la API que consulta una base de datos y publica un mensaje en una cola crea una traza con tres spans:
API (150ms)
├── PostgreSQL query (12ms)
└── RabbitMQ publish (3ms)
Instrumentacion automatica
Swisblade inyecta instrumentacion OpenTelemetry en tu aplicacion automaticamente segun el campo runtime:
| Runtime | Que se rastrea |
|---|---|
node | Peticiones HTTP, consultas a base de datos, comandos Redis, operaciones de cola de mensajes |
python | Peticiones HTTP, consultas a base de datos, comandos Redis, operaciones de cola de mensajes |
java | Peticiones HTTP, JDBC, Redis, mensajeria |
No se necesitan cambios en el codigo ni dependencias adicionales. La instrumentacion se ejecuta como sidecar e intercepta las llamadas de librerias estandar.
Ver trazas
Ve a Proyecto -> Trazas en el dashboard para ver:
- Lista de trazas recientes con duracion y estado
- Vista de cascada mostrando la linea de tiempo de los spans
- Detalles del span (metodo HTTP, codigo de estado, sentencia de base de datos, etc.)
- Trazas con errores resaltadas en rojo
Contexto de trazas
Las trazas estan limitadas a tu proyecto. Cada traza lleva el slug de tu proyecto como parte del nombre del servicio:
{project-slug}/{service-name}
Esto asegura que las trazas de diferentes proyectos nunca se mezclen.
Retencion
| Datos | Periodo de retencion |
|---|---|
| Logs | 24 horas |
| Trazas | 24 horas |
Los logs y trazas con mas de 24 horas se eliminan automaticamente.
Los periodos de retencion podrian aumentar con planes de pago en el futuro.
Buenas practicas
Logging estructurado
Usa logs JSON con campos consistentes:
import json, logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Good: structured
logger.info(json.dumps({"event": "user_signup", "user_id": "123"}))
# Bad: unstructured
logger.info(f"User 123 signed up")
Nombres de servicio descriptivos
Elige nombres de servicio descriptivos en stack.json. Estos aparecen en las trazas y logs:
"services": {
"api-gateway": { ... }, // ✓ Claro
"payment-worker": { ... }, // ✓ Claro
"svc1": { ... } // ✗ No es util
}
Manejo de errores
Las trazas capturan automaticamente excepciones y codigos de estado de error. Retorna codigos de estado HTTP apropiados desde tu API para que los errores sean visibles en la vista de trazas:
// Returns a trace span with status: ERROR
app.get("/order/:id", (req, res) => {
const order = db.find(req.params.id);
if (!order) return res.status(404).json({ error: "Not found" });
res.json(order);
});