in pkg/operator/apis/monitoring/v1/common_types.go [38:111]
func relabelingsForSelector(selector metav1.LabelSelector, crd interface{}) ([]*relabel.Config, error) {
// Pick the correct labels based on the CRD type.
var objectLabelPresent, objectLabel prommodel.LabelName
switch crd.(type) {
case *PodMonitoring, *ClusterPodMonitoring:
objectLabel = "__meta_kubernetes_pod_label_"
objectLabelPresent = "__meta_kubernetes_pod_labelpresent_"
case *ClusterNodeMonitoring:
objectLabel = "__meta_kubernetes_node_label_"
objectLabelPresent = "__meta_kubernetes_node_labelpresent_"
default:
return nil, fmt.Errorf("invalid CRD type %T", crd)
}
// Simple equal matchers. Sort by keys first to ensure that generated configs are reproducible.
// (Go map iteration is non-deterministic.)
var selectorKeys []string
for k := range selector.MatchLabels {
selectorKeys = append(selectorKeys, k)
}
sort.Strings(selectorKeys)
var relabelCfgs []*relabel.Config
for _, k := range selectorKeys {
re, err := relabel.NewRegexp(selector.MatchLabels[k])
if err != nil {
return nil, err
}
relabelCfgs = append(relabelCfgs, &relabel.Config{
Action: relabel.Keep,
SourceLabels: prommodel.LabelNames{objectLabel + sanitizeLabelName(k)},
Regex: re,
})
}
// Expression matchers are mapped to relabeling rules with the same behavior.
for _, exp := range selector.MatchExpressions {
switch exp.Operator {
case metav1.LabelSelectorOpIn:
re, err := relabel.NewRegexp(strings.Join(exp.Values, "|"))
if err != nil {
return nil, err
}
relabelCfgs = append(relabelCfgs, &relabel.Config{
Action: relabel.Keep,
SourceLabels: prommodel.LabelNames{objectLabel + sanitizeLabelName(exp.Key)},
Regex: re,
})
case metav1.LabelSelectorOpNotIn:
re, err := relabel.NewRegexp(strings.Join(exp.Values, "|"))
if err != nil {
return nil, err
}
relabelCfgs = append(relabelCfgs, &relabel.Config{
Action: relabel.Drop,
SourceLabels: prommodel.LabelNames{objectLabel + sanitizeLabelName(exp.Key)},
Regex: re,
})
case metav1.LabelSelectorOpExists:
relabelCfgs = append(relabelCfgs, &relabel.Config{
Action: relabel.Keep,
SourceLabels: prommodel.LabelNames{objectLabelPresent + sanitizeLabelName(exp.Key)},
Regex: relabel.MustNewRegexp("true"),
})
case metav1.LabelSelectorOpDoesNotExist:
relabelCfgs = append(relabelCfgs, &relabel.Config{
Action: relabel.Drop,
SourceLabels: prommodel.LabelNames{objectLabelPresent + sanitizeLabelName(exp.Key)},
Regex: relabel.MustNewRegexp("true"),
})
}
}
return relabelCfgs, nil
}