Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions internal/checks/alerts_absent.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/cloudflare/pint/internal/diags"
"github.com/cloudflare/pint/internal/discovery"
"github.com/cloudflare/pint/internal/output"
"github.com/cloudflare/pint/internal/parser/utils"
"github.com/cloudflare/pint/internal/parser/source"
"github.com/cloudflare/pint/internal/promapi"

"github.com/prometheus/common/model"
Expand Down Expand Up @@ -59,12 +59,12 @@ func (c AlertsAbsentCheck) Check(ctx context.Context, entry *discovery.Entry, _
return problems
}

if entry.Rule.AlertingRule.Expr.SyntaxError != nil {
if entry.Rule.AlertingRule.Expr.SyntaxError() != nil {
return problems
}

src := utils.LabelsSource(entry.Rule.AlertingRule.Expr.Value.Value, entry.Rule.AlertingRule.Expr.Query.Expr)
absentSources := make([]utils.Source, 0, len(src))
src := entry.Rule.AlertingRule.Expr.Source()
absentSources := make([]source.Source, 0, len(src))
for _, s := range src {
if s.Operation() != "absent" {
continue
Expand Down Expand Up @@ -101,7 +101,7 @@ func (c AlertsAbsentCheck) Check(ctx context.Context, entry *discovery.Entry, _
for _, s := range absentSources {
var summary string

call, _ := utils.MostOuterOperation[*promParser.Call](s)
call, _ := source.MostOuterOperation[*promParser.Call](s)
dgs := []diags.Diagnostic{
{
Message: "Using `absent()` might cause false positive alerts when Prometheus restarts.",
Expand Down
5 changes: 2 additions & 3 deletions internal/checks/alerts_comparison.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (

"github.com/cloudflare/pint/internal/diags"
"github.com/cloudflare/pint/internal/discovery"
"github.com/cloudflare/pint/internal/parser/utils"
)

const (
Expand Down Expand Up @@ -49,12 +48,12 @@ func (c ComparisonCheck) Check(_ context.Context, entry *discovery.Entry, _ []*d
return problems
}

if entry.Rule.AlertingRule.Expr.SyntaxError != nil {
if entry.Rule.AlertingRule.Expr.SyntaxError() != nil {
return problems
}

expr := entry.Rule.Expr()
srcs := utils.LabelsSource(expr.Value.Value, expr.Query.Expr)
srcs := expr.Source()
var msg string
for _, src := range srcs {
if src.DeadInfo != nil {
Expand Down
2 changes: 1 addition & 1 deletion internal/checks/alerts_count.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func (c AlertsCheck) Check(ctx context.Context, entry *discovery.Entry, _ []*dis
return problems
}

if entry.Rule.AlertingRule.Expr.SyntaxError != nil {
if entry.Rule.AlertingRule.Expr.SyntaxError() != nil {
return problems
}

Expand Down
2 changes: 1 addition & 1 deletion internal/checks/alerts_external_labels.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ func (c AlertsExternalLabelsCheck) Check(ctx context.Context, entry *discovery.E
return problems
}

if entry.Rule.AlertingRule.Expr.SyntaxError != nil {
if entry.Rule.AlertingRule.Expr.SyntaxError() != nil {
return problems
}

Expand Down
16 changes: 8 additions & 8 deletions internal/checks/alerts_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import (
"github.com/cloudflare/pint/internal/diags"
"github.com/cloudflare/pint/internal/discovery"
"github.com/cloudflare/pint/internal/parser"
"github.com/cloudflare/pint/internal/parser/utils"
"github.com/cloudflare/pint/internal/parser/source"
)

const (
Expand Down Expand Up @@ -117,11 +117,11 @@ func (c TemplateCheck) Check(ctx context.Context, entry *discovery.Entry, _ []*d
return nil
}

if entry.Rule.AlertingRule.Expr.SyntaxError != nil {
if entry.Rule.AlertingRule.Expr.SyntaxError() != nil {
return nil
}

src := utils.LabelsSource(entry.Rule.AlertingRule.Expr.Value.Value, entry.Rule.AlertingRule.Expr.Query.Expr)
src := entry.Rule.AlertingRule.Expr.Source()
data := promTemplate.AlertTemplateData(map[string]string{}, map[string]string{}, "", promql.Sample{})

for _, label := range entry.Labels().Items {
Expand Down Expand Up @@ -216,7 +216,7 @@ func (c TemplateCheck) checkHumanizeIsNeeded(expr parser.PromQLExpr, ann *parser
if !ok {
return problems
}
for _, src := range utils.LabelsSource(expr.Value.Value, expr.Query.Expr) {
for _, src := range expr.Source() {
call := isRateResult(src)
if call != nil {
dgs := []diags.Diagnostic{
Expand Down Expand Up @@ -260,15 +260,15 @@ func (c TemplateCheck) checkHumanizeIsNeeded(expr parser.PromQLExpr, ann *parser
return problems
}

func isRateResult(src utils.Source) *promParser.Call {
if src.Type == utils.AggregateSource {
func isRateResult(src source.Source) *promParser.Call {
if src.Type == source.AggregateSource {
switch src.Operation() {
case "count", "count_values", "group":
return nil
}
}

call, ok := utils.MostOuterOperation[*promParser.Call](src)
call, ok := source.MostOuterOperation[*promParser.Call](src)
if !ok {
return nil
}
Expand Down Expand Up @@ -502,7 +502,7 @@ func findTemplateVariables(_, text string) (vars []tmplVar, aliases aliasMap, ok
return vars, aliases, true
}

func (c TemplateCheck) checkQueryLabels(group *parser.Group, rule parser.Rule, label *parser.YamlKeyValue, src []utils.Source) (problems []Problem) {
func (c TemplateCheck) checkQueryLabels(group *parser.Group, rule parser.Rule, label *parser.YamlKeyValue, src []source.Source) (problems []Problem) {
vars, aliases, ok := findTemplateVariables(label.Key.Value, label.Value.Value)
if !ok {
return nil
Expand Down
4 changes: 2 additions & 2 deletions internal/checks/labels_conflict.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,10 @@ func (c LabelsConflictCheck) Reporter() string {

func (c LabelsConflictCheck) Check(ctx context.Context, entry *discovery.Entry, _ []*discovery.Entry) (problems []Problem) {
var labels *parser.YamlMap
if entry.Rule.AlertingRule != nil && entry.Rule.AlertingRule.Expr.SyntaxError == nil && entry.Rule.AlertingRule.Labels != nil {
if entry.Rule.AlertingRule != nil && entry.Rule.AlertingRule.Expr.SyntaxError() == nil && entry.Rule.AlertingRule.Labels != nil {
labels = entry.Rule.AlertingRule.Labels
}
if entry.Rule.RecordingRule != nil && entry.Rule.RecordingRule.Expr.SyntaxError == nil && entry.Rule.RecordingRule.Labels != nil {
if entry.Rule.RecordingRule != nil && entry.Rule.RecordingRule.Expr.SyntaxError() == nil && entry.Rule.RecordingRule.Labels != nil {
labels = entry.Rule.RecordingRule.Labels
}
if labels == nil {
Expand Down
14 changes: 7 additions & 7 deletions internal/checks/promql_aggregation.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (

"github.com/cloudflare/pint/internal/diags"
"github.com/cloudflare/pint/internal/discovery"
"github.com/cloudflare/pint/internal/parser/utils"
"github.com/cloudflare/pint/internal/parser/source"
)

const (
Expand Down Expand Up @@ -58,7 +58,7 @@ func (c AggregationCheck) Reporter() string {

func (c AggregationCheck) Check(_ context.Context, entry *discovery.Entry, _ []*discovery.Entry) (problems []Problem) {
expr := entry.Rule.Expr()
if expr.SyntaxError != nil {
if expr.SyntaxError() != nil {
return nil
}

Expand Down Expand Up @@ -88,8 +88,8 @@ func (c AggregationCheck) Check(_ context.Context, entry *discovery.Entry, _ []*
nameDesc = "all"
}

for _, src := range utils.LabelsSource(expr.Value.Value, expr.Query.Expr) {
if src.Type != utils.AggregateSource {
for _, src := range expr.Source() {
if src.Type != source.AggregateSource {
continue
}
if c.keep && !src.CanHaveLabel(c.label) {
Expand Down Expand Up @@ -122,13 +122,13 @@ func (c AggregationCheck) Check(_ context.Context, entry *discovery.Entry, _ []*
}
if !c.keep && src.CanHaveLabel(c.label) {
posrange := src.Position
if aggr, ok := utils.MostOuterOperation[*promParser.AggregateExpr](src); ok {
if aggr, ok := source.MostOuterOperation[*promParser.AggregateExpr](src); ok {
posrange = aggr.PosRange
if len(aggr.Grouping) != 0 {
if aggr.Without {
posrange = utils.FindFuncNamePosition(expr.Value.Value, aggr.PosRange, "without")
posrange = source.FindFuncNamePosition(expr.Value.Value, aggr.PosRange, "without")
} else {
posrange = utils.FindFuncNamePosition(expr.Value.Value, aggr.PosRange, "by")
posrange = source.FindFuncNamePosition(expr.Value.Value, aggr.PosRange, "by")
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions internal/checks/promql_counter.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,14 @@ func (c CounterCheck) Reporter() string {
func (c CounterCheck) Check(ctx context.Context, entry *discovery.Entry, _ []*discovery.Entry) (problems []Problem) {
expr := entry.Rule.Expr()

if expr.SyntaxError != nil {
if expr.SyntaxError() != nil {
return problems
}

done := map[string]struct{}{}

LOOP:
for _, vs := range parser.WalkDownExpr[*promParser.VectorSelector](expr.Query) {
for _, vs := range parser.WalkDownExpr[*promParser.VectorSelector](expr.Query()) {
if vs.Parent == nil {
// This might be a counter but there's no parent so we have something like `expr: foo`.
// We're only testing for the existence of foo in alerts OR copying it via recording rules.
Expand Down
18 changes: 9 additions & 9 deletions internal/checks/promql_fragile.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
"github.com/cloudflare/pint/internal/diags"
"github.com/cloudflare/pint/internal/discovery"
"github.com/cloudflare/pint/internal/parser"
"github.com/cloudflare/pint/internal/parser/utils"
"github.com/cloudflare/pint/internal/parser/source"
)

const (
Expand Down Expand Up @@ -57,12 +57,12 @@ func (c FragileCheck) Reporter() string {

func (c FragileCheck) Check(_ context.Context, entry *discovery.Entry, _ []*discovery.Entry) (problems []Problem) {
expr := entry.Rule.Expr()
if expr.SyntaxError != nil {
if expr.SyntaxError() != nil {
return nil
}

if entry.Rule.AlertingRule != nil {
for _, src := range utils.LabelsSource(expr.Value.Value, expr.Query.Expr) {
for _, src := range expr.Source() {
problems = append(problems, c.checkTopK(expr, src)...)
problems = append(problems, c.checkPartialData(expr, src, entry.Rule.AlertingRule.For)...)
}
Expand All @@ -71,11 +71,11 @@ func (c FragileCheck) Check(_ context.Context, entry *discovery.Entry, _ []*disc
return problems
}

func (c FragileCheck) checkTopK(expr parser.PromQLExpr, src utils.Source) (problems []Problem) {
if src.Type != utils.AggregateSource {
func (c FragileCheck) checkTopK(expr *parser.PromQLExpr, src source.Source) (problems []Problem) {
if src.Type != source.AggregateSource {
return problems
}
if src.FixedLabels && len(src.TransformedLabels(utils.PossibleLabel)) == 0 {
if src.FixedLabels && len(src.TransformedLabels(source.PossibleLabel)) == 0 {
return problems
}
if !slices.Contains([]string{"topk", "bottomk", "limit", "limit_ratio"}, src.Operation()) {
Expand All @@ -101,8 +101,8 @@ func (c FragileCheck) checkTopK(expr parser.PromQLExpr, src utils.Source) (probl
return problems
}

func (c FragileCheck) checkPartialData(expr parser.PromQLExpr, src utils.Source, forVal *parser.YamlNode) (problems []Problem) {
if src.Type != utils.AggregateSource {
func (c FragileCheck) checkPartialData(expr *parser.PromQLExpr, src source.Source, forVal *parser.YamlNode) (problems []Problem) {
if src.Type != source.AggregateSource {
return problems
}
if !src.IsConditional {
Expand All @@ -118,7 +118,7 @@ func (c FragileCheck) checkPartialData(expr parser.PromQLExpr, src utils.Source,

for _, j := range src.Joins {
// Only look for joins that are aggregations.
if j.Src.Type != utils.AggregateSource {
if j.Src.Type != source.AggregateSource {
continue
}
// Ignore joins that are not conditional and instead are used to add labels.
Expand Down
10 changes: 5 additions & 5 deletions internal/checks/promql_impossible.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"github.com/cloudflare/pint/internal/diags"
"github.com/cloudflare/pint/internal/discovery"
"github.com/cloudflare/pint/internal/parser"
"github.com/cloudflare/pint/internal/parser/utils"
"github.com/cloudflare/pint/internal/parser/source"
)

const (
Expand Down Expand Up @@ -42,20 +42,20 @@ func (c ImpossibleCheck) Reporter() string {

func (c ImpossibleCheck) Check(_ context.Context, entry *discovery.Entry, _ []*discovery.Entry) (problems []Problem) {
expr := entry.Rule.Expr()
if expr.SyntaxError != nil {
if expr.SyntaxError() != nil {
return problems
}

for _, src := range utils.LabelsSource(expr.Value.Value, expr.Query.Expr) {
src.WalkSources(func(s utils.Source, _ *utils.Join, _ *utils.Unless) {
for _, src := range expr.Source() {
src.WalkSources(func(s source.Source, _ *source.Join, _ *source.Unless) {
problems = append(problems, c.checkSource(expr, s)...)
})
}

return problems
}

func (c ImpossibleCheck) checkSource(expr parser.PromQLExpr, s utils.Source) (problems []Problem) {
func (c ImpossibleCheck) checkSource(expr *parser.PromQLExpr, s source.Source) (problems []Problem) {
if s.DeadInfo != nil {
problems = append(problems, Problem{
Anchor: AnchorAfter,
Expand Down
10 changes: 6 additions & 4 deletions internal/checks/promql_range_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,15 @@ func (c RangeQueryCheck) Reporter() string {

func (c RangeQueryCheck) Check(ctx context.Context, entry *discovery.Entry, _ []*discovery.Entry) (problems []Problem) {
expr := entry.Rule.Expr()
if expr.SyntaxError != nil {
if expr.SyntaxError() != nil {
return problems
}

if c.limit > 0 {
problems = append(problems, c.checkNode(
ctx,
expr, expr.Query,
expr,
expr.Query(),
c.limit,
fmt.Sprintf("%s is the maximum allowed range query.", model.Duration(c.limit)),
c.severity,
Expand Down Expand Up @@ -130,7 +131,8 @@ func (c RangeQueryCheck) Check(ctx context.Context, entry *discovery.Entry, _ []

problems = append(problems, c.checkNode(
ctx,
expr, expr.Query,
expr,
expr.Query(),
retention,
fmt.Sprintf("%s is configured to only keep %s of metrics history.", promText(c.prom.Name(), flags.URI),
model.Duration(retention)),
Expand All @@ -141,7 +143,7 @@ func (c RangeQueryCheck) Check(ctx context.Context, entry *discovery.Entry, _ []
return problems
}

func (c RangeQueryCheck) checkNode(ctx context.Context, expr parser.PromQLExpr, node *parser.PromQLNode, retention time.Duration, reason string, s Severity) (problems []Problem) {
func (c RangeQueryCheck) checkNode(ctx context.Context, expr *parser.PromQLExpr, node *parser.PromQLNode, retention time.Duration, reason string, s Severity) (problems []Problem) {
if n, ok := node.Expr.(*promParser.MatrixSelector); ok {
if n.Range > retention {
problems = append(problems, Problem{
Expand Down
16 changes: 8 additions & 8 deletions internal/checks/promql_rate.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
"github.com/cloudflare/pint/internal/discovery"
"github.com/cloudflare/pint/internal/output"
"github.com/cloudflare/pint/internal/parser"
"github.com/cloudflare/pint/internal/parser/utils"
"github.com/cloudflare/pint/internal/parser/source"
"github.com/cloudflare/pint/internal/promapi"

v1 "github.com/prometheus/client_golang/api/prometheus/v1"
Expand Down Expand Up @@ -77,7 +77,7 @@ func (c RateCheck) Reporter() string {
func (c RateCheck) Check(ctx context.Context, entry *discovery.Entry, entries []*discovery.Entry) (problems []Problem) {
expr := entry.Rule.Expr()

if expr.SyntaxError != nil {
if expr.SyntaxError() != nil {
return problems
}

Expand All @@ -91,11 +91,11 @@ func (c RateCheck) Check(ctx context.Context, entry *discovery.Entry, entries []
return problems
}

problems = append(problems, c.checkNode(ctx, entry.Rule, expr, expr.Query, entries, cfg, &completedList{values: nil})...)
problems = append(problems, c.checkNode(ctx, entry.Rule, expr, expr.Query(), entries, cfg, &completedList{values: nil})...)
return problems
}

func (c RateCheck) checkNode(ctx context.Context, rule parser.Rule, expr parser.PromQLExpr, node *parser.PromQLNode, entries []*discovery.Entry, cfg *promapi.ConfigResult, done *completedList) (problems []Problem) {
func (c RateCheck) checkNode(ctx context.Context, rule parser.Rule, expr *parser.PromQLExpr, node *parser.PromQLNode, entries []*discovery.Entry, cfg *promapi.ConfigResult, done *completedList) (problems []Problem) {
if n, ok := node.Expr.(*promParser.Call); ok && (n.Func.Name == "rate" || n.Func.Name == "irate" || n.Func.Name == "deriv") {
for _, arg := range n.Args {
m, ok := arg.(*promParser.MatrixSelector)
Expand Down Expand Up @@ -168,12 +168,12 @@ func (c RateCheck) checkNode(ctx context.Context, rule parser.Rule, expr parser.
if e.Rule.Error.Err != nil {
continue
}
if e.Rule.RecordingRule != nil && e.Rule.RecordingRule.Expr.SyntaxError == nil && e.Rule.RecordingRule.Record.Value == s.Name {
for _, src := range utils.LabelsSource(e.Rule.RecordingRule.Expr.Value.Value, e.Rule.RecordingRule.Expr.Query.Expr) {
if src.Type != utils.AggregateSource {
if e.Rule.RecordingRule != nil && e.Rule.RecordingRule.Expr.SyntaxError() == nil && e.Rule.RecordingRule.Record.Value == s.Name {
for _, src := range e.Rule.RecordingRule.Expr.Source() {
if src.Type != source.AggregateSource {
continue
}
if vs, ok := utils.MostOuterOperation[*promParser.VectorSelector](src); ok {
if vs, ok := source.MostOuterOperation[*promParser.VectorSelector](src); ok {
metadata, err := c.prom.Metadata(ctx, vs.Name)
if err != nil {
if errors.Is(err, promapi.ErrUnsupported) {
Expand Down
Loading
Loading