Le processeur de filtrage supprime les enregistrements de télémétrie ou des attributs spécifiques en fonction d'expressions booléennes OTTL (OpenTelemetry Transformation Language). Utilisez-le pour supprimer les données de test, les logs de débogage, les vérifications de l'état ou toute télémétrie de faible valeur avant qu'elle ne quitte votre réseau.
Quand utiliser le processeur de filtre
Utilisez le processeur de filtre lorsque vous devez :
- Supprimer les PII ou les données d'environnement de test: Supprimez les données qui ne doivent pas quitter votre réseau
- Supprimer les logs de niveau debug de la production: filtrer par sévérité pour réduire le bruit
- Filtrer les requêtes de vérification de l'état: exclure le trafic de monitoring répétitif et de faible valeur
- Supprimer les métriques avec des préfixes ou des motifs spécifiques: Supprimez les flux de métriques inutiles
- Supprimez la télémétrie de faible valeur en fonction des attributs: filtrez par nom de service, environnement ou tags personnalisés
Fonctionnement du processeur de filtrage
Le processeur de filtre évalue les expressions booléennes OTTL pour chaque enregistrement de télémétrie. Lorsqu'une condition est évaluée à true, l'enregistrement est rejeté.
C'est l'inverse de nombreux langages de requête où WHERE status = 'ERROR' signifie « conserver les erreurs ». Dans le processeur de filtre, status == 'ERROR' signifie « abandonner les erreurs ».
Configuration
Ajoutez un processeur de filtre à votre 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"Champs de configuration:
logs: Tableau d'expressions booléennes OTTL pour le filtrage des logsspan,span_event: Tableau d'expressions booléennes OTTL pour le filtrage des spans de tracemetric,datapoint: Tableau d'expressions booléennes OTTL pour le filtrage des métriques
Conditions multiples: lorsque vous fournissez plusieurs expressions dans le tableau, elles sont évaluées avec une logique OU. Si l'une des conditions est vraie, l'enregistrement est rejeté.
Opérateurs booléens OTTL
Opérateurs de comparaison
==- Égal à!=- Différent de<- Inférieur à<=- Inférieur ou égal à>- Supérieur à>=- Supérieur ou égal à
Opérateurs logiques
and- Les deux conditions doivent être vraiesor- L'une des conditions doit être vraienot- Nie une condition
Correspondance de motifs
matches- Correspondance de motifs Regex
logs: - 'body matches ".*health.*"' - 'attributes["http.url"] matches ".*\\/api\\/v1\\/health.*"'Exemples complets
Exemple 1 : Supprimer les données de l'environnement de test
Supprimer toute la télémétrie des environnements de test et de développement :
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"Exemple 2 : Supprimer les logs de debug en production
Conservez uniquement les niveaux de log pertinents en production :
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 < 9Référence du numéro de sévérité:
- TRACE = 1-4
- DEBUG = 5-8
- INFO = 9-12
- WARN = 13-16
- ERREUR = 17-20
- FATAL = 21-24
Exemple 3 : Supprimer les spans de contrôle de santé
Supprimez le trafic de contrôle de santé qui n'apporte aucune valeur diagnostique :
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"Exemple 4 : Supprimer par nom de service
Filtrer des services spécifiques ou des modèles de service :
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")Exemple 5 : Supprimer les métriques avec des préfixes spécifiques
Supprimer les flux de métriques inutiles :
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"Exemple 6 : Conditions combinées avec AND
Supprimer uniquement lorsque plusieurs conditions sont vraies :
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"Exemple 7 : Conserver les erreurs, abandonner tout le reste
Inversez la logique pour ne conserver que les données utiles :
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 utilisez la logique 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")Exemple 8 : Correspondance de motifs dans le corps du log
Supprimer les logs contenant des motifs spécifiques :
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.*")Exemple 9 : Supprimer les spans à volume élevé et de faible valeur
Supprimez les spans qui apparaissent fréquemment mais apportent peu de valeur :
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"] == trueExemple 10 : Suppression basée sur le statut HTTP
Filtrer les requêtes réussies, conserver les erreurs :
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"] < 400Exemple 11 : Conditions multiples avec OR
Supprimer si une condition correspond :
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"Suppression de données vs suppression d'attributs
Le processeur de filtre peut supprimer des enregistrements entiers (comme indiqué ci-dessus) ou supprimer des attributs spécifiques des enregistrements conservés.
Pour supprimer des attributs tout en conservant l'enregistrement, vous devez utiliser la fonction delete_key() du processeur de transformation, et non le processeur de filtre. Le processeur de filtre supprime uniquement des enregistrements entiers.
Mauvaise approche (cela ne fonctionnera pas) :
filter/Logs: config: logs: - 'delete attributes["sensitive_field"]' # This is not validApproche correcte (utilisez plutôt le processeur de transformation) :
transform/Logs: description: "Remove sensitive attribute" config: log_statements: - delete_key(attributes, "sensitive_field") output: ["filter/Logs"]Considérations relatives aux performances
- L'ordre est important: placez les processeurs de filtrage au début de votre pipeline pour supprimer les données indésirables avant les traitements coûteux
- Combiner les conditions: Utilisez la logique
and/ordans une seule expression plutôt que de chaîner plusieurs processeurs de filtrage - Performance des regex: La correspondance de motifs avec
matchesest plus coûteuse que les vérifications d'égalité exacte. Utilisez==si possible.
Exemple d'ordonnancement efficace:
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")Référence des expressions booléennes OTTL
Pour la syntaxe OTTL complète et les opérateurs supplémentaires :
Prochaines étapes
- En savoir plus sur le processeur de transformation pour modifier les données avant le filtrage.
- Consultez Sampling processor pour la réduction probabiliste du volume
- Consultez la référence de configuration YAML pour la syntaxe complète