Skip to main content

Span Attributes

São um conjunto chave valor, no Jaeger são mostrados em tags, que nos informa o que aconteceu nesse span. Eles fornecem contexto adicional e informações detalhadas sobre uma operação específica.

Abaixo podemos ver para qual database foi a conexão, a porta usada, etc. Além disso na aba process podemos ver informações sobre o runtime e o ambiente que esse span foi executado.

alt text

Alguns exemplos práticos de span attributes que são gerados.

Em requisições HTTP:

{
"http.method": "GET",
"http.url": "/api/users",
"http.status_code": 200,
"http.user_agent": "Mozilla/5.0..."
}

Em operações de banco de dados:

{
"db.system": "postgresql",
"db.name": "users_db",
"db.statement": "SELECT * FROM users",
"db.user": "app_user"
}

Em sistemas distribuídos:

{
"service.name": "payment-service",
"service.version": "1.2.0",
"deployment.environment": "production"
}

Podemos usar esses valores para filtragem de forma se que seja mais fácil buscar o que queremos e entender saber mais sobre esse intervalo de tempo.

Até agora esses atributos foram gerados automaticamente pela instrumentação que fizemos, mas podemos extender para mais atributos do nosso interesse. Na maioria das vezes os itens que você irá adicionar estão relacionados especificamente a sua aplicação.

Poderíamos adicionar um userId pode tras desse rastreamento. A maioria dos rastros (traces) que são coletados aconteceram porque nosso cliente final fez alguma coisa no nosso sistema. Saber qual usuário causou esse trace será muito útil ao tentar debugar algo.

Vamos para o nosso código em auth-servicets. O que fazemos é basicamente definindo o usuário neste trecho.

app.get('/auth', (req, res) => {
//Adicionei o userID agora
res.json({ username: 'David Prata', userId: 12345 });
});

Vamos criar um atributo. Vale lembrar que existe casos que o activeSpan não existirá e dependendo da linguagem que você esta usando é necessário verificar antes de setar o atributo.

import opentelemetry from "@opentelemetry/api"; // Lembrar de importar!

app.get('/auth', (req, res) => {

res.json({ username: 'David Prata', userId: 123345 });
//Poderíamos setar um atributo como um map para vários valores se necessário, aqui vamos usar só o userId
opentelemetry.trace.getActiveSpan()?.setAttribute('userId', 123456);
});

Vamos chamar o novamente o curl e ver o que temos no 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": "Adicionar métricas"
},
{
"name": "Configurar OpenTelemetry"
},
{
"name": "Implementar tracing"
},
{
"name": "Configurar exporters"
}
],
"user": {
"username": "David Prata",
"userId": 123345 ## Já apareceu aqui a nossa modificação inicial.
}
}

alt text

E essa forma ficará muito mais fácil na busca de algum incidente.