in pkg/operator/apis/monitoring/v1/rules_config.go [120:157]
func scope(groups *rulefmt.RuleGroups, lset map[string]string) error {
for _, g := range groups.Groups {
for i, r := range g.Rules {
expr, err := parser.ParseExpr(r.Expr.Value)
if err != nil {
return fmt.Errorf("parse PromQL expression: %w", err)
}
// Traverse the query and inject label matchers to all metric selectors
err = walkExpr(expr, func(n parser.Node) error {
vs, ok := n.(*parser.VectorSelector)
if ok {
for name, value := range lset {
if err := setSelector(vs, name, value); err != nil {
return fmt.Errorf("set isolation selector %s=%q on %s: %w", name, value, vs, err)
}
}
}
return nil
})
if err != nil {
return err
}
r.Expr.SetString(expr.String())
// Add labels to produced label sets (metrics or alerts) in case
// they got aggregated away.
for name, value := range lset {
if err := setLabel(&r, name, value); err != nil {
return fmt.Errorf("set result isolation label %s=%q on %v: %w", name, value, r, err)
}
}
g.Rules[i] = r
}
}
return nil
}