Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lx9FNLG2CqeBbVGGd9bFsP
57 lines
1.8 KiB
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)
|
|
}
|
|
}
|
|
}
|