From 988725a4e7d99450855d8f4f900fda3d18487648 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Wed, 27 May 2026 16:37:30 +0200 Subject: [PATCH 01/10] PMM-15039 disable telemetry by default --- api-tests/server/helpers.go | 4 ++-- api-tests/server/settings/settings_test.go | 8 ++++---- managed/models/settings.go | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/api-tests/server/helpers.go b/api-tests/server/helpers.go index 381ebb77da..969a90786e 100644 --- a/api-tests/server/helpers.go +++ b/api-tests/server/helpers.go @@ -37,7 +37,7 @@ func RestoreSettingsDefaults(t *testing.T) { res, err := serverClient.Default.ServerService.ChangeSettings(&server.ChangeSettingsParams{ Body: server.ChangeSettingsBody{ EnableAdvisor: new(true), - EnableTelemetry: new(true), + EnableTelemetry: new(false), EnableAlerting: new(true), EnableUpdates: new(true), MetricsResolutions: &server.ChangeSettingsParamsBodyMetricsResolutions{ @@ -58,7 +58,7 @@ func RestoreSettingsDefaults(t *testing.T) { Context: pmmapitests.Context, }) require.NoError(t, err) - assert.True(t, res.Payload.Settings.TelemetryEnabled) + assert.False(t, res.Payload.Settings.TelemetryEnabled) assert.True(t, res.Payload.Settings.AdvisorEnabled) expectedResolutions := &server.ChangeSettingsOKBodySettingsMetricsResolutions{ Hr: "5s", diff --git a/api-tests/server/settings/settings_test.go b/api-tests/server/settings/settings_test.go index 3cb5c0ff9b..e16995a393 100644 --- a/api-tests/server/settings/settings_test.go +++ b/api-tests/server/settings/settings_test.go @@ -41,7 +41,7 @@ func TestSettings(t *testing.T) { t.Run("GetSettings", func(t *testing.T) { res, err := serverClient.Default.ServerService.GetSettings(nil) require.NoError(t, err) - assert.True(t, res.Payload.Settings.TelemetryEnabled) + assert.False(t, res.Payload.Settings.TelemetryEnabled) assert.True(t, res.Payload.Settings.AdvisorEnabled) expected := &server.GetSettingsOKBodySettingsMetricsResolutions{ Hr: "5s", @@ -224,7 +224,7 @@ func TestSettings(t *testing.T) { resg, err := serverClient.Default.ServerService.GetSettings(nil) require.NoError(t, err) - assert.True(t, resg.Payload.Settings.TelemetryEnabled) + assert.False(t, resg.Payload.Settings.TelemetryEnabled) assert.False(t, resg.Payload.Settings.AdvisorEnabled) }) @@ -243,7 +243,7 @@ func TestSettings(t *testing.T) { resg, err := serverClient.Default.ServerService.GetSettings(nil) require.NoError(t, err) - assert.True(t, resg.Payload.Settings.TelemetryEnabled) + assert.False(t, resg.Payload.Settings.TelemetryEnabled) assert.True(t, resg.Payload.Settings.AdvisorEnabled) t.Run("EnableAdvisorsWhileItIsEnabled", func(t *testing.T) { @@ -258,7 +258,7 @@ func TestSettings(t *testing.T) { resg, err := serverClient.Default.ServerService.GetSettings(nil) require.NoError(t, err) - assert.True(t, resg.Payload.Settings.TelemetryEnabled) + assert.False(t, resg.Payload.Settings.TelemetryEnabled) assert.True(t, resg.Payload.Settings.AdvisorEnabled) }) diff --git a/managed/models/settings.go b/managed/models/settings.go index 49be797841..ab7c7d397f 100644 --- a/managed/models/settings.go +++ b/managed/models/settings.go @@ -26,7 +26,7 @@ import ( const ( AdvisorsEnabledDefault = true AlertingEnabledDefault = true - TelemetryEnabledDefault = true + TelemetryEnabledDefault = false UpdatesEnabledDefault = true BackupManagementEnabledDefault = true VictoriaMetricsCacheEnabledDefault = false From e1f72b59ea7ff8dcb4194d374d58340df8bf61db Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Wed, 27 May 2026 16:45:10 +0200 Subject: [PATCH 02/10] PMM-15039 Drop redundant telemetry flag telemetry is now disabled by default so this is redundant --- dev/api/run-tests.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/dev/api/run-tests.sh b/dev/api/run-tests.sh index 73f4aa86f1..afdabd3dbd 100755 --- a/dev/api/run-tests.sh +++ b/dev/api/run-tests.sh @@ -28,7 +28,6 @@ pmm-api() { -e AWS_ACCESS_KEY \ -e AWS_SECRET_KEY \ -e PMM_ENABLE_ACCESS_CONTROL=1 \ - -e PMM_ENABLE_TELEMETRY=0 \ -v pmm-data:/srv \ "${PMM_SERVER_IMAGE:-perconalab/pmm-server:3-dev-latest}" From ab3a0ba0c3c390c4d4938ef3f0f01d292c66dcf7 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Thu, 28 May 2026 22:22:59 +0200 Subject: [PATCH 03/10] PMM-15039 Add build arg `PMM_ENABLE_TELEMETRY` --- build/docker/server/Dockerfile.el9 | 2 ++ build/scripts/build-server-docker | 1 + 2 files changed, 3 insertions(+) diff --git a/build/docker/server/Dockerfile.el9 b/build/docker/server/Dockerfile.el9 index b71f797e10..acc47e9ce3 100644 --- a/build/docker/server/Dockerfile.el9 +++ b/build/docker/server/Dockerfile.el9 @@ -2,10 +2,12 @@ FROM oraclelinux:9-slim ARG VERSION ARG BUILD_DATE +ARG PMM_ENABLE_TELEMETRY=0 ENV LANG=en_US.utf8 ENV GF_PLUGIN_DIR=/srv/grafana/plugins ENV PERCONA_TELEMETRY_DISABLE=1 +ENV PMM_ENABLE_TELEMETRY=${PMM_ENABLE_TELEMETRY} ENV PS1="[\u@\h \W] # " WORKDIR /opt diff --git a/build/scripts/build-server-docker b/build/scripts/build-server-docker index 221e5067f1..973b48db67 100755 --- a/build/scripts/build-server-docker +++ b/build/scripts/build-server-docker @@ -35,6 +35,7 @@ GO_VERSION=$(grep '^go ' ${root_dir}/tmp/source/pmm/go.mod | awk '{print $2}') docker build --build-arg BUILD_DATE="`date --rfc-3339=seconds`" \ --build-arg VERSION="$IMAGE_VERSION" \ --build-arg GO_VERSION="$GO_VERSION" \ + --build-arg PMM_ENABLE_TELEMETRY="${PMM_ENABLE_TELEMETRY:-0}" -f ${docker_root}/${docker_file} \ -t ${DOCKER_TAG} \ ${docker_root}/ From 348c38c9dadc1633627547f175f5708d81ebe837 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Thu, 28 May 2026 22:33:35 +0200 Subject: [PATCH 04/10] PMM-15039 Add missing trailing backslash --- build/scripts/build-server-docker | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/scripts/build-server-docker b/build/scripts/build-server-docker index 973b48db67..370b5b132a 100755 --- a/build/scripts/build-server-docker +++ b/build/scripts/build-server-docker @@ -35,7 +35,7 @@ GO_VERSION=$(grep '^go ' ${root_dir}/tmp/source/pmm/go.mod | awk '{print $2}') docker build --build-arg BUILD_DATE="`date --rfc-3339=seconds`" \ --build-arg VERSION="$IMAGE_VERSION" \ --build-arg GO_VERSION="$GO_VERSION" \ - --build-arg PMM_ENABLE_TELEMETRY="${PMM_ENABLE_TELEMETRY:-0}" + --build-arg PMM_ENABLE_TELEMETRY="${PMM_ENABLE_TELEMETRY:-0}" \ -f ${docker_root}/${docker_file} \ -t ${DOCKER_TAG} \ ${docker_root}/ From aad4d76a87f2459d3f82e08cde4fbfaa83acc6e6 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Thu, 28 May 2026 22:43:00 +0200 Subject: [PATCH 05/10] PMM-15039 Remove redundant telemetry version gate telemetry functionality is controlled through `PMM_ENABLE_TELEMETRY` env var, which can be set in both build step and runtime --- managed/services/telemetry/telemetry.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/managed/services/telemetry/telemetry.go b/managed/services/telemetry/telemetry.go index 230a08969a..881d6b9ed6 100644 --- a/managed/services/telemetry/telemetry.go +++ b/managed/services/telemetry/telemetry.go @@ -36,7 +36,6 @@ import ( "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/utils/platform" "github.com/percona/pmm/utils/logger" - "github.com/percona/pmm/version" ) const ( @@ -159,12 +158,6 @@ func (s *Service) Run(ctx context.Context) { return } - p, err := version.Parse(s.pmmVersion) - // do not send telemetry if this is a feature build, match only clean release versions like "3.7.1" - if err != nil || p.Rest != "" { - return - } - s.sendCh <- report } From 6ca6c991317278252069e4d110203cda0b61b203 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Thu, 28 May 2026 23:50:09 +0200 Subject: [PATCH 06/10] PMM-15039 Remove test --- managed/services/telemetry/telemetry_test.go | 63 -------------------- 1 file changed, 63 deletions(-) diff --git a/managed/services/telemetry/telemetry_test.go b/managed/services/telemetry/telemetry_test.go index d099757a12..ddc1416d47 100644 --- a/managed/services/telemetry/telemetry_test.go +++ b/managed/services/telemetry/telemetry_test.go @@ -23,7 +23,6 @@ import ( "time" _ "github.com/ClickHouse/clickhouse-go/v2" - sqlmock "github.com/DATA-DOG/go-sqlmock" pmmv1 "github.com/percona/platform/gen/telemetry/events/pmm" telemetryv1 "github.com/percona/platform/gen/telemetry/generic" "github.com/sirupsen/logrus" @@ -186,68 +185,6 @@ func TestRunTelemetryService(t *testing.T) { } } -func TestRunSkipsNonReleaseVersion(t *testing.T) { - t.Parallel() - - logger := logrus.StandardLogger() - logger.SetLevel(logrus.DebugLevel) - logEntry := logrus.NewEntry(logger) - - // Settings JSON with a pre-existing UUID so makeMetric won't attempt an UPDATE. - settingsJSON := []byte(`{"telemetry":{"uuid":"00000000-0000-0000-0000-000000000001"}}`) - - tests := []struct { - version string - }{ - {"3.0.0-rc1"}, - {"3.0.0-beta2"}, - {"3.0.0-dev"}, - {"not-a-version"}, - } - - for _, tt := range tests { - t.Run(tt.version, func(t *testing.T) { - t.Parallel() - - var mockSender mockSender - mockSender.Test(t) - t.Cleanup(func() { - mockSender.AssertNotCalled(t, "SendTelemetry") - }) - - sqlDB, dbMock, err := sqlmock.New() - require.NoError(t, err) - t.Cleanup(func() { sqlDB.Close() }) - db := reform.NewDB(sqlDB, postgresql.Dialect, nil) - - // doSend calls models.GetSettings(s.db) before prepareReport. - dbMock.ExpectQuery("SELECT settings FROM settings"). - WillReturnRows(sqlmock.NewRows([]string{"settings"}).AddRow(settingsJSON)) - // prepareReport → makeMetric runs a transaction with the same query. - dbMock.ExpectBegin() - dbMock.ExpectQuery("SELECT settings FROM settings"). - WillReturnRows(sqlmock.NewRows([]string{"settings"}).AddRow(settingsJSON)) - dbMock.ExpectCommit() - - ctx, cancel := context.WithTimeout(t.Context(), 100*time.Millisecond) - defer cancel() - - s := Service{ - db: db, - l: logEntry, - config: getTestConfig(true, "VM", 10*time.Second), // long interval: only SendOnStart fires - pmmVersion: tt.version, - dus: getDistributionUtilService(t, logEntry), - portalClient: &mockSender, - sendCh: make(chan *telemetryv1.GenericReport, sendChSize), - } - s.Run(ctx) - - require.NoError(t, dbMock.ExpectationsWereMet()) - }) - } -} - func getServiceConfig(pgPortHost string, qanDSN string, vmDSN string) ServiceConfig { serviceConfig := ServiceConfig{ Enabled: true, From bdb7301a1d0645c8e773097adedd8af0ed464821 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Fri, 29 May 2026 00:15:01 +0200 Subject: [PATCH 07/10] PMM-15039 Enable telemetry in TestRunTelemetryService --- managed/services/telemetry/telemetry_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/managed/services/telemetry/telemetry_test.go b/managed/services/telemetry/telemetry_test.go index ddc1416d47..0236a472bf 100644 --- a/managed/services/telemetry/telemetry_test.go +++ b/managed/services/telemetry/telemetry_test.go @@ -154,6 +154,11 @@ func TestRunTelemetryService(t *testing.T) { }) db := reform.NewDB(sqlDB, postgresql.Dialect, nil) + _, err := models.UpdateSettings(db, &models.ChangeSettingsParams{ + EnableTelemetry: new(true), + }) + require.NoError(t, err) + for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { t.Parallel() From 223b73fc50a38eeafce0fc378543b4b312dfd0dc Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Mon, 1 Jun 2026 18:04:20 +0200 Subject: [PATCH 08/10] Revert "PMM-15039 Remove redundant telemetry version gate" This reverts commit aad4d76a87f2459d3f82e08cde4fbfaa83acc6e6. --- managed/services/telemetry/telemetry.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/managed/services/telemetry/telemetry.go b/managed/services/telemetry/telemetry.go index 881d6b9ed6..230a08969a 100644 --- a/managed/services/telemetry/telemetry.go +++ b/managed/services/telemetry/telemetry.go @@ -36,6 +36,7 @@ import ( "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/utils/platform" "github.com/percona/pmm/utils/logger" + "github.com/percona/pmm/version" ) const ( @@ -158,6 +159,12 @@ func (s *Service) Run(ctx context.Context) { return } + p, err := version.Parse(s.pmmVersion) + // do not send telemetry if this is a feature build, match only clean release versions like "3.7.1" + if err != nil || p.Rest != "" { + return + } + s.sendCh <- report } From cc2741e8c455829928e63cb1463cf2ad2f300c53 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Mon, 1 Jun 2026 18:09:13 +0200 Subject: [PATCH 09/10] Revert "PMM-15039 Remove test" This reverts commit 6ca6c991317278252069e4d110203cda0b61b203. --- managed/services/telemetry/telemetry_test.go | 63 ++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/managed/services/telemetry/telemetry_test.go b/managed/services/telemetry/telemetry_test.go index 184a1d95b4..6fc6b626c4 100644 --- a/managed/services/telemetry/telemetry_test.go +++ b/managed/services/telemetry/telemetry_test.go @@ -23,6 +23,7 @@ import ( "time" _ "github.com/ClickHouse/clickhouse-go/v2" + sqlmock "github.com/DATA-DOG/go-sqlmock" pmmv1 "github.com/percona/platform/gen/telemetry/events/pmm" telemetryv1 "github.com/percona/platform/gen/telemetry/generic" "github.com/sirupsen/logrus" @@ -190,6 +191,68 @@ func TestRunTelemetryService(t *testing.T) { } } +func TestRunSkipsNonReleaseVersion(t *testing.T) { + t.Parallel() + + logger := logrus.StandardLogger() + logger.SetLevel(logrus.DebugLevel) + logEntry := logrus.NewEntry(logger) + + // Settings JSON with a pre-existing UUID so makeMetric won't attempt an UPDATE. + settingsJSON := []byte(`{"telemetry":{"uuid":"00000000-0000-0000-0000-000000000001"}}`) + + tests := []struct { + version string + }{ + {"3.0.0-rc1"}, + {"3.0.0-beta2"}, + {"3.0.0-dev"}, + {"not-a-version"}, + } + + for _, tt := range tests { + t.Run(tt.version, func(t *testing.T) { + t.Parallel() + + var mockSender mockSender + mockSender.Test(t) + t.Cleanup(func() { + mockSender.AssertNotCalled(t, "SendTelemetry") + }) + + sqlDB, dbMock, err := sqlmock.New() + require.NoError(t, err) + t.Cleanup(func() { sqlDB.Close() }) + db := reform.NewDB(sqlDB, postgresql.Dialect, nil) + + // doSend calls models.GetSettings(s.db) before prepareReport. + dbMock.ExpectQuery("SELECT settings FROM settings"). + WillReturnRows(sqlmock.NewRows([]string{"settings"}).AddRow(settingsJSON)) + // prepareReport → makeMetric runs a transaction with the same query. + dbMock.ExpectBegin() + dbMock.ExpectQuery("SELECT settings FROM settings"). + WillReturnRows(sqlmock.NewRows([]string{"settings"}).AddRow(settingsJSON)) + dbMock.ExpectCommit() + + ctx, cancel := context.WithTimeout(t.Context(), 100*time.Millisecond) + defer cancel() + + s := Service{ + db: db, + l: logEntry, + config: getTestConfig(true, "VM", 10*time.Second), // long interval: only SendOnStart fires + pmmVersion: tt.version, + dus: getDistributionUtilService(t, logEntry), + portalClient: &mockSender, + sendCh: make(chan *telemetryv1.GenericReport, sendChSize), + } + s.Run(ctx) + + require.NoError(t, dbMock.ExpectationsWereMet()) + }) + } +} + func getServiceConfig(pgPortHost string, qanDSN string, vmDSN string) ServiceConfig { serviceConfig := ServiceConfig{ Enabled: true, From 8ece1ad9fb9f07aebccd68d1cb9fdff50a077e43 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Mon, 1 Jun 2026 18:33:14 +0200 Subject: [PATCH 10/10] PMM-15039 Enable telemetry in test --- managed/services/telemetry/telemetry_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/services/telemetry/telemetry_test.go b/managed/services/telemetry/telemetry_test.go index 6fc6b626c4..718159a32a 100644 --- a/managed/services/telemetry/telemetry_test.go +++ b/managed/services/telemetry/telemetry_test.go @@ -199,7 +199,7 @@ func TestRunSkipsNonReleaseVersion(t *testing.T) { logEntry := logrus.NewEntry(logger) // Settings JSON with a pre-existing UUID so makeMetric won't attempt an UPDATE. - settingsJSON := []byte(`{"telemetry":{"uuid":"00000000-0000-0000-0000-000000000001"}}`) + settingsJSON := []byte(`{"telemetry":{"enabled":true,"uuid":"00000000-0000-0000-0000-000000000001"}}`) tests := []struct { version string