Redaction Processor
contrib, k8s
Maintainers: @dmitryax, @mx-psi, @TylerHelmuth, @iblancasa
Source: opentelemetry-collector-contrib
Supported Telemetry
Overview
Use Cases
Typical use-cases:- Prevent sensitive fields from accidentally leaking into traces
- Ensure compliance with legal, privacy, or security requirements
- EU General Data Protection Regulation (GDPR) prohibits the transfer of any personal data like birthdates, addresses, or ip addresses across borders without explicit consent from the data subject. Popular trace aggregation services are located in US, not in EU. You can use the redaction processor to scrub personal data from your data.
- PRC legislation prohibits the transfer of geographic coordinates outside of the PRC. Popular trace aggregation services are located in US, not in the PRC. You can use the redaction processor to scrub geographic coordinates from your data.
- Payment Card Industry (PCI) Data Security Standards prohibit logging certain things or storing them unencrypted. You can use the redaction processor to scrub them from your traces.
Processor Configuration
Please refer to config.go for the config spec. Examples:ignored_keys for
exact key matches or ignored_key_patterns for regex-based pattern matching.
Only span/log/datapoint attributes included on the list of allowed keys list are retained.
If allowed_keys is empty, then no attributes are allowed. All
attributes are removed in that case. To keep all span attributes, you should
explicitly set allow_all_keys to true.
blocked_values and allowed_values applies to the values of the allowed keys.
If the value of an allowed key matches the regular expression for an allowed value, the matching
part of the value is not masked even if it matches the regular expression for a blocked value.
If the value matches the regular expression for a blocked value only, the matching
part of the value is masked with a fixed length of asterisks.
Precedence between allowed_values and blocked_values
When both allowed_values and blocked_values are configured, allowed_values takes precedence.
This means that if a value matches an entry in allowed_values, it will not be masked even if it also matches blocked_values. This behavior is intentional and allows operators to explicitly whitelist known-safe values while still blocking broader patterns.
Example
blocked_key_patterns applies to the values of the keys matching one of the patterns.
The value is then masked according to the configuration.
hash_function defines the function for hashing values of matched keys or matches in values
instead of masking them with a fixed string. By default, no hash function is used
and masking with a fixed string is performed. The supported hash functions
are md5, sha1, sha3 (SHA-256), hmac-sha256, and hmac-sha512.
HMAC Hash Functions
For enhanced security, especially when dealing with low-entropy data like IP addresses, HMAC (Hash-based Message Authentication Code) hash functions are recommended over simple hash functions like MD5, SHA1, or SHA3.Configuration Example
Audit Trail
Whensummary is set to debug or info, the processor appends diagnostic
attributes to each span, log record, or metric datapoint describing the actions
it took. Setting summary: silent suppresses all audit attributes.
Attribute-level audit (spans, logs, metric datapoints)
These attributes are added to the record’s attribute map:| Attribute | info | debug | Description |
|---|---|---|---|
redaction.redacted.keys | ✓ | Comma-separated list of attribute keys removed because they were not in allowed_keys | |
redaction.redacted.count | ✓ | ✓ | Number of attributes removed |
redaction.masked.keys | ✓ | Comma-separated list of attribute keys whose values matched a blocked_values pattern and were masked | |
redaction.masked.count | ✓ | ✓ | Number of attribute values masked |
redaction.allowed.keys | ✓ | Comma-separated list of attribute keys that passed through | |
redaction.allowed.count | ✓ | ✓ | Number of attributes allowed through |
redaction.ignored.count | ✓ | ✓ | Number of attributes skipped due to ignored_keys or ignored_key_patterns |
Log body audit
For log records whose body is a map, the processor additionally appends audit attributes into the body map itself:| Attribute | info | debug | Description |
|---|---|---|---|
redaction.body.redacted.keys | ✓ | Comma-separated list of body map keys removed | |
redaction.body.redacted.count | ✓ | ✓ | Number of body map keys removed |
redaction.body.masked.keys | ✓ | Comma-separated list of body map keys whose values were masked | |
redaction.body.masked.count | ✓ | ✓ | Number of body map values masked |
redaction.body.allowed.keys | ✓ | Comma-separated list of body map keys permitted | |
redaction.body.allowed.count | ✓ | ✓ | Number of body map keys allowed through |
redaction.body.ignored.count | ✓ | ✓ | Number of body map keys ignored |
Example
Given this configuration:| Key | Value |
|---|---|
description | "payment processed" |
email | "[email protected]" |
credit_card | "4111111111111111" |
internal_id | "abc-123" |
| Key | Value |
|---|---|
description | "payment processed" |
email | "[email protected]" |
redaction.redacted.keys | "credit_card,internal_id" |
redaction.redacted.count | 2 |
redaction.allowed.keys | "description,email" |
redaction.allowed.count | 2 |
credit_card was removed (not masked) because it was not in
allowed_keys — its value never reached the blocked_values check. If
credit_card had been in allowed_keys, its value 4111111111111111 would
have matched the Visa pattern and redaction.masked.keys would show
"credit_card" instead.
Attributes with a zero count (e.g. redaction.masked.count, redaction.ignored.count) are
not emitted — the processor only writes audit attributes when at least one relevant
action occurred.
URL Sanitization
Theurl_sanitizer configuration enables sanitization of URLs in specified attributes by removing potentially sensitive information like UUIDs, timestamps, and other non-essential path segments. This is particularly useful for reducing cardinality in telemetry data while preserving the essential parts of URLs for troubleshooting.
Span Name Sanitization
By default, when URL sanitization is enabled, span names for client and server span types that contain ”/” characters are automatically sanitized. This helps reduce cardinality issues caused by high-variability URL paths in span names while preserving essential routing information. You can control this behavior using thesanitize_span_name option:
true(default): Span names will be sanitized along with attributesfalse: Only attributes are sanitized, span names remain unchanged
notes is on the list of allowed keys, then the notes
attribute is retained. However, if there is a value such as a credit card
number in the notes field that matched a regular expression on the list of
blocked values, then that value is masked.
Database Query Sanitization
The redaction processor now supports sanitizing database queries and commands to remove sensitive information. This feature supports multiple database systems:- SQL databases
- Redis
- Memcached
- MongoDB
- OpenSearch
- Elasticsearch
- Remove sensitive data like literal values from SQL queries
- Redact command arguments from Redis/Memcached commands
- Sanitize MongoDB queries and JSON payloads
- Process only specified attributes if provided
- Preserve query structure while removing sensitive data
- Sanitize span names containing database queries (can be controlled with
sanitize_span_name)
sanitize_span_name: false in the db_sanitizer configuration, which allows you to keep original database query span names while still sanitizing the query values in attributes.
This provides an additional layer of protection when collecting telemetry that includes database operations.
Trace and metric behaviour: Database sanitization for spans and metric attributes only runs when the telemetry includes a db.system.name or db.system attribute and the span kind is CLIENT or SERVER. This prevents non-database spans from being rewritten. Logs automatically enable a sequential fallback internally, so database attributes without db.system can still be sanitized when they appear in log records.
Configuration
Example Configuration
Last generated: 2026-04-13