Monitorar aplicações distribuídas é fundamental, mas vamos ser honestos: lidar com uma avalanche de dados de telemetria pode ser uma dor de cabeça. Quer seja em termos de desempenho ou de custo, gerenciar esses dados não é moleza. Grandes volumes de dados normalmente embutem grandes custos de armazenamento e processamento.
Pensando nessa situação o OpenTelemetry collector implementa uma solução interessante chamada amostragem (Sampling). Com ela você pode selecionar apenas o que te interessa.
Existem duas estratégias de amostragem o Head Sampling e o tail sampling
Head Sampling
O Head Sampling é realizado no início do ciclo de vida do trace, determinando imediatamente se um ele será capturado. Esta estratégia é eficaz para reduzir a quantidade de dados logo na origem, ajudando a manter os custos e a sobrecarga de processamento baixos.
O Head Sampling decide logo de cara se um trace vai ser coletado ou não. É uma forma direta de dizer "sim" ou "não" para os dados antes mesmo deles começarem a se formar de verdade. A decisão é tomada mesmo antes mesmo de o traço ser completamente formado.
Vantagens:
- Simples de configurar
- Eficiente
Ponto de atenção:
- Não é possível tomar decisões baseados em atributos do trace, latência, status do trace etc. Se quiser por exemplo separar todos os traces come erro, head sampling não é solução.
Gostou da idéia? Quer ver como faz?
Vai aqui um exemplo de como configurar seu collector para fazer um head sampling. Este exemplo configura o `probabilistic_sampler` para capturar 10% dos spans, baseando-se em um algoritmo de hash, ideal para a redução inicial do volume de dados.
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch, probabilistic_sampler]
exporters: [otlp]
processors:
probabilistic_sampler:
hash_seed: 1234567890
sampling_percentage: 10
Tail Sampling
O Tail Sampling, ao contrário, é executado após os dados serem inicialmente coletados, permitindo decisões baseadas em um contexto mais completo. Esta abordagem é particularmente útil para capturar traços críticos, como aqueles que contêm erros ou têm alta latência.
O Tail Sampling entra em cena depois que os dados já foram coletados. Ele olha o contexto completo antes de tomar uma decisão. É ótimo para pegar aqueles detalhes críticos, como erros ou demoras.
Vantagens:
- É possível tomar decisões baseados em atributos do trace, latência, status do trace etc. Se quiser por exemplo separar todos os traces come erro, head sampling não é solução.
Pontos de Atenção:
- Pode ser um pouco mais complexo de configurar
- Como necessitamos ter o trace completo, consome um pouco mais de recursos do collector
- Todas as spans que compõem um mesmo trace devem ser recebidas pelo mesmo collector.
Aqui vai um exemplo de como enviar somente traces com latência alta ou com erros.
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch, tail_sampling]
exporters: [otlp]
# tail sampling - traces with latency higher than 2s OR traces with errors
processors:
tail_sampling:
decision_wait: 30s
num_traces: 100
expected_new_traces_per_sec: 100
policies:
[
{
name: test-policy-2,
type: latency,
latency: {threshold_ms: 2000}
},
{
name: test-policy-5,
type: status_code,
status_code: {status_codes: [ERROR]}
}
]
A implementação de estratégias de amostragem no OpenTelemetry traz diversos benefícios:
- Redução de Custos: Menos dados para armazenar, processar e analisar diretamente se traduzem em menores custos de infraestrutura e armazenamento.
- Filtragem de Ruído: Ao focar em dados significativos, a amostragem pode ajudar a filtrar "ruído", ou seja, informações irrelevantes que não contribuem para a análise essencial.
- Melhoria de Desempenho: Processar e analisar uma menor quantidade de dados pode reduzir a carga nos sistemas de processamento e melhorar o tempo de resposta geral.
- Escalabilidade: Amostragem eficaz permite que o sistema escale de forma mais eficiente, gerenciando grandes volumes de dados sem degradação do desempenho.
Mas e ai? É melhor user Head ou Tail Sampling?
A escolha entre head sampling e tail sampling depende do que você precisa. Se a ideia é só dar uma filtrada rápida e manter os custos baixos, o head sampling é sua praia. Mas se você precisa de uma análise mais detalhada, especialmente para capturar problemas específicos, o tail sampling pode ser a melhor opção.
Você pode até combinar os dois. Por exemplo, usar um head sampling maroto pra dar aquela primeira filtrada nos dados separando 50% do tráfego e depois analisar quem sobrou aplicando um tail sampling.
Usar estratégias de amostragem com o OpenTelemetry é uma maneira esperta de manejar os dados de telemetria. Escolher entre head sampling e tail sampling pode fazer uma grande diferença na performance e nos custos de monitoramento das suas aplicações. Com a estratégia certa, você ganha em eficiência e ainda mantém tudo rodando suave.
Gostou do papo e quer praticar um pouco. Da uma olhada nesse repo com alguns exemplos.
https://github.com/lof000/otel-cco-labs/tree/main/lab5_otel_sampling