Files
nmon/internal/rollup/source_test.go

57 lines
1.8 KiB
Go

package rollup
import (
"os"
"path/filepath"
"regexp"
"strings"
"testing"
)
// forbidden matches an aggregation or rate function whose argument mentions a
// raw octet or packet counter. Counters are turned into rates from their
// increase between samples (rate.go), never averaged, summed or rate()d by a
// query. Acceptance: "Average, sum or otherwise aggregate a raw counter value
// anywhere (grep-level test on the rollup package plus a fixture assertion)".
var forbidden = regexp.MustCompile(`(?i)\b(avg|sum|min|max|count|quantile\w*|avg_over_time|sum_over_time|max_over_time|min_over_time|rate|irate|increase)\s*\(\s*[^)]*(if(HC)?(In|Out)(Octets|UcastPkts|Errors|Discards)|Octets)`)
func TestRollupSourceNeverAggregatesRawCounters(t *testing.T) {
files, err := filepath.Glob("*.go")
if err != nil || len(files) == 0 {
t.Fatalf("glob: %v %v", files, err)
}
for _, f := range files {
if strings.HasSuffix(f, "_test.go") {
continue
}
b, err := os.ReadFile(f)
if err != nil {
t.Fatal(err)
}
for i, line := range strings.Split(string(b), "\n") {
if strings.HasPrefix(strings.TrimSpace(line), "//") {
continue
}
if m := forbidden.FindString(line); m != "" {
t.Errorf("%s:%d aggregates a raw counter: %s", f, i+1, m)
}
}
}
}
func TestForbiddenPatternCatchesTheMistakesItExists(t *testing.T) {
for _, bad := range []string{
`avg_over_time(ifHCInOctets[5m])`, `sum(ifHCOutOctets{device="a"})`, `rate(ifInOctets[5m])`,
`max_over_time(ifOutOctets[1h])`, `increase( ifHCInOctets[5m])`,
} {
if !forbidden.MatchString(bad) {
t.Errorf("pattern misses %q", bad)
}
}
for _, ok := range []string{`{__name__=~"ifHCInOctets|ifInOctets",device="a"}[600s]`, `avg_over_time(hrProcessorLoad[300s])`} {
if forbidden.MatchString(ok) {
t.Errorf("pattern flags %q", ok)
}
}
}