O processador de filtro descarta registros de telemetria ou atributos específicos com base em expressões booleanas da OTTL (OpenTelemetry Transformation Language). Use-o para remover dados de teste, logs de depuração, verificações de integridade ou qualquer telemetria de baixo valor antes que saia da sua rede.
Quando usar o processador de filtro
Use o processador de filtro quando precisar:
- Descarte PII ou dados de ambiente de teste: Remova dados que não devem sair da sua rede
- Remova logs de nível debug da produção: Filtre por severidade para reduzir o ruído
- Filtrar solicitações de verificação de integridade: Descarte tráfego de monitoramento repetitivo e de baixo valor
- Descarte métricas com prefixos ou padrões específicos: Remova fluxos de métricas desnecessários
- Remova telemetria de baixo valor com base em atributos: Filtre por nome do serviço, ambiente ou tags personalizadas
Como funciona o processador de filtro
O processador de filtro avalia expressões booleanas OTTL em relação a cada registro de telemetria. Quando uma condição é avaliada como true, o registro é descartado.
Isso é o oposto de muitas linguagens de consulta onde WHERE status = 'ERROR' significa "manter erros." No processador de filtro, status == 'ERROR' significa "descartar erros".
Configuração
Adicione um processador de filtro ao seu pipeline:
filter/Logs: description: Apply drop rules and data processing for logs output: - transform/Logs config: error_mode: ignore logs: rules: - name: drop the log records description: drop all records which has severity text INFO value: log.severity_text == "INFO"Campos de configuração:
logs: Array de expressões booleanas OTTL para filtragem de logsspan,span_event: Array de expressões booleanas OTTL para filtragem de spans de rastreamentometric,datapoint: Array de expressões booleanas OTTL para filtragem de métricas
Múltiplas condições: Quando você fornece várias expressões no array, elas são avaliadas com a lógica OU. Se qualquer condição for verdadeira, o registro é descartado.
Operadores booleanos OTTL
Operadores de comparação
==- Igual a!=- Diferente de<- Menor que<=- Menor ou igual a>- Maior que>=- Maior ou igual a
Operadores lógicos
and- Ambas as condições devem ser verdadeirasor- Uma das condições deve ser verdadeiranot- Nega uma condição
Correspondência de padrões
matches- Correspondência de padrão de regex
logs: - 'body matches ".*health.*"' - 'attributes["http.url"] matches ".*\\/api\\/v1\\/health.*"'Exemplos completos
Exemplo 1: Descartar dados do ambiente de teste
Remova toda a telemetria dos ambientes de teste e desenvolvimento:
filter/Logs: description: "Drop non-production environments" config: error_mode: ignore logs: rules: - name: drop-test-environment description: Drop logs from test environment value: resource.attributes["environment"] == "test" - name: drop-dev-environment description: Drop logs from dev environment value: resource.attributes["environment"] == "dev" - name: drop-local-environment description: Drop logs from local environment value: resource.attributes["environment"] == "local"Exemplo 2: Descartar logs de debug em produção
Mantenha apenas níveis de log significativos em produção:
filter/Logs: description: "Drop debug and trace logs" config: error_mode: ignore logs: rules: - name: drop-debug-logs description: Drop all DEBUG severity logs value: severity_text == "DEBUG" - name: drop-trace-logs description: Drop all TRACE severity logs value: severity_text == "TRACE" - name: drop-low-severity-logs description: Drop INFO and below severity logs value: severity_number < 9Referência do número de gravidade:
- TRACE = 1-4
- DEBUG = 5-8
- INFO = 9-12
- WARN = 13-16
- ERRO = 17-20
- FATAL = 21-24
Exemplo 3: Descartar spans de verificação de integridade
Remova o tráfego de verificação de integridade que não agrega valor diagnóstico:
filter/Traces: description: "Drop health check spans" config: error_mode: ignore span: rules: - name: drop-health-endpoint description: Drop spans from /health endpoint value: attributes["http.path"] == "/health" - name: drop-healthz-endpoint description: Drop spans from /healthz endpoint value: attributes["http.path"] == "/healthz" - name: drop-ping-endpoint description: Drop spans from /ping endpoint value: attributes["http.path"] == "/ping" - name: drop-health-check-spans description: Drop spans named health_check value: name == "health_check"Exemplo 4: Descartar por nome do serviço
Filtrar serviços específicos ou padrões de serviço:
filter/Logs: description: "Drop deprecated services" config: error_mode: ignore logs: rules: - name: drop-legacy-api description: Drop logs from legacy API v1 service value: resource.attributes["service.name"] == "legacy-api-v1" - name: drop-canary-services description: Drop logs from canary deployment services value: IsMatch(resource.attributes["service.name"], ".*-canary")Exemplo 5: Descartar métricas com prefixos específicos
Remova fluxos de métricas desnecessários:
filter/Metrics: description: "Drop internal metrics" config: error_mode: ignore metric: rules: - name: drop-internal-metrics description: Drop metrics with internal prefix value: IsMatch(name, "^internal\\.") - name: drop-test-metrics description: Drop metrics with test prefix value: IsMatch(name, "^test_") - name: drop-debug-metrics description: Drop metrics marked as debug type in resource attributes value: resource.attributes["metric.type"] == "debug" datapoint: rules: - name: drop-debug-datapoints description: Drop datapoints marked as debug type value: attributes["metric.type"] == "debug"Exemplo 6: Condições combinadas com AND
Descartar apenas quando múltiplas condições forem verdadeiras:
filter/Logs: description: "Drop debug logs from specific service in test environment" config: error_mode: ignore logs: rules: - name: drop-debug-logs-from-test description: Drop DEBUG logs from background-worker service in test environment value: | severity_text == "DEBUG" and resource.attributes["service.name"] == "background-worker" and resource.attributes["environment"] == "test"Exemplo 7: Manter erros, descartar o restante
Inverta a lógica para manter apenas dados valiosos:
filter/Logs: description: "Drop non-error logs" config: error_mode: ignore logs: rules: - name: drop-non-error-logs description: Drop everything below ERROR severity level value: severity_number < 17Ou use a lógica NOT:
filter/Logs: description: "Drop non-errors" config: error_mode: ignore logs: rules: - name: drop-non-error-logs description: Drop logs that are not ERROR or FATAL value: not (severity_text == "ERROR" or severity_text == "FATAL")Exemplo 8: Correspondência de padrões no corpo do log
Descartar logs que contenham padrões específicos:
filter/Logs: description: "Drop health check logs by body content" config: error_mode: ignore logs: rules: - name: drop-health-check-logs description: Drop logs with health check in body value: IsMatch(body, ".*health check.*") - name: drop-status-endpoint-logs description: Drop logs with GET /status in body value: IsMatch(body, ".*GET /status.*") - name: drop-monitor-ok-logs description: Drop logs with 200 OK monitor in body value: IsMatch(body, ".*200 OK.*monitor.*")Exemplo 9: Descartar spans de alto volume e baixo valor
Remova spans que ocorrem com frequência, mas agregam pouco valor:
filter/Traces: description: "Drop fast, successful cache hits" config: error_mode: ignore span: rules: - name: drop-fast-cache-hits description: Drop cache hit operations faster than 1ms value: | attributes["db.operation"] == "get" and end_time_unix_nano - start_time_unix_nano < 1000000 and attributes["cache.hit"] == trueExemplo 10: Descarte baseado no status HTTP
Filtrar requisições bem-sucedidas, manter erros:
filter/Traces: description: "Drop successful HTTP requests" config: error_mode: ignore span: rules: - name: drop-successful-requests description: Drop HTTP requests with status code less than 400 value: attributes["http.status_code"] < 400Exemplo 11: Múltiplas condições com OU
Descartar se alguma condição corresponder:
filter/Logs: description: "Drop test data, health checks, or debug logs" config: error_mode: ignore logs: rules: - name: drop-test-health-debug description: Drop logs from test environment, health checks, or debug severity value: | resource.attributes["environment"] == "test" or IsMatch(body, ".*health.*") or severity_text == "DEBUG"Descartar dados vs. descartar atributos
O processador de filtro pode descartar registros inteiros (como mostrado acima) ou descartar atributos específicos de registros que são mantidos.
Para descartar atributos mantendo o registro, você precisa usar a função delete_key() do processador de transformação, e não o processador de filtro. O processador de filtro descarta apenas registros inteiros.
Abordagem incorreta (isso não funcionará):
filter/Logs: config: logs: - 'delete attributes["sensitive_field"]' # This is not validAbordagem correta (use o processador de transformação em vez disso):
transform/Logs: description: "Remove sensitive attribute" config: log_statements: - delete_key(attributes, "sensitive_field") output: ["filter/Logs"]Considerações de desempenho
- A ordem importa: Coloque os processadores de filtro no início do seu pipeline para descartar dados indesejados antes de um processamento custoso
- Combine condições: Use a lógica
and/orem uma única expressão em vez de encadear vários processadores de filtro - Desempenho de regex: A correspondência de padrões com
matchesé mais custosa do que verificações de igualdade exata. Use==quando possível.
Exemplo de ordenação eficiente:
steps: receivelogs: description: Receive logs from OTLP and New Relic proprietary sources output: - probabilistic_sampler/Logs receivemetrics: description: Receive metrics from OTLP and New Relic proprietary sources output: - filter/Metrics receivetraces: description: Receive traces from OTLP and New Relic proprietary sources output: - probabilistic_sampler/Traces probabilistic_sampler/Logs: description: Probabilistic sampling for all logs output: - filter/Logs config: global_sampling_percentage: 100 conditionalSamplingRules: - 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 condition: resource.attributes["service.name"] == "ruby-test-service" probabilistic_sampler/Traces: description: Probabilistic sampling for traces output: - filter/Traces config: global_sampling_percentage: 80 filter/Logs: description: Apply drop rules and data processing for logs output: - transform/Logs config: error_mode: ignore logs: rules: - name: drop the log records description: drop all records which has severity text INFO value: log.severity_text == "INFO" filter/Metrics: description: Apply drop rules and data processing for metrics output: - transform/Metrics config: error_mode: ignore metric: rules: - name: drop entire metrics description: delete the metric on basis of humidity_level_metric value: (name == "humidity_level_metric" and IsMatch(resource.attributes["process_group_id"], "pcg_.*")) datapoint: rules: - name: drop datapoint description: drop datapoint on the basis of unit value: (attributes["unit"] == "Fahrenheit" and (IsMatch(attributes["process_group_id"], "pcg_.*") or IsMatch(resource.attributes["process_group_id"], "pcg_.*"))) filter/Traces: description: Apply drop rules and data processing for traces output: - transform/Traces config: error_mode: ignore span: rules: - name: delete spans description: deleting the span for a specified host value: (attributes["host"] == "host123.example.com" and (IsMatch(attributes["control_group_id"], "pcg_.*") or IsMatch(resource.attributes["control_group_id"], "pcg_.*"))) span_event: rules: - name: Drop all the traces span event description: Drop all the traces span event with name debug event value: name == "debug_event" transform/Logs: description: Transform and process logs output: - nrexporter/newrelic config: log_statements: - context: log name: add new field to attribute description: for otlp-test-service application add newrelic source type field conditions: - resource.attributes["service.name"] == "otlp-java-test-service" statements: - set(resource.attributes["source.type"],"otlp") transform/Metrics: description: Transform and process metrics output: - nrexporter/newrelic config: metric_statements: - context: metric name: adding a new attributes description: 'adding a new field into a attributes ' conditions: - resource.attributes["service.name"] == "payments-api" statements: - set(resource.attributes["application.name"], "compute-application") transform/Traces: description: Transform and process traces output: - nrexporter/newrelic config: trace_statements: - context: span name: remove the attribute description: remove the attribute when service name is payment-service conditions: - resource.attributes["service.name"] == "payment-service" statements: - delete_key(resource.attributes, "service.version")Referência de expressão booleana OTTL
Para a sintaxe completa do OTTL e operadores adicionais:
Próximos passos
- Saiba mais sobre o Transform processor para modificar dados antes da filtragem
- Veja Processador de amostragem para redução probabilística de volume
- Consulte a referência de configuração YAML para a sintaxe completa