Como Acontece o Trace
Vale muito a pena entender como o OTel consegue construir o trace.
Temos algo acontecendo em um processo e outra acontecendo em outro processo mas como você acha que isso esta acontecendo?
Temos o seguinte cenário, app A e app B ambos instrumentado 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 ser um ID pai, caso não tenha será a raiz do rastreamento.
Basicamente quando a aplicação B esta 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ários 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 dependencia usando os valores como traceID, parentId, spanID, etc.
Podemos utilizar o context para carregar mais informações entre os aplicativos distribuiídos. Ao invés de repetir a passagem de valor chamada a chamada, por exemplo um userID, podemos utilizar o a idéia de Baggage. Se você for desenvolvedor de backend vale a pena dar uma conferida nisso. Não vou me aprofundar muito sobre 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.