Pular para o conteúdo principal

Padrãointermediário

Identificadores de Correlação

Visão Geral

Um identificador de correlação é um valor único gerado na entrada de uma requisição e propagado por todos os componentes que participam do atendimento dela.

Com ele, é possível reunir todos os registros, todas as mensagens e todos os eventos que pertencem à mesma operação — mesmo que tenham passado por doze serviços e três filas.

O custo de implantar é baixo perto do de rastreamento distribuído completo, e é pré-requisito das demais técnicas desta seção: sem correlação, logs de sistemas distribuídos são coleções de fragmentos que ninguém consegue montar.

Problema

Um usuário reporta que o pedido dele falhou às 14h32.

Sem correlação, a investigação é assim: procurar nos registros do serviço de pedidos por algo naquele horário; encontrar candidatos; procurar no serviço de pagamento por registros próximos; tentar casar por horário e por identificador de usuário; repetir para cada serviço da cadeia.

Isso leva horas, frequentemente não conclui, e piora com o volume — em horário de pico, há centenas de operações por segundo e nada distingue uma da outra.

Com correlação, é uma consulta.

Conceitos Centrais

Gerar na borda, propagar em tudo

1. o identificador é gerado na entrada — gateway, balanceador ou primeiro serviço
2. viaja em todas as chamadas subsequentes
3. aparece em todo registro e evento emitido — **não** em rótulo de métrica
4. volta ao cliente na resposta

O passo 4 é frequentemente esquecido e tem valor prático alto: o usuário que reporta um problema pode informar o identificador, e a investigação começa direto no ponto certo.

Muitos produtos exibem esse valor em mensagens de erro por essa razão.

Aceitar o identificador de quem chama

Se o chamador já tem um identificador — porque a chamada é parte de uma operação maior —, ele deve ser reaproveitado, não substituído.

Isso permite correlacionar através de fronteiras organizacionais: um parceiro que envia o identificador dele permite rastrear a operação nos dois lados.

A regra: aceitar se vier; gerar se não vier. E, por segurança, validar o formato — um identificador vindo de fora entra em registros e consultas, e vale tratá-lo como entrada não confiável.

Os saltos assíncronos são onde a propagação quebra

Propagar em chamadas HTTP é simples: um cabeçalho. O problema aparece nos outros caminhos:

mensagem em fila o identificador vai nos metadados da mensagem
tarefa agendada não há requisição de origem — gera um novo, e registra a causa
processamento em lote um identificador por execução, mais um por item
webhook recebido o identificador do parceiro, se houver, mais o seu
trabalho em segundo plano herda do que o disparou

O caso de fila é o mais importante e o mais frequentemente omitido: a cadeia de investigação quebra exatamente no ponto em que ela ficaria mais difícil de reconstruir manualmente. Ver integração por mensageria.

Um identificador não basta

A prática madura usa mais de um, com propósitos diferentes:

identificador de requisição único por requisição individual
identificador de correlação o mesmo para toda a operação de negócio
identificador de sessão agrupa a jornada do usuário
identificador de usuário permite ver tudo de uma pessoa

A distinção entre os dois primeiros importa: uma operação de negócio pode envolver várias requisições — uma retentativa, uma chamada assíncrona subsequente. O de requisição as separa; o de correlação as reúne.

Ver rastreamento distribuído, que formaliza isso com trace e span.

Precisa estar em tudo que é emitido

Um identificador propagado e não registrado não serve. Ele precisa aparecer:

em todo registro de aplicação
em erros retornados ao cliente
nunca em rótulo de métrica: é um valor por requisição, e cada valor vira
uma série temporal
em mensagens publicadas
em registros de acesso do gateway e do balanceador
em eventos de auditoria

Isso é mais fácil de garantir por infraestrutura que por disciplina: um contexto que acompanha a execução e uma biblioteca de registro que o inclui automaticamente eliminam o esquecimento.

Times que dependem de cada desenvolvedor lembrar de incluir têm cobertura parcial, e a parte que falta costuma ser descoberta no meio do incidente.

Não coloque dado sensível

O identificador circula amplamente: registros, sistemas de terceiros, mensagens de erro exibidas ao usuário, tickets de suporte.

Usar o documento do cliente ou o e-mail como identificador espalha dado pessoal por toda essa superfície. Ver proteção de dados.

O identificador deve ser opaco e sem significado.

Modelo Mental

O identificador é o fio que costura os fragmentos. Sem ele, cada serviço conta uma história separada.

Quando Usar

  • Qualquer sistema com mais de um componente.
  • Comunicação assíncrona por fila ou evento.
  • Integração com sistemas externos.
  • Onde há investigação de incidentes.
  • Onde há requisito de auditoria.

Quando Não Usar

Quando já há rastreamento distribuído ponta a ponta. Correlação é o subconjunto mínimo dele — manter um esquema próprio ao lado duplica propagação, cabeçalho e instrumentação para responder à mesma pergunta com menos informação.

Em processo único, sem salto de rede. O contexto da própria biblioteca de registro já cobre a operação inteira, e o identificador não atravessa nada.

Quando a cadeia que importa passa por terceiro que não repassa o cabeçalho. O identificador morre ali, e o que sobra é cobertura parcial — pior que nenhuma, porque dá confiança onde não há. Se o salto crítico é justamente esse, o esforço rende mais em reconciliação por chave de negócio.

Como identificador de negócio. Ele é operacional, não é chave de domínio: some no expurgo de logs, não tem garantia de unicidade eterna e não pertence a nenhum agregado.

Alternativas

  • Rastreamento distribuído — a versão completa, com estrutura de chamadas e tempos. Correlação é o subconjunto mínimo dele.
  • Correlação por horário e usuário — o que se faz sem identificador. Lento, impreciso e inviável em volume.
  • Identificador de negócio — número do pedido, por exemplo. Funciona para investigar aquele domínio, e não cobre o que acontece antes de ele existir.

Trade-offs

Com correlaçãoSem
Investigação em minutosHoras ou impossível
Custo de propagação mínimoNenhum
Um campo em todo registroRegistros menores
Exige disciplina ou infraestruturaNada
Um identificadorVários
Um campo a propagarQuatro campos a propagar e manter coerentes
Não separa retentativasSepara

Modos de Falha

Quebra na fila. O identificador não vai na mensagem.

Gerado em vez de propagado. Cada serviço cria o seu.

Ausente em parte dos registros. A cadeia tem buracos.

Dado sensível no identificador.

Não retornado ao cliente. O usuário não consegue informar qual operação falhou.

Formato inconsistente. Cada serviço usa um nome de cabeçalho diferente.

Perdido em processamento assíncrono interno. Um trabalho em segundo plano perde o contexto.

Erros Comuns

Propagar só em HTTP.

Não incluir no registro automaticamente.

Usar dado de negócio como identificador.

Não padronizar o nome do cabeçalho entre serviços.

Não devolver ao cliente.

Não registrar a causa de trabalhos disparados sem requisição de origem.

Exemplo Real

Uma plataforma de seguros levava, em média, 4 horas para investigar um problema reportado por cliente.

O fluxo de contratação passava por sete serviços e duas filas. Os registros existiam, com bom nível de detalhe, e não se conectavam.

A investigação típica: pegar o horário aproximado informado pelo cliente, procurar em cada serviço, tentar casar por horário e por documento do cliente — que aparecia em alguns registros e em outros não.

A implementação de correlação levou três semanas:

Geração no gateway, com aceitação de identificador externo quando presente.

Contexto propagado automaticamente por uma biblioteca compartilhada, incluindo os saltos por fila — o identificador passou a ir nos metadados da mensagem.

Inclusão automática no registro, sem depender de o desenvolvedor lembrar.

Retorno ao cliente em toda resposta, e exibição em mensagens de erro.

O tempo médio de investigação caiu de 4 horas para 12 minutos.

Três problemas apareceram durante a adoção:

Nomes de cabeçalho divergentes. Três serviços usavam nomes diferentes, herdados de implementações independentes. A padronização exigiu um período de aceitar todos.

Trabalhos em segundo plano sem contexto. Processos disparados por agendador não tinham requisição de origem. A solução foi gerar um identificador por execução e registrar explicitamente o que a originou.

Documento do cliente usado como correlação em dois serviços — o que espalhava dado pessoal por registros e por um sistema de terceiro. Substituído por identificador opaco.

Três semanas de trabalho eliminaram, sozinhas, a maior fonte de tempo gasto em investigação. Nenhuma ferramenta foi comprada.

Conceitos Relacionados

Exercício Prático

Pegue um erro reportado por um usuário e tente reconstruir o caminho completo da requisição pelos seus registros.

O tempo que levar — e o quanto você conseguir reconstruir — é a medida da sua correlação atual.

Perguntas de Entrevista

  • Por que a propagação quebra com mais frequência nos saltos assíncronos?
  • Qual a diferença entre identificador de requisição e de correlação?
  • Por que o identificador não deve conter dado de negócio?

Para Aprofundar

  • Sigelman, Benjamin et al. Dapper, a Large-Scale Distributed Systems Tracing Infrastructure. Google, 2010.
  • W3C. Trace Context, Recomendação, 2021 — padroniza traceparent e tracestate, que carregam contexto de trace; não define cabeçalho genérico de correlação. O Level 2 segue como rascunho de recomendação candidata.
  • Majors, Charity et al. Observability Engineering. O'Reilly, 2022.
Terminou de ler este documento?Seu progresso fica salvo apenas neste navegador.