El procesador de filtros descarta registros de telemetría o atributos específicos basados en expresiones booleanas de OTTL (Lenguaje de transformación de OpenTelemetry). Úselo para eliminar datos de prueba, logs de depuración, comprobaciones de estado o cualquier telemetría de bajo valor antes de que salga de su red.
Cuándo usar el procesador de filtros
Utilice el procesador de filtros cuando necesite:
- Descartar PII o datos de entornos de prueba: Elimine los datos que no deben salir de su red
- Elimine los logs de nivel de depuración de producción: Filtre por severidad para reducir el ruido
- Filtrar solicitudes de verificación de estado: Descarte el tráfico de monitoreo repetitivo y de bajo valor
- Descartar métricas con prefijos o patrones específicos: Elimine flujos de métricas innecesarios
- Elimine la telemetría de bajo valor basada en atributos: Filtre por nombre del servicio, entorno o etiquetas personalizadas
Cómo funciona el procesador de filtros
El procesador de filtros evalúa expresiones booleanas OTTL contra cada registro de telemetría. Cuando una condición se evalúa como true, el registro se descarta.
Esto es lo opuesto a muchos lenguajes de consulta donde WHERE status = 'ERROR' significa "conservar errores". En el procesador de filtros, status == 'ERROR' significa "descartar errores".
Configuración
Agregue un procesador de filtros a su 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 configuración:
logs: Arreglo de expresiones booleanas OTTL para el filtrado de logsspan,span_event: Arreglo de expresiones booleanas OTTL para el filtrado de spans de trazasmetric,datapoint: Arreglo de expresiones booleanas OTTL para el filtrado de métricas
Múltiples condiciones: Cuando se proporcionan múltiples expresiones en el arreglo, se evalúan con lógica OR. Si alguna condición es verdadera, el registro se descarta.
Operadores booleanos de OTTL
Operadores de comparación
==- Igual a!=- No es igual a<- Menor que<=- Menor o igual que>- Mayor que>=- Mayor o igual que
Operadores logicos
and- Ambas condiciones deben ser verdaderasor- Cualquiera de las condiciones debe ser verdaderanot- Niega una condición
Coincidencia de patrones
matches- Coincidencia de patrones de expresiones regulares
logs: - 'body matches ".*health.*"' - 'attributes["http.url"] matches ".*\\/api\\/v1\\/health.*"'Ejemplos completos
Ejemplo 1: Eliminar datos del entorno de prueba
Elimine toda la telemetría de los entornos de pruebas y desarrollo:
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"Ejemplo 2: Descartar logs de depuración en producción
Mantenga solo los niveles de log significativos en producción:
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 < 9Referencia de números de severidad:
- TRACE = 1-4
- DEBUG = 5-8
- INFORMACIÓN = 9-12
- ADVERTENCIA = 13-16
- ERROR = 17-20
- FATAL = 21-24
Ejemplo 3: Descartar spans de verificación de estado
Elimine el tráfico de comprobación de estado que no aporta valor de 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"Ejemplo 4: Descartar por nombre de servicio
Filtrar servicios específicos o patrones de servicio:
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")Ejemplo 5: Descartar métricas con prefijos específicos
Eliminar flujos de métricas innecesarios:
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"Ejemplo 6: Condiciones combinadas con AND
Descartar solo cuando múltiples condiciones sean verdaderas:
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"Ejemplo 7: Conservar errores, descartar todo lo demás
Invierta la lógica para conservar solo los datos 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 < 17O utilice la 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")Ejemplo 8: Coincidencia de patrones en el cuerpo del log
Descartar logs que contengan patrones 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.*")Ejemplo 9: Descartar spans de alto volumen y bajo valor
Elimina los spans que aparecen con frecuencia pero aportan poco 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"] == trueEjemplo 10: Descartar basado en el estado HTTP
Filtrar solicitudes exitosas, mantener errores:
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"] < 400Ejemplo 11: Múltiples condiciones con OR
Descartar si alguna condición coincide:
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 datos vs. descartar atributos
El procesador de filtros puede descartar registros completos (como se muestra arriba) o descartar atributos específicos de los registros que se conservan.
Para eliminar atributos conservando el registro, debe usar la función delete_key() del procesador de transformación, no el procesador de filtrado. El procesador de filtros solo descarta registros completos.
Enfoque incorrecto (esto no funcionará):
filter/Logs: config: logs: - 'delete attributes["sensitive_field"]' # This is not validEnfoque correcto (utilice el procesador de transformación en su lugar):
transform/Logs: description: "Remove sensitive attribute" config: log_statements: - delete_key(attributes, "sensitive_field") output: ["filter/Logs"]Consideraciones de rendimiento
- El orden importa: Coloque los procesadores de filtros al principio de su pipeline para descartar datos no deseados antes de un procesamiento costoso
- Combine condiciones: Utilice la lógica
and/oren una sola expresión en lugar de encadenar múltiples procesadores de filtros - Rendimiento de expresiones regulares: La coincidencia de patrones con
matcheses más costosa que las comprobaciones de igualdad exacta. Use==cuando sea posible.
Ejemplo de ordenamiento 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")Referencia de expresiones booleanas de OTTL
Para la sintaxis completa de OTTL y operadores adicionales:
Próximos pasos
- Obtenga más información sobre el procesador de transformación para modificar datos antes del filtrado
- Consulte Sampling processor para la reducción de volumen probabilística
- Consulte la referencia de configuración YAML para la sintaxis completa