Como Funciona o Rastreamento
Vale muito a pena entender como o OTel consegue construir o trace.
Temos algo acontecendo em um processo e outra coisa acontecendo em outro processo, mas como você acha que isso está acontecendo?
Temos o seguinte cenário: app A e app B ambos instrumentados com OTel e A faz requisição HTTP para B.
A instrumentação envia os dados para o Jaeger que será nosso OTel backend.
Quando esses serviços estiverem reportando sobre o rastreamento, eles precisam saber algumas coisas, sendo o principal o Trace ID (ID de Rastreamento).
O Trace ID é compartilhado entre todos os intervalos (spans) para que saibamos quem é quem, quem se relaciona com quem e o tempo gasto.
Cada intervalo precisa ter um ID pai; caso não tenha, será a raiz do rastreamento.
Basicamente, quando a aplicação B está reportando para o Jaeger, ela precisa reportar:
- Seu Span ID
- Span ID dos pais (que foi criado no app A)
- Trace ID (que foi criado no app A)
Isso significa que quando estivermos enviando a chamada HTTP do App A para o App B, precisamos fornecer o contexto de telemetria.
Isso é feito injetando no cabeçalho (Header) da chamada HTTP. O App B irá extrair o contexto do cabeçalho da chamada que foi injetado automaticamente.
Então o OTel suporta só HTTP? Claro que não. Ele suporta várias formas de comunicação e isso foi só um exemplo. Poderíamos ter usado Kafka, SQS, RabbitMQ, gRPC, Socket.io, etc.
Os SpanID são gerados automaticamente.
Na verdade, estamos sempre criando spans que são mostrados por ferramentas como Jaeger através de uma árvore de dependência usando os valores como traceID, parentId, spanID, etc.
Podemos utilizar o context para carregar mais informações entre os aplicativos distribuídos. Ao invés de repetir a passagem de valor chamada a chamada, por exemplo um userID, podemos utilizar a ideia de Baggage. Se você for desenvolvedor de backend, vale a pena dar uma conferida nisso. Não vou me aprofundar muito sobre isso pois está mais associado ao desenvolvimento, mas saiba que existe.
No OpenTelemetry, Baggage é uma informação contextual que reside ao lado do contexto. Baggage é um armazenamento de chave-valor, o que significa que ele permite que você propague quaisquer dados que desejar junto com o contexto.