Skip to content

Commit d8cafe9

Browse files
committed
Add pod affinity/anti-affinity metrics
- Add kube_deployment_spec_pod_affinity_required_rules metric - Add kube_deployment_spec_pod_affinity_preferred_rules metric - Add kube_deployment_spec_pod_anti_affinity_required_rules metric - Add kube_deployment_spec_pod_anti_affinity_preferred_rules metric - Update deployment metrics documentation - Add comprehensive test coverage for all scenarios
1 parent 95b29ac commit d8cafe9

File tree

3 files changed

+257
-46
lines changed

3 files changed

+257
-46
lines changed
Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
# Deployment Metrics
22

3-
| Metric name | Metric type | Description | Labels/tags | Status |
4-
| ----------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
3+
| Metric name | Metric type | Description | Labels/tags | Status |
4+
|-------------------------------------------------------------|-------------|-----------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|
55
| kube_deployment_annotations | Gauge | Kubernetes annotations converted to Prometheus labels controlled via [--metric-annotations-allowlist](../../developer/cli-arguments.md) | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; <br> `annotation_DEPLOYMENT_ANNOTATION`=&lt;DEPLOYMENT_ANNOTATION&gt; | EXPERIMENTAL |
6-
| kube_deployment_status_replicas | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
7-
| kube_deployment_status_replicas_ready | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
8-
| kube_deployment_status_replicas_available | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
9-
| kube_deployment_status_replicas_unavailable | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
10-
| kube_deployment_status_replicas_updated | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
11-
| kube_deployment_status_observed_generation | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
12-
| kube_deployment_status_condition | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; <br> `condition`=&lt;deployment-condition&gt; <br> `status`=&lt;true\|false\|unknown&gt; | STABLE |
13-
| kube_deployment_spec_replicas | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
14-
| kube_deployment_spec_paused | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
15-
| kube_deployment_spec_strategy_rollingupdate_max_unavailable | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
16-
| kube_deployment_spec_strategy_rollingupdate_max_surge | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
17-
| kube_deployment_metadata_generation | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
6+
| kube_deployment_status_replicas | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
7+
| kube_deployment_status_replicas_ready | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
8+
| kube_deployment_status_replicas_available | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
9+
| kube_deployment_status_replicas_unavailable | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
10+
| kube_deployment_status_replicas_updated | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
11+
| kube_deployment_status_observed_generation | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
12+
| kube_deployment_status_condition | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; <br> `condition`=&lt;deployment-condition&gt; <br> `status`=&lt;true\|false\|unknown&gt; | STABLE |
13+
| kube_deployment_spec_replicas | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
14+
| kube_deployment_spec_paused | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
15+
| kube_deployment_spec_pod_affinity_preferred_rules | Gauge | Number of preferred pod affinity rules in the deployment's pod template | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | ALPHA |
16+
| kube_deployment_spec_pod_affinity_required_rules | Gauge | Number of required pod affinity rules in the deployment's pod template | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | ALPHA |
17+
| kube_deployment_spec_pod_anti_affinity_preferred_rules | Gauge | Number of preferred pod anti-affinity rules in the deployment's pod template | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | ALPHA |
18+
| kube_deployment_spec_pod_anti_affinity_required_rules | Gauge | Number of required pod anti-affinity rules in the deployment's pod template | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | ALPHA |
19+
| kube_deployment_spec_strategy_rollingupdate_max_unavailable | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
20+
| kube_deployment_spec_strategy_rollingupdate_max_surge | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
21+
| kube_deployment_metadata_generation | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
1822
| kube_deployment_labels | Gauge | Kubernetes labels converted to Prometheus labels controlled via [--metric-labels-allowlist](../../developer/cli-arguments.md) | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; <br> `label_DEPLOYMENT_LABEL`=&lt;DEPLOYMENT_LABEL&gt; | STABLE |
19-
| kube_deployment_created | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
23+
| kube_deployment_created | Gauge | | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |

internal/store/deployment.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,86 @@ func deploymentMetricFamilies(allowAnnotationsList, allowLabelsList []string) []
267267
}
268268
}),
269269
),
270+
*generator.NewFamilyGeneratorWithStability(
271+
"kube_deployment_spec_pod_affinity_required_rules",
272+
"Number of required pod affinity rules in the deployment's pod template.",
273+
metric.Gauge,
274+
basemetrics.ALPHA,
275+
"",
276+
wrapDeploymentFunc(func(d *v1.Deployment) *metric.Family {
277+
count := 0
278+
if d.Spec.Template.Spec.Affinity != nil && d.Spec.Template.Spec.Affinity.PodAffinity != nil {
279+
count = len(d.Spec.Template.Spec.Affinity.PodAffinity.RequiredDuringSchedulingIgnoredDuringExecution)
280+
}
281+
return &metric.Family{
282+
Metrics: []*metric.Metric{
283+
{
284+
Value: float64(count),
285+
},
286+
},
287+
}
288+
}),
289+
),
290+
*generator.NewFamilyGeneratorWithStability(
291+
"kube_deployment_spec_pod_affinity_preferred_rules",
292+
"Number of preferred pod affinity rules in the deployment's pod template.",
293+
metric.Gauge,
294+
basemetrics.ALPHA,
295+
"",
296+
wrapDeploymentFunc(func(d *v1.Deployment) *metric.Family {
297+
count := 0
298+
if d.Spec.Template.Spec.Affinity != nil && d.Spec.Template.Spec.Affinity.PodAffinity != nil {
299+
count = len(d.Spec.Template.Spec.Affinity.PodAffinity.PreferredDuringSchedulingIgnoredDuringExecution)
300+
}
301+
return &metric.Family{
302+
Metrics: []*metric.Metric{
303+
{
304+
Value: float64(count),
305+
},
306+
},
307+
}
308+
}),
309+
),
310+
*generator.NewFamilyGeneratorWithStability(
311+
"kube_deployment_spec_pod_anti_affinity_required_rules",
312+
"Number of required pod anti-affinity rules in the deployment's pod template.",
313+
metric.Gauge,
314+
basemetrics.ALPHA,
315+
"",
316+
wrapDeploymentFunc(func(d *v1.Deployment) *metric.Family {
317+
count := 0
318+
if d.Spec.Template.Spec.Affinity != nil && d.Spec.Template.Spec.Affinity.PodAntiAffinity != nil {
319+
count = len(d.Spec.Template.Spec.Affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution)
320+
}
321+
return &metric.Family{
322+
Metrics: []*metric.Metric{
323+
{
324+
Value: float64(count),
325+
},
326+
},
327+
}
328+
}),
329+
),
330+
*generator.NewFamilyGeneratorWithStability(
331+
"kube_deployment_spec_pod_anti_affinity_preferred_rules",
332+
"Number of preferred pod anti-affinity rules in the deployment's pod template.",
333+
metric.Gauge,
334+
basemetrics.ALPHA,
335+
"",
336+
wrapDeploymentFunc(func(d *v1.Deployment) *metric.Family {
337+
count := 0
338+
if d.Spec.Template.Spec.Affinity != nil && d.Spec.Template.Spec.Affinity.PodAntiAffinity != nil {
339+
count = len(d.Spec.Template.Spec.Affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution)
340+
}
341+
return &metric.Family{
342+
Metrics: []*metric.Metric{
343+
{
344+
Value: float64(count),
345+
},
346+
},
347+
}
348+
}),
349+
),
270350
*generator.NewFamilyGeneratorWithStability(
271351
"kube_deployment_metadata_generation",
272352
"Sequence number representing a specific generation of the desired state.",

0 commit comments

Comments
 (0)