Skip to content

Commit 3c88746

Browse files
committed
affinity metrics: add namespaceSelector and namespaces labels; remove stray comments; keep header spacing; docs+tests updated
1 parent 74da1d6 commit 3c88746

File tree

3 files changed

+21
-13
lines changed

3 files changed

+21
-13
lines changed

docs/metrics/workload/deployment-metrics.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
| kube_deployment_status_condition | Gauge | The current status conditions of a deployment. | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; <br> `reason`=&lt;deployment-transition-reason&gt; <br> `condition`=&lt;deployment-condition&gt; <br> `status`=&lt;true\|false\|unknown&gt; | STABLE |
1313
| kube_deployment_spec_replicas | Gauge | Number of desired pods for a deployment. | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
1414
| kube_deployment_spec_paused | Gauge | Whether the deployment is paused and will not be processed by the deployment controller. | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
15-
| kube_deployment_spec_affinity | Gauge | Pod affinity and anti-affinity rules defined in the deployment's pod template specification. | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; <br> `affinity`=&lt;podaffinity\|podantiaffinity&gt; <br> `type`=&lt;requiredDuringSchedulingIgnoredDuringExecution\|preferredDuringSchedulingIgnoredDuringExecution&gt; <br> `topology_key`=&lt;topology-key&gt; <br> `label_selector`=&lt;selector-string&gt; | ALPHA |
15+
| kube_deployment_spec_affinity | Gauge | Pod affinity and anti-affinity rules defined in the deployment's pod template specification. | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; <br> `affinity`=&lt;podaffinity\|podantiaffinity&gt; <br> `type`=&lt;requiredDuringSchedulingIgnoredDuringExecution\|preferredDuringSchedulingIgnoredDuringExecution&gt; <br> `topology_key`=&lt;topology-key&gt; <br> `label_selector`=&lt;selector-string&gt; <br> `namespace_selector`=&lt;namespace-selector-string&gt; <br> `namespaces`=&lt;comma-separated-namespaces&gt; | ALPHA |
1616
| kube_deployment_spec_strategy_rollingupdate_max_unavailable | Gauge | Maximum number of unavailable replicas during a rolling update of a deployment. | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
1717
| kube_deployment_spec_strategy_rollingupdate_max_surge | Gauge | Maximum number of replicas that can be scheduled above the desired number of replicas during a rolling update of a deployment. | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |
1818
| kube_deployment_metadata_generation | Gauge | Sequence number representing a specific generation of the desired state. | `deployment`=&lt;deployment-name&gt; <br> `namespace`=&lt;deployment-namespace&gt; | STABLE |

internal/store/deployment.go

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package store
1818

1919
import (
2020
"context"
21+
"strings"
2122

2223
basemetrics "k8s.io/component-base/metrics"
2324

@@ -456,19 +457,23 @@ func generateDeploymentAffinityMetrics(d *v1.Deployment) *metric.Family {
456457
// Required affinity rules
457458
for _, rule := range d.Spec.Template.Spec.Affinity.PodAffinity.RequiredDuringSchedulingIgnoredDuringExecution {
458459
labelSelector := formatLabelSelector(rule.LabelSelector)
460+
namespaceSelector := formatLabelSelector(rule.NamespaceSelector)
461+
namespaces := strings.Join(rule.Namespaces, ",")
459462
metrics = append(metrics, &metric.Metric{
460-
LabelKeys: []string{"affinity", "type", "topology_key", "label_selector"},
461-
LabelValues: []string{"podaffinity", "requiredDuringSchedulingIgnoredDuringExecution", rule.TopologyKey, labelSelector},
463+
LabelKeys: []string{"affinity", "type", "topology_key", "label_selector", "namespace_selector", "namespaces"},
464+
LabelValues: []string{"podaffinity", "requiredDuringSchedulingIgnoredDuringExecution", rule.TopologyKey, labelSelector, namespaceSelector, namespaces},
462465
Value: 1,
463466
})
464467
}
465468

466469
// Preferred affinity rules
467470
for _, rule := range d.Spec.Template.Spec.Affinity.PodAffinity.PreferredDuringSchedulingIgnoredDuringExecution {
468471
labelSelector := formatLabelSelector(rule.PodAffinityTerm.LabelSelector)
472+
namespaceSelector := formatLabelSelector(rule.PodAffinityTerm.NamespaceSelector)
473+
namespaces := strings.Join(rule.PodAffinityTerm.Namespaces, ",")
469474
metrics = append(metrics, &metric.Metric{
470-
LabelKeys: []string{"affinity", "type", "topology_key", "label_selector"},
471-
LabelValues: []string{"podaffinity", "preferredDuringSchedulingIgnoredDuringExecution", rule.PodAffinityTerm.TopologyKey, labelSelector},
475+
LabelKeys: []string{"affinity", "type", "topology_key", "label_selector", "namespace_selector", "namespaces"},
476+
LabelValues: []string{"podaffinity", "preferredDuringSchedulingIgnoredDuringExecution", rule.PodAffinityTerm.TopologyKey, labelSelector, namespaceSelector, namespaces},
472477
Value: 1,
473478
})
474479
}
@@ -479,19 +484,23 @@ func generateDeploymentAffinityMetrics(d *v1.Deployment) *metric.Family {
479484
// Required anti-affinity rules
480485
for _, rule := range d.Spec.Template.Spec.Affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution {
481486
labelSelector := formatLabelSelector(rule.LabelSelector)
487+
namespaceSelector := formatLabelSelector(rule.NamespaceSelector)
488+
namespaces := strings.Join(rule.Namespaces, ",")
482489
metrics = append(metrics, &metric.Metric{
483-
LabelKeys: []string{"affinity", "type", "topology_key", "label_selector"},
484-
LabelValues: []string{"podantiaffinity", "requiredDuringSchedulingIgnoredDuringExecution", rule.TopologyKey, labelSelector},
490+
LabelKeys: []string{"affinity", "type", "topology_key", "label_selector", "namespace_selector", "namespaces"},
491+
LabelValues: []string{"podantiaffinity", "requiredDuringSchedulingIgnoredDuringExecution", rule.TopologyKey, labelSelector, namespaceSelector, namespaces},
485492
Value: 1,
486493
})
487494
}
488495

489496
// Preferred anti-affinity rules
490497
for _, rule := range d.Spec.Template.Spec.Affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution {
491498
labelSelector := formatLabelSelector(rule.PodAffinityTerm.LabelSelector)
499+
namespaceSelector := formatLabelSelector(rule.PodAffinityTerm.NamespaceSelector)
500+
namespaces := strings.Join(rule.PodAffinityTerm.Namespaces, ",")
492501
metrics = append(metrics, &metric.Metric{
493-
LabelKeys: []string{"affinity", "type", "topology_key", "label_selector"},
494-
LabelValues: []string{"podantiaffinity", "preferredDuringSchedulingIgnoredDuringExecution", rule.PodAffinityTerm.TopologyKey, labelSelector},
502+
LabelKeys: []string{"affinity", "type", "topology_key", "label_selector", "namespace_selector", "namespaces"},
503+
LabelValues: []string{"podantiaffinity", "preferredDuringSchedulingIgnoredDuringExecution", rule.PodAffinityTerm.TopologyKey, labelSelector, namespaceSelector, namespaces},
495504
Value: 1,
496505
})
497506
}
@@ -505,6 +514,5 @@ func formatLabelSelector(selector *metav1.LabelSelector) string {
505514
if selector == nil {
506515
return ""
507516
}
508-
// Use Kubernetes helper function as suggested by @mrueg
509517
return metav1.FormatLabelSelector(selector)
510518
}

internal/store/deployment_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,9 @@ func TestDeploymentStore(t *testing.T) {
198198
Want: metadata + `
199199
kube_deployment_metadata_generation{deployment="depl-with-affinity",namespace="ns1"} 1
200200
kube_deployment_spec_paused{deployment="depl-with-affinity",namespace="ns1"} 0
201-
kube_deployment_spec_affinity{deployment="depl-with-affinity",namespace="ns1",affinity="podaffinity",type="requiredDuringSchedulingIgnoredDuringExecution",topology_key="kubernetes.io/zone",label_selector="app=cache"} 1
202-
kube_deployment_spec_affinity{deployment="depl-with-affinity",namespace="ns1",affinity="podaffinity",type="preferredDuringSchedulingIgnoredDuringExecution",topology_key="kubernetes.io/hostname",label_selector="app=web"} 1
203-
kube_deployment_spec_affinity{deployment="depl-with-affinity",namespace="ns1",affinity="podantiaffinity",type="requiredDuringSchedulingIgnoredDuringExecution",topology_key="kubernetes.io/hostname",label_selector="app=depl-with-affinity"} 1
201+
kube_deployment_spec_affinity{deployment="depl-with-affinity",namespace="ns1",affinity="podaffinity",type="requiredDuringSchedulingIgnoredDuringExecution",topology_key="kubernetes.io/zone",label_selector="app=cache",namespace_selector="",namespaces=""} 1
202+
kube_deployment_spec_affinity{deployment="depl-with-affinity",namespace="ns1",affinity="podaffinity",type="preferredDuringSchedulingIgnoredDuringExecution",topology_key="kubernetes.io/hostname",label_selector="app=web",namespace_selector="",namespaces=""} 1
203+
kube_deployment_spec_affinity{deployment="depl-with-affinity",namespace="ns1",affinity="podantiaffinity",type="requiredDuringSchedulingIgnoredDuringExecution",topology_key="kubernetes.io/hostname",label_selector="app=depl-with-affinity",namespace_selector="",namespaces=""} 1
204204
kube_deployment_spec_replicas{deployment="depl-with-affinity",namespace="ns1"} 3
205205
kube_deployment_status_observed_generation{deployment="depl-with-affinity",namespace="ns1"} 1
206206
kube_deployment_status_replicas_available{deployment="depl-with-affinity",namespace="ns1"} 3

0 commit comments

Comments
 (0)