|
|
@@ -14,6 +14,14 @@ import (
|
|
|
type KubePodLabelsCollector struct {
|
|
|
KubeClusterCache clustercache.ClusterCache
|
|
|
metricsConfig MetricsConfig
|
|
|
+ labelsWhitelist map[string]bool
|
|
|
+}
|
|
|
+
|
|
|
+func (kpmc *KubePodLabelsCollector) SetLabelsWhiteList() {
|
|
|
+ kpmc.labelsWhitelist = make(map[string]bool)
|
|
|
+ for k, v := range kpmc.metricsConfig.LabelsWhitelist {
|
|
|
+ kpmc.labelsWhitelist[k] = v
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Describe sends the super-set of all possible descriptors of pod labels only
|
|
|
@@ -29,6 +37,40 @@ func (kpmc KubePodLabelsCollector) Describe(ch chan<- *prometheus.Desc) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func (kpmc *KubePodLabelsCollector) UpdateControllerSelectorsCache() {
|
|
|
+ for _, r := range kpmc.KubeClusterCache.GetAllReplicaSets() {
|
|
|
+ for k := range r.Spec.Selector.MatchLabels {
|
|
|
+ kpmc.labelsWhitelist[k] = true
|
|
|
+ }
|
|
|
+ for _, v := range r.Spec.Selector.MatchExpressions {
|
|
|
+ kpmc.labelsWhitelist[v.Key] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for _, ss := range kpmc.KubeClusterCache.GetAllStatefulSets() {
|
|
|
+ for k := range ss.Spec.Selector.MatchLabels {
|
|
|
+ kpmc.labelsWhitelist[k] = true
|
|
|
+ }
|
|
|
+ for _, v := range ss.Spec.Selector.MatchExpressions {
|
|
|
+ kpmc.labelsWhitelist[v.Key] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (kpmc *KubePodLabelsCollector) UpdateServiceLabels() {
|
|
|
+ for _, service := range kpmc.KubeClusterCache.GetAllServices() {
|
|
|
+ // Just unroll the selector and keep all labels whose keys could match a service selector
|
|
|
+ for k := range service.Spec.Selector {
|
|
|
+ kpmc.labelsWhitelist[k] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (kpmc *KubePodLabelsCollector) UpdateWhitelist() {
|
|
|
+ kpmc.SetLabelsWhiteList()
|
|
|
+ kpmc.UpdateControllerSelectorsCache()
|
|
|
+ kpmc.UpdateServiceLabels()
|
|
|
+}
|
|
|
+
|
|
|
// Collect is called by the Prometheus registry when collecting metrics.
|
|
|
func (kpmc KubePodLabelsCollector) Collect(ch chan<- prometheus.Metric) {
|
|
|
pods := kpmc.KubeClusterCache.GetAllPods()
|
|
|
@@ -41,7 +83,17 @@ func (kpmc KubePodLabelsCollector) Collect(ch chan<- prometheus.Metric) {
|
|
|
|
|
|
// Pod Labels
|
|
|
if _, disabled := disabledMetrics["kube_pod_labels"]; !disabled {
|
|
|
- labelNames, labelValues := promutil.KubePrependQualifierToLabels(promutil.SanitizeLabels(pod.GetLabels()), "label_")
|
|
|
+ podLabels := pod.GetLabels()
|
|
|
+ if kpmc.metricsConfig.UseLabelsWhitelist {
|
|
|
+ kpmc.UpdateWhitelist()
|
|
|
+ for lname := range podLabels {
|
|
|
+ if _, ok := kpmc.labelsWhitelist[lname]; !ok {
|
|
|
+ delete(podLabels, lname)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ labelNames, labelValues := promutil.KubePrependQualifierToLabels(promutil.SanitizeLabels(podLabels), "label_")
|
|
|
ch <- newKubePodLabelsMetric("kube_pod_labels", podNS, podName, podUID, labelNames, labelValues)
|
|
|
}
|
|
|
|