From e3241ae4c186cf0d2af08a494d7a0ca7ecd691ef Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Tue, 23 Jul 2024 11:12:43 +0200 Subject: [PATCH 1/2] fix: test: no parallel when starting Prometheus endpoint --- enterprise/cli/provisionerdaemons_test.go | 147 +++++++++++----------- 1 file changed, 73 insertions(+), 74 deletions(-) diff --git a/enterprise/cli/provisionerdaemons_test.go b/enterprise/cli/provisionerdaemons_test.go index 86fbfec4df096..a46899e85f4d3 100644 --- a/enterprise/cli/provisionerdaemons_test.go +++ b/enterprise/cli/provisionerdaemons_test.go @@ -299,88 +299,87 @@ func TestProvisionerDaemon_SessionToken(t *testing.T) { assert.Equal(t, buildinfo.Version(), daemons[0].Version) assert.Equal(t, proto.CurrentVersion.String(), daemons[0].APIVersion) }) +} - t.Run("PrometheusEnabled", func(t *testing.T) { - t.Parallel() - - prometheusPort := testutil.RandomPortNoListen(t) +//nolint:tparallel // Prometheus endpoint tends to fail with `bind: address already in use`. +func TestProvisionerDaemon_PrometheusEnabled(t *testing.T) { + prometheusPort := testutil.RandomPortNoListen(t) - // Configure CLI client - client, admin := coderdenttest.New(t, &coderdenttest.Options{ - ProvisionerDaemonPSK: "provisionersftw", - LicenseOptions: &coderdenttest.LicenseOptions{ - Features: license.Features{ - codersdk.FeatureExternalProvisionerDaemons: 1, - }, + // Configure CLI client + client, admin := coderdenttest.New(t, &coderdenttest.Options{ + ProvisionerDaemonPSK: "provisionersftw", + LicenseOptions: &coderdenttest.LicenseOptions{ + Features: license.Features{ + codersdk.FeatureExternalProvisionerDaemons: 1, }, - }) - anotherClient, _ := coderdtest.CreateAnotherUser(t, client, admin.OrganizationID, rbac.RoleTemplateAdmin()) - inv, conf := newCLI(t, "provisionerd", "start", "--name", "daemon-with-prometheus", "--prometheus-enable", "--prometheus-address", fmt.Sprintf("127.0.0.1:%d", prometheusPort)) - clitest.SetupConfig(t, anotherClient, conf) - pty := ptytest.New(t).Attach(inv) - ctx, cancel := context.WithTimeout(inv.Context(), testutil.WaitLong) - defer cancel() + }, + }) + anotherClient, _ := coderdtest.CreateAnotherUser(t, client, admin.OrganizationID, rbac.RoleTemplateAdmin()) + inv, conf := newCLI(t, "provisionerd", "start", "--name", "daemon-with-prometheus", "--prometheus-enable", "--prometheus-address", fmt.Sprintf("127.0.0.1:%d", prometheusPort)) + clitest.SetupConfig(t, anotherClient, conf) + pty := ptytest.New(t).Attach(inv) + ctx, cancel := context.WithTimeout(inv.Context(), testutil.WaitLong) + defer cancel() - // Start "provisionerd" command - clitest.Start(t, inv) - pty.ExpectMatchContext(ctx, "starting provisioner daemon") + // Start "provisionerd" command + clitest.Start(t, inv) + pty.ExpectMatchContext(ctx, "starting provisioner daemon") - var daemons []codersdk.ProvisionerDaemon - var err error - require.Eventually(t, func() bool { - daemons, err = client.ProvisionerDaemons(ctx) - if err != nil { - return false - } - return len(daemons) == 1 - }, testutil.WaitLong, testutil.IntervalSlow) - require.Equal(t, "daemon-with-prometheus", daemons[0].Name) + var daemons []codersdk.ProvisionerDaemon + var err error + require.Eventually(t, func() bool { + daemons, err = client.ProvisionerDaemons(ctx) + if err != nil { + return false + } + return len(daemons) == 1 + }, testutil.WaitLong, testutil.IntervalSlow) + require.Equal(t, "daemon-with-prometheus", daemons[0].Name) - // Fetch metrics from Prometheus endpoint - var req *http.Request - var res *http.Response - require.Eventually(t, func() bool { - req, err = http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("http://127.0.0.1:%d", prometheusPort), nil) - if err != nil { - t.Logf("unable to create new HTTP request: %s", err.Error()) - return false - } + // Fetch metrics from Prometheus endpoint + var req *http.Request + var res *http.Response + require.Eventually(t, func() bool { + req, err = http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("http://127.0.0.1:%d", prometheusPort), nil) + if err != nil { + t.Logf("unable to create new HTTP request: %s", err.Error()) + return false + } - // nolint:bodyclose - res, err = http.DefaultClient.Do(req) - if err != nil { - t.Logf("unable to call Prometheus endpoint: %s", err.Error()) - return false - } - return true - }, testutil.WaitShort, testutil.IntervalMedium) - defer res.Body.Close() + // nolint:bodyclose + res, err = http.DefaultClient.Do(req) + if err != nil { + t.Logf("unable to call Prometheus endpoint: %s", err.Error()) + return false + } + return true + }, testutil.WaitShort, testutil.IntervalMedium) + defer res.Body.Close() - // Scan for metric patterns - scanner := bufio.NewScanner(res.Body) - hasOneDaemon := false - hasGoStats := false - hasPromHTTP := false - for scanner.Scan() { - if strings.HasPrefix(scanner.Text(), "coderd_provisionerd_num_daemons 1") { - hasOneDaemon = true - continue - } - if strings.HasPrefix(scanner.Text(), "go_goroutines") { - hasGoStats = true - continue - } - if strings.HasPrefix(scanner.Text(), "promhttp_metric_handler_requests_total") { - hasPromHTTP = true - continue - } - t.Logf("scanned %s", scanner.Text()) + // Scan for metric patterns + scanner := bufio.NewScanner(res.Body) + hasOneDaemon := false + hasGoStats := false + hasPromHTTP := false + for scanner.Scan() { + if strings.HasPrefix(scanner.Text(), "coderd_provisionerd_num_daemons 1") { + hasOneDaemon = true + continue + } + if strings.HasPrefix(scanner.Text(), "go_goroutines") { + hasGoStats = true + continue } - require.NoError(t, scanner.Err()) + if strings.HasPrefix(scanner.Text(), "promhttp_metric_handler_requests_total") { + hasPromHTTP = true + continue + } + t.Logf("scanned %s", scanner.Text()) + } + require.NoError(t, scanner.Err()) - // Verify patterns - require.True(t, hasOneDaemon, "should be one daemon running") - require.True(t, hasGoStats, "Go stats are missing") - require.True(t, hasPromHTTP, "Prometheus HTTP metrics are missing") - }) + // Verify patterns + require.True(t, hasOneDaemon, "should be one daemon running") + require.True(t, hasGoStats, "Go stats are missing") + require.True(t, hasPromHTTP, "Prometheus HTTP metrics are missing") } From 860bde1f739790f64ecd2861f63ec6952b77bb9d Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Tue, 23 Jul 2024 11:20:46 +0200 Subject: [PATCH 2/2] fix --- enterprise/cli/provisionerdaemons_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enterprise/cli/provisionerdaemons_test.go b/enterprise/cli/provisionerdaemons_test.go index a46899e85f4d3..0b8916e1b343c 100644 --- a/enterprise/cli/provisionerdaemons_test.go +++ b/enterprise/cli/provisionerdaemons_test.go @@ -301,7 +301,7 @@ func TestProvisionerDaemon_SessionToken(t *testing.T) { }) } -//nolint:tparallel // Prometheus endpoint tends to fail with `bind: address already in use`. +//nolint:paralleltest,tparallel // Prometheus endpoint tends to fail with `bind: address already in use`. func TestProvisionerDaemon_PrometheusEnabled(t *testing.T) { prometheusPort := testutil.RandomPortNoListen(t)