New resource types
We added new resource types and the associated resource equality, typing and naming rules: k8s.replicationcontroller, k8s.service, k8s.persistentvolume, k8s.persistentvolumeclaim, k8s.hpa, and k8s.resourcequota. We also added a new, generic k8s.object resource type for all the CRDs that do not currently have semantic conventions, which is necessary to improve the experience with the k8sobjectreceiver of the OpenTelemetry Collector.
Improving the experience with the k8sobjectreceiver
The k8sobjectreceiver sends one log every time a new version of a Kubernetes resource is created. Taking some liberties with the encoding (thankfully, OTLP/YAML is not a thing):
sample-k8sobjectreceiver.yaml123456789101112131415161718192021222324252627282930313233343536373839ResourceLogs:Resource:k8s.namespace.name: dash0-validationScopeLogs:scope.name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiverLogRecords:- timestamp: 1970-01-01T00:00:00Z # receiver leaves it zeroseverity_number: Unspecified # receiver has no Event knowledgeseverity_text: ""event_name: ""attributes:k8s.resource.name: eventsevent.domain: k8sevent.name: bad-image.18b32f4314df584e # verbatim Event.metadata.namebody: # watch modetype: MODIFIEDobject:apiVersion: events.k8s.io/v1kind: Eventmetadata:name: bad-image.18b32f4314df584enamespace: dash0-validationuid: 75309f4a-a6e9-4250-afa8-447ce7afdbe8resourceVersion: "508"creationTimestamp: "2026-05-26T17:57:22Z"regarding:apiVersion: v1kind: Podname: bad-imagenamespace: dash0-validationuid: 91551565-71f9-4d88-9711-3bef7607a7a7fieldPath: spec.containers{bad}resourceVersion: "508"reason: BackOffnote: 'Back-off pulling image "this-image-does-not-exist.example.com/never:latest"'eventTime: "2026-05-26T17:57:22Z"reportingController: kubeletreportingInstance: node-3type: Normal
Since the only resource attribute is k8s.namespace.name, this log used to be associated with a k8s.namespace resource, alongside all others representing new versions of resources in the same namespace. Instead, we now extract from the body of the log additional k8s.* resource attributes:
what-you-find-in-dash0.yaml123456789101112ResourceLogs:Resource:k8s.namespace.name: dash0-validation # from regarding.namespacek8s.pod.name: bad-image # per-Kind promotionk8s.pod.uid: 91551565-71f9-4d88-9711-3bef7607a7a7k8s.node.name: node-3 # from reportingInstance / source.host# (k8s.object.* generic keys removed: Pod has dedicated semconv)ScopeLogs:scope.name: github.com/dash0hq/dash0-opentelemetry-collector/processor/dash0k8sobjectprocessorLogRecords:event_name: k8s.object # this makes the log available for Annotations!# The rest is the same
That is, you are going now to find your new versions of Pods and Deployments when you filters for those pods and deployments.
Additionally, since we replace the bogus event_name field with k8s.object, you can use these logs for dashboard annotations, and can overlay how your Kubernetes resources change to your telemetry!
We also added support to normalizing the format for Kubernetes events as reported by k8sobjectreceiver to the format we already supported of k8seventreceiver (because, for Kubernetes, events are resources the way a pod or a deployment are), which means you can standardsize of k8sobjectreceiver rather than using additionally k8seventreceiver.
Last but not least, we papered over a nasty bug in k8seventreceiver, which set timestamps based on the timezone where the collector is deployed in. Now it will all be consistently UTC.
Further reading
- Updated resource equality, naming and typing rules for Kubernetes
- How Dash0 Processes Kubernetes Object Logs