Kubeletstats Receiver
contrib, k8s
Maintainers: @dmitryax, @TylerHelmuth, @ChrsMark
Source: opentelemetry-collector-contrib
Supported Telemetry
Overview
Metrics
Details about the metrics produced by this receiver can be found in metadata.yaml with further documentation in documentation.mdCompatibility
Kubernetes Versions
This receiver is tested against the Kubernetes versions specified in the e2e-tests.yml workflow. These tested versions represent the officially supported Kubernetes versions for this component.Configuration
A kubelet runs on a kubernetes node and has an API server to which this receiver connects. To configure this receiver, you have to tell it how to connect and authenticate to the API server and how often to collect data and send it to the next consumer. Kubelet Stats Receiver supports both secure Kubelet endpoint exposed at port 10250 by default and read-only Kubelet endpoint exposed at port 10255. Ifauth_type set to none, the read-only endpoint will be used. The secure
endpoint will be used if auth_type set to any of the following values:
tlstells the receiver to use TLS for auth and requires that the fieldsca_file,key_file, andcert_filealso be set.serviceAccounttells this receiver to use the default service account token to authenticate to the kubelet API along with the default certificate which is signed by the clusterβs root CA cert:/var/run/secrets/kubernetes.io/serviceaccount/token/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
kubeConfigtells this receiver to use the kubeconfig file (KUBECONFIG env variable or ~/.kube/config) to authenticate and use API server proxy to access the kubelet API.initial_delay(default =1s): defines how long this receiver waits before starting.
TLS Example
Service Account Authentication Example
Although itβs possible to use kubernetesβ hostNetwork feature to talk to the kubelet api from a pod, the preferred approach is to use the downward API. Make sure the pod spec sets the node name as follows:K8S_NODE_NAME environment variable:
endpoint will cause the hostname on which the
collector is running to be used as the endpoint. If the hostNetwork flag is
set, and the collector is running in a pod, this hostname will resolve to the
nodeβs network namespace.
Custom CA
The service account client, by default, uses the CA certificate located at/var/run/secrets/kubernetes.io/serviceaccount/ca.crt to validate the kubelet certificate.
If the kubelet server uses a certificate issued by a different CA,
specify the custom CA certificate path using the ca_file option.
AKS Custom CA example
This use case applies to AKS cluster, where the kubelet certificate is issued by/etc/kubernetes/certs/kubeletserver.crt
Read Only Endpoint Example
The following config can be used to collect Kubelet metrics from read-only endpoint:Kubeconfig example
The following config can be used to collect Kubelet metrics from read-only endpoint, proxied by the API server:auth_type kubeConfig, the endpoint should only be the node name as the communication to the kubelet is proxied by the API server configured in the kubeConfig.
insecure_skip_verify still applies by overriding the kubeConfig settings.
If no context is specified, the current context or the default context is used.
Extra metadata labels
By default, all produced metrics get resource labels based on what kubelet /stats/summary endpoint provides. For some use cases it might be not enough. So itβs possible to leverage other endpoints to fetch additional metadata entities and set them as extra labels on metric resource. Currently supported metadata include the following:container.id- to augment metrics with Container ID label obtained from container statuses exposed via/pods.k8s.volume.type- to collect volume type from the Pod spec exposed via/podsand have it as a label on volume metrics. If thereβs more information available from the endpoint than just volume type, those are synced as well depending on the available fields and the type of volume. For example,aws.volume.idwould be synced fromawsElasticBlockStoreandgce.pd.nameis synced forgcePersistentDisk.
[!WARNING]If you want to havegce.pd.name,aws.volume.id,glusterfs.path, andglusterfs.endpoints.nameresource attributes are all deprecated and will be removed soon.
container.id label added to your metrics, use extra_metadata_labels field to enable
it, for example:
extra_metadata_labels is not set, no additional API calls is done to fetch extra metadata.
Collecting Additional Volume Metadata
When dealing with Persistent Volume Claims, it is possible to optionally sync metdadata from the underlying storage resource rather than just the volume claim. This is achieved by talking to the Kubernetes API. Below is an example, configuration to achieve this.k8s_api_config is set, the receiver will attempt to collect metadata from underlying storage resources for
Persistent Volume Claims. For example, if a Pod is using a PVC backed by an EBS instance on AWS, the receiver
would set the k8s.volume.type label to be awsElasticBlockStore rather than persistentVolumeClaim.
[!WARNING]
awsElasticBlockStore resource attribute aws.volume.id is deprecated and will be removed soon
Important: When using k8s_api_config, the service account must have get permissions for
persistentvolumeclaims and persistentvolumes resources. See Role-based access control
for the required RBAC configuration.
Metric Groups
A list of metric groups from which metrics should be collected. By default, metrics from containers, pods and nodes will be collected. Ifmetric_groups is set, only metrics from the listed groups
will be collected. Valid groups are container, pod, node and volume. For example, if youβre
looking to collect only node and pod metrics from the receiver use the following configuration.
Network metrics from all interfaces for Node and Pod
By default,k8s.[node|pod].network.* metrics are collected only for the default network interface (e.g. eth0). To enable network IO/error metrics collection from all available interfaces on Node/Pod level - you can use collect_all_network_interfaces configuration parameters. Please be aware that enabling this options will increase the amount of produced network metrics and increase network metrics cardinality, because of interface attribute.
For example, if you would like to have network IO/error metrics from all network interfaces for both Pod and Node level you can use the following configuration.
Collect k8s.{container,pod}.{cpu,memory}.node.utilization as ratio of total nodeβs capacity
In order to calculate the k8s.container.cpu.node.utilization, k8s.pod.cpu.node.utilization,
k8s.container.memory.node.utilization and k8s.pod.memory.node.utilization metrics, the
information of the nodeβs capacity must be retrieved from the k8s API. In this, the k8s_api_config needs to be set.
In addition, the node name must be identified properly. The K8S_NODE_NAME env var can be set using the
downward API inside the collector pod spec as follows:
node value to ${env:K8S_NODE_NAME} in the receiverβs configuration:
Optional parameters
The following parameters can also be specified:collection_interval(default =10s): The interval at which to collect data.insecure_skip_verify(default =false): Whether or not to skip certificate verification.
Role-based access control
The Kubelet Stats Receiver needsget permissions on the nodes/stats resources. Additionally, when using extra_metadata_labels or any of the {request|limit}_utilization metrics the receiver also needs get permissions for nodes/pods resources.
When using k8s_api_config to collect detailed volume metadata from PersistentVolumeClaims (as described in Collecting Additional Volume Metadata), the receiver also needs get permissions for persistentvolumeclaims and persistentvolumes resources.
Metrics
| Metric Name | Description | Unit | Type | Attributes |
|---|---|---|---|---|
β
container.cpu.time | Total cumulative CPU time (sum of all cores) spent by the container/pod/node since its creation | s | Counter | |
β
container.cpu.usage | Total CPU usage (sum of all cores per second) averaged over the sample window | {cpu} | Gauge | |
β
container.filesystem.available | Container filesystem available | By | Gauge | |
β
container.filesystem.capacity | Container filesystem capacity | By | Gauge | |
β
container.filesystem.usage | Container filesystem usage | By | Gauge | |
β
container.memory.available | Container memory available | By | Gauge | |
β
container.memory.major_page_faults | Container memory major_page_faults | 1 | Gauge | |
β
container.memory.page_faults | Container memory page_faults | 1 | Gauge | |
β
container.memory.rss | Container memory rss | By | Gauge | |
β
container.memory.usage | Container memory usage | By | Gauge | |
β
container.memory.working_set | Container memory working_set | By | Gauge | |
β container.uptime | The time since the container started | s | Counter | |
β k8s.container.cpu.node.utilization | Container cpu utilization as a ratio of the nodeβs capacity | 1 | Gauge | |
β k8s.container.cpu_limit_utilization | Container cpu utilization as a ratio of the containerβs limits | 1 | Gauge | |
β k8s.container.cpu_request_utilization | Container cpu utilization as a ratio of the containerβs requests | 1 | Gauge | |
β k8s.container.memory.node.utilization | Container memory utilization as a ratio of the nodeβs capacity | 1 | Gauge | |
β k8s.container.memory_limit_utilization | Container memory utilization as a ratio of the containerβs limits | 1 | Gauge | |
β k8s.container.memory_request_utilization | Container memory utilization as a ratio of the containerβs requests | 1 | Gauge | |
β
k8s.node.cpu.time | Total cumulative CPU time (sum of all cores) spent by the container/pod/node since its creation | s | Counter | |
β
k8s.node.cpu.usage | Total CPU usage (sum of all cores per second) averaged over the sample window | {cpu} | Gauge | |
β
k8s.node.filesystem.available | Node filesystem available | By | Gauge | |
β
k8s.node.filesystem.capacity | Node filesystem capacity | By | Gauge | |
β
k8s.node.filesystem.usage | Node filesystem usage | By | Gauge | |
β
k8s.node.memory.available | Node memory available | By | Gauge | |
β
k8s.node.memory.major_page_faults | Node memory major_page_faults | 1 | Gauge | |
β
k8s.node.memory.page_faults | Node memory page_faults | 1 | Gauge | |
β
k8s.node.memory.rss | Node memory rss | By | Gauge | |
β
k8s.node.memory.usage | Node memory usage | By | Gauge | |
β
k8s.node.memory.working_set | Node memory working_set | By | Gauge | |
β
k8s.node.network.errors | Node network errors | 1 | Counter | interface, direction |
β
k8s.node.network.io | Node network IO | By | Counter | interface, direction |
β k8s.node.uptime | The time since the node started | s | Counter | |
β k8s.pod.cpu.node.utilization | Pod cpu utilization as a ratio of the nodeβs capacity | 1 | Gauge | |
β
k8s.pod.cpu.time | Total cumulative CPU time (sum of all cores) spent by the container/pod/node since its creation | s | Counter | |
β
k8s.pod.cpu.usage | Total CPU usage (sum of all cores per second) averaged over the sample window | {cpu} | Gauge | |
β k8s.pod.cpu_limit_utilization | Pod cpu utilization as a ratio of the podβs total container limits. If any container is missing a limit the metric is not emitted. | 1 | Gauge | |
β k8s.pod.cpu_request_utilization | Pod cpu utilization as a ratio of the podβs total container requests. If any container is missing a request the metric is not emitted. | 1 | Gauge | |
β
k8s.pod.filesystem.available | Pod filesystem available | By | Gauge | |
β
k8s.pod.filesystem.capacity | Pod filesystem capacity | By | Gauge | |
β
k8s.pod.filesystem.usage | Pod filesystem usage | By | Gauge | |
β
k8s.pod.memory.available | Pod memory available | By | Gauge | |
β
k8s.pod.memory.major_page_faults | Pod memory major_page_faults | 1 | Gauge | |
β k8s.pod.memory.node.utilization | Pod memory utilization as a ratio of the nodeβs capacity | 1 | Gauge | |
β
k8s.pod.memory.page_faults | Pod memory page_faults | 1 | Gauge | |
β
k8s.pod.memory.rss | Pod memory rss | By | Gauge | |
β
k8s.pod.memory.usage | Pod memory usage | By | Gauge | |
β
k8s.pod.memory.working_set | Pod memory working_set | By | Gauge | |
β k8s.pod.memory_limit_utilization | Pod memory utilization as a ratio of the podβs total container limits. If any container is missing a limit the metric is not emitted. | 1 | Gauge | |
β k8s.pod.memory_request_utilization | Pod memory utilization as a ratio of the podβs total container requests. If any container is missing a request the metric is not emitted. | 1 | Gauge | |
β
k8s.pod.network.errors | Pod network errors | 1 | Counter | interface, direction |
β
k8s.pod.network.io | Pod network IO | By | Counter | interface, direction |
β k8s.pod.uptime | The time since the pod started | s | Counter | |
β k8s.pod.volume.usage | The number of used bytes in the pod volume. | By | UpDownCounter | |
β
k8s.volume.available | The number of available bytes in the volume. | By | Gauge | |
β
k8s.volume.capacity | The total capacity in bytes of the volume. | By | Gauge | |
β
k8s.volume.inodes | The total inodes in the filesystem. | 1 | Gauge | |
β
k8s.volume.inodes.free | The free inodes in the filesystem. | 1 | Gauge | |
β
k8s.volume.inodes.used | The inodes used by the filesystem. This may not equal inodes - free because filesystem may share inodes with other filesystems. | 1 | Gauge |
Attributes
| Attribute Name | Description | Type | Values |
|---|---|---|---|
direction | Direction of flow of bytes/operations (receive or transmit). | string | receive, transmit |
interface | Name of the network interface. | string |
Resource Attributes
| Attribute Name | Description | Type | Enabled |
|---|---|---|---|
aws.volume.id | [DEPRECATED] The id of the AWS Volume | string | β |
container.id | Container id used to identify container | string | β |
fs.type | [DEPRECATED] The filesystem type of the Volume | string | β |
gce.pd.name | [DEPRECATED] The name of the persistent disk in GCE | string | β |
glusterfs.endpoints.name | [DEPRECATED] The endpoint name that details Glusterfs topology | string | β |
glusterfs.path | [DEPRECATED] Glusterfs volume path | string | β |
k8s.container.name | Container name used by container runtime | string | β |
k8s.namespace.name | The name of the namespace that the pod is running in | string | β |
k8s.node.name | The name of the Node | string | β |
k8s.persistentvolumeclaim.name | The name of the Persistent Volume Claim | string | β |
k8s.pod.name | The name of the Pod | string | β |
k8s.pod.uid | The UID of the Pod | string | β |
k8s.volume.name | The name of the Volume | string | β |
k8s.volume.type | The type of the Volume | string | β |
partition | [DEPRECATED] The partition in the Volume | string | β |
Configuration
Example Configuration
Last generated: 2026-04-13