diff --git a/.github/workflows/golang-test-linux.yml b/.github/workflows/golang-test-linux.yml index 5d80b3038..e727aa4e5 100644 --- a/.github/workflows/golang-test-linux.yml +++ b/.github/workflows/golang-test-linux.yml @@ -482,7 +482,7 @@ jobs: go test -tags=benchmark \ -run=^$ \ -bench=. \ - -exec 'sudo --preserve-env=CI,NETBIRD_STORE_ENGINE,GIT_BRANCH' \ + -exec 'sudo --preserve-env=CI,NETBIRD_STORE_ENGINE,GIT_BRANCH,GITHUB_RUN_ID' \ -timeout 20m ./management/... api_integration_test: diff --git a/management/server/http/testing/benchmarks/users_handler_benchmark_test.go b/management/server/http/testing/benchmarks/users_handler_benchmark_test.go index 026e8991b..c0b641a70 100644 --- a/management/server/http/testing/benchmarks/users_handler_benchmark_test.go +++ b/management/server/http/testing/benchmarks/users_handler_benchmark_test.go @@ -13,6 +13,7 @@ import ( "testing" "time" + "github.com/prometheus/client_golang/prometheus/push" log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" @@ -150,3 +151,28 @@ func BenchmarkDeleteUsers(b *testing.B) { }) } } + +func TestMain(m *testing.M) { + exitCode := m.Run() + + if exitCode == 0 && os.Getenv("CI") == "true" { + runID := os.Getenv("GITHUB_RUN_ID") + storeEngine := os.Getenv("NETBIRD_STORE_ENGINE") + err := push.New("http://localhost:9091", "api_benchmark"). + Collector(testing_tools.BenchmarkDuration). + Grouping("ci_run", runID). + Grouping("store_engine", storeEngine). + Push() + if err != nil { + log.Printf("Failed to push metrics: %v", err) + } else { + time.Sleep(1 * time.Minute) + _ = push.New("http://localhost:9091", "api_benchmark"). + Grouping("ci_run", runID). + Grouping("store_engine", storeEngine). + Delete() + } + } + + os.Exit(exitCode) +} diff --git a/management/server/http/testing/testing_tools/tools.go b/management/server/http/testing/testing_tools/tools.go index e597b83ab..8c5d2e386 100644 --- a/management/server/http/testing/testing_tools/tools.go +++ b/management/server/http/testing/testing_tools/tools.go @@ -16,7 +16,6 @@ import ( "github.com/golang-jwt/jwt" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/push" "github.com/stretchr/testify/assert" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" @@ -75,6 +74,14 @@ const ( OperationGetAll = "get_all" ) +var BenchmarkDuration = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "benchmark_duration_ms", + Help: "Benchmark duration per op in ms", + }, + []string{"module", "operation", "test_case", "branch"}, +) + type TB interface { Cleanup(func()) Helper() @@ -324,38 +331,15 @@ func EvaluateBenchmarkResults(b *testing.B, testCase string, duration time.Durat b.Fatalf("environment variable GIT_BRANCH is not set") } - storeEngine := os.Getenv("NETBIRD_STORE_ENGINE") - if storeEngine == "" { - b.Fatalf("environment variable NETBIRD_STORE_ENGINE is not set") - } - if recorder.Code != http.StatusOK { b.Fatalf("Benchmark %s failed: unexpected status code %d", testCase, recorder.Code) } msPerOp := float64(duration.Nanoseconds()) / float64(b.N) / 1e6 - gauge := prometheus.NewGauge(prometheus.GaugeOpts{ - Name: "benchmark_duration_ms", - Help: "Benchmark duration per op in ms", - ConstLabels: prometheus.Labels{ - "store_engine": storeEngine, - "module": module, - "operation": operation, - "test_case": testCase, - "branch": branch, - }, - }) - + gauge := BenchmarkDuration.WithLabelValues(module, operation, testCase, branch) gauge.Set(msPerOp) - if err := push.New("http://localhost:9091", "api_benchmark"). - Collector(gauge). - Grouping("ci_run", os.Getenv("GITHUB_RUN_ID")). - Push(); err != nil { - b.Fatalf("Could not push benchmark metric: %v", err) - } - b.ReportMetric(msPerOp, "ms/op") }