Every tool in your observability stack adds metadata. Kubernetes adds pod UIDs. The OTel SDK adds its version. Collectors add process information. Each tool assumes you might need it.Most of it, you don’t. These fields exist on every log, get indexed, take up storage. Nobody ever searches them.
Kubernetes assigns internal UIDs to every resource. You already have the human-readable names (k8s.pod.name, k8s.deployment.name), so the UIDs just take up space.
id: remove-k8s-uidsname: Remove Kubernetes UIDsdescription: Drop internal Kubernetes identifiers. Pod and deployment names are sufficient for debugging.log: match: - resource_attribute: k8s.pod.uid exists: true transform: remove: - resource_attribute: k8s.pod.uid - resource_attribute: k8s.replicaset.uid - resource_attribute: k8s.deployment.uid - resource_attribute: k8s.statefulset.uid - resource_attribute: k8s.daemonset.uid - resource_attribute: k8s.job.uid - resource_attribute: k8s.cronjob.uid
The OpenTelemetry SDK adds metadata about itself: which SDK, which version, which language. Useful for debugging OTel. Not useful for debugging your application.
id: remove-otel-sdk-metadataname: Remove OTel SDK metadatadescription: Drop OpenTelemetry SDK version info. Only needed when debugging the SDK itself.log: match: - resource_attribute: telemetry.sdk.name exists: true transform: remove: - resource_attribute: telemetry.sdk.name - resource_attribute: telemetry.sdk.version - resource_attribute: telemetry.sdk.language - resource_attribute: telemetry.auto.version
Collectors often add process-level metadata: the PID, the command line, the executable path. PIDs change on every restart. Command lines and executable paths are identical across instances of the same service.
These fields are added by infrastructure tooling, not your application code. Fixing at the source would mean reconfiguring agents across your entire fleet. It’s simpler to drop them at the edge.
Tero checks every signal in your context graph: query history, dashboards, alerts, saved searches. Fields that exist on logs but never appear anywhere are flagged as unused.This isn’t guessing. If k8s.pod.uid appears in even one dashboard or alert, it won’t be flagged. Tero only surfaces fields with zero usage across all signals.