From 4d90543a64878031ffa1435fc26a4415b770cfca Mon Sep 17 00:00:00 2001 From: Hugo Shaka Date: Fri, 1 Nov 2024 17:53:41 -0400 Subject: [PATCH] [v17] Fix flaky integration tests caused by prometheus metrics conflict (#48296) * Fix flaky test because of prometheus metrics: blackhole metrics * lint --- integration/tctl_terraform_env_test.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/integration/tctl_terraform_env_test.go b/integration/tctl_terraform_env_test.go index 9ebea1c95bc35..5034378cb20a2 100644 --- a/integration/tctl_terraform_env_test.go +++ b/integration/tctl_terraform_env_test.go @@ -31,6 +31,7 @@ import ( "github.com/alecthomas/kingpin/v2" "github.com/google/uuid" + "github.com/prometheus/client_golang/prometheus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -51,6 +52,7 @@ import ( // service and generates valid credentials Terraform can use to connect to Teleport. func TestTCTLTerraformCommand_ProxyJoin(t *testing.T) { testDir := t.TempDir() + prometheus.DefaultRegisterer = metricRegistryBlackHole{} // Test setup: creating a teleport instance running auth and proxy clusterName := "root.example.com" @@ -126,6 +128,7 @@ func TestTCTLTerraformCommand_ProxyJoin(t *testing.T) { func TestTCTLTerraformCommand_AuthJoin(t *testing.T) { t.Parallel() testDir := t.TempDir() + prometheus.DefaultRegisterer = metricRegistryBlackHole{} // Test setup: creating a teleport instance running auth and proxy clusterName := "root.example.com" @@ -347,3 +350,20 @@ func connectWithCredentialsFromVars(t *testing.T, vars map[string]string, clt *a _, err = botClt.Ping(ctx) require.NoError(t, err) } + +// metricRegistryBlackHole is a fake prometheus.Registerer that accepts every metric and do nothing. +// This is a workaround for different teleport component using the global registry but registering incompatible metrics. +// Those issues can surface during integration tests starting Teleport auth, proxy, and tbot. +// The long-term fix is to have every component use its own registry instead of the global one. +type metricRegistryBlackHole struct { +} + +func (m metricRegistryBlackHole) Register(_ prometheus.Collector) error { + return nil +} + +func (m metricRegistryBlackHole) MustRegister(_ ...prometheus.Collector) {} + +func (m metricRegistryBlackHole) Unregister(_ prometheus.Collector) bool { + return true +}