Marcio Cunha

Arquitetura de Observabilidade Distribuída com OpenTelemetry e Amostragem Dinâmica

Descubra como implementar uma estratégia robusta de coleta de telemetria baseada na criticidade das transações de negócios, reduzindo custos de armazenamento e mantendo a visibilidade de sistemas complexos.

Marcio Cunha•5 min
Também disponível em:EnglishEspañol
Resumo
  • A coleta integral de dados de telemetria em sistemas de grande escala torna-se financeiramente insustentável devido ao volume gerado.
  • O OpenTelemetry padroniza a captura de métricas, logs e rastreamentos sem prender a aplicação a um único fornecedor de software.
  • A amostragem dinâmica ajusta a taxa de captura em tempo real com base na importância comercial e no comportamento de cada requisição.
  • A classificação da criticidade de transações evita a perda de diagnósticos cruciais em rotinas críticas de pagamento ou checkout.
  • A gestão eficiente do pipeline de dados de monitoramento equilibra orçamento operacional e precisão diagnóstica em arquiteturas distribuídas.

O Desafio Operacional do Crescimento de Dados em Sistemas Distribuídos

Quando as aplicações modernas abandonam o modelo tradicional de monólitos — blocos únicos de software onde tudo roda junto — e passam a ser divididas em dezenas ou centenas de serviços menores que conversam entre si pela rede, surge um problema fascinante e custoso: a visibilidade. Em arquiteturas de microsserviços, uma simples chamada de usuário pode atravessar múltiplos sistemas independentes, passando por filas de mensagens, bancos de dados e APIs externas. O OpenTelemetry surgiu como um projeto padrão da indústria para unificar a forma como geramos rastreamentos (traces), métricas e registros (logs). Na prática, ele funciona como uma caixa-preta universal instalada em cada vagão do trem, registrando exatamente por onde a requisição passou e quanto tempo levou em cada etapa.

No entanto, coletar absolutamente tudo o que acontece em um ambiente corporativo de alta volumetria cria um tsunami de dados. Se uma empresa processa dezenas de milhares de requisições por segundo, armazenar cada pequeno detalhe de telemetria exige uma infraestrutura de armazenamento gigantesca, gerando contas mensais de nuvem exorbitantes. É aqui que entra o conceito de amostragem (sampling), que na prática significa decidir quais caminhos registrar e quais descartar para economizar recursos sem perder o sono à noite. O grande dilema dos engenheiros sempre foi encontrar o ponto de equilíbrio: se coletar pouco, problemas silenciosos passam despercebidos; se coletar tudo, o orçamento da empresa derrete em servidores de banco de dados e ferramentas de análise.

Entendendo a Amostragem Tradicional e Suas Limitações

Historicamente, a amostragem de dados de monitoramento era feita de forma estática e bruta. A abordagem mais comum consistia na amostragem baseada na cabeça (head-based sampling), que ocorre logo no momento em que a requisição entra no sistema. Imagine um segurança na portaria de um prédio que decide, ao vir a primeira pessoa da fila, que apenas uma a cada cem pessoas terá seus documentos verificados ao longo de todo o trajeto interno. Na computação, isso significa que um número aleatório é gerado no início da transação; se o número cair na regra, todo o caminho daquela requisição é gravado e enviado para a ferramenta de observabilidade. Caso contrário, ele é sumariamente ignorado.

O problema dessa abordagem simplista é que ela é totalmente cega em relação ao valor do que está sendo descartado. Se a requisição que foi descartada pertencia a um cliente VIP realizando uma transação financeira de alto valor que falhou por um erro obscuro, esse erro simplesmente desaparece das estatísticas de diagnóstico. Por outro lado, milhões de requisições perfeitamente bem-sucedidas e triviais — como uma consulta repetida a um catálogo de produtos estáticos — podem ser coletadas exaustivamente, desperdiçando espaço precioso com informações redundantes. Na prática, a amostragem estática trata uma transação de login com falha exatamente da mesma forma que trata o carregamento de uma imagem decorativa de fundo.

O Conceito de Amostragem Dinâmica Baseada em Criticidade

Para resolver essa assimetria entre o custo de armazenamento e a importância dos dados, a engenharia moderna evoluiu para a amostragem dinâmica e baseada em cauda (tail-based sampling). Diferente do segurança na portaria, o mecanismo de cauda atua como um gerente perspicaz que observa o resultado de todo o processo antes de decidir se o relatório daquele atendimento deve ser arquivado permanentemente ou descartado. Na arquitetura OpenTelemetry, isso é implementado usando coletores intermediários que retêm temporariamente os dados de rastreamento em memória, avaliam o comportamento global da requisição e aplicam regras inteligentes de preservação logo antes de enviar os dados para o armazenamento de longo prazo.

Na prática, isso significa que o sistema agora entende o contexto comercial do que está acontecendo. Se uma transação durou mais tempo do que o normal, se retornou um código de erro de servidor (como um erro HTTP 500) ou se envolveu um cliente categorizado como prioritário, o coletor garante que 100% desses rastreamentos sejam salvos, independentemente de qualquer regra estatística aleatória. Simultaneamente, se uma requisição comum ocorreu dentro do tempo esperado e sem nenhum percalço técnico, o sistema pode decidir guardar apenas uma fração mínima dela, como 1% ou 2% do total. Essa abordagem garante que os incidentes mais raros e complexos nunca fiquem sem evidências para depuração, enquanto o volume global de dados despenca drasticamente.

Arquitetura Prática de Implementação com Coletores OpenTelemetry

Implementar essa engenharia na prática exige uma topologia de rede e processamento bem desenhada, geralmente estruturada em duas camadas de coletores OpenTelemetry: os agentes locais e o cluster central de coleta. Os agentes locais rodam lado a lado com as aplicações, seja no mesmo servidor físico, no mesmo pod de Kubernetes ou como uma biblioteca embutida. A função principal desses agentes na borda é realizar a instrumentação básica, injetar contextos de rastreamento nos cabeçalhos HTTP e fazer um pré-filtragem leve de telemetria ruidosa antes que ela trafegue pela rede interna da empresa.

Em seguida, esses dados fluem para o cluster central de coletores configurados com suporte a tail-based sampling. Como essa camada central precisa reter os rastreamentos por alguns segundos em memória para correlacionar todos os microsserviços envolvidos em uma única transação, ela precisa ser dimensionada com nós capazes de lidar com essa retenção volátil. Abaixo, encontra-se um exemplo simplificado de configuração em arquivo YAML para um coletor OpenTelemetry central executando regras de amostragem baseada em cauda:

receivers:  otlp:    protocols:      grpc:      http:processors:  tail_sampling:    decision_wait: 10s    num_traces: 50000    expected_new_traces_per_sec: 2000    policies:      - name: errors-policy        type: status_code        status_code: {status_codes: [ERROR]}      - name: latency-policy        type: latency        latency: {threshold_ms: 500}      - name: probabilistic-policy        type: probabilistic        probabilistic: {sampling_percentage: 5}exporters:  otlp:    endpoint: