func scope()

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
}