O processador de amostragem implementa amostragem probabilística para reduzir o volume de dados enquanto preserva o sinal. Use-o para manter todos os erros e requisições lentas, enquanto faz uma amostragem agressiva de casos de sucesso rotineiros, reduzindo custos sem perder valor diagnóstico.
Quando usar o processador de amostragem
O processador de amostragem suporta diferentes recursos dependendo do seu tipo de dados de telemetria:
Para Logs e Eventos
Logs e Eventos suportam amostragem condicional com regras personalizáveis baseadas em gravidade, atributos e outros critérios:
- Mantenha 100% dos erros ao fazer amostragem de casos de sucesso: Preserve todos os dados de diagnóstico, descarte o tráfego de rotina
- Amostre serviços de alto volume de forma mais agressiva: Diferentes taxas de amostragem por nível de serviço ou importância
- Preserve requisições lentas ao amostrar as rápidas: Mantenha outliers de desempenho para análise
- Aplique diferentes taxas de amostragem por ambiente ou serviço: Produção a 10%, staging a 50%, teste a 100%
Para Traces
Traces suportam apenas amostragem baseada em taxa global. Reduza o volume geral de traces com uma taxa de amostragem uniforme.
Para métricas
A amostragem de métricas não é suportada atualmente pelo processador de amostragem. Em vez disso, use o processador de filtro para descartar métricas indesejadas.
Como funciona a amostragem
O processador de amostragem utiliza amostragem probabilística com regras condicionais:
- Porcentagem de amostragem padrão: taxa padrão aplicada a todos os dados que não correspondem às regras condicionais.
- Regras: substitua a taxa padrão quando condições específicas forem atendidas.
- Fonte de aleatoriedade: campo consistente (como
trace_id) garante que dados relacionados sejam amostrados juntos.
Ordem de avaliação: regras são avaliadas na ordem definida. A primeira regra de correspondência determina a taxa de amostragem. Se nenhuma regra corresponder, a porcentagem de amostragem padrão será aplicada.
Configuração
Adicione um processador de amostragem ao seu pipeline:
probabilistic_sampler/Logs: description: Probabilistic sampling for all logs config: default_sampling_percentage: 100 rules: - name: sample the log records for ruby test service description: sample the log records for ruby test service with 70% sampling_percentage: 70 source_of_randomness: trace.id conditions: - resource.attributes["service.name"] == "ruby-test-service"Campos de configuração:
default_sampling_percentage: Taxa de amostragem padrão (0–100) para dados que não correspondem a regras.rules: Matriz de regras (avaliadas em ordem) - suportada apenas para logs e eventos.name: Identificador da regra.description: Descrição legível por humanos.sampling_percentage: Taxa de amostragem para dados correspondentes (0–100).source_of_randomness: Campo a ser usado para decisão de amostragem (tipicamentetrace_id).conditions: lista de expressões OTTL para corresponder à telemetria.
Estratégias de amostragem
Mantenha dados valiosos, descarte tráfego de rotina
O padrão mais comum para logs e eventos: preservar todos os dados de diagnóstico (erros, requisições lentas), amostrar agressivamente casos de sucesso rotineiros.
probabilistic_sampler/Logs: description: "Intelligent log sampling" config: default_sampling_percentage: 5 # Sample 5% of everything else rules: - name: "preserve-errors" description: "Keep all errors and fatals" sampling_percentage: 100 source_of_randomness: "trace.id" conditions: - 'severity_text == "ERROR" or severity_text == "FATAL"'
- name: "preserve-warnings" description: "Keep most warnings" sampling_percentage: 50 source_of_randomness: "trace.id" conditions: - 'severity_text == "WARN"'Resultado: 100% dos erros + 50% dos avisos + 5% de todo o restante
Amostra por nível de serviço
Diferentes taxas de amostragem para diferentes importâncias de serviço:
probabilistic_sampler/Logs: description: "Service tier sampling" config: default_sampling_percentage: 10 rules: - name: "critical-services" description: "Keep most traces from critical services" sampling_percentage: 80 source_of_randomness: "trace.id" conditions: - 'resource.attributes["service.name"] == "checkout" or resource.attributes["service.name"] == "payment"'
- name: "standard-services" description: "Medium sampling for standard services" sampling_percentage: 30 source_of_randomness: "trace.id" conditions: - 'resource.attributes["service.tier"] == "standard"'Amostra por ambiente
Maior amostragem em ambientes de teste, menor em produção:
probabilistic_sampler/Logs: description: "Environment-based sampling" config: default_sampling_percentage: 10 # Production default rules: - name: "test-environment" description: "Keep all test data" sampling_percentage: 100 source_of_randomness: "trace.id" conditions: - 'resource.attributes["environment"] == "test"'
- name: "staging-environment" description: "Keep half of staging data" sampling_percentage: 50 source_of_randomness: "trace.id" conditions: - 'resource.attributes["environment"] == "staging"'Preservar requisições lentas
Mantenha outliers de desempenho para análise:
probabilistic_sampler/Logs: description: "Preserve important logs" config: default_sampling_percentage: 1 # Sample 1% of routine logs rules: - name: "critical-logs" description: "Keep all error and fatal logs" sampling_percentage: 100 source_of_randomness: "trace.id" conditions: - 'severity_text == "ERROR" or severity_text == "FATAL"'
- name: "warning-logs" description: "Keep half of warning logs" sampling_percentage: 50 source_of_randomness: "trace.id" conditions: - 'severity_text == "WARN"' - name: "traced-logs" description: "Keep logs with trace context" sampling_percentage: 50 source_of_randomness: "trace.id" conditions: - 'trace_id != nil and trace_id.string != "00000000000000000000000000000000"'Nota: A duração é em nanossegundos (1 segundo = 1.000.000.000 ns).
Exemplos completos
Exemplo 1: Amostragem inteligente de rastreamento para rastreamento distribuído
Para traces, você só pode configurar a porcentagem de amostragem padrão. Essa porcentagem se aplica a todos os traces uniformemente, incluindo traces de erro e traces lentos:
probabilistic_sampler/Traces: description: Probabilistic sampling for traces config: default_sampling_percentage: 55Exemplo 2: Redução do volume de logs
Reduza drasticamente o volume de logs mantendo os dados de diagnóstico:
probabilistic_sampler/Logs: description: "Aggressive log sampling, preserve errors" config: default_sampling_percentage: 2 # Keep 2% of routine logs rules: - name: "keep-errors-fatals" description: "Keep all errors and fatals" sampling_percentage: 100 source_of_randomness: "trace.id" conditions: - 'severity_number >= 17' # ERROR and above
- name: "keep-some-warnings" description: "Keep 25% of warnings" sampling_percentage: 25 source_of_randomness: "trace.id" conditions: - 'severity_number >= 13 and severity_number < 17' # WARNExemplo 3: Amostra por código de status HTTP
Amostre todas as falhas (100%) e uma fração dos sucessos (5%):
probabilistic_sampler/Logs: description: "Sample by HTTP response status" config: default_sampling_percentage: 5 # 5% of successes rules: - name: "keep-server-errors" description: "Keep all 5xx errors" sampling_percentage: 100 source_of_randomness: "trace.id" conditions: - 'attributes["http.status_code"] >= 500'
- name: "keep-client-errors" description: "Keep all 4xx errors" sampling_percentage: 100 source_of_randomness: "trace.id" conditions: - 'attributes["http.status_code"] >= 400 and attributes["http.status_code"] < 500'Exemplo 4: Amostragem de serviço multicamadas
Taxas diferentes para diferentes níveis de importância:
probabilistic_sampler/Logs: description: "Business criticality sampling" config: default_sampling_percentage: 1 rules: # Critical business services: keep 80% - name: "critical-services" description: "High sampling for critical services" sampling_percentage: 80 source_of_randomness: "trace.id" conditions: - 'attributes["business_criticality"] == "critical"'
# Important services: keep 40% - name: "important-services" description: "Medium sampling for important services" sampling_percentage: 40 source_of_randomness: "trace.id" conditions: - 'attributes["business_criticality"] == "important"'
# Standard services: keep 10% - name: "standard-services" description: "Low sampling for standard services" sampling_percentage: 10 source_of_randomness: "trace.id" conditions: - 'attributes["business_criticality"] == "standard"'Exemplo 5: Amostragem baseada em tempo (redução fora de pico)
Amostragem mais alta durante o horário comercial (requer etiquetagem de atributos externos):
probabilistic_sampler/Logs: description: "Time-based sampling (requires time attribute)" config: default_sampling_percentage: 5 # Off-peak default rules: - name: "business-hours" description: "Higher sampling during business hours" sampling_percentage: 50 source_of_randomness: "trace.id" conditions: - 'attributes["is_business_hours"] == true'Exemplo 6: Amostra por padrão de endpoint
Mantenha todos os endpoints de administração, amostre a API pública agressivamente:
probabilistic_sampler/Logs: description: "Endpoint-based sampling" config: default_sampling_percentage: 10 rules: - name: "admin-endpoints" description: "Keep all admin traffic" sampling_percentage: 100 source_of_randomness: "trace.id" conditions: - 'IsMatch(attributes["http.path"], "^/admin/.*")'
- name: "api-endpoints" description: "Sample public API" sampling_percentage: 5 source_of_randomness: "trace.id" conditions: - 'IsMatch(attributes["http.path"], "^/api/.*")'Fonte de aleatoriedade
O campo source_of_randomness determina qual atributo é usado para tomar decisões de amostragem consistentes.
Valores comuns:
trace_id: Para rastreamentos distribuídos (garante que todos os spans em um rastreamento sejam amostrados juntos)span_id: Para amostragem de span individual (não recomendado para rastreamento distribuído)- Atributo personalizado: Qualquer atributo que forneça aleatoriedade
Por que isso importa: Usar trace_id garante que, ao amostrar um trace, você obtenha TODOS os spans desse trace, não apenas spans individuais aleatórios. Isso é fundamental para entender transações distribuídas.
Considerações de desempenho
- Ordene as regras por frequência: Coloque as condições correspondidas com mais frequência em primeiro lugar para reduzir o tempo de avaliação
- Desempenho da fonte de aleatoriedade: O uso de
trace_idé muito eficiente, pois já está disponível - A amostragem ocorre após outros processadores: Coloque a amostragem perto do final do seu pipeline para evitar o desperdício de CPU em dados que serão descartados
Ordenação eficiente de pipelines:
steps: # ... receive steps... probabilistic_sampler/Logs: description: Probabilistic sampling for all logs output: - filter/Logs config: rules: - name: sample the log records for ruby test service description: sample the log records for ruby test service with 70% sampling_percentage: 70 source_of_randomness: trace.id conditions: - resource.attributes["service.name"] == "ruby-test-service" default_sampling_percentage: 100 probabilistic_sampler/Traces: description: Probabilistic sampling for traces output: - filter/Traces config: default_sampling_percentage: 100 filter/Logs: description: Apply drop rules and data processing for logs output: - transform/Logs config: error_mode: ignore rules: - name: drop the log records description: drop all records which has severity text INFO conditions: - log.severity_text == "INFO" context: log # ... filter steps ... # ... transdormer steps ...Exemplos de impacto nos custos
Exemplo: 1TB/dia → 100GB/dia
Antes da amostragem:
- 1TB de logs por dia
- 90% são operações de rotina de nível INFO
- 8% são WARN
- 2% são ERROR/FATAL
Com amostragem inteligente:
probabilistic_sampler/Logs: description: "Sample logs by severity level" config: default_sampling_percentage: 2 # Sample 2% of INFO and below rules: - name: "errors" description: "Keep all error logs" sampling_percentage: 100 # Keep 100% of errors source_of_randomness: "trace.id" conditions: - 'severity_number >= 17' - name: "warnings" description: "Keep quarter of warning logs" sampling_percentage: 25 # Keep 25% of warnings source_of_randomness: "trace.id" conditions: - 'severity_number >= 13 and severity_number < 17'Após a amostragem:
- INFO: 900GB × 2% = 18GB
- AVISO: 80GB × 25% = 20GB
- ERRO/FATAL: 20GB × 100% = 20GB
- Total: -58GB/dia (redução de 94%)
- Todos os erros preservados para solução de problemas
Recursos do OpenTelemetry
Próximos passos
- Saiba mais sobre o processador de transformação para enriquecimento de dados antes da amostragem
- Veja Processador de filtro para descartar dados indesejados
- Consulte a referência de configuração YAML para a sintaxe completa