diff --git a/.chloggen/add_k8s_container_metrics.yaml b/.chloggen/add_k8s_container_metrics.yaml new file mode 100644 index 000000000..26e4a8388 --- /dev/null +++ b/.chloggen/add_k8s_container_metrics.yaml @@ -0,0 +1,22 @@ +# Use this changelog template to create an entry for release notes. +# +# If your change doesn't affect end users you should instead start +# your pull request title with [chore] or use the "Skip Changelog" label. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement + +# The name of the area of concern in the attributes-registry, (e.g. http, cloud, db) +component: k8s + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Add K8s container resource related metrics + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +# The values here must be integers. +issues: [2074] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: diff --git a/docs/non-normative/k8s-migration.md b/docs/non-normative/k8s-migration.md index d56ba67ba..566c8034f 100644 --- a/docs/non-normative/k8s-migration.md +++ b/docs/non-normative/k8s-migration.md @@ -57,6 +57,7 @@ and one for disabling the old schema called `semconv.k8s.disableLegacy`. Then: - [K8s Namespace metrics](#k8s-namespace-metrics) - [K8s ResourceQuota resource](#k8s-resourcequota-resource) - [K8s ReplicationController resource](#k8s-replicationcontroller-resource) + - [K8s Container metrics](#k8s-container-metrics) @@ -282,4 +283,27 @@ The changes are the following: |---------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------| | `k8s.replication_controller.{name,uid}` | `k8s.replicationcontroller.{name,uid}` | +### K8s Container metrics + +The K8s Container metrics implemented by the Collector and specifically the +[k8scluster](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/v0.115.0/receiver/k8sclusterreceiver/documentation.md) +receiver were introduced as semantic conventions in +[#2178](https://github.com/open-telemetry/semantic-conventions/pull/2178) (TODO: replace with SemConv version once +available). + +The changes in their metrics are the following: + + + +| Old (Collector) ![changed](https://img.shields.io/badge/changed-orange?style=flat) | New | +|------------------------------------------------------------------------------------|-------------------------------------------| +| `k8s.container.cpu_limit` | `k8s.container.cpu.limit` | +| `k8s.container.cpu_request` | `k8s.container.cpu.request` | +| `k8s.container.memory_limit` | `k8s.container.memory.limit` | +| `k8s.container.memory_request` | `k8s.container.memory.request` | +| `k8s.container.storage_limit` | `k8s.container.storage.limit` | +| `k8s.container.storage_request` | `k8s.container.storage.request` | +| `k8s.container.ephemeralstorage_limit` | `k8s.container.ephemeral_storage.limit` | +| `k8s.container.ephemeralstorage_request` | `k8s.container.ephemeral_storage.request` | + diff --git a/docs/system/k8s-metrics.md b/docs/system/k8s-metrics.md index c72e19b0d..dd3e2097e 100644 --- a/docs/system/k8s-metrics.md +++ b/docs/system/k8s-metrics.md @@ -65,6 +65,15 @@ and therefore inherit its attributes, like `k8s.pod.name` and `k8s.pod.uid`. - [Metric: `k8s.cronjob.active_jobs`](#metric-k8scronjobactive_jobs) - [Namespace metrics](#namespace-metrics) - [Metric: `k8s.namespace.phase`](#metric-k8snamespacephase) +- [K8s Container metrics](#k8s-container-metrics) + - [Metric: `k8s.container.cpu.limit`](#metric-k8scontainercpulimit) + - [Metric: `k8s.container.cpu.request`](#metric-k8scontainercpurequest) + - [Metric: `k8s.container.memory.limit`](#metric-k8scontainermemorylimit) + - [Metric: `k8s.container.memory.request`](#metric-k8scontainermemoryrequest) + - [Metric: `k8s.container.storage.limit`](#metric-k8scontainerstoragelimit) + - [Metric: `k8s.container.storage.request`](#metric-k8scontainerstoragerequest) + - [Metric: `k8s.container.ephemeral_storage.limit`](#metric-k8scontainerephemeral_storagelimit) + - [Metric: `k8s.container.ephemeral_storage.request`](#metric-k8scontainerephemeral_storagerequest) @@ -1089,5 +1098,185 @@ This metric is [recommended][MetricRecommended]. +## K8s Container metrics + +**Description:** K8s Container level metrics captured under the namespace `k8s.container`. + +### Metric: `k8s.container.cpu.limit` + +This metric is [recommended][MetricRecommended]. + + + + + + + + +| Name | Instrument Type | Unit (UCUM) | Description | Stability | Entity Associations | +| -------- | --------------- | ----------- | -------------- | --------- | ------ | +| `k8s.container.cpu.limit` | Gauge | `{cpu}` | Maximum CPU resource limit set for the container [1] | ![Development](https://img.shields.io/badge/-development-blue) | `k8s.container` | + +**[1]:** See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + + + + + + +### Metric: `k8s.container.cpu.request` + +This metric is [recommended][MetricRecommended]. + + + + + + + + +| Name | Instrument Type | Unit (UCUM) | Description | Stability | Entity Associations | +| -------- | --------------- | ----------- | -------------- | --------- | ------ | +| `k8s.container.cpu.request` | Gauge | `{cpu}` | CPU resource requested for the container [1] | ![Development](https://img.shields.io/badge/-development-blue) | `k8s.container` | + +**[1]:** See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + + + + + + +### Metric: `k8s.container.memory.limit` + +This metric is [recommended][MetricRecommended]. + + + + + + + + +| Name | Instrument Type | Unit (UCUM) | Description | Stability | Entity Associations | +| -------- | --------------- | ----------- | -------------- | --------- | ------ | +| `k8s.container.memory.limit` | Gauge | `By` | Maximum memory resource limit set for the container [1] | ![Development](https://img.shields.io/badge/-development-blue) | `k8s.container` | + +**[1]:** See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + + + + + + +### Metric: `k8s.container.memory.request` + +This metric is [recommended][MetricRecommended]. + + + + + + + + +| Name | Instrument Type | Unit (UCUM) | Description | Stability | Entity Associations | +| -------- | --------------- | ----------- | -------------- | --------- | ------ | +| `k8s.container.memory.request` | Gauge | `By` | Memory resource requested for the container [1] | ![Development](https://img.shields.io/badge/-development-blue) | `k8s.container` | + +**[1]:** See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + + + + + + +### Metric: `k8s.container.storage.limit` + +This metric is [recommended][MetricRecommended]. + + + + + + + + +| Name | Instrument Type | Unit (UCUM) | Description | Stability | Entity Associations | +| -------- | --------------- | ----------- | -------------- | --------- | ------ | +| `k8s.container.storage.limit` | Gauge | `By` | Maximum storage resource limit set for the container [1] | ![Development](https://img.shields.io/badge/-development-blue) | `k8s.container` | + +**[1]:** See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + + + + + + +### Metric: `k8s.container.storage.request` + +This metric is [recommended][MetricRecommended]. + + + + + + + + +| Name | Instrument Type | Unit (UCUM) | Description | Stability | Entity Associations | +| -------- | --------------- | ----------- | -------------- | --------- | ------ | +| `k8s.container.storage.request` | Gauge | `By` | Storage resource requested for the container [1] | ![Development](https://img.shields.io/badge/-development-blue) | `k8s.container` | + +**[1]:** See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + + + + + + +### Metric: `k8s.container.ephemeral_storage.limit` + +This metric is [recommended][MetricRecommended]. + + + + + + + + +| Name | Instrument Type | Unit (UCUM) | Description | Stability | Entity Associations | +| -------- | --------------- | ----------- | -------------- | --------- | ------ | +| `k8s.container.ephemeral_storage.limit` | Gauge | `By` | Maximum ephemeral storage resource limit set for the container [1] | ![Development](https://img.shields.io/badge/-development-blue) | `k8s.container` | + +**[1]:** See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + + + + + + +### Metric: `k8s.container.ephemeral_storage.request` + +This metric is [recommended][MetricRecommended]. + + + + + + + + +| Name | Instrument Type | Unit (UCUM) | Description | Stability | Entity Associations | +| -------- | --------------- | ----------- | -------------- | --------- | ------ | +| `k8s.container.ephemeral_storage.request` | Gauge | `By` | Ephemeral storage resource requested for the container [1] | ![Development](https://img.shields.io/badge/-development-blue) | `k8s.container` | + +**[1]:** See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + + + + + + [DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status [MetricRecommended]: /docs/general/metric-requirement-level.md#recommended diff --git a/model/k8s/metrics.yaml b/model/k8s/metrics.yaml index 9c199bd5c..4730cec88 100644 --- a/model/k8s/metrics.yaml +++ b/model/k8s/metrics.yaml @@ -469,3 +469,93 @@ groups: attributes: - ref: k8s.namespace.phase requirement_level: required + + # k8s.container.* metrics + - id: metric.k8s.container.cpu.limit + type: metric + metric_name: k8s.container.cpu.limit + stability: development + brief: "Maximum CPU resource limit set for the container" + entity_associations: + - k8s.container + note: | + See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + instrument: gauge + unit: "{cpu}" + - id: metric.k8s.container.cpu.request + type: metric + metric_name: k8s.container.cpu.request + stability: development + brief: "CPU resource requested for the container" + entity_associations: + - k8s.container + note: | + See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + instrument: gauge + unit: "{cpu}" + - id: metric.k8s.container.memory.limit + type: metric + metric_name: k8s.container.memory.limit + stability: development + brief: "Maximum memory resource limit set for the container" + entity_associations: + - k8s.container + note: | + See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + instrument: gauge + unit: "By" + - id: metric.k8s.container.memory.request + type: metric + metric_name: k8s.container.memory.request + stability: development + brief: "Memory resource requested for the container" + entity_associations: + - k8s.container + note: | + See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + instrument: gauge + unit: "By" + - id: metric.k8s.container.storage.limit + type: metric + metric_name: k8s.container.storage.limit + stability: development + brief: "Maximum storage resource limit set for the container" + entity_associations: + - k8s.container + note: | + See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + instrument: gauge + unit: "By" + - id: metric.k8s.container.storage.request + type: metric + metric_name: k8s.container.storage.request + stability: development + brief: "Storage resource requested for the container" + entity_associations: + - k8s.container + note: | + See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + instrument: gauge + unit: "By" + - id: metric.k8s.container.ephemeral_storage.limit + type: metric + metric_name: k8s.container.ephemeral_storage.limit + stability: development + brief: "Maximum ephemeral storage resource limit set for the container" + entity_associations: + - k8s.container + note: | + See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + instrument: gauge + unit: "By" + - id: metric.k8s.container.ephemeral_storage.request + type: metric + metric_name: k8s.container.ephemeral_storage.request + stability: development + brief: "Ephemeral storage resource requested for the container" + entity_associations: + - k8s.container + note: | + See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core for details. + instrument: gauge + unit: "By"