service.name in both attributes and resource_attributes. level and severity_text both present. The same data, stored redundantly.
This happens when different parts of your stack add the same information:
- Your application logs
time, your collector adds@timestamp - Your SDK logs
level, the OTel exporter addsseverity_text - Your service logs
host, your agent addshostname
level/severity. Two different fields that happen to have matching values aren’t duplicates. That’s coincidence, not redundancy.
Example
The following log has three duplicate pairs:time and @timestamp, level and severity_text, host and hostname. Same values, different names.
- Before
- After
Recommended enforcement
Enforce at edge
Drop the duplicate field before data leaves your network. Immediate savings, no code changes.
How it works
Tero compares field values across your logs. Exact string matches get flagged. Semantic equivalents too:level: 9 and severity_text: INFO are the same thing, so one gets removed.
Fields that look similar but contain different values aren’t flagged. If time is UTC and @timestamp is local time, that’s not a duplicate. They’re different representations. Same with request_id and trace_id. Related but distinct identifiers.
Only true duplicates. Tero keeps the canonical field (usually the more standard name like @timestamp or severity_text) and removes the duplicate.