Atributos de Span
Son un conjunto clave-valor, en Jaeger se muestran en tags, que nos informa de lo que ocurrió en ese span. Proporcionan contexto adicional e información detallada sobre una operación específica.
A continuación podemos ver a qué base de datos fue la conexión, el puerto usado, etc. Además, en la pestaña process podemos ver información sobre el runtime y el entorno en el que ese span fue ejecutado.

Algunos ejemplos prácticos de span attributes que se generan.
En peticiones HTTP:
{
"http.method": "GET",
"http.url": "/api/users",
"http.status_code": 200,
"http.user_agent": "Mozilla/5.0..."
}
En operaciones de base de datos:
{
"db.system": "postgresql",
"db.name": "users_db",
"db.statement": "SELECT * FROM users",
"db.user": "app_user"
}
En sistemas distribuidos:
{
"service.name": "payment-service",
"service.version": "1.2.0",
"deployment.environment": "production"
}
Podemos usar estos valores para filtrado de forma que sea más fácil buscar lo que queremos y entender más sobre ese intervalo de tiempo.
Hasta ahora estos atributos fueron generados automáticamente por la instrumentación que hicimos, pero podemos extenderlos a más atributos de nuestro interés. En la mayoría de los casos, los elementos que añadirás están relacionados específicamente con tu aplicación.
Podríamos añadir un userId detrás de este rastreo. La mayoría de los rastros (traces) que se recopilan ocurrieron porque nuestro cliente final hizo algo en nuestro sistema. Saber qué usuario causó ese trace será muy útil al intentar depurar algo.
Vamos a nuestro código en auth-service.ts. Lo que hacemos es básicamente definir el usuario en este fragmento.
app.get('/auth', (req, res) => {
// Añadí el userID ahora
res.json({ username: 'David Prata', userId: 12345 });
});
Vamos a crear un atributo. Vale la pena recordar que hay casos en los que el activeSpan no existirá y dependiendo del lenguaje que estés usando es necesario verificar antes de establecer el atributo.
import opentelemetry from "@opentelemetry/api"; // ¡Recordar importar!
app.get('/auth', (req, res) => {
res.json({ username: 'David Prata', userId: 123345 });
// Podríamos establecer un atributo como un map para varios valores si es necesario, aquí vamos a usar solo el userId
opentelemetry.trace.getActiveSpan()?.setAttribute('userId', 123456);
});
Vamos a llamar de nuevo al curl y ver lo que tenemos en Jaeger.
❯ curl http://localhost:8081/todos | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 191 100 191 0 0 13618 0 --:--:-- --:--:-- --:--:-- 13642
{
"todos": [
{
"name": "Añadir métricas"
},
{
"name": "Configurar OpenTelemetry"
},
{
"name": "Implementar tracing"
},
{
"name": "Configurar exporters"
}
],
"user": {
"username": "David Prata",
"userId": 123345 ## Ya apareció aquí nuestra modificación inicial.
}
}

Y de esta forma será mucho más fácil en la búsqueda de algún incidente.