Skip to content

Commit 8dffac0

Browse files
committed
Add benchmark trend reporting with benchstat baseline
1 parent 02e2364 commit 8dffac0

4 files changed

Lines changed: 69 additions & 8 deletions

File tree

.github/workflows/main-cicd.yml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,16 @@ jobs:
5050
uses: actions/setup-go@v5
5151
with:
5252
go-version: "1.24.13"
53-
- name: Run benchmark suites
53+
- name: Run benchmark suites with trend report
5454
run: |
55-
mkdir -p /tmp/bench
56-
go test -run '^$' -bench "BenchmarkScanText|BenchmarkPolicyEvaluate|BenchmarkDecideEndpoint|BenchmarkScanEndpoint" -benchmem ./internal/scan ./internal/policy ./internal/server | tee /tmp/bench/benchmark.txt
57-
- name: Upload benchmark artifact
55+
bash scripts/run-benchmarks.sh
56+
- name: Upload benchmark artifacts
5857
uses: actions/upload-artifact@v4
5958
with:
6059
name: benchmark-results
61-
path: /tmp/bench/benchmark.txt
60+
path: |
61+
/tmp/bench/benchmark-current.txt
62+
/tmp/bench/benchmark-trend.txt
6263
6364
race:
6465
runs-on: ubuntu-latest

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,4 +379,4 @@ spec:
379379
4. Environment variables are set and files are writable
380380
5. API token/header if `DATAFOG_API_TOKEN` is configured
381381
6. Policy JSON is valid and rules match expected action fields
382-
7. Optional benchmark sweep: `scripts/run-benchmarks.sh`
382+
7. Optional benchmark sweep: `scripts/run-benchmarks.sh` (writes `/tmp/bench/benchmark-current.txt`; if `scripts/benchmark-baseline.txt` exists, also writes `/tmp/bench/benchmark-trend.txt` with benchstat deltas)

scripts/benchmark-baseline.txt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
goos: darwin
2+
goarch: arm64
3+
pkg: github.com/datafog/datafog-api/internal/scan
4+
cpu: Apple M3
5+
BenchmarkScanTextSmall-8 64513 16559 ns/op 3.62 MB/s 6881 B/op 51 allocs/op
6+
BenchmarkScanTextMedium-8 38298 30559 ns/op 3.99 MB/s 12209 B/op 54 allocs/op
7+
BenchmarkScanTextLarge-8 6988 170732 ns/op 2.88 MB/s 158424 B/op 193 allocs/op
8+
BenchmarkScanTextWithFilter-8 144634 8321 ns/op 14.66 MB/s 1444 B/op 12 allocs/op
9+
PASS
10+
ok github.com/datafog/datafog-api/internal/scan 5.508s
11+
goos: darwin
12+
goarch: arm64
13+
pkg: github.com/datafog/datafog-api/internal/policy
14+
cpu: Apple M3
15+
BenchmarkPolicyEvaluateSorted-8 7168506 154.2 ns/op 16 B/op 1 allocs/op
16+
BenchmarkPolicyEvaluateUnsorted-8 2565021 470.7 ns/op 2136 B/op 5 allocs/op
17+
PASS
18+
ok github.com/datafog/datafog-api/internal/policy 3.144s
19+
goos: darwin
20+
goarch: arm64
21+
pkg: github.com/datafog/datafog-api/internal/server
22+
cpu: Apple M3
23+
BenchmarkScanEndpoint-8 58554 19254 ns/op 3.38 MB/s 15734 B/op 99 allocs/op
24+
BenchmarkDecideEndpoint-8 405 2923160 ns/op 0.03 MB/s 11742 B/op 67 allocs/op
25+
PASS
26+
ok github.com/datafog/datafog-api/internal/server 3.022s

scripts/run-benchmarks.sh

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,42 @@
22

33
set -euo pipefail
44

5+
BENCH_PATTERN='BenchmarkScanText|BenchmarkPolicyEvaluate|BenchmarkDecideEndpoint|BenchmarkScanEndpoint'
6+
OUTPUT_DIR="${DATAFOG_BENCH_OUTPUT_DIR:-/tmp/bench}"
7+
CURRENT_FILE="${DATAFOG_BENCH_CURRENT_FILE:-$OUTPUT_DIR/benchmark-current.txt}"
8+
TREND_FILE="${DATAFOG_BENCH_TREND_FILE:-$OUTPUT_DIR/benchmark-trend.txt}"
9+
BASELINE_FILE="${DATAFOG_BENCH_BASELINE_FILE:-$(pwd)/scripts/benchmark-baseline.txt}"
10+
11+
mkdir -p "$OUTPUT_DIR"
12+
513
echo "Running API hot-path benchmark suite..."
14+
go test -run '^$' -bench "$BENCH_PATTERN" -benchmem ./internal/scan ./internal/policy ./internal/server | tee "$CURRENT_FILE"
15+
16+
echo "Benchmark output written to $CURRENT_FILE"
17+
18+
if [ -f "$BASELINE_FILE" ]; then
19+
echo "Comparing against baseline: $BASELINE_FILE"
20+
21+
BENCHSTAT_BIN=""
22+
if command -v benchstat >/dev/null 2>&1; then
23+
BENCHSTAT_BIN="$(command -v benchstat)"
24+
else
25+
if ! go install golang.org/x/perf/cmd/benchstat@latest >/dev/null; then
26+
echo "warn: unable to install benchstat; skipping trend report"
27+
exit 0
28+
fi
629

7-
go test -run '^$' -bench 'BenchmarkScanText|BenchmarkPolicyEvaluate|BenchmarkDecideEndpoint|BenchmarkScanEndpoint' -benchmem ./internal/scan ./internal/policy ./internal/server | tee /tmp/benchmark-results.txt
30+
GO_BIN="$(go env GOPATH)/bin/benchstat"
31+
if [ -x "$GO_BIN" ]; then
32+
BENCHSTAT_BIN="$GO_BIN"
33+
else
34+
echo "warn: benchstat not available after installation; skipping trend report"
35+
exit 0
36+
fi
37+
fi
838

9-
echo "Benchmark output written to /tmp/benchmark-results.txt"
39+
"$BENCHSTAT_BIN" "$BASELINE_FILE" "$CURRENT_FILE" | tee "$TREND_FILE"
40+
echo "Trend report written to $TREND_FILE"
41+
else
42+
echo "No baseline found at $BASELINE_FILE, skipping trend comparison"
43+
fi

0 commit comments

Comments
 (0)