From 5c4c1b63b9ba4c7b0d6f72833a8d706792c8dd9d Mon Sep 17 00:00:00 2001 From: Matus Fabian Date: Fri, 28 Jun 2024 16:11:04 +0200 Subject: prom: concurrent connections fix Type: fix Change-Id: I57814edb735e9dac916f2e01de95ccfb739ce655 Signed-off-by: Matus Fabian --- extras/hs-test/http_test.go | 35 ++++++++++++++++++++++++++++++++++- extras/hs-test/infra/hst_suite.go | 1 + 2 files changed, 35 insertions(+), 1 deletion(-) (limited to 'extras') diff --git a/extras/hs-test/http_test.go b/extras/hs-test/http_test.go index 29bd272fe99..2983ba38fa0 100644 --- a/extras/hs-test/http_test.go +++ b/extras/hs-test/http_test.go @@ -9,9 +9,11 @@ import ( "net/http" "net/http/httptrace" "os" + "sync" "time" . "fd.io/hs-test/infra" + . "github.com/onsi/ginkgo/v2" ) func init() { @@ -24,7 +26,7 @@ func init() { HttpStaticMacTimeTest, HttpStaticBuildInUrlGetVersionVerboseTest, HttpVersionNotSupportedTest, HttpInvalidContentLengthTest, HttpInvalidTargetSyntaxTest, HttpStaticPathTraversalTest, HttpUriDecodeTest, HttpHeadersTest, HttpStaticFileHandler) - RegisterNoTopoSoloTests(HttpStaticPromTest, HttpTpsTest, HttpTpsInterruptModeTest) + RegisterNoTopoSoloTests(HttpStaticPromTest, HttpTpsTest, HttpTpsInterruptModeTest, PromConcurrentConnections) } const wwwRootPath = "/tmp/www_root" @@ -203,6 +205,37 @@ func HttpStaticPromTest(s *NoTopoSuite) { _, err = io.ReadAll(resp.Body) } +func promReq(s *NoTopoSuite, url string, wg *sync.WaitGroup) { + defer GinkgoRecover() + defer wg.Done() + client := NewHttpClient() + req, err := http.NewRequest("GET", url, nil) + s.AssertNil(err, fmt.Sprint(err)) + resp, err := client.Do(req) + s.AssertNil(err, fmt.Sprint(err)) + defer resp.Body.Close() + s.AssertEqual(200, resp.StatusCode) + _, err = io.ReadAll(resp.Body) +} + +func PromConcurrentConnections(s *NoTopoSuite) { + vpp := s.GetContainerByName("vpp").VppInstance + serverAddress := s.GetInterfaceByName(TapInterfaceName).Peer.Ip4AddressString() + url := "http://" + serverAddress + ":80/stats.prom" + + s.Log(vpp.Vppctl("http static server uri tcp://" + serverAddress + "/80 url-handlers")) + s.Log(vpp.Vppctl("prom enable")) + time.Sleep(time.Second * 5) + + var wg sync.WaitGroup + for i := 0; i < 20; i++ { + wg.Add(1) + go promReq(s, url, &wg) + } + wg.Wait() + s.Log(vpp.Vppctl("show session verbose proto http")) +} + func HttpStaticFileHandler(s *NoTopoSuite) { content := "

Hello

" content2 := "

Page

" diff --git a/extras/hs-test/infra/hst_suite.go b/extras/hs-test/infra/hst_suite.go index 1f1d54b1b94..028ab0bef1f 100644 --- a/extras/hs-test/infra/hst_suite.go +++ b/extras/hs-test/infra/hst_suite.go @@ -565,6 +565,7 @@ runBenchmark creates Gomega's experiment with the passed-in name and samples the passing in suite context, experiment and your data. You can also instruct runBenchmark to run with multiple concurrent workers. +Note that if running in parallel Gomega returns from Sample when spins up all samples and does not wait until all finished. You can record multiple named measurements (float64 or duration) within passed-in callback. runBenchmark then produces report to show statistical distribution of measurements. */ -- cgit 1.2.3-korg