From e0ec2226d1405a62cc7e026a5a33d760e8d6f8b9 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Fri, 15 May 2026 10:43:44 +0300 Subject: [PATCH 01/23] PMM-7 Fix Makefile.devcontainer usage --- Makefile | 10 +++++----- Makefile.devcontainer | 8 ++++---- docker-compose.dev.yml | 1 + 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 3f1098530c2..02a452d3304 100644 --- a/Makefile +++ b/Makefile @@ -9,15 +9,15 @@ endif env-up: ## Start devcontainer COMPOSE_PROFILES=$(PROFILES) \ - docker compose up -d --wait --wait-timeout 100 + docker compose -f ./docker-compose.dev.yml up -d --wait --wait-timeout 100 env-up-rebuild: env-update-image ## Rebuild and start devcontainer. Useful for custom $PMM_SERVER_IMAGE COMPOSE_PROFILES=$(PROFILES) \ - docker compose up --build -d + docker compose -f ./docker-compose.dev.yml up --build -d env-update-image: ## Pull latest dev image COMPOSE_PROFILES=$(PROFILES) \ - docker compose pull + docker compose -f ./docker-compose.dev.yml pull env-compose-up: env-update-image COMPOSE_PROFILES=$(PROFILES) \ @@ -28,11 +28,11 @@ env-devcontainer: env-down: ## Stop devcontainer COMPOSE_PROFILES=$(PROFILES) \ - docker compose down --remove-orphans + docker compose -f ./docker-compose.dev.yml down --remove-orphans env-remove: COMPOSE_PROFILES=$(PROFILES) \ - docker compose down --volumes --remove-orphans + docker compose -f ./docker-compose.dev.yml down --volumes --remove-orphans TARGET ?= _bash diff --git a/Makefile.devcontainer b/Makefile.devcontainer index 3c4d84645ec..f059e92a857 100644 --- a/Makefile.devcontainer +++ b/Makefile.devcontainer @@ -23,7 +23,7 @@ PMM_RELEASE_PATH ?= ./bin run-managed-ci: release-dev-managed ## Replace pmm-managed from build, restart (used in CI) supervisorctl stop pmm-managed supervisorctl stop pmm-managed truncate -s 0 /srv/logs/pmm-managed.log - cp $(PMM_RELEASE_PATH)/pmm-managed /usr/sbin/pmm-managed + install -m 755 $(PMM_RELEASE_PATH)/pmm-managed /usr/sbin/ supervisorctl start pmm-managed run-managed: run-managed-ci ## Replace pmm-managed from build, restart and tail logs @@ -32,7 +32,7 @@ run-managed: run-managed-ci ## Replace pmm-managed from build, restart and run-agent-ci: release-dev-agent ## Replace pmm-agent from build and restart (used in CI) supervisorctl stop pmm-agent truncate -s 0 /srv/logs/pmm-agent.log - cp $(PMM_RELEASE_PATH)/pmm-agent /usr/sbin/pmm-agent + install -m 755 $(PMM_RELEASE_PATH)/pmm-agent /usr/sbin/ supervisorctl start pmm-agent run-agent: run-agent-ci ## Replace pmm-agent from build, restart and tail logs @@ -41,7 +41,7 @@ run-agent: run-agent-ci ## Replace pmm-agent from build, restart and tail log run-vmproxy-ci: release-vmproxy ## Replace vmproxy from build and restart (used in CI) supervisorctl stop vmproxy truncate -s 0 /srv/logs/vmproxy.log - cp $(PMM_RELEASE_PATH)/vmproxy /usr/sbin/vmproxy + install -m 755 $(PMM_RELEASE_PATH)/vmproxy /usr/sbin/ supervisorctl start vmproxy run-vmproxy: run-vmproxy-ci ## Replace vmproxy from build, restart and tail logs @@ -49,7 +49,7 @@ run-vmproxy: run-vmproxy-ci ## Replace vmproxy from build, restart and tail lo run-qan-ci: release-qan ## Replace qan-api2 from build and restart (used in CI) supervisorctl stop qan-api2 - cp $(PMM_RELEASE_PATH)/qan-api2 /usr/sbin/percona-qan-api2 + install -m 755 $(PMM_RELEASE_PATH)/qan-api2 /usr/sbin/percona-qan-api2 truncate -s 0 /srv/logs/qan-api2.log supervisorctl start qan-api2 diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 03aadb2fd38..94c52a6e390 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -32,6 +32,7 @@ services: - ${PMM_PORT_CH_HTTP:-8123}:8123 volumes: - ./:/root/go/src/github.com/percona/pmm + - ./Makefile.devcontainer:/root/go/src/github.com/percona/pmm/Makefile:ro - ./managed/testdata/updater/:/home/pmm/.config/systemd/user/ # clickhouse config for backup/restore - ./dev/clickhouse-config.xml:/etc/clickhouse-server/config.xml:ro From 9161af85912874e5b4ee8180a1d676d910a94e8c Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Fri, 15 May 2026 17:13:47 +0300 Subject: [PATCH 02/23] PMM-7 Fix testifylint linter warnings --- .../internal/collector/collector_test.go | 2 +- .../profiler/internal/profiler_test.go | 2 +- .../service_info_broker_test.go | 2 +- agent/versioner/versioner_test.go | 2 +- managed/models/artifact_helpers_test.go | 4 +-- managed/models/check_settings_helper_test.go | 4 +-- managed/models/database_test.go | 5 +-- managed/models/location_helpers_test.go | 5 ++- managed/models/role_helpers_test.go | 3 +- managed/models/service_helpers_test.go | 32 +++++++++---------- managed/models/template_helpers_test.go | 2 +- .../backup/compatibility_service_test.go | 2 +- managed/services/inventory/services_test.go | 10 +++--- .../services/management/accesscontrol_test.go | 4 +-- managed/services/management/node_test.go | 2 +- managed/services/management/rds_test.go | 4 +-- managed/utils/envvars/parser_test.go | 4 +-- qan-api2/models/reporter_test.go | 2 +- 18 files changed, 45 insertions(+), 46 deletions(-) diff --git a/agent/agents/mongodb/profiler/internal/collector/collector_test.go b/agent/agents/mongodb/profiler/internal/collector/collector_test.go index 35d9c63675a..dee034baaec 100644 --- a/agent/agents/mongodb/profiler/internal/collector/collector_test.go +++ b/agent/agents/mongodb/profiler/internal/collector/collector_test.go @@ -168,7 +168,7 @@ func TestCollector(t *testing.T) { wg.Wait() ctr.Stop() - assert.Equal(t, maxDocs*maxLoops, len(profiles)) + assert.Len(t, profiles, maxDocs*maxLoops) } func genData(ctx context.Context, client *mongo.Client, maxLoops, maxDocs int) { diff --git a/agent/agents/mongodb/profiler/internal/profiler_test.go b/agent/agents/mongodb/profiler/internal/profiler_test.go index ef5009019e5..b9d35a95e15 100644 --- a/agent/agents/mongodb/profiler/internal/profiler_test.go +++ b/agent/agents/mongodb/profiler/internal/profiler_test.go @@ -163,7 +163,7 @@ func testProfiler(t *testing.T, url string) { responseLength := float32(45) - assert.Equal(t, dbsCount, len(bucketsMap)) // 300 sample docs / 10 = different database names + assert.Len(t, bucketsMap, dbsCount) // 300 sample docs / 10 = different database names var buckets []*agentv1.MetricsBucket for _, bucket := range bucketsMap { buckets = append(buckets, bucket) diff --git a/agent/serviceinfobroker/service_info_broker_test.go b/agent/serviceinfobroker/service_info_broker_test.go index 4c7219b90d1..fc75fb70eaa 100644 --- a/agent/serviceinfobroker/service_info_broker_test.go +++ b/agent/serviceinfobroker/service_info_broker_test.go @@ -222,7 +222,7 @@ func TestServiceInfoBroker(t *testing.T) { }, 0) require.NotNil(t, resp) assert.Equal(t, []string{"postgres", "pmm-agent"}, resp.DatabaseList) - assert.Equal(t, "", *resp.PgsmVersion) + assert.Empty(t, *resp.PgsmVersion) }) } diff --git a/agent/versioner/versioner_test.go b/agent/versioner/versioner_test.go index b650bdb7749..3dbd7413a21 100644 --- a/agent/versioner/versioner_test.go +++ b/agent/versioner/versioner_test.go @@ -40,7 +40,7 @@ func TestVersioner(t *testing.T) { version, err := versioner.MySQLdVersion() assert.True(t, errors.Is(err, ErrNotFound)) - assert.Equal(t, "", version) + assert.Empty(t, version) }) // mysql software diff --git a/managed/models/artifact_helpers_test.go b/managed/models/artifact_helpers_test.go index a51bd6fcc39..35daf24d65c 100644 --- a/managed/models/artifact_helpers_test.go +++ b/managed/models/artifact_helpers_test.go @@ -284,11 +284,11 @@ func TestArtifacts(t *testing.T) { err = a.MetadataRemoveFirstN(q, 0) require.NoError(t, err) - assert.Equal(t, 4, len(a.MetadataList)) + assert.Len(t, a.MetadataList, 4) err = a.MetadataRemoveFirstN(q, 3) require.NoError(t, err) - assert.Equal(t, 1, len(a.MetadataList)) + assert.Len(t, a.MetadataList, 1) err = a.MetadataRemoveFirstN(q, 10) require.NoError(t, err) diff --git a/managed/models/check_settings_helper_test.go b/managed/models/check_settings_helper_test.go index b64de25bd15..40812756701 100644 --- a/managed/models/check_settings_helper_test.go +++ b/managed/models/check_settings_helper_test.go @@ -105,7 +105,7 @@ func TestChecksSettings(t *testing.T) { //nolint:tparallel actual, err := models.FindCheckSettings(q) require.NoError(t, err) assert.Len(t, actual, 2) - assert.Equal(t, actual["check1"], models.Standard) - assert.Equal(t, actual["check2"], models.Standard) + assert.Equal(t, models.Standard, actual["check1"]) + assert.Equal(t, models.Standard, actual["check2"]) }) } diff --git a/managed/models/database_test.go b/managed/models/database_test.go index 275e572eb94..840c1354c0f 100644 --- a/managed/models/database_test.go +++ b/managed/models/database_test.go @@ -22,6 +22,7 @@ import ( "testing" "github.com/lib/pq" + "github.com/lib/pq/pqerror" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -36,7 +37,7 @@ func assertUniqueViolation(t *testing.T, err error, constraint string) { require.IsType(t, &pq.Error{}, err) pgErr := err.(*pq.Error) //nolint:errorlint - assert.EqualValues(t, pq.ErrorCode("23505"), pgErr.Code) + assert.Equal(t, pqerror.Code("23505"), pgErr.Code) assert.Equal(t, fmt.Sprintf(`duplicate key value violates unique constraint %q`, constraint), pgErr.Message) } @@ -45,7 +46,7 @@ func assertCheckViolation(t *testing.T, err error, table, constraint string) { / require.IsType(t, &pq.Error{}, err) pgErr := err.(*pq.Error) //nolint:errorlint - assert.EqualValues(t, pq.ErrorCode("23514"), pgErr.Code) + assert.Equal(t, pqerror.Code("23514"), pgErr.Code) assert.Equal(t, fmt.Sprintf(`new row for relation %q violates check constraint %q`, table, constraint), pgErr.Message) } diff --git a/managed/models/location_helpers_test.go b/managed/models/location_helpers_test.go index cdcf30242a8..d1ad445c6bf 100644 --- a/managed/models/location_helpers_test.go +++ b/managed/models/location_helpers_test.go @@ -16,7 +16,6 @@ package models_test import ( - "errors" "fmt" "net/url" "testing" @@ -336,10 +335,10 @@ func TestBackupLocations(t *testing.T) { require.NoError(t, err) _, err = models.FindArtifactByID(q, artifact.ID) - require.True(t, errors.Is(err, models.ErrNotFound)) + require.ErrorIs(t, err, models.ErrNotFound) _, err = models.FindRestoreHistoryItemByID(q, rhi.ID) - require.True(t, errors.Is(err, models.ErrNotFound)) + require.ErrorIs(t, err, models.ErrNotFound) locations, err := models.FindBackupLocations(q) require.NoError(t, err) diff --git a/managed/models/role_helpers_test.go b/managed/models/role_helpers_test.go index a78741e8e4b..fd2f027daa7 100644 --- a/managed/models/role_helpers_test.go +++ b/managed/models/role_helpers_test.go @@ -16,7 +16,6 @@ package models_test import ( - "errors" "testing" "github.com/stretchr/testify/require" @@ -82,7 +81,7 @@ func TestRoleHelpers(t *testing.T) { defer teardown(t) err := models.AssignRoles(tx, userID, []int{0}) - require.True(t, errors.Is(err, models.ErrRoleNotFound)) + require.ErrorIs(t, err, models.ErrRoleNotFound) }) //nolint:paralleltest diff --git a/managed/models/service_helpers_test.go b/managed/models/service_helpers_test.go index 78913a7832b..f461292c93b 100644 --- a/managed/models/service_helpers_test.go +++ b/managed/models/service_helpers_test.go @@ -166,7 +166,7 @@ func TestServiceHelpers(t *testing.T) { services, err = models.FindServices(q, models.ServiceFilters{NodeID: "N1"}) assert.NoError(t, err) assert.Len(t, services, 4) - assert.Equal(t, services, []*models.Service{{ + assert.Equal(t, []*models.Service{{ ServiceID: "S1", ServiceType: models.MongoDBServiceType, ServiceName: "Service without Agents", @@ -202,12 +202,12 @@ func TestServiceHelpers(t *testing.T) { Port: pointer.ToUint16OrNil(6032), CreatedAt: now, UpdatedAt: now, - }}) + }}, services) services, err = models.FindServices(q, models.ServiceFilters{NodeID: "N1", ServiceType: new(models.MySQLServiceType)}) assert.NoError(t, err) assert.Len(t, services, 1) - assert.Equal(t, services, []*models.Service{{ + assert.Equal(t, []*models.Service{{ ServiceID: "S2", ServiceType: models.MySQLServiceType, ServiceName: "Service with Agents", @@ -216,12 +216,12 @@ func TestServiceHelpers(t *testing.T) { Port: pointer.ToUint16OrNil(3306), CreatedAt: now, UpdatedAt: now, - }}) + }}, services) services, err = models.FindServices(q, models.ServiceFilters{NodeID: "N2", ServiceType: new(models.ExternalServiceType)}) assert.NoError(t, err) assert.Len(t, services, 2) - assert.Equal(t, services, []*models.Service{ + assert.Equal(t, []*models.Service{ { ServiceID: "S4", ServiceType: models.ExternalServiceType, @@ -242,12 +242,12 @@ func TestServiceHelpers(t *testing.T) { CreatedAt: now, UpdatedAt: now, }, - }) + }, services) services, err = models.FindServices(q, models.ServiceFilters{NodeID: "N2", ServiceType: new(models.ProxySQLServiceType)}) assert.NoError(t, err) assert.Len(t, services, 1) - assert.Equal(t, services, []*models.Service{{ + assert.Equal(t, []*models.Service{{ ServiceID: "S6", ServiceType: models.ProxySQLServiceType, ServiceName: "Sixth service", @@ -255,12 +255,12 @@ func TestServiceHelpers(t *testing.T) { NodeID: "N2", CreatedAt: now, UpdatedAt: now, - }}) + }}, services) services, err = models.FindServices(q, models.ServiceFilters{ExternalGroup: "redis"}) assert.NoError(t, err) assert.Len(t, services, 1) - assert.Equal(t, services, []*models.Service{{ + assert.Equal(t, []*models.Service{{ ServiceID: "S7", ServiceType: models.ExternalServiceType, ServiceName: "Seventh service", @@ -270,19 +270,19 @@ func TestServiceHelpers(t *testing.T) { ExternalGroup: "redis", CreatedAt: now, UpdatedAt: now, - }}) + }}, services) services, err = models.FindServices(q, models.ServiceFilters{NodeID: "N2", ServiceType: new(models.HAProxyServiceType)}) assert.NoError(t, err) assert.Len(t, services, 1) - assert.Equal(t, services, []*models.Service{{ + assert.Equal(t, []*models.Service{{ ServiceID: "S8", ServiceType: models.HAProxyServiceType, ServiceName: "Eighth service", NodeID: "N2", CreatedAt: now, UpdatedAt: now, - }}) + }}, services) }) t.Run("FindActiveServiceTypes", func(t *testing.T) { @@ -483,10 +483,10 @@ func TestServiceHelpers(t *testing.T) { ns, err := models.FindServiceByID(q, s.ServiceID) require.NoError(t, err) - assert.Equal(t, ns.Cluster, "cluster") - assert.Equal(t, ns.Environment, "env") - assert.Equal(t, ns.ReplicationSet, "rs") - assert.Equal(t, ns.ExternalGroup, "external") + assert.Equal(t, "cluster", ns.Cluster) + assert.Equal(t, "env", ns.Environment) + assert.Equal(t, "rs", ns.ReplicationSet) + assert.Equal(t, "external", ns.ExternalGroup) }) t.Run("Software versions record created when adding a service", func(t *testing.T) { diff --git a/managed/models/template_helpers_test.go b/managed/models/template_helpers_test.go index 26be98f6ba5..14404deab9b 100644 --- a/managed/models/template_helpers_test.go +++ b/managed/models/template_helpers_test.go @@ -199,7 +199,7 @@ func TestRuleTemplates(t *testing.T) { assert.Equal(t, created.Summary, actual.Summary) assert.Equal(t, created.Expr, actual.Expr) assert.Equal(t, created.Params, actual.Params) - assert.EqualValues(t, created.For, actual.For) + assert.Equal(t, created.For, actual.For) assert.Equal(t, created.Severity, actual.Severity) assert.Equal(t, created.Labels, actual.Labels) assert.Empty(t, actual.Annotations) diff --git a/managed/services/backup/compatibility_service_test.go b/managed/services/backup/compatibility_service_test.go index c3dc6dbcf6d..56284c97f29 100644 --- a/managed/services/backup/compatibility_service_test.go +++ b/managed/services/backup/compatibility_service_test.go @@ -197,7 +197,7 @@ func TestCheckCompatibility(t *testing.T) { dbVersion, err := cSvc.checkCompatibility(&models.Service{ServiceType: tc.serviceType}, &agentModel) if tc.expectedError != nil { assert.ErrorIs(t, err, tc.expectedError) - assert.Equal(t, "", dbVersion) + assert.Empty(t, dbVersion) } else { assert.NoError(t, err) assert.Equal(t, tc.versions[0].Version, dbVersion) diff --git a/managed/services/inventory/services_test.go b/managed/services/inventory/services_test.go index ed2fcdf619c..ded0854ad58 100644 --- a/managed/services/inventory/services_test.go +++ b/managed/services/inventory/services_test.go @@ -969,8 +969,8 @@ func TestServices(t *testing.T) { labels, err := service.GetCustomLabels() assert.NoError(t, err) assert.Len(t, labels, 2) - assert.Equal(t, labels["newKey"], "newValue") - assert.Equal(t, labels["newKey2"], "newValue2") + assert.Equal(t, "newValue", labels["newKey"]) + assert.Equal(t, "newValue2", labels["newKey2"]) }) t.Run("Replace a label", func(t *testing.T) { @@ -1013,8 +1013,8 @@ func TestServices(t *testing.T) { labels, err := service.GetCustomLabels() assert.NoError(t, err) assert.Len(t, labels, 2) - assert.Equal(t, labels["newKey"], "newValue") - assert.Equal(t, labels["newKey2"], "newValue-replaced") + assert.Equal(t, "newValue", labels["newKey"]) + assert.Equal(t, "newValue-replaced", labels["newKey2"]) }) }) @@ -1064,7 +1064,7 @@ func TestServices(t *testing.T) { labels, err := service.GetCustomLabels() assert.NoError(t, err) assert.Len(t, labels, 1) - assert.Equal(t, labels["newKey3"], "newValue3") + assert.Equal(t, "newValue3", labels["newKey3"]) }) }) } diff --git a/managed/services/management/accesscontrol_test.go b/managed/services/management/accesscontrol_test.go index 2ea85cfd56c..1f006a41240 100644 --- a/managed/services/management/accesscontrol_test.go +++ b/managed/services/management/accesscontrol_test.go @@ -123,7 +123,7 @@ func TestAccessControlService(t *testing.T) { roles, err := s.ListRoles(ctx, &rolev1beta1.ListRolesRequest{}) require.NoError(t, err) assert.Len(t, roles.Roles, 1) - assert.Equal(t, roles.Roles[0].Title, "Role A") + assert.Equal(t, "Role A", roles.Roles[0].Title) }) t.Run("Shall return not found", func(t *testing.T) { @@ -145,7 +145,7 @@ func TestAccessControlService(t *testing.T) { res, err := s.GetRole(ctx, &rolev1beta1.GetRoleRequest{RoleId: roleID}) require.NoError(t, err) - assert.Equal(t, res.Title, "Role B") + assert.Equal(t, "Role B", res.Title) }) t.Run("Shall return not found", func(t *testing.T) { diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index c0a25e2024e..ec16cf438ea 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -226,7 +226,7 @@ func TestNodeService(t *testing.T) { Force: true, }) assert.NoError(t, err) - assert.Equal(t, "", res.Warning) + assert.Empty(t, res.Warning) }) }) diff --git a/managed/services/management/rds_test.go b/managed/services/management/rds_test.go index ce070c471be..2b76a26a7b9 100644 --- a/managed/services/management/rds_test.go +++ b/managed/services/management/rds_test.go @@ -164,7 +164,7 @@ func TestRDSService(t *testing.T) { }) require.NoError(t, err) - assert.Equal(t, 4, len(instances.RdsInstances), "Should have four instances") + assert.Len(t, instances.RdsInstances, 4, "Should have four instances") assert.Equal(t, []*managementv1.DiscoverRDSInstance{ { Region: "us-east-1", @@ -240,7 +240,7 @@ func TestRDSService(t *testing.T) { instances, err := discoverRDSRegion(ctx, cfg, tt.region) require.NoError(t, err) - require.Equal(t, len(tt.instances), len(instances), "Should have two instances") + require.Len(t, instances, len(tt.instances), "Should have two instances") // we compare instances this way because there are too much fields that we don't need to compare. for i, instance := range tt.instances { assert.Equal(t, instance.az, pointer.GetString(instances[i].AvailabilityZone)) diff --git a/managed/utils/envvars/parser_test.go b/managed/utils/envvars/parser_test.go index 0041b9dd930..24f5ae4c142 100644 --- a/managed/utils/envvars/parser_test.go +++ b/managed/utils/envvars/parser_test.go @@ -219,7 +219,7 @@ func TestEnvVarValidator(t *testing.T) { expectedEnvVars := &models.ChangeSettingsParams{} gotEnvVars, gotErrs, gotWarns := ParseEnvVars(envs) - assert.Equal(t, gotEnvVars, expectedEnvVars) + assert.Equal(t, expectedEnvVars, gotEnvVars) assert.Nil(t, gotErrs) assert.Nil(t, gotWarns) }) @@ -240,7 +240,7 @@ func TestEnvVarValidator(t *testing.T) { expectedEnvVars := &models.ChangeSettingsParams{} gotEnvVars, gotErrs, gotWarns := ParseEnvVars(envs) - assert.Equal(t, gotEnvVars, expectedEnvVars) + assert.Equal(t, expectedEnvVars, gotEnvVars) assert.Nil(t, gotErrs) assert.Nil(t, gotWarns) }) diff --git a/qan-api2/models/reporter_test.go b/qan-api2/models/reporter_test.go index 85ea9dde9a4..6e422ab3ddb 100644 --- a/qan-api2/models/reporter_test.go +++ b/qan-api2/models/reporter_test.go @@ -150,7 +150,7 @@ func TestHeadersToLbacFilter(t *testing.T) { ctx := setup(t, `["{custom_label=\"value\",service_type=\"mysql\"}"]`) filter, err := headersToLbacFilter(ctx) require.NoError(t, err) - require.Equal(t, filter, "((hasAny(labels.key, ['custom_label']) AND hasAny(labels.value, ['value'])) AND service_type = 'mysql')") + require.Equal(t, "((hasAny(labels.key, ['custom_label']) AND hasAny(labels.value, ['value'])) AND service_type = 'mysql')", filter) }) } From 3d219011e8c85b882f8fe6c5c8a782098f994c8e Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Mon, 18 May 2026 18:32:12 +0300 Subject: [PATCH 03/23] PMM-7 Fix testifylint linter warnings (p2) --- admin/commands/base_test.go | 12 ++-- admin/commands/list_test.go | 5 +- admin/commands/management/add_mysql_test.go | 7 +-- admin/commands/summary_test.go | 4 +- agent/agents/cache/cache_test.go | 10 ++-- .../profiler/internal/profiler_test.go | 20 +++---- .../shared/aggregator/aggregator_test.go | 2 +- .../fingerprinter/fingerprinter_test.go | 4 +- .../mysql/slowlog/parser/parser_bench_test.go | 4 +- .../mysql/slowlog/parser/parser_test.go | 4 +- .../pgstatmonitor/pgstatmonitor_test.go | 16 +++--- .../pgstatmonitor/stat_monitor_cache_test.go | 9 ++- .../pgstatstatements/pgstatstatements_test.go | 6 +- .../agents/supervisor/ports_registry_test.go | 28 ++++----- agent/client/channel/channel_test.go | 24 ++++---- agent/client/client_test.go | 10 ++-- agent/config/config_test.go | 6 +- .../actions/mongodb_explain_action_test.go | 10 ++-- .../mongodb_query_admincommand_action_test.go | 4 +- .../actions/mysql_explain_action_test.go | 12 ++-- .../mysql_show_create_table_action_test.go | 4 +- .../actions/mysql_show_index_action_test.go | 4 +- .../mysql_show_table_status_action_test.go | 4 +- .../postgresql_query_select_action_test.go | 2 +- ...ostgresql_show_create_table_action_test.go | 2 +- agent/runner/actions/process_action_test.go | 2 +- .../actions/pt_mysql_summary_action_test.go | 2 +- agent/runner/jobs/mongodb_backup_job_test.go | 5 +- agent/runner/jobs/pbm_helpers_test.go | 4 +- .../filereader/continuous_file_reader_test.go | 4 +- agent/utils/mongo_fix/mongo_fix_test.go | 3 +- agent/utils/templates/template_test.go | 7 ++- agent/utils/version/mysql_test.go | 3 +- agent/versioner/versioner_test.go | 15 ++--- api-tests/alerting/alerting_test.go | 8 +-- api-tests/helpers.go | 2 +- api-tests/inventory/services_test.go | 6 +- api-tests/management/action/explain_test.go | 2 +- api-tests/management/annotation_test.go | 9 ++- api-tests/management/external_test.go | 12 ++-- api-tests/management/haproxy_test.go | 12 ++-- api-tests/management/helpers.go | 6 +- api-tests/management/mongodb_test.go | 26 ++++----- api-tests/management/mysql_test.go | 22 +++---- api-tests/management/nodes_test.go | 6 +- api-tests/management/postgresql_test.go | 22 +++---- api-tests/management/proxysql_test.go | 6 +- api-tests/management/valkey_test.go | 8 +-- api-tests/server/logs_test.go | 2 +- api-tests/server/settings/settings_test.go | 2 +- managed/models/action_helpers_test.go | 2 +- managed/models/agent_helpers_test.go | 2 +- managed/models/agentversion_test.go | 6 +- managed/models/artifact_helpers_test.go | 2 +- managed/models/database_test.go | 10 ++-- managed/models/job_helpers_test.go | 4 +- managed/models/location_helpers_test.go | 8 +-- managed/models/models_test.go | 9 +-- managed/models/node_helpers_test.go | 12 ++-- managed/models/postgresql_version_test.go | 4 +- .../models/restore_history_helpers_test.go | 2 +- .../models/scheduled_tasks_helpers_test.go | 12 ++-- managed/models/service_helpers_test.go | 24 ++++---- managed/models/settings_helpers_test.go | 12 ++-- .../models/software_version_helpers_test.go | 6 +- .../services/agents/channel/channel_test.go | 30 +++++----- managed/services/agents/postgresql_test.go | 57 ++++++++++--------- managed/services/alerting/service_test.go | 4 +- .../services/backup/backup_service_test.go | 22 +++---- .../backup/compatibility_helpers_test.go | 19 ++++--- .../backup/compatibility_service_test.go | 12 ++-- .../backup/pitr_timerange_service_test.go | 6 +- .../services/backup/removal_service_test.go | 20 +++---- .../services/backup/retention_service_test.go | 12 ++-- managed/services/checks/checks_test.go | 8 +-- managed/services/checks/funcs_test.go | 6 +- managed/services/converters_test.go | 2 +- managed/services/grafana/client_test.go | 6 +- managed/services/inventory/services_test.go | 20 +++---- .../services/management/accesscontrol_test.go | 2 +- .../management/backup/backup_service_test.go | 20 +++---- .../backup/locations_service_test.go | 10 ++-- .../management/backup/restore_service_test.go | 8 +-- managed/services/management/checks_test.go | 14 ++--- managed/services/management/node_test.go | 8 +-- managed/services/management/service_test.go | 6 +- managed/services/preconditions_test.go | 11 ++-- managed/services/qan/client_test.go | 4 +- managed/services/scheduler/scheduler_test.go | 2 +- managed/services/scheduler/task_test.go | 5 +- managed/services/server/logs_test.go | 14 ++--- managed/services/server/server_test.go | 12 ++-- .../services/supervisord/devcontainer_test.go | 4 +- managed/services/telemetry/telemetry_test.go | 2 +- managed/services/telemetry/transform_test.go | 45 +++++++-------- .../versioncache/versioncache_test.go | 18 +++--- .../victoriametrics/victoriametrics_test.go | 6 +- managed/utils/clean/clean_test.go | 10 ++-- managed/utils/dir/dir_test.go | 6 +- .../distribution/distribution_util_test.go | 4 +- managed/utils/encryption/encryption_test.go | 12 ++-- managed/utils/pprof/pprof_test.go | 8 +-- managed/utils/signatures/signatures_test.go | 6 +- managed/utils/tests/asserts.go | 5 +- .../utils/validators/alerting_rules_test.go | 3 +- .../services/analytics/object_details_test.go | 10 ++-- qan-api2/services/analytics/profile_test.go | 25 ++++---- qan-api2/utils/templatefs/templatefs_test.go | 4 +- 108 files changed, 517 insertions(+), 515 deletions(-) diff --git a/admin/commands/base_test.go b/admin/commands/base_test.go index 2f8c5081b37..e0de07c0288 100644 --- a/admin/commands/base_test.go +++ b/admin/commands/base_test.go @@ -78,8 +78,8 @@ func TestCredentials(t *testing.T) { credSourceX, _ := CreateDummyCredentialsExecutable(data) t.Cleanup(func() { - assert.NoError(t, os.Remove(credSource)) - assert.NoError(t, os.Remove(credSourceX)) + require.NoError(t, os.Remove(credSource)) + require.NoError(t, os.Remove(credSourceX)) }) t.Run("Reading", func(t *testing.T) { @@ -178,15 +178,15 @@ func TestReadFile(t *testing.T) { require.NoError(t, err) defer func() { err = cert.Close() - assert.NoError(t, err) + require.NoError(t, err) err = os.Remove(cert.Name()) - assert.NoError(t, err) + require.NoError(t, err) }() _, err = cert.WriteString("cert") require.NoError(t, err) certificate, err := ReadFile(cert.Name()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "cert", certificate) }) @@ -195,7 +195,7 @@ func TestReadFile(t *testing.T) { filepath := "not-existed-file" certificate, err := ReadFile(filepath) - assert.EqualError(t, err, fmt.Sprintf("cannot load file in path %q: open not-existed-file: no such file or directory", filepath)) + require.EqualError(t, err, fmt.Sprintf("cannot load file in path %q: open not-existed-file: no such file or directory", filepath)) assert.Empty(t, certificate) }) diff --git a/admin/commands/list_test.go b/admin/commands/list_test.go index 6528a6a1dfb..29e61baf664 100644 --- a/admin/commands/list_test.go +++ b/admin/commands/list_test.go @@ -20,6 +20,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/percona/pmm/api/inventory/v1/json/client/agents_service" "github.com/percona/pmm/api/inventory/v1/json/client/services_service" @@ -222,7 +223,7 @@ func TestListJSONOutput(t *testing.T) { } res, err := json.Marshal(result) - assert.NoError(t, err) + require.NoError(t, err) expected := ` { "service": [ @@ -301,7 +302,7 @@ func TestListJSONOutput(t *testing.T) { } res, err := json.Marshal(result) - assert.NoError(t, err) + require.NoError(t, err) expected := `{"service":[],"agent":[]}` assert.Equal(t, expected, string(res)) }) diff --git a/admin/commands/management/add_mysql_test.go b/admin/commands/management/add_mysql_test.go index d402ea2630f..c0b61008c49 100644 --- a/admin/commands/management/add_mysql_test.go +++ b/admin/commands/management/add_mysql_test.go @@ -19,6 +19,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" mservice "github.com/percona/pmm/api/management/v1/json/client/management_service" ) @@ -154,9 +155,7 @@ func TestRun(t *testing.T) { } _, err := cmd.RunCmd() - if assert.Error(t, err) { - expected := "Unrecognized option. To create a user, see https://docs.percona.com/percona-monitoring-and-management/3/install-pmm/install-pmm-client/connect-database/mysql/mysql.html#create-a-database-account-for-pmm" - assert.Equal(t, expected, err.Error()) - } + expected := "Unrecognized option. To create a user, see https://docs.percona.com/percona-monitoring-and-management/3/install-pmm/install-pmm-client/connect-database/mysql/mysql.html#create-a-database-account-for-pmm" + require.Error(t, err, expected) }) } diff --git a/admin/commands/summary_test.go b/admin/commands/summary_test.go index d0cc8318db0..04e3dfc0789 100644 --- a/admin/commands/summary_test.go +++ b/admin/commands/summary_test.go @@ -35,7 +35,7 @@ func TestSummary(t *testing.T) { filename := f.Name() t.Logf("Using temp file: %s", filename) - assert.NoError(t, f.Close()) + require.NoError(t, f.Close()) t.Run("Summary default", func(t *testing.T) { cmd := &SummaryCommand{ @@ -80,7 +80,7 @@ func TestSummary(t *testing.T) { // Check there is a pprof dir with data inside the zip file reader, err := zip.OpenReader(filename) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expected, res) hasPprofDir := false diff --git a/agent/agents/cache/cache_test.go b/agent/agents/cache/cache_test.go index 40bfafc8219..277ad3efda8 100644 --- a/agent/agents/cache/cache_test.go +++ b/agent/agents/cache/cache_test.go @@ -146,20 +146,20 @@ func TestCacheErrors(t *testing.T) { t.Parallel() var err error _, err = New(100, time.Second*100, 100, logrus.WithField("test", t.Name())) - assert.Error(t, err) + require.Error(t, err) _, err = New([]float64{}, time.Second*100, 100, logrus.WithField("test", t.Name())) - assert.Error(t, err) + require.Error(t, err) _, err = New(struct{}{}, time.Second*100, 100, logrus.WithField("test", t.Name())) - assert.Error(t, err) + require.Error(t, err) }) t.Run("WrongTypeOnRefresh", func(t *testing.T) { t.Parallel() c, _ := New(make(map[int]int), time.Second*100, 100, logrus.WithField("test", t.Name())) err := c.Set(map[int]string{1: "some string"}) - assert.Error(t, err) + require.Error(t, err) }) t.Run("WrongTypeOnGet", func(t *testing.T) { @@ -167,6 +167,6 @@ func TestCacheErrors(t *testing.T) { c, _ := New(make(map[int]int), time.Second*100, 100, logrus.WithField("test", t.Name())) dest := make(map[int]string) err := c.Get(dest) - assert.Error(t, err) + require.Error(t, err) }) } diff --git a/agent/agents/mongodb/profiler/internal/profiler_test.go b/agent/agents/mongodb/profiler/internal/profiler_test.go index b9d35a95e15..ae5c00aaf4c 100644 --- a/agent/agents/mongodb/profiler/internal/profiler_test.go +++ b/agent/agents/mongodb/profiler/internal/profiler_test.go @@ -94,7 +94,7 @@ func testProfiler(t *testing.T, url string) { dbName := fmt.Sprintf("test_%02d", i) logrus.Traceln("create db", dbName) _, err := sess.Database(dbName).Collection("test").InsertOne(context.TODO(), doc) - assert.NoError(t, err) + require.NoError(t, err) i++ } <-time.After(aggregator.DefaultInterval) // give it some time before starting profiler @@ -121,7 +121,7 @@ func testProfiler(t *testing.T, url string) { dbName := fmt.Sprintf("test_%02d", dbNumber) logrus.Tracef("inserting value %d to %s", i, dbName) _, err := sess.Database(dbName).Collection("people").InsertOne(context.TODO(), doc) - assert.NoError(t, err) + require.NoError(t, err) i++ } cursor, err := sess.Database("test_00").Collection("people").Find(context.TODO(), bson.M{"name_00\xff": "value_00\xff"}) @@ -186,17 +186,17 @@ func testProfiler(t *testing.T, url string) { MResponseLengthP99: responseLength, } // TODO: fix protobuf equality https://jira.percona.com/browse/PMM-6743 - assert.Equalf(t, expected.MDocsReturnedCnt, bucket.Mongodb.MDocsReturnedCnt, "wrong metrics MDocsReturnedCnt for db %s", bucket.Common.Database) - assert.Equalf(t, expected.MResponseLengthCnt, bucket.Mongodb.MResponseLengthCnt, "wrong metrics MResponseLengthCnt for db %s", bucket.Common.Database) - assert.Equalf(t, expected.MResponseLengthSum, bucket.Mongodb.MResponseLengthSum, "wrong metrics MResponseLengthSum for db %s", bucket.Common.Database) - assert.Equalf(t, expected.MResponseLengthMin, bucket.Mongodb.MResponseLengthMin, "wrong metrics MResponseLengthMin for db %s", bucket.Common.Database) - assert.Equalf(t, expected.MResponseLengthMax, bucket.Mongodb.MResponseLengthMax, "wrong metrics MResponseLengthMax for db %s", bucket.Common.Database) - assert.Equalf(t, expected.MResponseLengthP99, bucket.Mongodb.MResponseLengthP99, "wrong metrics MResponseLengthP99 for db %s", bucket.Common.Database) - assert.Equalf(t, expected.MDocsExaminedCnt, bucket.Mongodb.MDocsExaminedCnt, "wrong metrics MDocsExaminedCnt for db %s", bucket.Common.Database) + assert.InEpsilonf(t, expected.MDocsReturnedCnt, bucket.Mongodb.MDocsReturnedCnt, 0.0001, "wrong metrics MDocsReturnedCnt for db %s", bucket.Common.Database) + assert.InEpsilonf(t, expected.MResponseLengthCnt, bucket.Mongodb.MResponseLengthCnt, 0.0001, "wrong metrics MResponseLengthCnt for db %s", bucket.Common.Database) + assert.InEpsilonf(t, expected.MResponseLengthSum, bucket.Mongodb.MResponseLengthSum, 0.0001, "wrong metrics MResponseLengthSum for db %s", bucket.Common.Database) + assert.InEpsilonf(t, expected.MResponseLengthMin, bucket.Mongodb.MResponseLengthMin, 0.0001, "wrong metrics MResponseLengthMin for db %s", bucket.Common.Database) + assert.InEpsilonf(t, expected.MResponseLengthMax, bucket.Mongodb.MResponseLengthMax, 0.0001, "wrong metrics MResponseLengthMax for db %s", bucket.Common.Database) + assert.InEpsilonf(t, expected.MResponseLengthP99, bucket.Mongodb.MResponseLengthP99, 0.0001, "wrong metrics MResponseLengthP99 for db %s", bucket.Common.Database) + assert.InEpsilonf(t, expected.MDocsExaminedCnt, bucket.Mongodb.MDocsExaminedCnt, 0.0001, "wrong metrics MDocsExaminedCnt for db %s", bucket.Common.Database) } require.NotNil(t, findBucket) assert.Equal(t, `db.people.find({"name_00\ufffd":"?"})`, findBucket.Common.Fingerprint) - assert.Equal(t, docsCount, findBucket.Mongodb.MDocsReturnedSum) + assert.InEpsilon(t, docsCount, findBucket.Mongodb.MDocsReturnedSum, 0.0001) } func cleanUpDBs(t *testing.T, sess *mongo.Client) { diff --git a/agent/agents/mongodb/shared/aggregator/aggregator_test.go b/agent/agents/mongodb/shared/aggregator/aggregator_test.go index 53713c4c8db..b5565f2d232 100644 --- a/agent/agents/mongodb/shared/aggregator/aggregator_test.go +++ b/agent/agents/mongodb/shared/aggregator/aggregator_test.go @@ -39,7 +39,7 @@ func TestAggregator(t *testing.T) { t.Run("error if aggregator is not running", func(t *testing.T) { a := New(time.Now(), "test-agent", logrus.WithField("component", "test"), truncate.GetMongoDBDefaultMaxQueryLength()) err := a.Add(context.TODO(), proto.SystemProfile{}) - assert.EqualError(t, err, "aggregator is not running") + require.EqualError(t, err, "aggregator is not running") }) }) diff --git a/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go index cc642e1ef73..31b5e369c29 100644 --- a/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go +++ b/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go @@ -114,9 +114,9 @@ func TestProfilerFingerprinter(t *testing.T) { database := client.Database(dbName) _, err = database.Collection("test").InsertOne(ctx, bson.M{"id": 0, "name": "test", "value": 1, "time": time.Now()}) - assert.NoError(t, err) + require.NoError(t, err) _, err = database.Collection("secondcollection").InsertOne(ctx, bson.M{"id": 0, "name": "sec", "value": 2}) - assert.NoError(t, err) + require.NoError(t, err) database.Collection("test").FindOne(ctx, bson.M{"id": 0}) database.Collection("test").FindOne(ctx, bson.M{"id": 1, "name": "test", "time": time.Now()}) database.Collection("test").FindOneAndUpdate(ctx, bson.M{"id": 0}, bson.M{"$set": bson.M{"name": "new"}}) diff --git a/agent/agents/mysql/slowlog/parser/parser_bench_test.go b/agent/agents/mysql/slowlog/parser/parser_bench_test.go index a2dd3c4e7f8..206b2d3a60a 100644 --- a/agent/agents/mysql/slowlog/parser/parser_bench_test.go +++ b/agent/agents/mysql/slowlog/parser/parser_bench_test.go @@ -50,7 +50,7 @@ func benchmarkFile(b *testing.B, name string) { b.StopTimer() r, err := filereader.NewSimpleFileReader(name) - assert.NoError(b, err) + require.NoError(b, err) p := NewSlowLogParser(r, log.Options{}) b.StartTimer() @@ -62,7 +62,7 @@ func benchmarkFile(b *testing.B, name string) { b.StopTimer() assert.Equal(b, io.EOF, p.Err()) - assert.NoError(b, r.Close()) + require.NoError(b, r.Close()) } }) } diff --git a/agent/agents/mysql/slowlog/parser/parser_test.go b/agent/agents/mysql/slowlog/parser/parser_test.go index 2e675cf8c6c..8d4b33243ba 100644 --- a/agent/agents/mysql/slowlog/parser/parser_test.go +++ b/agent/agents/mysql/slowlog/parser/parser_test.go @@ -40,7 +40,7 @@ func parseSlowLog(t *testing.T, filepath string, opts log.Options) []log.Event { r, err := filereader.NewSimpleFileReader(filepath) require.NoError(t, err) defer func() { - assert.NoError(t, r.Close()) + require.NoError(t, r.Close()) }() p := NewSlowLogParser(r, opts) @@ -335,7 +335,7 @@ func TestParserSpecial(t *testing.T) { r, err := filereader.NewSimpleFileReader(filepath.Join("testdata", "slow023.log")) require.NoError(t, err) defer func() { - assert.NoError(t, r.Close()) + require.NoError(t, r.Close()) }() opts := log.Options{ diff --git a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go index 2356776f947..7271f3b2101 100644 --- a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go +++ b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go @@ -107,18 +107,18 @@ func TestPGStatMonitorSchema(t *testing.T) { } _, err := db.Exec("CREATE EXTENSION IF NOT EXISTS pg_stat_monitor SCHEMA public") - assert.NoError(t, err) + require.NoError(t, err) defer func() { _, err = db.Exec("DROP EXTENSION pg_stat_monitor") - assert.NoError(t, err) + require.NoError(t, err) }() vPG, err := getPGVersion(db.Querier) - assert.NoError(t, err) + require.NoError(t, err) vPGSM, _, err := getPGMonitorVersion(db.Querier) - assert.NoError(t, err) + require.NoError(t, err) _, view := newPgStatMonitorStructs(vPGSM, vPG) structs, err := db.SelectAllFrom(view, "") @@ -181,7 +181,7 @@ func TestPGStatMonitorSchema(t *testing.T) { var selectCMDType, insertCMDType string var mPlansCallsCnt, mPlansTimeCnt float32 pgsmVersion, _, err := getPGMonitorVersion(db.Querier) - assert.NoError(t, err) + require.NoError(t, err) switch pgsmVersion { case pgStatMonitorVersion06: case pgStatMonitorVersion08: @@ -499,12 +499,10 @@ func TestPGStatMonitorSchema(t *testing.T) { for i := 0; i < n; i++ { id := i query := fmt.Sprintf(`INSERT /* CheckMBlkReadTime controller='test' */ INTO %s (customer_id, first_name, last_name, active) VALUES (%d, 'John', 'Dow', TRUE)`, tableName, id) - waitGroup.Add(1) - go func() { - defer waitGroup.Done() + waitGroup.Go(func() { _, err := db.Exec(query) require.NoError(t, err) - }() + }) } waitGroup.Wait() diff --git a/agent/agents/postgres/pgstatmonitor/stat_monitor_cache_test.go b/agent/agents/postgres/pgstatmonitor/stat_monitor_cache_test.go index 441a776bc76..6e3246a4257 100644 --- a/agent/agents/postgres/pgstatmonitor/stat_monitor_cache_test.go +++ b/agent/agents/postgres/pgstatmonitor/stat_monitor_cache_test.go @@ -18,7 +18,6 @@ import ( "context" "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "gopkg.in/reform.v1" "gopkg.in/reform.v1/dialects/postgresql" @@ -38,18 +37,18 @@ func TestPGStatMonitorStructs(t *testing.T) { } _, err := db.Exec("CREATE EXTENSION IF NOT EXISTS pg_stat_monitor SCHEMA public") - assert.NoError(t, err) + require.NoError(t, err) defer func() { _, err = db.Exec("DROP EXTENSION pg_stat_monitor") - assert.NoError(t, err) + require.NoError(t, err) }() m := setup(t, db, false, false) settings, err := m.getSettings() - assert.NoError(t, err) + require.NoError(t, err) normalizedQuery, err := settings.getNormalizedQueryValue() - assert.NoError(t, err) + require.NoError(t, err) current, cache, err := m.monitorCache.getStatMonitorExtended(context.TODO(), db.Querier, normalizedQuery, truncate.GetDefaultMaxQueryLength()) diff --git a/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go b/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go index 97e998f753f..be0cd9f1d28 100644 --- a/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go +++ b/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go @@ -75,7 +75,7 @@ func TestPGStatStatementsQAN(t *testing.T) { defer func() { _, err := db.Exec("DROP EXTENSION pg_stat_statements") - assert.NoError(t, err) + require.NoError(t, err) }() structs, err := db.SelectAllFrom(pgStatDatabaseView, "") @@ -488,7 +488,7 @@ func TestPGStatStatementsQPS(t *testing.T) { defer func() { _, err := db.Exec("DROP EXTENSION pg_stat_statements") - assert.NoError(t, err) + require.NoError(t, err) }() // filterInsertQueries retrieves only buckets for insert queries used by test. @@ -536,7 +536,7 @@ func TestPGStatStatementsQPS(t *testing.T) { insertBuckets := filterInsertQueries(t, buckets) mismatchedCount := 0 for _, b := range insertBuckets { - assert.Equal(t, float32(1), b.Common.NumQueries) + assert.InEpsilon(t, float32(1), b.Common.NumQueries, 0.0001) if b.Common.NumQueries != 1 { mismatchedCount++ } diff --git a/agent/agents/supervisor/ports_registry_test.go b/agent/agents/supervisor/ports_registry_test.go index bb88f22bb15..d15cc70a9c9 100644 --- a/agent/agents/supervisor/ports_registry_test.go +++ b/agent/agents/supervisor/ports_registry_test.go @@ -30,7 +30,7 @@ func TestRegistry(t *testing.T) { defer l1.Close() //nolint:gosec,errcheck,nolintlint p, err := r.Reserve() - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, 65002, p) _, err = r.Reserve() assert.Equal(t, errNoFreePort, err) @@ -40,7 +40,7 @@ func TestRegistry(t *testing.T) { defer l2.Close() //nolint:errcheck,gosec,nolintlint err = r.Release(65000) - assert.NoError(t, err) + require.NoError(t, err) err = r.Release(65001) assert.Equal(t, errPortNotReserved, err) err = r.Release(65002) @@ -50,19 +50,19 @@ func TestRegistry(t *testing.T) { l2.Close() //nolint:errcheck p, err = r.Reserve() - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, 65000, p) p, err = r.Reserve() - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, 65001, p) _, err = r.Reserve() assert.Equal(t, errNoFreePort, err) err = r.Release(65002) - assert.NoError(t, err) + require.NoError(t, err) p, err = r.Reserve() - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, 65002, p) _, err = r.Reserve() assert.Equal(t, errNoFreePort, err) @@ -72,22 +72,22 @@ func TestPreferNewPort(t *testing.T) { r := newPortsRegistry(65000, 65002, nil) p, err := r.Reserve() - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, 65000, p) err = r.Release(p) - assert.NoError(t, err) + require.NoError(t, err) p, err = r.Reserve() - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, 65001, p) p, err = r.Reserve() - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, 65002, p) p, err = r.Reserve() - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, 65000, p) } @@ -95,16 +95,16 @@ func TestSinglePort(t *testing.T) { r := newPortsRegistry(65000, 65000, nil) p, err := r.Reserve() - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, 65000, p) _, err = r.Reserve() assert.Equal(t, errNoFreePort, err) err = r.Release(p) - assert.NoError(t, err) + require.NoError(t, err) p, err = r.Reserve() - assert.NoError(t, err) + require.NoError(t, err) assert.EqualValues(t, 65000, p) } diff --git a/agent/client/channel/channel_test.go b/agent/client/channel/channel_test.go index edcb19fcfdf..1bbf5cb8b8e 100644 --- a/agent/client/channel/channel_test.go +++ b/agent/client/channel/channel_test.go @@ -121,7 +121,7 @@ func TestAgentRequestWithTruncatedInvalidUTF8(t *testing.T) { Id: uint32(1), Payload: (&agentv1.QANCollectResponse{}).ServerMessageResponsePayload(), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "SELECT * FROM contacts t0 WHERE t0.person_id = '\u0241\ufffd\\uD83D\ufffdü\ufffd'", msg.GetQanCollect().MetricsBucket[0].Common.Example) _, err = stream.Recv() @@ -170,7 +170,7 @@ func TestAgentRequest(t *testing.T) { Id: i, Payload: (&agentv1.QANCollectResponse{}).ServerMessageResponsePayload(), }) - assert.NoError(t, err) + require.NoError(t, err) } return nil @@ -229,7 +229,7 @@ func TestServerRequest(t *testing.T) { Id: i, Payload: (&agentv1.Ping{}).ServerMessageRequestPayload(), }) - assert.NoError(t, err) + require.NoError(t, err) } for i := uint32(1); i <= count; i++ { @@ -302,7 +302,7 @@ func TestAgentClosesStream(t *testing.T) { Id: 1, Payload: (&agentv1.Ping{}).ServerMessageRequestPayload(), }) - assert.NoError(t, err) + require.NoError(t, err) msg, err := stream.Recv() assert.Equal(t, io.EOF, err) @@ -319,7 +319,7 @@ func TestAgentClosesStream(t *testing.T) { assert.IsType(t, &agentv1.Ping{}, req.Payload) err := channel.s.CloseSend() - assert.NoError(t, err) + require.NoError(t, err) } func TestAgentClosesConnection(t *testing.T) { @@ -331,7 +331,7 @@ func TestAgentClosesConnection(t *testing.T) { Id: 1, Payload: (&agentv1.Ping{}).ServerMessageRequestPayload(), }) - assert.NoError(t, err) + require.NoError(t, err) msg, err := stream.Recv() assert.Equal(t, status.Error(codes.Canceled, context.Canceled.Error()).Error(), err.Error()) @@ -355,7 +355,7 @@ func TestAgentClosesConnection(t *testing.T) { assert.IsType(t, &agentv1.Ping{}, req.Payload) err := cc.Close() - assert.NoError(t, err) + require.NoError(t, err) wg.Wait() } @@ -367,7 +367,7 @@ func TestUnexpectedResponseIDFromServer(t *testing.T) { Id: 111, Payload: (&agentv1.QANCollectResponse{}).ServerMessageResponsePayload(), }) - assert.NoError(t, err) + require.NoError(t, err) close(unexpectedIDSent) // Check that channel is still open. @@ -375,9 +375,9 @@ func TestUnexpectedResponseIDFromServer(t *testing.T) { Id: 1, Payload: (&agentv1.Ping{}).ServerMessageRequestPayload(), }) - assert.NoError(t, err) + require.NoError(t, err) pong, err := stream.Recv() - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, pong) return nil } @@ -401,7 +401,7 @@ func TestUnexpectedResponsePayloadFromServer(t *testing.T) { Id: 1, Payload: (&agentv1.Ping{}).ServerMessageRequestPayload(), }) - assert.NoError(t, err) + require.NoError(t, err) _, _ = stream.Recv() // test unexpected payload @@ -411,7 +411,7 @@ func TestUnexpectedResponsePayloadFromServer(t *testing.T) { require.NoError(t, err) msg, err := stream.Recv() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int32(codes.Unimplemented), msg.GetStatus().GetCode()) return nil } diff --git a/agent/client/client_test.go b/agent/client/client_test.go index 41b6f4caccd..affb757063d 100644 --- a/agent/client/client_test.go +++ b/agent/client/client_test.go @@ -88,7 +88,7 @@ func TestClient(t *testing.T) { client := New(cfgStorage, nil, nil, nil, nil, nil, nil, nil) cancel() err := client.Run(ctx) - assert.EqualError(t, err, "missing PMM Server address: context canceled") + require.EqualError(t, err, "missing PMM Server address: context canceled") }) t.Run("NoAgentID", func(t *testing.T) { @@ -103,7 +103,7 @@ func TestClient(t *testing.T) { client := New(cfgStorage, nil, nil, nil, nil, nil, nil, nil) cancel() err := client.Run(ctx) - assert.EqualError(t, err, "missing Agent ID: context canceled") + require.EqualError(t, err, "missing Agent ID: context canceled") }) t.Run("FailedToDial", func(t *testing.T) { @@ -169,7 +169,7 @@ func TestClient(t *testing.T) { r := runner.New(cfgStorage.Get().RunnerCapacity, cfgStorage.Get().RunnerMaxConnectionsPerService) client := New(cfgStorage, &s, r, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) err := client.Run(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, serverMD, client.GetServerConnectMetadata()) }) @@ -198,7 +198,7 @@ func TestClient(t *testing.T) { client := New(cfgStorage, nil, nil, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) client.dialTimeout = 100 * time.Millisecond err := client.Run(ctx) - assert.EqualError(t, err, "failed to get server metadata: rpc error: code = Canceled desc = context canceled", "%+v", err) + require.EqualError(t, err, "failed to get server metadata: rpc error: code = Canceled desc = context canceled", "%+v", err) }) }) } @@ -288,7 +288,7 @@ func TestUnexpectedActionType(t *testing.T) { r := runner.New(cfgStorage.Get().RunnerCapacity, cfgStorage.Get().RunnerMaxConnectionsPerService) client := New(cfgStorage, s, r, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) err := client.Run(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, serverMD, client.GetServerConnectMetadata()) } diff --git a/agent/config/config_test.go b/agent/config/config_test.go index a0bb60b93bd..48286677f34 100644 --- a/agent/config/config_test.go +++ b/agent/config/config_test.go @@ -62,7 +62,8 @@ func TestLoadFromFile(t *testing.T) { require.NoError(t, os.Chmod(name, 0o000)) cfg, err := loadFromFile(name, nil) - require.IsType(t, (*os.PathError)(nil), err) + var targetErr *os.PathError + require.ErrorAs(t, err, &targetErr) assert.Equal(t, "open", err.(*os.PathError).Op) //nolint:errorlint require.EqualError(t, err.(*os.PathError).Err, "permission denied") //nolint:errorlint assert.Nil(t, cfg) @@ -73,7 +74,8 @@ func TestLoadFromFile(t *testing.T) { require.NoError(t, os.WriteFile(name, []byte(`not YAML`), 0o666)) //nolint:gosec cfg, err := loadFromFile(name, nil) - require.IsType(t, (*yaml.TypeError)(nil), err) + var targetErr *yaml.TypeError + require.ErrorAs(t, err, &targetErr) require.EqualError(t, err, "yaml: unmarshal errors:\n line 1: cannot unmarshal !!str `not YAML` into config.Config") assert.Nil(t, cfg) }) diff --git a/agent/runner/actions/mongodb_explain_action_test.go b/agent/runner/actions/mongodb_explain_action_test.go index 37d2a56ac7a..f0309634605 100644 --- a/agent/runner/actions/mongodb_explain_action_test.go +++ b/agent/runner/actions/mongodb_explain_action_test.go @@ -274,7 +274,7 @@ func TestMongoDBExplain(t *testing.T) { require.NoError(t, err) res, err := ex.Run(ctx) - assert.NoError(t, err) + require.NoError(t, err) want := map[string]interface{}{ "indexFilterSet": false, @@ -311,7 +311,7 @@ func TestMongoDBExplain(t *testing.T) { explainM := make(map[string]interface{}) err = json.Unmarshal(res, &explainM) - assert.NoError(t, err) + require.NoError(t, err) queryPlanner, ok := explainM["queryPlanner"] assert.True(t, ok) assert.NotEmpty(t, queryPlanner) @@ -355,7 +355,7 @@ func TestNewMongoDBExplain(t *testing.T) { for _, tf := range testFiles { t.Run(tf.in, func(t *testing.T) { query, err := os.ReadFile(filepath.Join("testdata/", filepath.Clean(tf.in))) - assert.NoError(t, err) + require.NoError(t, err) params := &agentv1.StartActionRequest_MongoDBExplainParams{ Dsn: tests.GetTestMongoDBDSN(t), Query: string(query), @@ -365,11 +365,11 @@ func TestNewMongoDBExplain(t *testing.T) { require.NoError(t, err) res, err := ex.Run(ctx) - assert.NoError(t, err) + require.NoError(t, err) explainM := make(map[string]interface{}) err = json.Unmarshal(res, &explainM) - assert.NoError(t, err) + require.NoError(t, err) // Just test not empty because different versions and environments return different // explain results diff --git a/agent/runner/actions/mongodb_query_admincommand_action_test.go b/agent/runner/actions/mongodb_query_admincommand_action_test.go index 27e448b91b5..a5352401ec6 100644 --- a/agent/runner/actions/mongodb_query_admincommand_action_test.go +++ b/agent/runner/actions/mongodb_query_admincommand_action_test.go @@ -20,7 +20,6 @@ import ( "time" "github.com/davecgh/go-spew/spew" - "github.com/pkg/errors" "github.com/stretchr/objx" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -231,7 +230,8 @@ func replSetGetStatusAssertionsStandalone(t *testing.T, id string, timeout time. defer cancel() b, err := a.Run(ctx) require.Nil(t, b) - require.IsType(t, mongo.CommandError{}, errors.Unwrap(err)) + var targetErr *mongo.CommandError + require.ErrorAs(t, err, &targetErr) require.Equal(t, "(NoReplicationEnabled) not running with --replSet", err.Error()) } diff --git a/agent/runner/actions/mysql_explain_action_test.go b/agent/runner/actions/mysql_explain_action_test.go index 6336a74d2af..d0fb4b51bb9 100644 --- a/agent/runner/actions/mysql_explain_action_test.go +++ b/agent/runner/actions/mysql_explain_action_test.go @@ -64,7 +64,7 @@ func TestMySQLExplain(t *testing.T) { var er explainResponse err = json.Unmarshal(b, &er) - assert.NoError(t, err) + require.NoError(t, err) actual := strings.TrimSpace(string(er.ExplainResult)) switch fmt.Sprintf("%s-%s", mySQLVersion, mySQLVendor) { @@ -100,7 +100,7 @@ func TestMySQLExplain(t *testing.T) { var er explainResponse err = json.Unmarshal(b, &er) - assert.NoError(t, err) + require.NoError(t, err) m, err := objx.FromJSON(string(er.ExplainResult)) require.NoError(t, err) @@ -158,7 +158,7 @@ func TestMySQLExplain(t *testing.T) { var er explainResponse err = json.Unmarshal(b, &er) - assert.NoError(t, err) + require.NoError(t, err) var actual [][]interface{} err = json.Unmarshal(er.ExplainResult, &actual) @@ -196,7 +196,7 @@ func TestMySQLExplain(t *testing.T) { OutputFormat: agentv1.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_DEFAULT, } a, err := NewMySQLExplainAction("", time.Second, params) - assert.ErrorContains(t, err, `Query to EXPLAIN is empty`) + require.ErrorContains(t, err, `Query to EXPLAIN is empty`) assert.Nil(t, a) }) @@ -218,7 +218,7 @@ func TestMySQLExplain(t *testing.T) { require.NoError(t, err) var er explainResponse err = json.Unmarshal(resp, &er) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, er.IsDMLQuery) assert.Equal(t, `SELECT * FROM city WHERE Name='Rosario'`, er.Query) }) @@ -232,7 +232,7 @@ func TestMySQLExplain(t *testing.T) { OutputFormat: agentv1.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_DEFAULT, } a, err := NewMySQLExplainAction("", time.Second, params) - assert.ErrorContains(t, err, "EXPLAIN failed because the query exceeded max length and got trimmed. Set max-query-length to a larger value.") + require.ErrorContains(t, err, "EXPLAIN failed because the query exceeded max length and got trimmed. Set max-query-length to a larger value.") assert.Nil(t, a) }) diff --git a/agent/runner/actions/mysql_show_create_table_action_test.go b/agent/runner/actions/mysql_show_create_table_action_test.go index baa64b7b1d7..2bad8c77557 100644 --- a/agent/runner/actions/mysql_show_create_table_action_test.go +++ b/agent/runner/actions/mysql_show_create_table_action_test.go @@ -132,7 +132,7 @@ CREATE TABLE "city" ( defer cancel() _, err := a.Run(ctx) - assert.EqualError(t, err, "Error 1146 (42S02): Table 'world.no_such_table' doesn't exist") + require.EqualError(t, err, "Error 1146 (42S02): Table 'world.no_such_table' doesn't exist") }) t.Run("LittleBobbyTables", func(t *testing.T) { @@ -147,7 +147,7 @@ CREATE TABLE "city" ( _, err := a.Run(ctx) expected := "Error 1146 (42S02): Table 'world.city; DROP TABLE city; --' doesn't exist" - assert.EqualError(t, err, expected) + require.EqualError(t, err, expected) var count int err = q.QueryRow("SELECT COUNT(*) FROM city").Scan(&count) diff --git a/agent/runner/actions/mysql_show_index_action_test.go b/agent/runner/actions/mysql_show_index_action_test.go index b6bd2a90f37..bfd3432fd4f 100644 --- a/agent/runner/actions/mysql_show_index_action_test.go +++ b/agent/runner/actions/mysql_show_index_action_test.go @@ -110,7 +110,7 @@ func TestMySQLShowIndex(t *testing.T) { defer cancel() _, err := a.Run(ctx) - assert.EqualError(t, err, `Error 1146 (42S02): Table 'world.no_such_table' doesn't exist`) + require.EqualError(t, err, `Error 1146 (42S02): Table 'world.no_such_table' doesn't exist`) }) t.Run("LittleBobbyTables", func(t *testing.T) { @@ -125,7 +125,7 @@ func TestMySQLShowIndex(t *testing.T) { _, err := a.Run(ctx) expected := "Error 1146 (42S02): Table 'world.city; DROP TABLE city; --' doesn't exist" - assert.EqualError(t, err, expected) + require.Equal(t, expected, err.Error()) var count int err = q.QueryRow("SELECT COUNT(*) FROM city").Scan(&count) diff --git a/agent/runner/actions/mysql_show_table_status_action_test.go b/agent/runner/actions/mysql_show_table_status_action_test.go index a2ad58234a3..7716ef76da6 100644 --- a/agent/runner/actions/mysql_show_table_status_action_test.go +++ b/agent/runner/actions/mysql_show_table_status_action_test.go @@ -90,7 +90,7 @@ func TestShowTableStatus(t *testing.T) { defer cancel() _, err := a.Run(ctx) - assert.EqualError(t, err, `table "no_such_table" not found`) + require.EqualError(t, err, `table "no_such_table" not found`) }) t.Run("LittleBobbyTables", func(t *testing.T) { @@ -104,7 +104,7 @@ func TestShowTableStatus(t *testing.T) { defer cancel() _, err := a.Run(ctx) - assert.EqualError(t, err, `table "city; DROP TABLE city; --" not found`) + require.EqualError(t, err, `table "city; DROP TABLE city; --" not found`) var count int err = db.QueryRow("SELECT COUNT(*) FROM city").Scan(&count) diff --git a/agent/runner/actions/postgresql_query_select_action_test.go b/agent/runner/actions/postgresql_query_select_action_test.go index 4d3b875f0e4..ca3863c1066 100644 --- a/agent/runner/actions/postgresql_query_select_action_test.go +++ b/agent/runner/actions/postgresql_query_select_action_test.go @@ -103,7 +103,7 @@ func TestPostgreSQLQuerySelect(t *testing.T) { Query: "* FROM city; DROP TABLE city CASCADE; --", } a, err := NewPostgreSQLQuerySelectAction("", 0, params, os.TempDir()) - assert.EqualError(t, err, "query contains ';'") + require.EqualError(t, err, "query contains ';'") assert.Nil(t, a) }) } diff --git a/agent/runner/actions/postgresql_show_create_table_action_test.go b/agent/runner/actions/postgresql_show_create_table_action_test.go index 5a9caa54443..5e7cf50744e 100644 --- a/agent/runner/actions/postgresql_show_create_table_action_test.go +++ b/agent/runner/actions/postgresql_show_create_table_action_test.go @@ -154,7 +154,7 @@ Foreign-key constraints: _, err = a.Run(ctx) expected := "Table not found: sql: no rows in result set" - assert.EqualError(t, err, expected) + require.EqualError(t, err, expected) var count int err = db.QueryRow("SELECT COUNT(*) FROM city").Scan(&count) diff --git a/agent/runner/actions/process_action_test.go b/agent/runner/actions/process_action_test.go index 6b5f4984a88..530c568fc41 100644 --- a/agent/runner/actions/process_action_test.go +++ b/agent/runner/actions/process_action_test.go @@ -57,5 +57,5 @@ func TestProcessActionRunAndCancel(t *testing.T) { _, err := p.Run(ctx) // check - assert.Error(t, err) + require.Error(t, err) } diff --git a/agent/runner/actions/pt_mysql_summary_action_test.go b/agent/runner/actions/pt_mysql_summary_action_test.go index 6cfe4343759..da319779e03 100644 --- a/agent/runner/actions/pt_mysql_summary_action_test.go +++ b/agent/runner/actions/pt_mysql_summary_action_test.go @@ -52,7 +52,7 @@ func TestPTMySQLSummaryActionRunAndCancel(t *testing.T) { time.AfterFunc(time.Millisecond, cancel) _, err := p.Run(ctx) - assert.Error(t, err) + require.Error(t, err) } func TestBuildMyCnfConfig(t *testing.T) { diff --git a/agent/runner/jobs/mongodb_backup_job_test.go b/agent/runner/jobs/mongodb_backup_job_test.go index 8f65c595f6f..8b8005168aa 100644 --- a/agent/runner/jobs/mongodb_backup_job_test.go +++ b/agent/runner/jobs/mongodb_backup_job_test.go @@ -19,6 +19,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" backuppb "github.com/percona/pmm/api/backup/v1" ) @@ -114,9 +115,9 @@ func TestNewMongoDBBackupJob(t *testing.T) { t.Parallel() _, err := NewMongoDBBackupJob(t.Name(), testJobDuration, t.Name(), "", BackupLocationConfig{}, tc.pitr, tc.dataModel, "artifact_folder") if tc.errMsg == "" { - assert.NoError(t, err) + require.NoError(t, err) } else { - assert.ErrorContains(t, err, tc.errMsg) + require.ErrorContains(t, err, tc.errMsg) } }) } diff --git a/agent/runner/jobs/pbm_helpers_test.go b/agent/runner/jobs/pbm_helpers_test.go index 45302128514..ccc1031da59 100644 --- a/agent/runner/jobs/pbm_helpers_test.go +++ b/agent/runner/jobs/pbm_helpers_test.go @@ -116,11 +116,11 @@ func TestCreatePBMConfig(t *testing.T) { t.Run(test.name, func(t *testing.T) { res, err := createPBMConfig(new(test.inputLocation), "test_prefix", test.inputPitr) if test.errString != "" { - assert.ErrorContains(t, err, test.errString) + require.ErrorContains(t, err, test.errString) assert.Nil(t, res) return } - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, test.output, res) }) } diff --git a/agent/utils/filereader/continuous_file_reader_test.go b/agent/utils/filereader/continuous_file_reader_test.go index ab35e87ac93..befbc77262f 100644 --- a/agent/utils/filereader/continuous_file_reader_test.go +++ b/agent/utils/filereader/continuous_file_reader_test.go @@ -94,7 +94,7 @@ func TestContinuousFileReader(t *testing.T) { // test close _, err = f.WriteString("7\n8") require.NoError(t, err) - assert.NoError(t, r.Close()) + require.NoError(t, r.Close()) l, ok := <-lines assert.False(t, ok, "line = %q", l) assert.Nil(t, r.Metrics()) @@ -187,7 +187,7 @@ func TestContinuousFileReader(t *testing.T) { // test close _, err = f.WriteString("\n10\n") require.NoError(t, err) - assert.NoError(t, r.Close()) + require.NoError(t, r.Close()) l, ok := <-lines assert.False(t, ok, "line = %q", l) assert.Nil(t, r.Metrics()) diff --git a/agent/utils/mongo_fix/mongo_fix_test.go b/agent/utils/mongo_fix/mongo_fix_test.go index 078903f07aa..b26ab259e87 100644 --- a/agent/utils/mongo_fix/mongo_fix_test.go +++ b/agent/utils/mongo_fix/mongo_fix_test.go @@ -19,6 +19,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestClientOptionsForDSN(t *testing.T) { @@ -70,7 +71,7 @@ func TestClientOptionsForDSN(t *testing.T) { if tt.error != "" { assert.Equal(t, err.Error(), tt.error) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, tt.expectedUser, got.Auth.Username) assert.Equal(t, tt.expectedPassword, got.Auth.Password) } diff --git a/agent/utils/templates/template_test.go b/agent/utils/templates/template_test.go index 1d103617073..3295417e431 100644 --- a/agent/utils/templates/template_test.go +++ b/agent/utils/templates/template_test.go @@ -22,6 +22,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" agentv1 "github.com/percona/pmm/api/agent/v1" ) @@ -37,7 +38,7 @@ func TestRenderDSN(t *testing.T) { dir := filepath.Join(os.TempDir(), fmt.Sprintf("pg_action_%05d", rand.Int63n(99999))) //nolint:gosec err := os.MkdirAll(dir, 0o750) - assert.NoError(t, err) + require.NoError(t, err) inDSN := "postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/database" + "?connect_timeout=1&ssl_ca_file={{.TextFiles.caFilePlaceholder}}&" + @@ -61,7 +62,7 @@ func TestRenderDSN(t *testing.T) { } outDSN, err := RenderDSN(inDSN, files, dir) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, wantDSN, outDSN) assert.True(t, fileExist(filepath.Join(dir, caFilePlaceholder))) @@ -74,7 +75,7 @@ func TestRenderDSN(t *testing.T) { // Cleanup err = os.RemoveAll(dir) - assert.NoError(t, err) + require.NoError(t, err) } func fileExist(file string) bool { diff --git a/agent/utils/version/mysql_test.go b/agent/utils/version/mysql_test.go index fac6fc456cb..ce3accceaa5 100644 --- a/agent/utils/version/mysql_test.go +++ b/agent/utils/version/mysql_test.go @@ -20,6 +20,7 @@ import ( sqlmock "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "gopkg.in/reform.v1" "gopkg.in/reform.v1/dialects/mysql" ) @@ -125,7 +126,7 @@ func TestGetMySQLVersion(t *testing.T) { version, vendor, err := GetMySQLVersion(ctx, q) assert.Equal(t, tc.wantVersion, version.String()) assert.Equal(t, tc.wantVendor, vendor) - assert.NoError(t, err) + require.NoError(t, err) }) } } diff --git a/agent/versioner/versioner_test.go b/agent/versioner/versioner_test.go index 3dbd7413a21..243c3150e5f 100644 --- a/agent/versioner/versioner_test.go +++ b/agent/versioner/versioner_test.go @@ -21,6 +21,7 @@ import ( "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" ) type mockedExec struct { @@ -51,7 +52,7 @@ func TestVersioner(t *testing.T) { execMock.On("CommandContext", mock.Anything, mysqldBin, "--version"). Return(&mockedExec{Output: mysqldVersionOutput}).Once() version, err := versioner.MySQLdVersion() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "8.0.22-13", version) }) @@ -63,7 +64,7 @@ xtrabackup version 2.4.23 based on MySQL server 5.7.34 Linux (x86_64) (revision execMock.On("CommandContext", mock.Anything, xtrabackupBin, "--version"). Return(&mockedExec{Output: xtrabackup2VersionOutput}).Once() version, err := versioner.XtrabackupVersion() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "2.4.23", version) }) @@ -74,7 +75,7 @@ xtrabackup version 2.4.23 based on MySQL server 5.7.34 Linux (x86_64) (revision execMock.On("CommandContext", mock.Anything, xtrabackupBin, "--version"). Return(&mockedExec{Output: xtrabackup8VersionOutput}).Once() version, err := versioner.XtrabackupVersion() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "8.0.23-16", version) }) @@ -85,7 +86,7 @@ xtrabackup version 2.4.23 based on MySQL server 5.7.34 Linux (x86_64) (revision execMock.On("CommandContext", mock.Anything, xbcloudBin, "--version"). Return(&mockedExec{Output: xbcloudVersionOutput}).Once() version, err := versioner.XbcloudVersion() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "8.0.23-16", version) }) @@ -99,7 +100,7 @@ Compiled for: Windows [*nix] [x86/x64] RISC 32-bit [64-bit] execMock.On("CommandContext", mock.Anything, qpressBin). Return(&mockedExec{Output: qpressVersionOutput}).Once() version, err := versioner.QpressVersion() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "1.1", version) }) @@ -114,7 +115,7 @@ Build Info: { execMock.On("CommandContext", mock.Anything, mongodbBin, "--version"). Return(&mockedExec{Output: mongodVersionOutput}).Once() version, err := versioner.MongoDBVersion() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "6.0.2-1", version) }) @@ -128,7 +129,7 @@ GitCommit: 3ec38a5fc6706515fb1be72b015972af1500aa17 execMock.On("CommandContext", mock.Anything, pbmBin, "version"). Return(&mockedExec{Output: pbmVersionOutput}).Once() version, err := versioner.PBMVersion() - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "2.0.2", version) }) diff --git a/api-tests/alerting/alerting_test.go b/api-tests/alerting/alerting_test.go index 95483fcdf41..a22db9c7a6e 100644 --- a/api-tests/alerting/alerting_test.go +++ b/api-tests/alerting/alerting_test.go @@ -569,14 +569,14 @@ func assertTemplate(t *testing.T, expectedTemplate alert.Template, listTemplates require.NotNil(t, param.Float) value, err := expectedParam.GetValueForFloat() require.NoError(t, err) - assert.Equal(t, value, *param.Float.Default) //nolint:testifylint + assert.InEpsilon(t, value, *param.Float.Default, 0.0001) } if len(expectedParam.Range) != 0 { - min, max, err := expectedParam.GetRangeForFloat() + minR, maxR, err := expectedParam.GetRangeForFloat() require.NoError(t, err) - assert.Equal(t, min, *param.Float.Min) //nolint:testifylint - assert.Equal(t, max, *param.Float.Max) //nolint:testifylint + assert.InDelta(t, minR, *param.Float.Min, 0.0001) + assert.InEpsilon(t, maxR, *param.Float.Max, 0.0001) } assert.Nil(t, param.Bool) diff --git a/api-tests/helpers.go b/api-tests/helpers.go index 0391a2c9f9d..feeba73f7a8 100644 --- a/api-tests/helpers.go +++ b/api-tests/helpers.go @@ -471,7 +471,7 @@ func GetGrafanaClient(t *testing.T) *gapi.Client { Transport: adminTransport, }, }) - assert.NoError(t, err) + require.NoError(t, err) gClient = grafanaClient }) diff --git a/api-tests/inventory/services_test.go b/api-tests/inventory/services_test.go index c6ea462a8d1..b4d405805e2 100644 --- a/api-tests/inventory/services_test.go +++ b/api-tests/inventory/services_test.go @@ -1218,10 +1218,10 @@ func TestExternalService(t *testing.T) { }) require.NoError(t, err) assert.NotNil(t, noFilterServicesList) - assert.GreaterOrEqual(t, len(noFilterServicesList.Payload.Mysql), 0) - assert.GreaterOrEqual(t, len(noFilterServicesList.Payload.Mongodb), 0) + assert.Empty(t, noFilterServicesList.Payload.Mysql) + assert.Empty(t, noFilterServicesList.Payload.Mongodb) assert.NotEmpty(t, noFilterServicesList.Payload.Postgresql) - assert.GreaterOrEqual(t, len(noFilterServicesList.Payload.Proxysql), 0) + assert.Empty(t, noFilterServicesList.Payload.Proxysql) assert.NotEmpty(t, noFilterServicesList.Payload.External) assert.Conditionf(t, containsExternalWithGroup(noFilterServicesList.Payload.External, "redis"), "list does not contain external group %s", "redis") diff --git a/api-tests/management/action/explain_test.go b/api-tests/management/action/explain_test.go index b9315cb3079..f16ebae7b19 100644 --- a/api-tests/management/action/explain_test.go +++ b/api-tests/management/action/explain_test.go @@ -117,6 +117,6 @@ func TestRunMongoDBExplain(t *testing.T) { } m := make(map[string]interface{}) err = json.Unmarshal([]byte(actionOK.Payload.Output), &m) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, want, m["queryPlanner"]) } diff --git a/api-tests/management/annotation_test.go b/api-tests/management/annotation_test.go index cf4a31387e0..a7fdf9cab25 100644 --- a/api-tests/management/annotation_test.go +++ b/api-tests/management/annotation_test.go @@ -20,7 +20,6 @@ import ( "strings" "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" @@ -105,7 +104,7 @@ func TestAddAnnotation(t *testing.T) { Context: pmmapitests.Context, } resNode, err := inventoryClient.Default.NodesService.AddNode(paramsNode) - assert.NoError(t, err) + require.NoError(t, err) genericNodeID := resNode.Payload.Generic.NodeID t.Cleanup(func() { pmmapitests.RemoveNodes(t, genericNodeID) @@ -136,7 +135,7 @@ func TestAddAnnotation(t *testing.T) { Context: pmmapitests.Context, } resNode, err := inventoryClient.Default.NodesService.AddNode(paramsNode) - assert.NoError(t, err) + require.NoError(t, err) genericNodeID := resNode.Payload.Generic.NodeID t.Cleanup(func() { pmmapitests.RemoveNodes(t, genericNodeID) @@ -156,7 +155,7 @@ func TestAddAnnotation(t *testing.T) { } resService, err := inventoryClient.Default.ServicesService.AddService(paramsService) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, resService) serviceID := resService.Payload.Mysql.ServiceID t.Cleanup(func() { @@ -188,7 +187,7 @@ func TestAddAnnotation(t *testing.T) { Context: pmmapitests.Context, } res, err := inventoryClient.Default.NodesService.AddNode(params) - assert.NoError(t, err) + require.NoError(t, err) nodeID := res.Payload.Generic.NodeID t.Cleanup(func() { pmmapitests.RemoveNodes(t, nodeID) diff --git a/api-tests/management/external_test.go b/api-tests/management/external_test.go index 2c2fdf3d68f..e6695858790 100644 --- a/api-tests/management/external_test.go +++ b/api-tests/management/external_test.go @@ -71,7 +71,7 @@ func TestAddExternal(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ External: &services.GetServiceOKBodyExternal{ @@ -90,7 +90,7 @@ func TestAddExternal(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyExternalExporterItems0{ { AgentID: listAgents.Payload.ExternalExporter[0].AgentID, @@ -149,7 +149,7 @@ func TestAddExternal(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ External: &services.GetServiceOKBodyExternal{ @@ -213,7 +213,7 @@ func TestAddExternal(t *testing.T) { NodeID: nodeID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, node) assert.Equal(t, nodes.GetNodeOKBody{ Remote: &nodes.GetNodeOKBodyRemote{ @@ -230,7 +230,7 @@ func TestAddExternal(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ External: &services.GetServiceOKBodyExternal{ @@ -249,7 +249,7 @@ func TestAddExternal(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyExternalExporterItems0{ { AgentID: listAgents.Payload.ExternalExporter[0].AgentID, diff --git a/api-tests/management/haproxy_test.go b/api-tests/management/haproxy_test.go index a00356bf59f..17eb027dba3 100644 --- a/api-tests/management/haproxy_test.go +++ b/api-tests/management/haproxy_test.go @@ -70,7 +70,7 @@ func TestAddHAProxy(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Haproxy: &services.GetServiceOKBodyHaproxy{ @@ -86,7 +86,7 @@ func TestAddHAProxy(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyExternalExporterItems0{ { AgentID: listAgents.Payload.ExternalExporter[0].AgentID, @@ -146,7 +146,7 @@ func TestAddHAProxy(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Haproxy: &services.GetServiceOKBodyHaproxy{ @@ -204,7 +204,7 @@ func TestAddHAProxy(t *testing.T) { NodeID: nodeID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, node) assert.Equal(t, nodes.GetNodeOKBody{ Remote: &nodes.GetNodeOKBodyRemote{ @@ -221,7 +221,7 @@ func TestAddHAProxy(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Haproxy: &services.GetServiceOKBodyHaproxy{ @@ -237,7 +237,7 @@ func TestAddHAProxy(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyExternalExporterItems0{ { AgentID: listAgents.Payload.ExternalExporter[0].AgentID, diff --git a/api-tests/management/helpers.go b/api-tests/management/helpers.go index b6690f561e7..77cbf28e007 100644 --- a/api-tests/management/helpers.go +++ b/api-tests/management/helpers.go @@ -78,7 +78,7 @@ func assertNodeExporterCreated(t *testing.T, pmmAgentID string) (string, bool) { PMMAgentID: new(pmmAgentID), Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.Len(t, listAgentsOK.Payload.NodeExporter, 1) nodeExporterAgentID := listAgentsOK.Payload.NodeExporter[0].AgentID asserted := assert.Equal(t, agents.ListAgentsOKBodyNodeExporterItems0{ @@ -100,7 +100,7 @@ func assertPMMAgentCreated(t *testing.T, nodeID string, pmmAgentID string) { AgentID: pmmAgentID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, agents.GetAgentOKBody{ PMMAgent: &agents.GetAgentOKBodyPMMAgent{ AgentID: pmmAgentID, @@ -117,7 +117,7 @@ func assertNodeCreated(t *testing.T, nodeID string, expectedResult nodes.GetNode NodeID: nodeID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expectedResult, *nodeOK.Payload) } diff --git a/api-tests/management/mongodb_test.go b/api-tests/management/mongodb_test.go index 578b3726fde..f70e22d8430 100644 --- a/api-tests/management/mongodb_test.go +++ b/api-tests/management/mongodb_test.go @@ -75,7 +75,7 @@ func TestAddMongoDB(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Mongodb: &services.GetServiceOKBodyMongodb{ @@ -93,7 +93,7 @@ func TestAddMongoDB(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyMongodbExporterItems0{ { AgentID: listAgents.Payload.MongodbExporter[0].AgentID, @@ -154,7 +154,7 @@ func TestAddMongoDB(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Mongodb: &services.GetServiceOKBodyMongodb{ @@ -172,7 +172,7 @@ func TestAddMongoDB(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, listAgents) require.Len(t, listAgents.Payload.MongodbExporter, 1) @@ -261,7 +261,7 @@ func TestAddMongoDB(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Mongodb: &services.GetServiceOKBodyMongodb{ @@ -665,7 +665,7 @@ func TestAddMongoDB(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Mongodb: &services.GetServiceOKBodyMongodb{ @@ -682,7 +682,7 @@ func TestAddMongoDB(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyMongodbExporterItems0{ { AgentID: listAgents.Payload.MongodbExporter[0].AgentID, @@ -740,7 +740,7 @@ func TestAddMongoDB(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Mongodb: &services.GetServiceOKBodyMongodb{ @@ -758,7 +758,7 @@ func TestAddMongoDB(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyMongodbExporterItems0{ { AgentID: listAgents.Payload.MongodbExporter[0].AgentID, @@ -816,7 +816,7 @@ func TestAddMongoDB(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Mongodb: &services.GetServiceOKBodyMongodb{ @@ -834,7 +834,7 @@ func TestAddMongoDB(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyMongodbExporterItems0{ { AgentID: listAgents.Payload.MongodbExporter[0].AgentID, @@ -891,7 +891,7 @@ func TestAddMongoDB(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Mongodb: &services.GetServiceOKBodyMongodb{ @@ -909,7 +909,7 @@ func TestAddMongoDB(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyMongodbExporterItems0{ { AgentID: listAgents.Payload.MongodbExporter[0].AgentID, diff --git a/api-tests/management/mysql_test.go b/api-tests/management/mysql_test.go index aa6c452670c..78a01a11db9 100644 --- a/api-tests/management/mysql_test.go +++ b/api-tests/management/mysql_test.go @@ -76,7 +76,7 @@ func TestAddMySQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Mysql: &services.GetServiceOKBodyMysql{ @@ -95,7 +95,7 @@ func TestAddMySQL(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyMysqldExporterItems0{ { AgentID: listAgents.Payload.MysqldExporter[0].AgentID, @@ -158,7 +158,7 @@ func TestAddMySQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Mysql: &services.GetServiceOKBodyMysql{ @@ -177,7 +177,7 @@ func TestAddMySQL(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, listAgents) require.Len(t, listAgents.Payload.MysqldExporter, 1) require.Len(t, listAgents.Payload.QANMysqlSlowlogAgent, 1) @@ -274,7 +274,7 @@ func TestAddMySQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Mysql: &services.GetServiceOKBodyMysql{ @@ -723,7 +723,7 @@ func TestAddMySQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Mysql: &services.GetServiceOKBodyMysql{ @@ -742,7 +742,7 @@ func TestAddMySQL(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyMysqldExporterItems0{ { AgentID: listAgents.Payload.MysqldExporter[0].AgentID, @@ -802,7 +802,7 @@ func TestAddMySQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Mysql: &services.GetServiceOKBodyMysql{ @@ -821,7 +821,7 @@ func TestAddMySQL(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyMysqldExporterItems0{ { AgentID: listAgents.Payload.MysqldExporter[0].AgentID, @@ -880,7 +880,7 @@ func TestAddMySQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Mysql: &services.GetServiceOKBodyMysql{ @@ -899,7 +899,7 @@ func TestAddMySQL(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyMysqldExporterItems0{ { AgentID: listAgents.Payload.MysqldExporter[0].AgentID, diff --git a/api-tests/management/nodes_test.go b/api-tests/management/nodes_test.go index 30d6b450b66..43b6da06a70 100644 --- a/api-tests/management/nodes_test.go +++ b/api-tests/management/nodes_test.go @@ -138,7 +138,7 @@ func TestNodeRegister(t *testing.T) { Body: body, } node, err := client.Default.ManagementService.RegisterNode(¶ms) - assert.NoError(t, err) + require.NoError(t, err) nodeID := node.Payload.GenericNode.NodeID t.Cleanup(func() { pmmapitests.UnregisterNodes(t, nodeID) @@ -200,7 +200,7 @@ func TestNodeRegister(t *testing.T) { Body: body, } node, err := client.Default.ManagementService.RegisterNode(¶ms) - assert.NoError(t, err) + require.NoError(t, err) nodeID := node.Payload.GenericNode.NodeID t.Cleanup(func() { @@ -254,7 +254,7 @@ func TestNodeRegister(t *testing.T) { PMMAgentID: new(pmmAgentID), Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.Len(t, listAgentsOK.Payload.NodeExporter, 1) nodeExporterAgentID := listAgentsOK.Payload.NodeExporter[0].AgentID assert.Equal(t, agents.ListAgentsOKBodyNodeExporterItems0{ diff --git a/api-tests/management/postgresql_test.go b/api-tests/management/postgresql_test.go index b33e5b55dd5..50e1c60d004 100644 --- a/api-tests/management/postgresql_test.go +++ b/api-tests/management/postgresql_test.go @@ -80,7 +80,7 @@ func TestAddPostgreSQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Postgresql: &services.GetServiceOKBodyPostgresql{ @@ -99,7 +99,7 @@ func TestAddPostgreSQL(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyPostgresExporterItems0{ { AgentID: listAgents.Payload.PostgresExporter[0].AgentID, @@ -164,7 +164,7 @@ func TestAddPostgreSQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Postgresql: &services.GetServiceOKBodyPostgresql{ @@ -183,7 +183,7 @@ func TestAddPostgreSQL(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, listAgents) require.Len(t, listAgents.Payload.PostgresExporter, 1) require.Len(t, listAgents.Payload.QANPostgresqlPgstatementsAgent, 1) @@ -273,7 +273,7 @@ func TestAddPostgreSQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Postgresql: &services.GetServiceOKBodyPostgresql{ @@ -691,7 +691,7 @@ func TestAddPostgreSQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Postgresql: &services.GetServiceOKBodyPostgresql{ @@ -710,7 +710,7 @@ func TestAddPostgreSQL(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyPostgresExporterItems0{ { AgentID: listAgents.Payload.PostgresExporter[0].AgentID, @@ -769,7 +769,7 @@ func TestAddPostgreSQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Postgresql: &services.GetServiceOKBodyPostgresql{ @@ -788,7 +788,7 @@ func TestAddPostgreSQL(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyPostgresExporterItems0{ { AgentID: listAgents.Payload.PostgresExporter[0].AgentID, @@ -846,7 +846,7 @@ func TestAddPostgreSQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Postgresql: &services.GetServiceOKBodyPostgresql{ @@ -865,7 +865,7 @@ func TestAddPostgreSQL(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyPostgresExporterItems0{ { AgentID: listAgents.Payload.PostgresExporter[0].AgentID, diff --git a/api-tests/management/proxysql_test.go b/api-tests/management/proxysql_test.go index 3671e82fb4d..841dbba3eab 100644 --- a/api-tests/management/proxysql_test.go +++ b/api-tests/management/proxysql_test.go @@ -152,7 +152,7 @@ func TestAddProxySQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Proxysql: &services.GetServiceOKBodyProxysql{ @@ -170,7 +170,7 @@ func TestAddProxySQL(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, listAgents) require.Len(t, listAgents.Payload.ProxysqlExporter, 1) assert.Equal(t, []*agents.ListAgentsOKBodyProxysqlExporterItems0{ @@ -234,7 +234,7 @@ func TestAddProxySQL(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Proxysql: &services.GetServiceOKBodyProxysql{ diff --git a/api-tests/management/valkey_test.go b/api-tests/management/valkey_test.go index c92eaf76931..7a977ce5efb 100644 --- a/api-tests/management/valkey_test.go +++ b/api-tests/management/valkey_test.go @@ -74,7 +74,7 @@ func TestAddValkey(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Valkey: &services.GetServiceOKBodyValkey{ @@ -92,7 +92,7 @@ func TestAddValkey(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []*agents.ListAgentsOKBodyValkeyExporterItems0{ { AgentID: listAgents.Payload.ValkeyExporter[0].AgentID, @@ -148,7 +148,7 @@ func TestAddValkey(t *testing.T) { ServiceID: serviceID, Context: pmmapitests.Context, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, serviceOK) assert.Equal(t, services.GetServiceOKBody{ Valkey: &services.GetServiceOKBodyValkey{ @@ -166,7 +166,7 @@ func TestAddValkey(t *testing.T) { Context: pmmapitests.Context, ServiceID: new(serviceID), }) - assert.NoError(t, err) + require.NoError(t, err) require.NotNil(t, listAgents) require.Len(t, listAgents.Payload.ValkeyExporter, 1) assert.Equal(t, []*agents.ListAgentsOKBodyValkeyExporterItems0{ diff --git a/api-tests/server/logs_test.go b/api-tests/server/logs_test.go index 1a9c7750db4..9700751a249 100644 --- a/api-tests/server/logs_test.go +++ b/api-tests/server/logs_test.go @@ -42,7 +42,7 @@ func TestDownloadLogs(t *testing.T) { r := bytes.NewReader(buf.Bytes()) zipR, err := zip.NewReader(r, r.Size()) - assert.NoError(t, err) + require.NoError(t, err) expected := []string{ "clickhouse-server.log", diff --git a/api-tests/server/settings/settings_test.go b/api-tests/server/settings/settings_test.go index 3cb5c0ff9b7..e4ef24f9cb3 100644 --- a/api-tests/server/settings/settings_test.go +++ b/api-tests/server/settings/settings_test.go @@ -765,7 +765,7 @@ func TestSettings(t *testing.T) { t.Logf("Response:\n%s", b) } b, err = io.ReadAll(resp.Body) - assert.NoError(t, err) + require.NoError(t, err) resp.Body.Close() //nolint:errcheck assert.Equal(t, 200, resp.StatusCode, "response:\n%s", b) diff --git a/managed/models/action_helpers_test.go b/managed/models/action_helpers_test.go index 019c0543140..bbbc4b2a887 100644 --- a/managed/models/action_helpers_test.go +++ b/managed/models/action_helpers_test.go @@ -169,7 +169,7 @@ func TestCleanupResults(t *testing.T) { defer teardown(t) err := models.CleanupOldActionResults(q, models.Now().Add(-1*time.Second)) - assert.NoError(t, err) + require.NoError(t, err) _, err = models.FindActionResultByID(q, "A1") require.Error(t, err) diff --git a/managed/models/agent_helpers_test.go b/managed/models/agent_helpers_test.go index 8dafb74129f..36a599646a4 100644 --- a/managed/models/agent_helpers_test.go +++ b/managed/models/agent_helpers_test.go @@ -445,7 +445,7 @@ func TestAgentHelpers(t *testing.T) { } agent, err = models.RemoveAgent(q, "A1", models.RemoveCascade) assert.Equal(t, expected, agent) - assert.NoError(t, err) + require.NoError(t, err) _, err = models.FindAgentByID(q, "A1") tests.AssertGRPCError(t, status.New(codes.NotFound, `Agent with ID A1 not found.`), err) }) diff --git a/managed/models/agentversion_test.go b/managed/models/agentversion_test.go index 5fd943c3e42..208086c5e58 100644 --- a/managed/models/agentversion_test.go +++ b/managed/models/agentversion_test.go @@ -75,7 +75,7 @@ func TestPMMAgentSupported(t *testing.T) { } err := models.IsAgentSupported(&agentModel, prefix, minVersion) if test.errString == "" { - assert.NoError(t, err) + require.NoError(t, err) } else { assert.Contains(t, err.Error(), test.errString) } @@ -162,12 +162,12 @@ func TestIsPostgreSQLSSLSniSupported(t *testing.T) { t.Run(tt.pmmAgentID, func(t *testing.T) { actual, err := models.IsPostgreSQLSSLSniSupported(q, tt.pmmAgentID) assert.Equal(t, tt.expected, actual) - assert.NoError(t, err) + require.NoError(t, err) }) } t.Run("Non-existing ID", func(t *testing.T) { _, err := models.IsPostgreSQLSSLSniSupported(q, "Not exist") - assert.Error(t, err) + require.Error(t, err) }) } diff --git a/managed/models/artifact_helpers_test.go b/managed/models/artifact_helpers_test.go index 35daf24d65c..9fd91e13689 100644 --- a/managed/models/artifact_helpers_test.go +++ b/managed/models/artifact_helpers_test.go @@ -436,7 +436,7 @@ func TestArtifactValidation(t *testing.T) { c, err := models.CreateArtifact(q, test.params) if test.errorMsg != "" { - assert.EqualError(t, err, test.errorMsg) + require.EqualError(t, err, test.errorMsg) assert.Nil(t, c) return } diff --git a/managed/models/database_test.go b/managed/models/database_test.go index 840c1354c0f..ad7586d550f 100644 --- a/managed/models/database_test.go +++ b/managed/models/database_test.go @@ -35,7 +35,8 @@ import ( func assertUniqueViolation(t *testing.T, err error, constraint string) { t.Helper() - require.IsType(t, &pq.Error{}, err) + var targetErr *pq.Error + require.ErrorAs(t, err, &targetErr) pgErr := err.(*pq.Error) //nolint:errorlint assert.Equal(t, pqerror.Code("23505"), pgErr.Code) assert.Equal(t, fmt.Sprintf(`duplicate key value violates unique constraint %q`, constraint), pgErr.Message) @@ -44,7 +45,8 @@ func assertUniqueViolation(t *testing.T, err error, constraint string) { func assertCheckViolation(t *testing.T, err error, table, constraint string) { //nolint:unparam t.Helper() - require.IsType(t, &pq.Error{}, err) + var targetErr *pq.Error + require.ErrorAs(t, err, &targetErr) pgErr := err.(*pq.Error) //nolint:errorlint assert.Equal(t, pqerror.Code("23514"), pgErr.Code) assert.Equal(t, fmt.Sprintf(`new row for relation %q violates check constraint %q`, table, constraint), pgErr.Message) @@ -311,7 +313,7 @@ func TestDatabaseChecks(t *testing.T) { `VALUES ('8', 'node_exporter', NULL, '1', '1', NULL, false, '', $1, $2, false, false, '{"max_query_length": 0, "query_examples_disabled": false, "comments_parsing_disabled": true, "max_query_log_size": 0}', '{"table_count_tablestats_group_limit": 0}', '{"rds_basic_metrics_disabled": false, "rds_enhanced_metrics_disabled": false}', '{"push_metrics": false, "expose_exporter": false}')`, now, now, ) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("service_id set", func(t *testing.T) { @@ -323,7 +325,7 @@ func TestDatabaseChecks(t *testing.T) { `VALUES ('8', 'mysqld_exporter', NULL, '1', NULL, '1', false, '', $1, $2, false, false, '{"max_query_length": 0, "query_examples_disabled": false, "comments_parsing_disabled": true, "max_query_log_size": 0}', '{"table_count_tablestats_group_limit": 0}', '{"rds_basic_metrics_disabled": false, "rds_enhanced_metrics_disabled": false}', '{"push_metrics": false, "expose_exporter": false}')`, now, now, ) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("Both NULL", func(t *testing.T) { diff --git a/managed/models/job_helpers_test.go b/managed/models/job_helpers_test.go index e786f9913a8..2eeaef9b05e 100644 --- a/managed/models/job_helpers_test.go +++ b/managed/models/job_helpers_test.go @@ -66,7 +66,7 @@ func TestJobs(t *testing.T) { assert.Equal(t, createJobParams.Data.MongoDBBackup.ArtifactID, job.Data.MongoDBBackup.ArtifactID) _, err = models.CreateJob(tx.Querier, models.CreateJobParams{Type: "unknown"}) - assert.EqualError(t, err, "unknown job type: unknown") + require.EqualError(t, err, "unknown job type: unknown") }) t.Run("find", func(t *testing.T) { @@ -253,7 +253,7 @@ func TestJobLogs(t *testing.T) { logs, err := models.FindJobLogs(tx.Querier, models.JobLogsFilter{ JobID: jobID, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, logs) } }) diff --git a/managed/models/location_helpers_test.go b/managed/models/location_helpers_test.go index d1ad445c6bf..0d8cacad623 100644 --- a/managed/models/location_helpers_test.go +++ b/managed/models/location_helpers_test.go @@ -560,10 +560,10 @@ func TestCreateBackupLocationValidation(t *testing.T) { c, err := models.CreateBackupLocation(q, test.params) if test.errorMsg != "" { - assert.EqualError(t, err, test.errorMsg) + require.EqualError(t, err, test.errorMsg) return } - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, c) }) } @@ -610,10 +610,10 @@ func TestParseEndpoint(t *testing.T) { t.Run(test.name, func(t *testing.T) { res, err := models.ParseEndpoint(test.endpoint) if test.errorMsg != "" { - assert.EqualError(t, err, test.errorMsg) + require.EqualError(t, err, test.errorMsg) return } - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, test.url, *res) }) } diff --git a/managed/models/models_test.go b/managed/models/models_test.go index e3846bfbe60..ae1764eb7ce 100644 --- a/managed/models/models_test.go +++ b/managed/models/models_test.go @@ -19,6 +19,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -33,10 +34,10 @@ func TestLabels(t *testing.T) { var b []byte err := setLabels(map[string]string{"_1foo": "bar", "baz": " "}, &b) - assert.NoError(t, err) + require.NoError(t, err) assert.JSONEq(t, `{"_1foo":"bar","baz":""}`, string(b)) m, err := getLabels(b) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, map[string]string{"_1foo": "bar", "baz": ""}, m) }) @@ -45,10 +46,10 @@ func TestLabels(t *testing.T) { var b []byte err := setLabels(make(map[string]string), &b) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, b) m, err := getLabels(b) - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, m) }) diff --git a/managed/models/node_helpers_test.go b/managed/models/node_helpers_test.go index d7e7eca5747..9a01814ae87 100644 --- a/managed/models/node_helpers_test.go +++ b/managed/models/node_helpers_test.go @@ -130,7 +130,7 @@ func TestNodeHelpers(t *testing.T) { NodeName: t.Name(), MachineID: new(machineID + "\n"), }) - assert.NoError(t, err) + require.NoError(t, err) structs, err := q.SelectAllFrom(models.NodeTable, "WHERE machine_id = $1 ORDER BY node_id", machineID) require.NoError(t, err) @@ -242,17 +242,17 @@ func TestNodeHelpers(t *testing.T) { tests.AssertGRPCError(t, status.New(codes.FailedPrecondition, `Node with ID "MySQLNode" has services.`), err) err = models.RemoveNode(q, "EmptyNode", models.RemoveRestrict) - assert.NoError(t, err) + require.NoError(t, err) err = models.RemoveNode(q, "GenericNode", models.RemoveCascade) - assert.NoError(t, err) + require.NoError(t, err) err = models.RemoveNode(q, "NodeWithPMMAgent", models.RemoveCascade) - assert.NoError(t, err) + require.NoError(t, err) err = models.RemoveNode(q, "MySQLNode", models.RemoveCascade) - assert.NoError(t, err) + require.NoError(t, err) nodes, err := models.FindNodes(q, models.NodeFilters{}) - assert.NoError(t, err) + require.NoError(t, err) require.Len(t, nodes, 1) // PMM Server }) } diff --git a/managed/models/postgresql_version_test.go b/managed/models/postgresql_version_test.go index 88fa4f75abb..300a3ff8d05 100644 --- a/managed/models/postgresql_version_test.go +++ b/managed/models/postgresql_version_test.go @@ -86,11 +86,11 @@ func TestGetPostgreSQLVersion(t *testing.T) { version, err := GetPostgreSQLVersion(ctx, q) if tc.wantError { - assert.Error(t, err) + require.Error(t, err) } else { assert.InEpsilon(t, tc.wantVersion.Float(), version.Float(), 0.0001) assert.Equal(t, tc.wantVersion.String(), version.String()) - assert.NoError(t, err) + require.NoError(t, err) } }) } diff --git a/managed/models/restore_history_helpers_test.go b/managed/models/restore_history_helpers_test.go index 54d3d982ae6..d5f98444dcf 100644 --- a/managed/models/restore_history_helpers_test.go +++ b/managed/models/restore_history_helpers_test.go @@ -275,7 +275,7 @@ func TestRestoreHistoryValidation(t *testing.T) { c, err := models.CreateRestoreHistoryItem(nil, test.params) if test.errorMsg != "" { - assert.EqualError(t, err, test.errorMsg) + require.EqualError(t, err, test.errorMsg) assert.Nil(t, c) return } diff --git a/managed/models/scheduled_tasks_helpers_test.go b/managed/models/scheduled_tasks_helpers_test.go index 96cdf694582..37956da0c21 100644 --- a/managed/models/scheduled_tasks_helpers_test.go +++ b/managed/models/scheduled_tasks_helpers_test.go @@ -127,7 +127,7 @@ func TestScheduledTaskHelpers(t *testing.T) { require.NoError(t, err) task, err = models.FindScheduledTaskByID(tx.Querier, task.ID) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, task.ID) assert.Equal(t, createParams1.CronExpression, task.CronExpression) assert.Equal(t, createParams1.Type, task.Type) @@ -169,7 +169,7 @@ func TestScheduledTaskHelpers(t *testing.T) { Error: new("something"), } task1, err = models.ChangeScheduledTask(tx.Querier, task1.ID, changeParams1) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, *changeParams1.NextRun, task1.NextRun) assert.Equal(t, *changeParams1.LastRun, task1.LastRun) assert.Equal(t, *changeParams1.Disable, task1.Disabled) @@ -189,7 +189,7 @@ func TestScheduledTaskHelpers(t *testing.T) { }, } _, err = models.ChangeScheduledTask(tx.Querier, task2.ID, changeParams2) - assert.ErrorIs(t, err, models.ErrAlreadyExists) + require.ErrorIs(t, err, models.ErrAlreadyExists) }) t.Run("Remove", func(t *testing.T) { @@ -203,10 +203,10 @@ func TestScheduledTaskHelpers(t *testing.T) { require.NoError(t, err) err = models.RemoveScheduledTask(tx.Querier, task.ID) - assert.NoError(t, err) + require.NoError(t, err) _, err = models.FindScheduledTaskByID(tx.Querier, task.ID) - assert.ErrorIs(t, err, models.ErrNotFound, "task is not removed") + require.ErrorIs(t, err, models.ErrNotFound, "task is not removed") }) t.Run("Find", func(t *testing.T) { @@ -280,7 +280,7 @@ func TestScheduledTaskHelpers(t *testing.T) { for _, tc := range tests { tasks, err := models.FindScheduledTasks(tx.Querier, tc.filter) - assert.NoError(t, err) + require.NoError(t, err) ids := make([]string, 0, len(tasks)) for _, task := range tasks { ids = append(ids, task.ID) diff --git a/managed/models/service_helpers_test.go b/managed/models/service_helpers_test.go index f461292c93b..bc915570e1d 100644 --- a/managed/models/service_helpers_test.go +++ b/managed/models/service_helpers_test.go @@ -160,11 +160,11 @@ func TestServiceHelpers(t *testing.T) { defer teardown(t) services, err := models.FindServices(q, models.ServiceFilters{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, services, 9) services, err = models.FindServices(q, models.ServiceFilters{NodeID: "N1"}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, services, 4) assert.Equal(t, []*models.Service{{ ServiceID: "S1", @@ -205,7 +205,7 @@ func TestServiceHelpers(t *testing.T) { }}, services) services, err = models.FindServices(q, models.ServiceFilters{NodeID: "N1", ServiceType: new(models.MySQLServiceType)}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, services, 1) assert.Equal(t, []*models.Service{{ ServiceID: "S2", @@ -219,7 +219,7 @@ func TestServiceHelpers(t *testing.T) { }}, services) services, err = models.FindServices(q, models.ServiceFilters{NodeID: "N2", ServiceType: new(models.ExternalServiceType)}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, services, 2) assert.Equal(t, []*models.Service{ { @@ -245,7 +245,7 @@ func TestServiceHelpers(t *testing.T) { }, services) services, err = models.FindServices(q, models.ServiceFilters{NodeID: "N2", ServiceType: new(models.ProxySQLServiceType)}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, services, 1) assert.Equal(t, []*models.Service{{ ServiceID: "S6", @@ -258,7 +258,7 @@ func TestServiceHelpers(t *testing.T) { }}, services) services, err = models.FindServices(q, models.ServiceFilters{ExternalGroup: "redis"}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, services, 1) assert.Equal(t, []*models.Service{{ ServiceID: "S7", @@ -273,7 +273,7 @@ func TestServiceHelpers(t *testing.T) { }}, services) services, err = models.FindServices(q, models.ServiceFilters{NodeID: "N2", ServiceType: new(models.HAProxyServiceType)}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, services, 1) assert.Equal(t, []*models.Service{{ ServiceID: "S8", @@ -290,7 +290,7 @@ func TestServiceHelpers(t *testing.T) { defer teardown(t) types, err := models.FindActiveServiceTypes(q) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, types, 6) }) @@ -307,7 +307,7 @@ func TestServiceHelpers(t *testing.T) { _, err = models.FindServiceByID(q, "S1") require.NoError(t, err) err = models.RemoveService(q, "S1", models.RemoveRestrict) - assert.NoError(t, err) + require.NoError(t, err) _, err = models.FindServiceByID(q, "S1") tests.AssertGRPCError(t, status.New(codes.NotFound, `Service with ID "S1" not found.`), err) @@ -317,7 +317,7 @@ func TestServiceHelpers(t *testing.T) { _, err = models.FindServiceByID(q, "S2") require.NoError(t, err) err = models.RemoveService(q, "S2", models.RemoveCascade) - assert.NoError(t, err) + require.NoError(t, err) _, err = models.FindServiceByID(q, "S2") tests.AssertGRPCError(t, status.New(codes.NotFound, `Service with ID "S2" not found.`), err) }) @@ -454,7 +454,7 @@ func TestServiceHelpers(t *testing.T) { ServiceType: new(models.MongoDBServiceType), Cluster: "cluster0", }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, services) assert.ElementsMatch(t, []*models.Service{s1, s2}, services) }) @@ -533,7 +533,7 @@ func TestServiceHelpers(t *testing.T) { return } - assert.ErrorIs(t, err, models.ErrNotFound) + require.ErrorIs(t, err, models.ErrNotFound) assert.Nil(t, swVersions) } }) diff --git a/managed/models/settings_helpers_test.go b/managed/models/settings_helpers_test.go index 2c329117c83..cfa2c9c7727 100644 --- a/managed/models/settings_helpers_test.go +++ b/managed/models/settings_helpers_test.go @@ -91,14 +91,14 @@ func TestSettings(t *testing.T) { _, err := models.UpdateSettings(sqlDB, s) var errInvalidArgument *models.InvalidArgumentError assert.True(t, errors.As(err, &errInvalidArgument)) - assert.EqualError(t, err, `invalid argument: aws_partitions: partition "foo" is invalid`) + require.EqualError(t, err, `invalid argument: aws_partitions: partition "foo" is invalid`) s = &models.ChangeSettingsParams{ AWSPartitions: []string{"foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo"}, } _, err = models.UpdateSettings(sqlDB, s) assert.True(t, errors.As(err, &errInvalidArgument)) - assert.EqualError(t, err, `invalid argument: aws_partitions: list is too long`) + require.EqualError(t, err, `invalid argument: aws_partitions: list is too long`) s = &models.ChangeSettingsParams{ AWSPartitions: []string{"aws", "aws-cn", "aws-cn"}, @@ -127,26 +127,26 @@ func TestSettings(t *testing.T) { }) var errInvalidArgument *models.InvalidArgumentError assert.True(t, errors.As(err, &errInvalidArgument)) - assert.EqualError(t, err, `invalid argument: mr: minimal resolution is 1s`) + require.EqualError(t, err, `invalid argument: mr: minimal resolution is 1s`) mr = models.MetricsResolutions{MR: 2*time.Second + (500 * time.Millisecond)} // 2.5s _, err = models.UpdateSettings(sqlDB, &models.ChangeSettingsParams{ MetricsResolutions: mr, }) assert.True(t, errors.As(err, &errInvalidArgument)) - assert.EqualError(t, err, `invalid argument: mr: should be a natural number of seconds`) + require.EqualError(t, err, `invalid argument: mr: should be a natural number of seconds`) _, err = models.UpdateSettings(sqlDB, &models.ChangeSettingsParams{ DataRetention: 90000 * time.Second, // 25h }) assert.True(t, errors.As(err, &errInvalidArgument)) - assert.EqualError(t, err, `invalid argument: data_retention: should be a natural number of days`) + require.EqualError(t, err, `invalid argument: data_retention: should be a natural number of days`) _, err = models.UpdateSettings(sqlDB, &models.ChangeSettingsParams{ DataRetention: 43200 * time.Second, // 12h }) assert.True(t, errors.As(err, &errInvalidArgument)) - assert.EqualError(t, err, `invalid argument: data_retention: minimal resolution is 24h`) + require.EqualError(t, err, `invalid argument: data_retention: minimal resolution is 24h`) }) t.Run("Updates validation", func(t *testing.T) { diff --git a/managed/models/software_version_helpers_test.go b/managed/models/software_version_helpers_test.go index 5ca9277b7f5..eb49ae5f92a 100644 --- a/managed/models/software_version_helpers_test.go +++ b/managed/models/software_version_helpers_test.go @@ -386,7 +386,7 @@ func TestSoftwareVersionsParamsValidation(t *testing.T) { c, err := models.CreateServiceSoftwareVersions(q, test.params) if test.errorMsg != "" { - assert.EqualError(t, err, test.errorMsg) + require.EqualError(t, err, test.errorMsg) assert.Nil(t, c) return } @@ -439,9 +439,9 @@ func TestUpdateServiceSoftwareVersionsParamsValidation(t *testing.T) { t.Run(test.name, func(t *testing.T) { err := test.params.Validate() if test.errorMsg != "" { - assert.EqualError(t, err, test.errorMsg) + require.EqualError(t, err, test.errorMsg) } else { - assert.NoError(t, err) + require.NoError(t, err) } }) } diff --git a/managed/services/agents/channel/channel_test.go b/managed/services/agents/channel/channel_test.go index c3ca846386b..2dd356c05ab 100644 --- a/managed/services/agents/channel/channel_test.go +++ b/managed/services/agents/channel/channel_test.go @@ -151,7 +151,7 @@ func TestAgentRequest(t *testing.T) { } err := stream.CloseSend() - assert.NoError(t, err) + require.NoError(t, err) // check metrics expectedMetrics := &Metrics{ @@ -172,7 +172,7 @@ func TestServerRequest(t *testing.T) { pong := resp.(*agentv1.Pong) ts := pong.CurrentTime.AsTime() err = pong.CurrentTime.CheckValid() - assert.NoError(t, err) + require.NoError(t, err) assert.InDelta(t, time.Now().Unix(), ts.Unix(), 1) } @@ -195,11 +195,11 @@ func TestServerRequest(t *testing.T) { CurrentTime: timestamppb.Now(), }).AgentMessageResponsePayload(), }) - assert.NoError(t, err) + require.NoError(t, err) } err := stream.CloseSend() - assert.NoError(t, err) + require.NoError(t, err) } func TestServerExitsWithGRPCError(t *testing.T) { @@ -221,10 +221,10 @@ func TestServerExitsWithGRPCError(t *testing.T) { Id: 1, Payload: collectReq.AgentMessageRequestPayload(), }) - assert.NoError(t, err) + require.NoError(t, err) _, err = stream.Recv() - assert.ErrorIs(t, err, errUnimplemented) + require.ErrorIs(t, err, errUnimplemented) } func TestServerExitsWithUnknownErrorIntercepted(t *testing.T) { @@ -245,7 +245,7 @@ func TestServerExitsWithUnknownErrorIntercepted(t *testing.T) { Id: 1, Payload: collectReq.AgentMessageRequestPayload(), }) - assert.NoError(t, err) + require.NoError(t, err) _, err = stream.Recv() tests.AssertGRPCError(t, status.New(codes.Internal, "Internal server error."), err) @@ -254,7 +254,7 @@ func TestServerExitsWithUnknownErrorIntercepted(t *testing.T) { func TestAgentClosesStream(t *testing.T) { connect := func(ch *Channel) error { resp, err := ch.SendAndWaitResponse(&agentv1.Ping{}) - assert.Errorf(t, err, "channel is closed") + require.Errorf(t, err, "channel is closed") assert.Nil(t, resp) assert.Nil(t, <-ch.Requests()) @@ -269,13 +269,13 @@ func TestAgentClosesStream(t *testing.T) { assert.NotNil(t, msg) err = stream.CloseSend() - assert.NoError(t, err) + require.NoError(t, err) } func TestAgentClosesConnection(t *testing.T) { connect := func(ch *Channel) error { resp, err := ch.SendAndWaitResponse(&agentv1.Ping{}) - assert.Errorf(t, err, "channel is closed") + require.Errorf(t, err, "channel is closed") assert.Nil(t, resp) assert.Nil(t, <-ch.Requests()) @@ -290,7 +290,7 @@ func TestAgentClosesConnection(t *testing.T) { assert.NotNil(t, msg) err = cc.Close() - assert.NoError(t, err) + require.NoError(t, err) } func TestUnexpectedResponseIdFromAgent(t *testing.T) { @@ -325,7 +325,7 @@ func TestUnexpectedResponseIdFromAgent(t *testing.T) { Id: 111, Payload: pong.AgentMessageResponsePayload(), }) - assert.NoError(t, err) + require.NoError(t, err) close(invalidIDSent) // This is a request with a proper id. @@ -334,10 +334,10 @@ func TestUnexpectedResponseIdFromAgent(t *testing.T) { Id: 9898, Payload: pong.AgentMessageResponsePayload(), }) - assert.NoError(t, err) + require.NoError(t, err) _, err = stream.Recv() - assert.NoError(t, err) + require.NoError(t, err) } func TestUnexpectedResponsePayloadFromAgent(t *testing.T) { @@ -358,7 +358,7 @@ func TestUnexpectedResponsePayloadFromAgent(t *testing.T) { msg, err := stream.Recv() assert.Equal(t, int32(codes.Unimplemented), msg.GetStatus().GetCode()) - assert.NoError(t, err) + require.NoError(t, err) close(stopServer) <-stop } diff --git a/managed/services/agents/postgresql_test.go b/managed/services/agents/postgresql_test.go index 5f96b069469..b1a6d6cc794 100644 --- a/managed/services/agents/postgresql_test.go +++ b/managed/services/agents/postgresql_test.go @@ -22,6 +22,7 @@ import ( "github.com/AlekSi/pointer" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" agentv1 "github.com/percona/pmm/api/agent/v1" @@ -84,7 +85,7 @@ func (s *PostgresExporterConfigTestSuite) TestConfig() { s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) - s.NoError(err, "Failed to create exporter config") + s.Require().NoError(err, "Failed to create exporter config") requireNoDuplicateFlags(s.T(), actual.Args) s.Require().Equal(s.expected.Args, actual.Args) @@ -102,7 +103,7 @@ func (s *PostgresExporterConfigTestSuite) TestDatabaseName() { s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) - s.NoError(err, "Failed to create exporter config") + s.Require().NoError(err, "Failed to create exporter config") s.Require().Equal(s.expected.Env, actual.Env) }) @@ -116,7 +117,7 @@ func (s *PostgresExporterConfigTestSuite) TestDatabaseName() { s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} _, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) - s.NoError(err, "Failed to create exporter config") + s.Require().NoError(err, "Failed to create exporter config") }) }) } @@ -128,7 +129,7 @@ func (s *PostgresExporterConfigTestSuite) TestEmptyPassword() { s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, exposeSecrets, s.pmmAgentVersion) - s.NoError(err, "Failed to create exporter config") + s.Require().NoError(err, "Failed to create exporter config") s.Equal("DATA_SOURCE_NAME=postgres://username@1.2.3.4:5432/postgres?connect_timeout=2&sslmode=disable", actual.Env[0]) } @@ -140,7 +141,7 @@ func (s *PostgresExporterConfigTestSuite) TestEmptyUsername() { s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, exposeSecrets, s.pmmAgentVersion) - s.NoError(err, "Failed to create exporter config") + s.Require().NoError(err, "Failed to create exporter config") s.Equal("DATA_SOURCE_NAME=postgres://:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=2&sslmode=disable", actual.Env[0]) } @@ -153,7 +154,7 @@ func (s *PostgresExporterConfigTestSuite) TestEmptyUsernameAndPassword() { s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, exposeSecrets, s.pmmAgentVersion) - s.NoError(err, "Failed to create exporter config") + s.Require().NoError(err, "Failed to create exporter config") s.Equal("DATA_SOURCE_NAME=postgres://1.2.3.4:5432/postgres?connect_timeout=2&sslmode=disable", actual.Env[0]) } @@ -169,7 +170,7 @@ func (s *PostgresExporterConfigTestSuite) TestSocket() { s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, exposeSecrets, s.pmmAgentVersion) - s.NoError(err, "Failed to create exporter config") + s.Require().NoError(err, "Failed to create exporter config") s.Equal("DATA_SOURCE_NAME=postgres:///postgres?connect_timeout=2&host=%2Fvar%2Frun%2Fpostgres&sslmode=disable", actual.Env[0]) } @@ -186,7 +187,7 @@ func (s *PostgresExporterConfigTestSuite) TestDisabledCollectors() { s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, exposeSecrets, s.pmmAgentVersion) - s.NoError(err, "Failed to create exporter config") + s.Require().NoError(err, "Failed to create exporter config") expected := &agentv1.SetStateRequest_AgentProcess{ Type: inventoryv1.AgentType_AGENT_TYPE_POSTGRES_EXPORTER, @@ -216,7 +217,7 @@ func (s *PostgresExporterConfigTestSuite) TestDialTimeoutRemoteRDSDefault() { s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=5&sslmode=disable" actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) - s.NoError(err) + s.Require().NoError(err) s.Require().Equal(s.expected.Env, actual.Env) } @@ -228,7 +229,7 @@ func (s *PostgresExporterConfigTestSuite) TestDialTimeoutRemoteRDSCustom() { s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=8&sslmode=disable" actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) - s.NoError(err) + s.Require().NoError(err) s.Require().Equal(s.expected.Env, actual.Env) } @@ -239,7 +240,7 @@ func (s *PostgresExporterConfigTestSuite) TestDialTimeoutRoundsUpSubSecondCustom s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=2&sslmode=disable" actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) - s.NoError(err) + s.Require().NoError(err) s.Require().Equal(s.expected.Env, actual.Env) s.Require().NotNil(s.exporter.ExporterOptions.ConnectionTimeout) s.Equal(1500*time.Millisecond, *s.exporter.ExporterOptions.ConnectionTimeout) @@ -252,7 +253,7 @@ func (s *PostgresExporterConfigTestSuite) TestDialTimeoutAzureDefault() { s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=5&sslmode=disable" actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) - s.NoError(err) + s.Require().NoError(err) s.Require().Equal(s.expected.Env, actual.Env) } @@ -263,7 +264,7 @@ func (s *PostgresExporterConfigTestSuite) TestDialTimeoutAzureRoundsUpSubSecondC s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=2&sslmode=disable" actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) - s.NoError(err) + s.Require().NoError(err) s.Require().Equal(s.expected.Env, actual.Env) s.Require().NotNil(s.exporter.ExporterOptions.ConnectionTimeout) s.Equal(1500*time.Millisecond, *s.exporter.ExporterOptions.ConnectionTimeout) @@ -276,7 +277,7 @@ func (s *PostgresExporterConfigTestSuite) TestDialTimeoutAzureCustom() { s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=4&sslmode=disable" actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) - s.NoError(err) + s.Require().NoError(err) s.Require().Equal(s.expected.Env, actual.Env) } @@ -326,7 +327,7 @@ func TestAutoDiscovery(t *testing.T) { t.Run("Not supported version - disabled", func(t *testing.T) { res, err := postgresExporterConfig(node, postgresql, exporter, redactSecrets, pmmAgentVersion) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expected, res) assert.NotContains(t, res.Args, discoveryFlag) assert.NotContains(t, res.Args, excludedFlag) @@ -335,7 +336,7 @@ func TestAutoDiscovery(t *testing.T) { t.Run("Supported version - enabled", func(t *testing.T) { pmmAgentVersion = version.MustParse("2.16.0") res, err := postgresExporterConfig(node, postgresql, exporter, redactSecrets, pmmAgentVersion) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, res.Args, discoveryFlag) assert.Contains(t, res.Args, excludedFlag) }) @@ -346,7 +347,7 @@ func TestAutoDiscovery(t *testing.T) { DatabaseCount: 10, } res, err := postgresExporterConfig(node, postgresql, exporter, redactSecrets, pmmAgentVersion) - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, res.Args, discoveryFlag) assert.NotContains(t, res.Args, excludedFlag) }) @@ -357,7 +358,7 @@ func TestAutoDiscovery(t *testing.T) { DatabaseCount: 5, } res, err := postgresExporterConfig(node, postgresql, exporter, redactSecrets, pmmAgentVersion) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, res.Args, discoveryFlag) assert.Contains(t, res.Args, excludedFlag) }) @@ -368,7 +369,7 @@ func TestAutoDiscovery(t *testing.T) { DatabaseCount: 3, } res, err := postgresExporterConfig(node, postgresql, exporter, redactSecrets, pmmAgentVersion) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, res.Args, discoveryFlag) assert.Contains(t, res.Args, excludedFlag) }) @@ -379,7 +380,7 @@ func TestAutoDiscovery(t *testing.T) { DatabaseCount: 3, } res, err := postgresExporterConfig(node, postgresql, exporter, redactSecrets, pmmAgentVersion) - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, res.Args, discoveryFlag) assert.NotContains(t, res.Args, excludedFlag) }) @@ -390,7 +391,7 @@ func TestAutoDiscovery(t *testing.T) { DatabaseCount: 3, } res, err := postgresExporterConfig(node, postgresql, exporter, redactSecrets, pmmAgentVersion) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, res.Args, discoveryFlag) assert.Contains(t, res.Args, excludedFlag) }) @@ -446,14 +447,14 @@ func TestMaxConnections(t *testing.T) { t.Run("Not supported version - disabled", func(t *testing.T) { res, err := postgresExporterConfig(node, postgresql, exporter, redactSecrets, version.MustParse("2.41.0")) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expected, res) assert.NotContains(t, res.Args, maxConnectionsFlag) }) t.Run("Supported version - enabled", func(t *testing.T) { res, err := postgresExporterConfig(node, postgresql, exporter, redactSecrets, pmmAgentVersion) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, res.Args, fmt.Sprintf("%s=%d", maxConnectionsFlag, 10)) }) @@ -462,7 +463,7 @@ func TestMaxConnections(t *testing.T) { MaxExporterConnections: 0, } res, err := postgresExporterConfig(node, postgresql, exporter, redactSecrets, pmmAgentVersion) - assert.NoError(t, err) + require.NoError(t, err) assert.NotContains(t, res.Args, maxConnectionsFlag) }) @@ -471,7 +472,7 @@ func TestMaxConnections(t *testing.T) { MaxExporterConnections: 5, } res, err := postgresExporterConfig(node, postgresql, exporter, redactSecrets, pmmAgentVersion) - assert.NoError(t, err) + require.NoError(t, err) assert.Contains(t, res.Args, fmt.Sprintf("%s=%d", maxConnectionsFlag, 5)) }) } @@ -501,7 +502,7 @@ func (s *PostgresExporterConfigTestSuite) TestAzureTimeout() { } actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) - s.NoError(err, "Failed to create exporter config") + s.Require().NoError(err, "Failed to create exporter config") s.expected = &agentv1.SetStateRequest_AgentProcess{ Type: inventoryv1.AgentType_AGENT_TYPE_POSTGRES_EXPORTER, @@ -550,7 +551,7 @@ func (s *PostgresExporterConfigTestSuite) TestPrometheusWebConfig() { } actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) - s.NoError(err, "Failed to create exporter config") + s.Require().NoError(err, "Failed to create exporter config") s.expected = &agentv1.SetStateRequest_AgentProcess{ Type: inventoryv1.AgentType_AGENT_TYPE_POSTGRES_EXPORTER, @@ -602,7 +603,7 @@ func (s *PostgresExporterConfigTestSuite) TestSSLSni() { } actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) - s.NoError(err, "Failed to create exporter config") + s.Require().NoError(err, "Failed to create exporter config") s.expected = &agentv1.SetStateRequest_AgentProcess{ Type: inventoryv1.AgentType_AGENT_TYPE_POSTGRES_EXPORTER, diff --git a/managed/services/alerting/service_test.go b/managed/services/alerting/service_test.go index 56984d19cb8..368b3e77310 100644 --- a/managed/services/alerting/service_test.go +++ b/managed/services/alerting/service_test.go @@ -142,7 +142,7 @@ templates: Yaml: templateWithMissingParam, }) assert.Nil(t, resp) - assert.EqualError(t, err, "rpc error: code = InvalidArgument desc = failed to fill expression "+ + require.EqualError(t, err, "rpc error: code = InvalidArgument desc = failed to fill expression "+ "placeholders: template: :4:5: executing \"\" at <.threshold>: map has no entry for key \"threshold\".") }) @@ -237,7 +237,7 @@ templates: Yaml: templateWithMissingParam, }) assert.Nil(t, resp) - assert.EqualError(t, err, "rpc error: code = InvalidArgument desc = failed to fill expression "+ + require.EqualError(t, err, "rpc error: code = InvalidArgument desc = failed to fill expression "+ "placeholders: template: :4:5: executing \"\" at <.threshold>: map has no entry for key \"threshold\".") }) } diff --git a/managed/services/backup/backup_service_test.go b/managed/services/backup/backup_service_test.go index 3099f00bc02..a420071d98a 100644 --- a/managed/services/backup/backup_service_test.go +++ b/managed/services/backup/backup_service_test.go @@ -174,12 +174,12 @@ func TestPerformBackup(t *testing.T) { }) if tc.expectedError != nil { - assert.ErrorIs(t, err, tc.expectedError) + require.ErrorIs(t, err, tc.expectedError) assert.Empty(t, artifactID) return } - assert.NoError(t, err) + require.NoError(t, err) artifact, err := models.FindArtifactByID(db.Querier, artifactID) require.NoError(t, err) assert.Equal(t, tc.locationModel.ID, artifact.LocationID) @@ -203,7 +203,7 @@ func TestPerformBackup(t *testing.T) { Mode: models.PITR, Folder: "artifact_folder_2", }) - assert.ErrorIs(t, err, ErrIncompatibleDataModel) + require.ErrorIs(t, err, ErrIncompatibleDataModel) assert.Empty(t, artifactID) }) @@ -217,7 +217,7 @@ func TestPerformBackup(t *testing.T) { Mode: models.PITR, Folder: "artifact_folder_3", }) - assert.ErrorContains(t, err, "Empty Service ID") + require.ErrorContains(t, err, "Empty Service ID") assert.Empty(t, artifactID) }) @@ -232,7 +232,7 @@ func TestPerformBackup(t *testing.T) { Mode: models.Incremental, Folder: "artifact_folder_4", }) - assert.ErrorContains(t, err, "the only supported backups mode for mongoDB is snapshot and PITR") + require.ErrorContains(t, err, "the only supported backups mode for mongoDB is snapshot and PITR") assert.Empty(t, artifactID) }) }) @@ -329,10 +329,10 @@ func TestRestoreBackup(t *testing.T) { } restoreID, err := backupService.RestoreBackup(ctx, pointer.GetString(agent.ServiceID), artifact.ID, time.Unix(0, 0)) if tc.expectedError != nil { - assert.ErrorIs(t, err, tc.expectedError) + require.ErrorIs(t, err, tc.expectedError) assert.Empty(t, restoreID) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, restoreID) } }) @@ -431,10 +431,10 @@ func TestRestoreBackup(t *testing.T) { } restoreID, err := backupService.RestoreBackup(ctx, pointer.GetString(agent.ServiceID), tc.artifact.ID, time.Unix(0, 0)) if tc.expectedError != nil { - assert.ErrorIs(t, err, tc.expectedError) + require.ErrorIs(t, err, tc.expectedError) assert.Empty(t, restoreID) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, restoreID) } }) @@ -568,7 +568,7 @@ func TestCheckArtifactModePreconditions(t *testing.T) { if tc.err == nil { require.NoError(t, err) } else { - assert.ErrorIs(t, err, tc.err) + require.ErrorIs(t, err, tc.err) } }) } @@ -709,7 +709,7 @@ func TestCheckArtifactModePreconditions(t *testing.T) { if tc.err == nil { require.NoError(t, err) } else { - assert.ErrorIs(t, err, tc.err) + require.ErrorIs(t, err, tc.err) } }) } diff --git a/managed/services/backup/compatibility_helpers_test.go b/managed/services/backup/compatibility_helpers_test.go index 9d5e975572d..2c143501bbb 100644 --- a/managed/services/backup/compatibility_helpers_test.go +++ b/managed/services/backup/compatibility_helpers_test.go @@ -19,6 +19,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/percona/pmm/managed/models" ) @@ -145,21 +146,21 @@ func TestMysqlAndXtrabackupCompatible(t *testing.T) { for _, ver := range compatible { actual, err := mysqlAndXtrabackupCompatible(ver.mysql, ver.pxb) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, actual, "mysql version %q, xtrabackup version %q", ver.mysql, ver.pxb) } for _, ver := range incompatible { actual, err := mysqlAndXtrabackupCompatible(ver.mysql, ver.pxb) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, actual, "mysql version %q, xtrabackup version %q", ver.mysql, ver.pxb) } _, err := mysqlAndXtrabackupCompatible("eight", "8.0.6") - assert.Error(t, err) + require.Error(t, err) _, err = mysqlAndXtrabackupCompatible("8.0", "eight") - assert.Error(t, err) + require.Error(t, err) } func TestVendorToServiceType(t *testing.T) { @@ -195,7 +196,7 @@ func TestVendorToServiceType(t *testing.T) { if test.errString != "" { assert.Contains(t, err.Error(), test.errString) } else { - assert.NoError(t, err) + require.NoError(t, err) } }) } @@ -290,9 +291,9 @@ func TestMySQLSoftwaresInstalledAndCompatible(t *testing.T) { t.Run(test.name, func(t *testing.T) { err := mySQLBackupSoftwareInstalledAndCompatible(test.input) if test.err != nil { - assert.ErrorIs(t, err, test.err) + require.ErrorIs(t, err, test.err) } else { - assert.NoError(t, err) + require.NoError(t, err) } }) } @@ -340,9 +341,9 @@ func TestMongoDBBackupSoftwareInstalledAndCompatible(t *testing.T) { t.Run(test.name, func(t *testing.T) { err := mongoDBBackupSoftwareInstalledAndCompatible(test.input) if test.err != nil { - assert.ErrorIs(t, err, test.err) + require.ErrorIs(t, err, test.err) } else { - assert.NoError(t, err) + require.NoError(t, err) } }) } diff --git a/managed/services/backup/compatibility_service_test.go b/managed/services/backup/compatibility_service_test.go index 56284c97f29..d6f6dcbefee 100644 --- a/managed/services/backup/compatibility_service_test.go +++ b/managed/services/backup/compatibility_service_test.go @@ -196,10 +196,10 @@ func TestCheckCompatibility(t *testing.T) { cSvc := NewCompatibilityService(nil, &mockVersioner) dbVersion, err := cSvc.checkCompatibility(&models.Service{ServiceType: tc.serviceType}, &agentModel) if tc.expectedError != nil { - assert.ErrorIs(t, err, tc.expectedError) + require.ErrorIs(t, err, tc.expectedError) assert.Empty(t, dbVersion) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, tc.versions[0].Version, dbVersion) } mock.AssertExpectationsForObjects(t, &mockVersioner) @@ -478,9 +478,9 @@ func TestFindArtifactCompatibleServices(t *testing.T) { res, err := cSvc.FindArtifactCompatibleServices(t.Context(), test.artifactIDToSearch) if test.errString != "" { - assert.ErrorContains(t, err, test.errString) + require.ErrorContains(t, err, test.errString) } else { - assert.NoError(t, err) + require.NoError(t, err) } if test.expectEmptyResult { @@ -618,7 +618,7 @@ func TestFindArtifactCompatibleServices(t *testing.T) { }) res, err := cSvc.FindArtifactCompatibleServices(t.Context(), "test_artifact_id") - assert.NoError(t, err) + require.NoError(t, err) assert.ElementsMatch(t, []*models.Service{serviceModel, &svsData4.service}, res) }) } @@ -699,7 +699,7 @@ func TestArtifactCompatibility(t *testing.T) { return } - assert.ErrorIs(t, err, tc.expectedErr) + require.ErrorIs(t, err, tc.expectedErr) }) } } diff --git a/managed/services/backup/pitr_timerange_service_test.go b/managed/services/backup/pitr_timerange_service_test.go index 255cf0a4779..b50478434cf 100644 --- a/managed/services/backup/pitr_timerange_service_test.go +++ b/managed/services/backup/pitr_timerange_service_test.go @@ -111,7 +111,7 @@ func TestGetPITROplogs(t *testing.T) { service := NewPBMPITRService() timelines, err := service.getPITROplogs(ctx, mockedStorage, location, &models.Artifact{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, timelines, 1) }) @@ -120,7 +120,7 @@ func TestGetPITROplogs(t *testing.T) { service := NewPBMPITRService() timelines, err := service.getPITROplogs(ctx, mockedStorage, location, &models.Artifact{}) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, timelines) }) @@ -137,7 +137,7 @@ func TestGetPITROplogs(t *testing.T) { service := NewPBMPITRService() timelines, err := service.getPITROplogs(ctx, mockedStorage, location, &models.Artifact{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, timelines) }) diff --git a/managed/services/backup/removal_service_test.go b/managed/services/backup/removal_service_test.go index 0d21a747ef3..1956f5dd91e 100644 --- a/managed/services/backup/removal_service_test.go +++ b/managed/services/backup/removal_service_test.go @@ -115,10 +115,10 @@ func TestDeleteArtifact(t *testing.T) { require.NoError(t, err) go func() { tx, err := db.BeginTx(t.Context(), &sql.TxOptions{Isolation: sql.LevelSerializable}) - require.NoError(t, err) + assert.NoError(t, err) err = models.RemoveRestoreHistoryItem(tx.Querier, ri.ID) - require.NoError(t, err) + assert.NoError(t, err) time.Sleep(time.Second * 3) err = tx.Commit() @@ -167,14 +167,14 @@ func TestDeleteArtifact(t *testing.T) { Return(nil).Once() err := removalService.DeleteArtifact(mockedStorage, artifact.ID, true) - assert.NoError(t, err) + require.NoError(t, err) // Removing files running in goroutine, need to wait some time. time.Sleep(time.Second * 3) artifact, err = models.FindArtifactByID(db.Querier, artifact.ID) assert.Nil(t, artifact) - assert.ErrorIs(t, err, models.ErrNotFound) + require.ErrorIs(t, err, models.ErrNotFound) }) t.Run("successful delete pitr", func(t *testing.T) { @@ -224,14 +224,14 @@ func TestDeleteArtifact(t *testing.T) { Return(nil).Once() err = removalService.DeleteArtifact(mockedStorage, artifact.ID, true) - assert.NoError(t, err) + require.NoError(t, err) // Removing files running in goroutine, need to wait some time. time.Sleep(time.Second * 3) artifact, err = models.FindArtifactByID(db.Querier, artifact.ID) assert.Nil(t, artifact) - assert.ErrorIs(t, err, models.ErrNotFound) + require.ErrorIs(t, err, models.ErrNotFound) }) mockedPbmPITRService.AssertExpectations(t) @@ -411,7 +411,7 @@ func TestLockArtifact(t *testing.T) { res, oldStatus, err := removalService.lockArtifact(artifact.ID, models.FailedToDeleteBackupStatus) assert.Nil(t, res) assert.Empty(t, oldStatus) - assert.ErrorIs(t, err, ErrIncorrectArtifactStatus) + require.ErrorIs(t, err, ErrIncorrectArtifactStatus) artifact, err = models.FindArtifactByID(db.Querier, artifact.ID) require.NoError(t, err) @@ -423,7 +423,7 @@ func TestLockArtifact(t *testing.T) { res, oldStatus, err := removalService.lockArtifact(artifact.ID, models.DeletingBackupStatus) assert.Nil(t, res) assert.Empty(t, oldStatus) - assert.ErrorIs(t, err, ErrIncorrectArtifactStatus) + require.ErrorIs(t, err, ErrIncorrectArtifactStatus) artifact, err = models.FindArtifactByID(db.Querier, artifact.ID) require.NoError(t, err) @@ -505,7 +505,7 @@ func TestReleaseArtifact(t *testing.T) { t.Run("wrong releasing status", func(t *testing.T) { err := removalService.releaseArtifact(artifact.ID, models.PendingBackupStatus) - assert.ErrorIs(t, err, ErrIncorrectArtifactStatus) + require.ErrorIs(t, err, ErrIncorrectArtifactStatus) artifact, err = models.FindArtifactByID(db.Querier, artifact.ID) require.NoError(t, err) @@ -515,7 +515,7 @@ func TestReleaseArtifact(t *testing.T) { t.Run("success", func(t *testing.T) { err := removalService.releaseArtifact(artifact.ID, models.SuccessBackupStatus) - assert.NoError(t, err) + require.NoError(t, err) artifact, err = models.FindArtifactByID(db.Querier, artifact.ID) require.NoError(t, err) diff --git a/managed/services/backup/retention_service_test.go b/managed/services/backup/retention_service_test.go index 8e176a5f004..427118ef139 100644 --- a/managed/services/backup/retention_service_test.go +++ b/managed/services/backup/retention_service_test.go @@ -76,7 +76,7 @@ func TestEnsureRetention(t *testing.T) { // Returns nil, no dependency calls. err = retentionService.EnforceRetention(wrongModetask.ID) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("successful snapshot", func(t *testing.T) { @@ -145,27 +145,27 @@ func TestEnsureRetention(t *testing.T) { createArtifact() assert.Equal(t, 1, countArtifacts()) createArtifact() - assert.NoError(t, retentionService.EnforceRetention(task.ID)) + require.NoError(t, retentionService.EnforceRetention(task.ID)) assert.Equal(t, 2, countArtifacts()) createArtifact() createArtifact() createArtifact() - assert.NoError(t, retentionService.EnforceRetention(task.ID)) + require.NoError(t, retentionService.EnforceRetention(task.ID)) assert.Equal(t, 5, countArtifacts()) changeRetention(6) - assert.NoError(t, retentionService.EnforceRetention(task.ID)) + require.NoError(t, retentionService.EnforceRetention(task.ID)) assert.Equal(t, 5, countArtifacts()) changeRetention(4) mockedRemovalService.On("DeleteArtifact", mock.Anything, mock.Anything, true).Return(nil).Run(deleteArtifacts).Once() - assert.NoError(t, retentionService.EnforceRetention(task.ID)) + require.NoError(t, retentionService.EnforceRetention(task.ID)) assert.Equal(t, 4, countArtifacts()) changeRetention(2) mockedRemovalService.On("DeleteArtifact", mock.Anything, mock.Anything, true).Return(nil).Run(deleteArtifacts).Twice() - assert.NoError(t, retentionService.EnforceRetention(task.ID)) + require.NoError(t, retentionService.EnforceRetention(task.ID)) assert.Equal(t, 2, countArtifacts()) }) diff --git a/managed/services/checks/checks_test.go b/managed/services/checks/checks_test.go index 0cb2b9f7983..9d5d4c63730 100644 --- a/managed/services/checks/checks_test.go +++ b/managed/services/checks/checks_test.go @@ -306,7 +306,7 @@ func TestStartChecks(t *testing.T) { s.customCheckFile = testChecksFile err := s.runChecksGroup(t.Context(), "unknown") - assert.EqualError(t, err, "unknown check interval: unknown") + require.EqualError(t, err, "unknown check interval: unknown") }) t.Run("advisors enabled", func(t *testing.T) { @@ -332,7 +332,7 @@ func TestStartChecks(t *testing.T) { require.NoError(t, err) err = s.runChecksGroup(t.Context(), "") - assert.ErrorIs(t, err, services.ErrAdvisorsDisabled) + require.ErrorIs(t, err, services.ErrAdvisorsDisabled) }) } @@ -703,7 +703,7 @@ func TestGetFailedChecks(t *testing.T) { results, err := s.GetChecksResults(t.Context(), "test_svc") assert.Nil(t, results) - assert.ErrorIs(t, err, services.ErrAdvisorsDisabled) + require.ErrorIs(t, err, services.ErrAdvisorsDisabled) }) } @@ -780,7 +780,7 @@ func TestFillQueryPlaceholders(t *testing.T) { assert.Equal(t, tt.expected, actual) } else { require.Error(t, err) - assert.ErrorContains(t, err, tt.errString) + require.ErrorContains(t, err, tt.errString) } }) } diff --git a/managed/services/checks/funcs_test.go b/managed/services/checks/funcs_test.go index b42b2fc874c..1f623bff6c4 100644 --- a/managed/services/checks/funcs_test.go +++ b/managed/services/checks/funcs_test.go @@ -63,7 +63,7 @@ Traceback (most recent call last): TestVersion:2:22: in check_context : in parse_version `) + "\n" - assert.EqualError(t, err, expectedErr) + require.Error(t, err, expectedErr) assert.Empty(t, res) input = []map[string]interface{}{ @@ -76,7 +76,7 @@ Traceback (most recent call last): TestVersion:2:22: in check_context : in parse_version `) + "\n" - assert.EqualError(t, err, expectedErr) + require.Error(t, err, expectedErr) assert.Empty(t, res) input = []map[string]interface{}{ @@ -277,7 +277,7 @@ def check_context(rows, context): require.NoError(t, err) assert.Equal(t, tc.result, res) } else { - assert.EqualError(t, err, tc.err) + require.Error(t, err, tc.err) assert.Empty(t, res) } }) diff --git a/managed/services/converters_test.go b/managed/services/converters_test.go index 783cbf06385..4ca890a0da7 100644 --- a/managed/services/converters_test.go +++ b/managed/services/converters_test.go @@ -144,7 +144,7 @@ func TestToAPIAgent(t *testing.T) { got, err := ToAPIAgent(tt.args.q, tt.args.agent) if tt.wantErr != nil { - assert.ErrorIs(t, err, tt.wantErr) + require.ErrorIs(t, err, tt.wantErr) } else { assert.Equalf(t, tt.want, got, "ToAPIAgent(%v, %v)", tt.args.q, tt.args.agent) } diff --git a/managed/services/grafana/client_test.go b/managed/services/grafana/client_test.go index 0a148961a48..d84f67340f9 100644 --- a/managed/services/grafana/client_test.go +++ b/managed/services/grafana/client_test.go @@ -493,7 +493,7 @@ func TestClient(t *testing.T) { t.Run("GrafanaAdmin", func(t *testing.T) { u, err := c.getAuthUser(ctx, authHeaders, l) role := u.role - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, grafanaAdmin, role) assert.Equal(t, "GrafanaAdmin", role.String()) }) @@ -538,7 +538,7 @@ func TestClient(t *testing.T) { u, err := c.getAuthUser(ctx, userAuthHeaders, l) actualRole := u.role - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, viewer, actualRole) assert.Equal(t, viewer.String(), actualRole.String()) }) @@ -591,7 +591,7 @@ func TestClient(t *testing.T) { serviceTokenAuthHeaders := http.Header{} serviceTokenAuthHeaders.Set("Authorization", fmt.Sprintf("Bearer %s", serviceToken)) u, err := c.getAuthUser(ctx, serviceTokenAuthHeaders, l) - assert.NoError(t, err) + require.NoError(t, err) actualRole := u.role assert.Equal(t, role, actualRole) assert.Equal(t, role.String(), actualRole.String()) diff --git a/managed/services/inventory/services_test.go b/managed/services/inventory/services_test.go index ded0854ad58..6b903ca60eb 100644 --- a/managed/services/inventory/services_test.go +++ b/managed/services/inventory/services_test.go @@ -346,7 +346,7 @@ func TestServices(t *testing.T) { Address: new("127.0.0.1"), Port: new(uint16(27017)), }) - assert.NoError(t, err) + require.NoError(t, err) expectedMongoDBService := &inventoryv1.MongoDBService{ ServiceId: "00000000-0000-4000-8000-000000000005", @@ -960,14 +960,14 @@ func TestServices(t *testing.T) { }, ) assert.NotNil(t, response) - assert.NoError(t, err) + require.NoError(t, err) service, err = models.FindServiceByID(s.db.Querier, service.ServiceID) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, service) labels, err := service.GetCustomLabels() - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, labels, 2) assert.Equal(t, "newValue", labels["newKey"]) assert.Equal(t, "newValue2", labels["newKey2"]) @@ -1004,14 +1004,14 @@ func TestServices(t *testing.T) { }, ) - assert.NoError(t, err) + require.NoError(t, err) service, err = models.FindServiceByID(s.db.Querier, service.ServiceID) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, service) labels, err := service.GetCustomLabels() - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, labels, 2) assert.Equal(t, "newValue", labels["newKey"]) assert.Equal(t, "newValue-replaced", labels["newKey2"]) @@ -1055,14 +1055,14 @@ func TestServices(t *testing.T) { }, nil, ) - assert.NoError(t, err) + require.NoError(t, err) service, err = models.FindServiceByID(s.db.Querier, service.ServiceID) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, service) labels, err := service.GetCustomLabels() - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, labels, 1) assert.Equal(t, "newValue3", labels["newKey3"]) }) diff --git a/managed/services/management/accesscontrol_test.go b/managed/services/management/accesscontrol_test.go index 1f006a41240..dc8418dc357 100644 --- a/managed/services/management/accesscontrol_test.go +++ b/managed/services/management/accesscontrol_test.go @@ -252,7 +252,7 @@ func TestAccessControlService(t *testing.T) { RoleId: 1337, }) - assert.Error(t, err) + require.Error(t, err) }) }) } diff --git a/managed/services/management/backup/backup_service_test.go b/managed/services/management/backup/backup_service_test.go index f61c700e6a8..af159692450 100644 --- a/managed/services/management/backup/backup_service_test.go +++ b/managed/services/management/backup/backup_service_test.go @@ -239,7 +239,7 @@ func TestStartBackup(t *testing.T) { assert.Equal(t, test.ErrString, err.Error()) return } - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, res) }) } @@ -322,7 +322,7 @@ func TestScheduledBackups(t *testing.T) { } _, err = backupSvc.ChangeScheduledBackup(ctx, changeReq) - assert.NoError(t, err) + require.NoError(t, err) task, err = models.FindScheduledTaskByID(db.Querier, res.ScheduledBackupId) require.NoError(t, err) data = task.Data.MySQLBackupTask @@ -337,7 +337,7 @@ func TestScheduledBackups(t *testing.T) { t.Run("list", func(t *testing.T) { res, err := backupSvc.ListScheduledBackups(ctx, &backupv1.ListScheduledBackupsRequest{}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, res.ScheduledBackups, 1) }) @@ -366,7 +366,7 @@ func TestScheduledBackups(t *testing.T) { _, err = backupSvc.RemoveScheduledBackup(ctx, &backupv1.RemoveScheduledBackupRequest{ ScheduledBackupId: task.ID, }) - assert.NoError(t, err) + require.NoError(t, err) task, err = models.FindScheduledTaskByID(db.Querier, task.ID) assert.Nil(t, task) @@ -376,7 +376,7 @@ func TestScheduledBackups(t *testing.T) { ScheduleID: id, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, artifacts) }) }) @@ -485,7 +485,7 @@ func TestGetLogs(t *testing.T) { ChunkID: chunkID, Data: "not important", }) - assert.NoError(t, err) + require.NoError(t, err) } for _, tc := range testCases { @@ -494,7 +494,7 @@ func TestGetLogs(t *testing.T) { Offset: tc.offset, Limit: tc.limit, }) - assert.NoError(t, err) + require.NoError(t, err) chunkIDs := make([]uint32, 0, len(logs.Logs)) for _, log := range logs.Logs { chunkIDs = append(chunkIDs, log.ChunkId) @@ -558,7 +558,7 @@ func TestListPitrTimeranges(t *testing.T) { DataModel: models.LogicalDataModel, Status: models.PendingBackupStatus, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, artifact.ID) response, err := backupSvc.ListPitrTimeranges(ctx, &backupv1.ListPitrTimerangesRequest{ @@ -588,7 +588,7 @@ func TestListPitrTimeranges(t *testing.T) { DataModel: models.LogicalDataModel, Status: models.PendingBackupStatus, }) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, artifact.ID) response, err := backupSvc.ListPitrTimeranges(ctx, &backupv1.ListPitrTimerangesRequest{ @@ -632,7 +632,7 @@ func TestArtifactMetadataListToProto(t *testing.T) { DataModel: models.LogicalDataModel, Status: models.PendingBackupStatus, }) - assert.NoError(t, err) + require.NoError(t, err) artifact, err = models.UpdateArtifact(db.Querier, artifact.ID, models.UpdateArtifactParams{ Metadata: &models.Metadata{ diff --git a/managed/services/management/backup/locations_service_test.go b/managed/services/management/backup/locations_service_test.go index ef52c7abb3e..d24d441a9a3 100644 --- a/managed/services/management/backup/locations_service_test.go +++ b/managed/services/management/backup/locations_service_test.go @@ -304,12 +304,12 @@ func TestRemoveBackupLocation(t *testing.T) { _, err = svc.RemoveLocation(ctx, &backuppb.RemoveLocationRequest{ LocationId: res1.LocationId, }) - assert.NoError(t, err) + require.NoError(t, err) _, err = svc.RemoveLocation(ctx, &backuppb.RemoveLocationRequest{ LocationId: res3.LocationId, }) - assert.NoError(t, err) + require.NoError(t, err) res, err := svc.ListLocations(ctx, &backuppb.ListLocationsRequest{}) require.NoError(t, err) @@ -322,7 +322,7 @@ func TestRemoveBackupLocation(t *testing.T) { _, err = svc.RemoveLocation(ctx, &backuppb.RemoveLocationRequest{ LocationId: "non-existing", }) - assert.ErrorIs(t, err, models.ErrNotFound) + require.ErrorIs(t, err, models.ErrNotFound) } func TestVerifyBackupLocationValidation(t *testing.T) { @@ -445,10 +445,10 @@ func TestVerifyBackupLocationValidation(t *testing.T) { t.Run(test.name, func(t *testing.T) { _, err := svc.TestLocationConfig(ctx, test.req) if test.errorMsg != "" { - assert.EqualError(t, err, test.errorMsg) + require.EqualError(t, err, test.errorMsg) return } - assert.NoError(t, err) + require.NoError(t, err) }) } } diff --git a/managed/services/management/backup/restore_service_test.go b/managed/services/management/backup/restore_service_test.go index 066b9114e3b..c1c2e11c5ca 100644 --- a/managed/services/management/backup/restore_service_test.go +++ b/managed/services/management/backup/restore_service_test.go @@ -95,7 +95,7 @@ func TestRestoreServiceGetLogs(t *testing.T) { ChunkID: chunkID, Data: "not important", }) - assert.NoError(t, err) + require.NoError(t, err) } for _, tc := range testCases { logs, err := restoreSvc.GetLogs(ctx, &backupv1.RestoreServiceGetLogsRequest{ @@ -103,7 +103,7 @@ func TestRestoreServiceGetLogs(t *testing.T) { Offset: tc.offset, Limit: tc.limit, }) - assert.NoError(t, err) + require.NoError(t, err) chunkIDs := make([]uint32, 0, len(logs.Logs)) for _, log := range logs.Logs { chunkIDs = append(chunkIDs, log.ChunkId) @@ -132,7 +132,7 @@ func TestRestoreServiceGetLogs(t *testing.T) { ChunkID: chunkID, Data: "not important", }) - assert.NoError(t, err) + require.NoError(t, err) } for _, tc := range testCases { @@ -141,7 +141,7 @@ func TestRestoreServiceGetLogs(t *testing.T) { Offset: tc.offset, Limit: tc.limit, }) - assert.NoError(t, err) + require.NoError(t, err) chunkIDs := make([]uint32, 0, len(logs.Logs)) for _, log := range logs.Logs { chunkIDs = append(chunkIDs, log.ChunkId) diff --git a/managed/services/management/checks_test.go b/managed/services/management/checks_test.go index c2657d2876c..2a4a20c1540 100644 --- a/managed/services/management/checks_test.go +++ b/managed/services/management/checks_test.go @@ -42,7 +42,7 @@ func TestStartAdvisorChecks(t *testing.T) { s := NewChecksAPIService(&checksService) resp, err := s.StartAdvisorChecks(t.Context(), &advisorsv1.StartAdvisorChecksRequest{}) - assert.EqualError(t, err, "failed to start advisor checks: random error") + require.EqualError(t, err, "failed to start advisor checks: random error") assert.Nil(t, resp) }) @@ -73,7 +73,7 @@ func TestGetFailedChecks(t *testing.T) { resp, err := s.GetFailedChecks(t.Context(), &advisorsv1.GetFailedChecksRequest{ ServiceId: serviceID, }) - assert.EqualError(t, err, fmt.Sprintf("failed to get check results for service '%s': random error", serviceID)) + require.EqualError(t, err, fmt.Sprintf("failed to get check results for service '%s': random error", serviceID)) assert.Nil(t, resp) }) @@ -217,7 +217,7 @@ func TestListFailedServices(t *testing.T) { s := NewChecksAPIService(&checksService) resp, err := s.ListFailedServices(t.Context(), &advisorsv1.ListFailedServicesRequest{}) - assert.EqualError(t, err, "failed to get check results: random error") + require.EqualError(t, err, "failed to get check results: random error") assert.Nil(t, resp) }) @@ -333,7 +333,7 @@ func TestListAdvisorChecks(t *testing.T) { s := NewChecksAPIService(&checksService) resp, err := s.ListAdvisorChecks(t.Context(), nil) - assert.EqualError(t, err, "failed to get disabled checks list: random error") + require.EqualError(t, err, "failed to get disabled checks list: random error") assert.Nil(t, resp) }) } @@ -346,7 +346,7 @@ func TestUpdateAdvisorChecks(t *testing.T) { s := NewChecksAPIService(&checksService) resp, err := s.ChangeAdvisorChecks(t.Context(), &advisorsv1.ChangeAdvisorChecksRequest{}) - assert.EqualError(t, err, "failed to enable disabled advisor checks: random error") + require.EqualError(t, err, "failed to enable disabled advisor checks: random error") assert.Nil(t, resp) }) @@ -358,7 +358,7 @@ func TestUpdateAdvisorChecks(t *testing.T) { s := NewChecksAPIService(&checksService) resp, err := s.ChangeAdvisorChecks(t.Context(), &advisorsv1.ChangeAdvisorChecksRequest{}) - assert.EqualError(t, err, "failed to disable advisor checks: random error") + require.EqualError(t, err, "failed to disable advisor checks: random error") assert.Nil(t, resp) }) @@ -374,7 +374,7 @@ func TestUpdateAdvisorChecks(t *testing.T) { Interval: advisorsv1.AdvisorCheckInterval_ADVISOR_CHECK_INTERVAL_STANDARD, }}, }) - assert.EqualError(t, err, "failed to change advisor check interval: random error") + require.EqualError(t, err, "failed to change advisor check interval: random error") assert.Nil(t, resp) }) diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index ec16cf438ea..5502569b0b9 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -119,7 +119,7 @@ func TestNodeService(t *testing.T) { Token: "test-token", } assert.Equal(t, expected, res) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("Exist", func(t *testing.T) { @@ -184,7 +184,7 @@ func TestNodeService(t *testing.T) { Token: "test-token", } assert.Equal(t, expected, res) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("Register/Unregister", func(t *testing.T) { @@ -219,13 +219,13 @@ func TestNodeService(t *testing.T) { Region: "region", Reregister: true, }) - assert.NoError(t, err) + require.NoError(t, err) res, err := s.UnregisterNode(ctx, &managementv1.UnregisterNodeRequest{ NodeId: resRegister.GenericNode.NodeId, Force: true, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Empty(t, res.Warning) }) }) diff --git a/managed/services/management/service_test.go b/managed/services/management/service_test.go index 2bc23097bec..310c1d264bb 100644 --- a/managed/services/management/service_test.go +++ b/managed/services/management/service_test.go @@ -154,7 +154,7 @@ func TestServiceService(t *testing.T) { s.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, pmmAgent.AgentID) response, err := s.RemoveService(ctx, &managementv1.RemoveServiceRequest{ServiceId: service.ServiceName, ServiceType: inventoryv1.ServiceType_SERVICE_TYPE_MYSQL_SERVICE}) assert.NotNil(t, response) - assert.NoError(t, err) + require.NoError(t, err) agent, err := models.FindAgentByID(s.db.Querier, mysqldExporter.AgentID) assert.Nil(t, agent) @@ -204,7 +204,7 @@ func TestServiceService(t *testing.T) { s.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, pmmAgent.AgentID) _, err = s.RemoveService(ctx, &managementv1.RemoveServiceRequest{ServiceId: service.ServiceName, ServiceType: inventoryv1.ServiceType_SERVICE_TYPE_MYSQL_SERVICE}) - assert.NoError(t, err) + require.NoError(t, err) _, err = models.FindServiceByID(s.db.Querier, service.ServiceID) tests.AssertGRPCError(t, status.New(codes.NotFound, fmt.Sprintf(`Service with ID "%s" not found.`, service.ServiceID)), err) @@ -258,7 +258,7 @@ func TestServiceService(t *testing.T) { s.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, pmmAgent.AgentID) _, err = s.RemoveService(ctx, &managementv1.RemoveServiceRequest{ServiceId: service.ServiceName, ServiceType: inventoryv1.ServiceType_SERVICE_TYPE_MYSQL_SERVICE}) - assert.NoError(t, err) + require.NoError(t, err) _, err = models.FindServiceByID(s.db.Querier, service.ServiceID) tests.AssertGRPCError(t, status.New(codes.NotFound, fmt.Sprintf(`Service with ID "%s" not found.`, service.ServiceID)), err) diff --git a/managed/services/preconditions_test.go b/managed/services/preconditions_test.go index 3fa6ed7c410..d46da7780a5 100644 --- a/managed/services/preconditions_test.go +++ b/managed/services/preconditions_test.go @@ -20,7 +20,6 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -252,17 +251,17 @@ func TestCheckArtifactOverlapping(t *testing.T) { require.NoError(t, err) err = CheckArtifactOverlapping(db.Querier, mongoSvc2.ServiceID, location.ID, folder1) - assert.NoError(t, err) + require.NoError(t, err) err = CheckArtifactOverlapping(db.Querier, mongoSvc3.ServiceID, location.ID, folder1) - assert.ErrorIs(t, err, ErrLocationFolderPairAlreadyUsed) + require.ErrorIs(t, err, ErrLocationFolderPairAlreadyUsed) err = CheckArtifactOverlapping(db.Querier, mysqlSvc1.ServiceID, location.ID, folder1) - assert.ErrorIs(t, err, ErrLocationFolderPairAlreadyUsed) + require.ErrorIs(t, err, ErrLocationFolderPairAlreadyUsed) err = CheckArtifactOverlapping(db.Querier, mysqlSvc2.ServiceID, location.ID, folder2) - assert.NoError(t, err) + require.NoError(t, err) err = CheckArtifactOverlapping(db.Querier, mongoSvc1.ServiceID, location.ID, folder2) - assert.ErrorIs(t, err, ErrLocationFolderPairAlreadyUsed) + require.ErrorIs(t, err, ErrLocationFolderPairAlreadyUsed) } diff --git a/managed/services/qan/client_test.go b/managed/services/qan/client_test.go index d0a52877cfc..7b06f097ee7 100644 --- a/managed/services/qan/client_test.go +++ b/managed/services/qan/client_test.go @@ -42,7 +42,7 @@ func TestClient(t *testing.T) { db := reform.NewDB(sqlDB, postgresql.Dialect, reformL) ctx := logger.Set(t.Context(), t.Name()) defer func() { - assert.NoError(t, sqlDB.Close()) + require.NoError(t, sqlDB.Close()) assert.Equal(t, 18, reformL.Requests()) }() @@ -439,7 +439,7 @@ func TestClientPerformance(t *testing.T) { reformL := sqlmetrics.NewReform("test", "test", t.Logf) db := reform.NewDB(sqlDB, postgresql.Dialect, reformL) defer func() { - assert.NoError(t, sqlDB.Close()) + require.NoError(t, sqlDB.Close()) }() for _, str := range []reform.Struct{ diff --git a/managed/services/scheduler/scheduler_test.go b/managed/services/scheduler/scheduler_test.go index 9b908b2f346..3bcfb590f52 100644 --- a/managed/services/scheduler/scheduler_test.go +++ b/managed/services/scheduler/scheduler_test.go @@ -143,6 +143,6 @@ func TestService(t *testing.T) { assert.Empty(t, scheduler.scheduler.Jobs()) _, err = models.FindScheduledTaskByID(scheduler.db.Querier, dbTask.ID) - assert.ErrorIs(t, err, models.ErrNotFound) + require.ErrorIs(t, err, models.ErrNotFound) }) } diff --git a/managed/services/scheduler/task_test.go b/managed/services/scheduler/task_test.go index 41e726e8cf4..6bf7fe6b32d 100644 --- a/managed/services/scheduler/task_test.go +++ b/managed/services/scheduler/task_test.go @@ -18,7 +18,6 @@ package scheduler import ( "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/percona/pmm/managed/models" @@ -164,7 +163,7 @@ func TestValidation(t *testing.T) { _, err := NewMySQLBackupTask(tt.params) if tt.errMsg != "" { - assert.EqualError(t, err, tt.errMsg) + require.EqualError(t, err, tt.errMsg) return } @@ -321,7 +320,7 @@ func TestValidation(t *testing.T) { _, err := NewMongoDBBackupTask(tt.params) if tt.errMsg != "" { - assert.EqualError(t, err, tt.errMsg) + require.EqualError(t, err, tt.errMsg) return } diff --git a/managed/services/server/logs_test.go b/managed/services/server/logs_test.go index a048f151397..5d0d8bad073 100644 --- a/managed/services/server/logs_test.go +++ b/managed/services/server/logs_test.go @@ -137,16 +137,16 @@ func TestAddAdminSummary(t *testing.T) { t.Skip("FIXME") zipfile, err := os.CreateTemp(t.TempDir(), "*-test.zip") - assert.NoError(t, err) + require.NoError(t, err) zw := zip.NewWriter(zipfile) err = addAdminSummary(t.Context(), zw) - assert.NoError(t, err) + require.NoError(t, err) - assert.NoError(t, zw.Close()) + require.NoError(t, zw.Close()) reader, err := zip.OpenReader(zipfile.Name()) - assert.NoError(t, err) + require.NoError(t, err) hasClientDir := false for _, file := range reader.File { @@ -171,18 +171,18 @@ func TestFiles(t *testing.T) { actual := make([]string, 0, len(files)) for _, f := range files { if f.Name == "prometheus.base.yml" { - assert.EqualError(t, f.Err, "open /srv/prometheus/prometheus.base.yml: no such file or directory") + require.EqualError(t, f.Err, "open /srv/prometheus/prometheus.base.yml: no such file or directory") continue } if f.Name == "supervisorctl_status.log" { - assert.EqualError(t, f.Err, "exit status 3") + require.EqualError(t, f.Err, "exit status 3") // NOTE: this fails in supervisorctl v4+ if there are stopped services; it is not critical because the call succeeds actual = append(actual, f.Name) continue } - assert.NoError(t, f.Err, "name = %q", f.Name) + require.NoError(t, f.Err, "name = %q", f.Name) actual = append(actual, f.Name) } diff --git a/managed/services/server/server_test.go b/managed/services/server/server_test.go index 3ebbfcb57e8..efb36e8a0cf 100644 --- a/managed/services/server/server_test.go +++ b/managed/services/server/server_test.go @@ -213,7 +213,7 @@ func TestServer(t *testing.T) { tests.AssertGRPCError(t, expected, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ EnableUpdates: new(false), })) - assert.NoError(t, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ + require.NoError(t, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ EnableUpdates: new(true), })) @@ -222,7 +222,7 @@ func TestServer(t *testing.T) { tests.AssertGRPCError(t, expected, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ UpdateSnoozeDuration: durationpb.New(12 * time.Hour), })) - assert.NoError(t, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ + require.NoError(t, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ UpdateSnoozeDuration: durationpb.New(24 * time.Hour), })) @@ -231,7 +231,7 @@ func TestServer(t *testing.T) { tests.AssertGRPCError(t, expected, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ EnableTelemetry: new(false), })) - assert.NoError(t, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ + require.NoError(t, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ EnableTelemetry: new(true), })) @@ -240,14 +240,14 @@ func TestServer(t *testing.T) { tests.AssertGRPCError(t, expected, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ EnableInternalPgQan: new(false), })) - assert.NoError(t, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ + require.NoError(t, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ EnableInternalPgQan: new(true), })) - assert.NoError(t, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ + require.NoError(t, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ EnableAdvisor: new(false), })) - assert.NoError(t, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ + require.NoError(t, s.validateChangeSettingsRequest(ctx, &serverv1.ChangeSettingsRequest{ EnableAdvisor: new(true), })) }) diff --git a/managed/services/supervisord/devcontainer_test.go b/managed/services/supervisord/devcontainer_test.go index 714e1bf3dfa..ecc9a2fce81 100644 --- a/managed/services/supervisord/devcontainer_test.go +++ b/managed/services/supervisord/devcontainer_test.go @@ -54,11 +54,11 @@ func TestDevContainer(t *testing.T) { defer func() { for name, b := range originals { err = os.WriteFile(name, b, 0) - assert.NoError(t, err) + require.NoError(t, err) } // force update supervisor config _, err := s.supervisorctl("update") - assert.NoError(t, err) + require.NoError(t, err) }() settings := &models.Settings{ diff --git a/managed/services/telemetry/telemetry_test.go b/managed/services/telemetry/telemetry_test.go index d099757a124..293e3d60858 100644 --- a/managed/services/telemetry/telemetry_test.go +++ b/managed/services/telemetry/telemetry_test.go @@ -165,7 +165,7 @@ func TestRunTelemetryService(t *testing.T) { serviceConfig := getServiceConfig(pgHostPort, qanDSN, vmDSN) registry, err := NewDataSourceRegistry(serviceConfig, logEntry) - assert.NoError(t, err) + require.NoError(t, err) s := Service{ db: db, diff --git a/managed/services/telemetry/transform_test.go b/managed/services/telemetry/transform_test.go index bb5be072be8..cb78bda9253 100644 --- a/managed/services/telemetry/transform_test.go +++ b/managed/services/telemetry/transform_test.go @@ -20,6 +20,7 @@ import ( telemetryv1 "github.com/percona/platform/gen/telemetry/generic" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestTransformToJSON(t *testing.T) { @@ -34,7 +35,7 @@ func TestTransformToJSON(t *testing.T) { name string args args want []*telemetryv1.GenericReport_Metric - wantErr assert.ErrorAssertionFunc + wantErr require.ErrorAssertionFunc }{ { name: "nil metrics", @@ -43,7 +44,7 @@ func TestTransformToJSON(t *testing.T) { metrics: nil, }, want: nil, - wantErr: assert.NoError, + wantErr: require.NoError, }, { name: "empty metrics", @@ -52,7 +53,7 @@ func TestTransformToJSON(t *testing.T) { metrics: noMetrics, }, want: noMetrics, - wantErr: assert.NoError, + wantErr: require.NoError, }, { name: "no Transform in config", @@ -61,7 +62,7 @@ func TestTransformToJSON(t *testing.T) { metrics: noMetrics, }, want: noMetrics, - wantErr: assert.NoError, + wantErr: require.NoError, }, { name: "no Metrics config", @@ -70,7 +71,7 @@ func TestTransformToJSON(t *testing.T) { metrics: noMetrics, }, want: noMetrics, - wantErr: assert.NoError, + wantErr: require.NoError, }, { name: "no Metric Name config", @@ -79,7 +80,7 @@ func TestTransformToJSON(t *testing.T) { metrics: noMetrics, }, want: noMetrics, - wantErr: assert.NoError, + wantErr: require.NoError, }, { name: "invalid seq", @@ -93,7 +94,7 @@ func TestTransformToJSON(t *testing.T) { }, }, want: nil, - wantErr: assert.Error, + wantErr: require.Error, }, { name: "correct seq", @@ -109,7 +110,7 @@ func TestTransformToJSON(t *testing.T) { want: []*telemetryv1.GenericReport_Metric{ {Key: configJSON().Transform.Metric, Value: `{"v":[{"b":"v1","my-metric":"v1"},{"b":"v1","my-metric":"v1"}]}`}, }, - wantErr: assert.NoError, + wantErr: require.NoError, }, { name: "happy path", @@ -123,7 +124,7 @@ func TestTransformToJSON(t *testing.T) { want: []*telemetryv1.GenericReport_Metric{ {Key: configJSON().Transform.Metric, Value: `{"v":[{"my-metric":"v1"},{"my-metric":"v2"}]}`}, }, - wantErr: assert.NoError, + wantErr: require.NoError, }, { name: "test_mysql_plugins_with_an_missing_metric", @@ -145,17 +146,14 @@ func TestTransformToJSON(t *testing.T) { want: []*telemetryv1.GenericReport_Metric{ {Key: "metric", Value: `{"v":[{"licence":"GPL","name":"INNODB_TABLES","status":"ACTIVE","type":"INFORMATION SCHEMA"}]}`}, }, - wantErr: assert.NoError, + wantErr: require.NoError, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := transformToJSON(tt.args.config, tt.args.metrics) - if !tt.wantErr(t, err) { - t.Logf("config: %v", tt.args.config) - return - } + tt.wantErr(t, err) assert.Equalf(t, tt.want, got, "transformToJSON(%v, %v)", tt.args.config, tt.args.metrics) }) } @@ -173,7 +171,7 @@ func TestTransformExportValues(t *testing.T) { name string args args want []*telemetryv1.GenericReport_Metric - wantErr assert.ErrorAssertionFunc + wantErr require.ErrorAssertionFunc }{ { name: "nil metrics", @@ -182,7 +180,7 @@ func TestTransformExportValues(t *testing.T) { metrics: nil, }, want: nil, - wantErr: assert.NoError, + wantErr: require.NoError, }, { name: "empty metrics", @@ -191,7 +189,7 @@ func TestTransformExportValues(t *testing.T) { metrics: noMetrics, }, want: noMetrics, - wantErr: assert.NoError, + wantErr: require.NoError, }, { name: "no Transform in config", @@ -200,7 +198,7 @@ func TestTransformExportValues(t *testing.T) { metrics: noMetrics, }, want: noMetrics, - wantErr: assert.NoError, + wantErr: require.NoError, }, { name: "no Metrics config", @@ -209,7 +207,7 @@ func TestTransformExportValues(t *testing.T) { metrics: noMetrics, }, want: noMetrics, - wantErr: assert.NoError, + wantErr: require.NoError, }, { name: "invalid data source", @@ -221,7 +219,7 @@ func TestTransformExportValues(t *testing.T) { }, }, want: nil, - wantErr: assert.Error, + wantErr: require.Error, }, { name: "happy path", @@ -236,17 +234,14 @@ func TestTransformExportValues(t *testing.T) { {Key: "metric-a", Value: "1"}, {Key: "metric-b", Value: "1"}, }, - wantErr: assert.NoError, + wantErr: require.NoError, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := transformExportValues(tt.args.config, tt.args.metrics) - if !tt.wantErr(t, err) { - t.Logf("config: %v", tt.args.config) - return - } + tt.wantErr(t, err) assert.Equalf(t, tt.want, got, "transformExportValues(%v, %v)", tt.args.config, tt.args.metrics) }) } diff --git a/managed/services/versioncache/versioncache_test.go b/managed/services/versioncache/versioncache_test.go index b46a2acb30d..60c5ffd4592 100644 --- a/managed/services/versioncache/versioncache_test.go +++ b/managed/services/versioncache/versioncache_test.go @@ -81,10 +81,10 @@ func TestVersionCache(t *testing.T) { require.NoError(t, db.Insert(str)) } t.Cleanup(func() { - assert.NoError(t, db.Delete(&models.Agent{AgentID: agentID2})) - assert.NoError(t, db.Delete(&models.Agent{AgentID: agentID1})) - assert.NoError(t, db.Delete(&models.Service{ServiceID: serviceID1})) - assert.NoError(t, db.Delete(&models.Node{NodeID: nodeID1})) + require.NoError(t, db.Delete(&models.Agent{AgentID: agentID2})) + require.NoError(t, db.Delete(&models.Agent{AgentID: agentID1})) + require.NoError(t, db.Delete(&models.Service{ServiceID: serviceID1})) + require.NoError(t, db.Delete(&models.Node{NodeID: nodeID1})) }) softwares := agents.GetRequiredBackupSoftwareList(models.MySQLServiceType) @@ -210,16 +210,16 @@ func TestVersionCache(t *testing.T) { require.NoError(t, db.Insert(str)) } t.Cleanup(func() { - assert.NoError(t, db.Delete(&models.Agent{AgentID: agentID2})) - assert.NoError(t, db.Delete(&models.Agent{AgentID: agentID1})) - assert.NoError(t, db.Delete(&models.Service{ServiceID: serviceID1})) - assert.NoError(t, db.Delete(&models.Node{NodeID: nodeID1})) + require.NoError(t, db.Delete(&models.Agent{AgentID: agentID2})) + require.NoError(t, db.Delete(&models.Agent{AgentID: agentID1})) + require.NoError(t, db.Delete(&models.Service{ServiceID: serviceID1})) + require.NoError(t, db.Delete(&models.Node{NodeID: nodeID1})) }) versionerMock := &MockVersioner{} cache := New(db, versionerMock) nextCheck, err := cache.updateVersionsForNextService() - assert.ErrorIs(t, err, ErrInvalidArgument) + require.ErrorIs(t, err, ErrInvalidArgument) assert.Equal(t, minCheckInterval, nextCheck) versionerMock.AssertNotCalled(t, "GetVersions") diff --git a/managed/services/victoriametrics/victoriametrics_test.go b/managed/services/victoriametrics/victoriametrics_test.go index f21ccdf75fc..cdd4a4e146e 100644 --- a/managed/services/victoriametrics/victoriametrics_test.go +++ b/managed/services/victoriametrics/victoriametrics_test.go @@ -869,12 +869,12 @@ scrape_configs: labels: instance: pmm-server follow_redirects: false`))) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("Bad scrape config file", func(t *testing.T) { err := svc.configAndReload(context.TODO(), []byte(`unexpected input`)) - assert.Errorf(t, err, "error when checking Prometheus config") + require.Errorf(t, err, "error when checking Prometheus config") }) t.Run("Scrape config file with unknown params", func(t *testing.T) { @@ -988,6 +988,6 @@ scrape_configs: follow_redirects: false `) + "\n" newcfg, err := svc.marshalConfig(svc.loadBaseConfig()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, expected, string(newcfg), "actual:\n%s", newcfg) } diff --git a/managed/utils/clean/clean_test.go b/managed/utils/clean/clean_test.go index ba9986c99b8..b5eea559dce 100644 --- a/managed/utils/clean/clean_test.go +++ b/managed/utils/clean/clean_test.go @@ -73,7 +73,7 @@ func TestCleaner(t *testing.T) { teardown := func(t *testing.T) { t.Helper() - assert.NoError(t, models.CleanupOldActionResults(db.Querier, models.Now())) + require.NoError(t, models.CleanupOldActionResults(db.Querier, models.Now())) } return db, q, teardown } @@ -93,16 +93,16 @@ func TestCleaner(t *testing.T) { time.Sleep(100 * time.Millisecond) _, err := models.FindActionResultByID(q, "A1") - assert.Error(t, err) + require.Error(t, err) _, err = models.FindActionResultByID(q, "A2") - assert.Error(t, err) + require.Error(t, err) _, err = models.FindActionResultByID(q, "A3") - assert.Error(t, err) + require.Error(t, err) a, err := models.FindActionResultByID(q, "A4") - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, a.ID) }) } diff --git a/managed/utils/dir/dir_test.go b/managed/utils/dir/dir_test.go index 26993063048..aa9fbe64837 100644 --- a/managed/utils/dir/dir_test.go +++ b/managed/utils/dir/dir_test.go @@ -50,11 +50,11 @@ func TestCreateDataDir(t *testing.T) { err := CreateDataDir(tc.path, tc.perm) if tc.err != "" { - assert.EqualError(t, err, tc.err) + require.EqualError(t, err, tc.err) return } - assert.NoError(t, err) + require.NoError(t, err) stat, err := os.Stat(tc.path) require.NoError(t, err) assert.True(t, stat.IsDir()) @@ -114,7 +114,7 @@ func TestFindFilesWithExtensions(t *testing.T) { t.Parallel() files, err := FindFilesWithExtensions(tmpDir, tc.extensions...) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, files, tc.expected) }) } diff --git a/managed/utils/distribution/distribution_util_test.go b/managed/utils/distribution/distribution_util_test.go index c5ff717d38f..9882a44188e 100644 --- a/managed/utils/distribution/distribution_util_test.go +++ b/managed/utils/distribution/distribution_util_test.go @@ -127,7 +127,7 @@ func Test_distributionUtilServiceImpl_getDistributionMethodAndOS(t *testing.T) { require.NoError(t, err) if tt.dockerVersion != "" { f2, err := writeToTmpFile(t, "", tt.dockerVersion) - assert.NoError(t, err) + require.NoError(t, err) tmpOsInfoFilePath = f2.Name() } @@ -154,7 +154,7 @@ func writeToTmpFile(t *testing.T, tmpDistributionFile string, s string) (*os.Fil t.Cleanup(func() { err := os.Remove(f.Name()) - assert.NoError(t, err) + require.NoError(t, err) }) return f, nil } diff --git a/managed/utils/encryption/encryption_test.go b/managed/utils/encryption/encryption_test.go index 21ebff0adca..33507bd5216 100644 --- a/managed/utils/encryption/encryption_test.go +++ b/managed/utils/encryption/encryption_test.go @@ -33,7 +33,7 @@ func TestEncryptionGenerateKey(t *testing.T) { // Verify it's valid base64 _, err = base64.StdEncoding.DecodeString(key1) - assert.NoError(t, err) + require.NoError(t, err) // Generate another key and ensure they are different key2, err := e.GenerateKey() @@ -43,7 +43,7 @@ func TestEncryptionGenerateKey(t *testing.T) { // Verify second key is also valid base64 _, err = base64.StdEncoding.DecodeString(key2) - assert.NoError(t, err) + require.NoError(t, err) } func TestEncryptionGenerateAndPersistKey(t *testing.T) { @@ -51,7 +51,7 @@ func TestEncryptionGenerateAndPersistKey(t *testing.T) { tempFile, err := os.CreateTemp(t.TempDir(), "encryption_test_*.key") require.NoError(t, err) err = tempFile.Close() - assert.NoError(t, err) + require.NoError(t, err) t.Cleanup(func() { _ = os.Remove(tempFile.Name()) @@ -60,15 +60,15 @@ func TestEncryptionGenerateAndPersistKey(t *testing.T) { e := &Encryption{Path: tempFile.Name()} err = e.generateAndPersistKey() - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, e.Key) // Verify the file was written with the correct content content, err := os.ReadFile(tempFile.Name()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, e.Key, string(content)) // Verify it's valid base64 _, err = base64.StdEncoding.DecodeString(e.Key) - assert.NoError(t, err) + require.NoError(t, err) } diff --git a/managed/utils/pprof/pprof_test.go b/managed/utils/pprof/pprof_test.go index 5cd5da75f1f..dd52066c38a 100644 --- a/managed/utils/pprof/pprof_test.go +++ b/managed/utils/pprof/pprof_test.go @@ -51,16 +51,16 @@ func TestProfile(t *testing.T) { ctx := t.Context() profileBytes, err := Profile(ctx, 1*time.Second) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, profileBytes) // read gzip reader, err := gzip.NewReader(bytes.NewBuffer(profileBytes)) - assert.NoError(t, err) + require.NoError(t, err) var resB bytes.Buffer _, err = resB.ReadFrom(reader) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, resB.Bytes()) }) @@ -88,7 +88,7 @@ func TestTrace(t *testing.T) { ctx := t.Context() traceBytes, err := Trace(ctx, 1*time.Second) - assert.NoError(t, err) + require.NoError(t, err) assert.NotEmpty(t, traceBytes) }) diff --git a/managed/utils/signatures/signatures_test.go b/managed/utils/signatures/signatures_test.go index 9e8935421eb..b001c495357 100644 --- a/managed/utils/signatures/signatures_test.go +++ b/managed/utils/signatures/signatures_test.go @@ -21,7 +21,7 @@ import ( "testing" "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestVerifySignatures(t *testing.T) { @@ -51,7 +51,7 @@ uEF33ScMPYpvHvBKv8+yBkJ9k4+DCfV4nDs6kKYwGhalvkkqwWkyfJffO+KW7a1m3y42WHpOnzBxLJ+I `) err := Verify(l, "random data", []string{invalidSign, validSign}, publicKeys) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("empty signatures", func(t *testing.T) { @@ -60,6 +60,6 @@ uEF33ScMPYpvHvBKv8+yBkJ9k4+DCfV4nDs6kKYwGhalvkkqwWkyfJffO+KW7a1m3y42WHpOnzBxLJ+I publicKeys := []string{"RWSdGihBPffV2c4IysqHAIxc5c5PLfmQStbRPkuLXDr3igJOqFWt7aml"} err := Verify(l, "random data", []string{}, publicKeys) - assert.EqualError(t, err, "zero signatures received") + require.EqualError(t, err, "zero signatures received") }) } diff --git a/managed/utils/tests/asserts.go b/managed/utils/tests/asserts.go index a78cd8483ef..681a65831ae 100644 --- a/managed/utils/tests/asserts.go +++ b/managed/utils/tests/asserts.go @@ -20,6 +20,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) @@ -33,9 +34,7 @@ func AssertGRPCError(tb testing.TB, expected *status.Status, actual error) { return } err := s.Err() - if !assert.Error(tb, err) { //nolint:testifylint - return - } + require.NoError(tb, err) assert.Equal(tb, expected.Err().Error(), err.Error()) // gives the best error message } diff --git a/managed/utils/validators/alerting_rules_test.go b/managed/utils/validators/alerting_rules_test.go index 6d46611d5b5..42822c80e4f 100644 --- a/managed/utils/validators/alerting_rules_test.go +++ b/managed/utils/validators/alerting_rules_test.go @@ -20,6 +20,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestValidateAlertingRules(t *testing.T) { @@ -43,7 +44,7 @@ groups: summary: High request latency `) + "\n" err := ValidateAlertingRules(ctx, rules) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("Invalid", func(t *testing.T) { diff --git a/qan-api2/services/analytics/object_details_test.go b/qan-api2/services/analytics/object_details_test.go index adf2467ad7b..f0fe44ad16e 100644 --- a/qan-api2/services/analytics/object_details_test.go +++ b/qan-api2/services/analytics/object_details_test.go @@ -129,7 +129,7 @@ func TestService_GetQueryExample(t *testing.T) { } got, err := s.GetQueryExample(context.TODO(), tt.in) if (err != nil) != tt.wantErr { - assert.Errorf(t, err, "Service.GetQueryExample() error = %v, wantErr %v", err, tt.wantErr) + require.Errorf(t, err, "Service.GetQueryExample() error = %v, wantErr %v", err, tt.wantErr) } if tt.want == nil { assert.Nil(t, got, "Service.GetQueryExample() returned not nil") @@ -263,7 +263,7 @@ func TestService_GetMetricsError(t *testing.T) { } _, err := s.GetMetrics(context.TODO(), tt.in) if (err != nil) != tt.wantErr { - assert.Errorf(t, err, "Service.GetMetrics() error = %v, wantErr %v", err, tt.wantErr) + require.Errorf(t, err, "Service.GetMetrics() error = %v, wantErr %v", err, tt.wantErr) } }) } @@ -288,7 +288,7 @@ func TestService_GetMetrics(t *testing.T) { FilterBy: "B305F6354FA21F2A", } got, err := s.GetMetrics(context.TODO(), in) - assert.NoError(t, err, "Unexpected error in Service.GetMetrics()") + require.NoError(t, err, "Unexpected error in Service.GetMetrics()") expectedJSON := getExpectedJSON(t, got, "../../test_data/GetMetrics_group_by_queryid.json") marshaler := protojson.MarshalOptions{Indent: "\t"} @@ -312,7 +312,7 @@ func TestService_GetMetrics(t *testing.T) { FilterBy: "B305F6354FA21F2A", } got, err := s.GetMetrics(context.TODO(), in) - assert.NoError(t, err, "Unexpected error in Service.GetMetrics()") + require.NoError(t, err, "Unexpected error in Service.GetMetrics()") expectedJSON := getExpectedJSON(t, got, "../../test_data/GetMetrics_sparklines_90_points.json") marshaler := protojson.MarshalOptions{Indent: "\t"} @@ -336,7 +336,7 @@ func TestService_GetMetrics(t *testing.T) { Totals: true, } got, err := s.GetMetrics(context.TODO(), in) - assert.NoError(t, err, "Unexpected error in Service.GetMetrics()") + require.NoError(t, err, "Unexpected error in Service.GetMetrics()") expectedJSON := getExpectedJSON(t, got, "../../test_data/GetMetrics_total.json") marshaler := protojson.MarshalOptions{Indent: "\t"} diff --git a/qan-api2/services/analytics/profile_test.go b/qan-api2/services/analytics/profile_test.go index d3bcc0cff0b..31be418036e 100644 --- a/qan-api2/services/analytics/profile_test.go +++ b/qan-api2/services/analytics/profile_test.go @@ -26,6 +26,7 @@ import ( "github.com/jmoiron/sqlx" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/grpc/metadata" jsonpb "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" @@ -334,7 +335,7 @@ func TestService_GetReport_Groups(t *testing.T) { } got, err := s.GetReport(makeContext(t), &in) - assert.NoError(t, err, "Unexpected error in Service.GetReport()") + require.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Groups_group_by_queryid.json") marshaler := jsonpb.MarshalOptions{Indent: "\t"} @@ -372,7 +373,7 @@ func TestService_GetReport_Groups(t *testing.T) { } got, err := s.GetReport(makeContext(t), &in) - assert.NoError(t, err, "Unexpected error in Service.GetReport()") + require.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Groups_group_by_service_name.json") marshaler := jsonpb.MarshalOptions{Indent: "\t"} @@ -410,7 +411,7 @@ func TestService_GetReport_Groups(t *testing.T) { } got, err := s.GetReport(makeContext(t), &in) - assert.NoError(t, err, "Unexpected error in Service.GetReport()") + require.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Groups_group_by_database.json") marshaler := jsonpb.MarshalOptions{Indent: "\t"} @@ -448,7 +449,7 @@ func TestService_GetReport_Groups(t *testing.T) { } got, err := s.GetReport(makeContext(t), &in) - assert.NoError(t, err, "Unexpected error in Service.GetReport()") + require.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Groups_group_by_schema.json") marshaler := jsonpb.MarshalOptions{Indent: "\t"} @@ -486,7 +487,7 @@ func TestService_GetReport_Groups(t *testing.T) { } got, err := s.GetReport(makeContext(t), &in) - assert.NoError(t, err, "Unexpected error in Service.GetReport()") + require.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Groups_group_by_username.json") marshaler := jsonpb.MarshalOptions{Indent: "\t"} @@ -524,7 +525,7 @@ func TestService_GetReport_Groups(t *testing.T) { } got, err := s.GetReport(makeContext(t), &in) - assert.NoError(t, err, "Unexpected error in Service.GetReport()") + require.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Groups_group_by_client_host.json") marshaler := jsonpb.MarshalOptions{Indent: "\t"} @@ -685,7 +686,7 @@ func TestService_GetReport_Sparklines(t *testing.T) { } got, err := s.GetReport(makeContext(t), &in) - assert.NoError(t, err, "Unexpected error in Service.GetReport()") + require.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_sparklines_60_points.json") marshaler := jsonpb.MarshalOptions{Indent: "\t"} @@ -724,7 +725,7 @@ func TestService_GetReport_Sparklines(t *testing.T) { } got, err := s.GetReport(makeContext(t), &in) - assert.NoError(t, err, "Unexpected error in Service.GetReport()") + require.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_sparklines_90_points.json") marshaler := jsonpb.MarshalOptions{Indent: "\t"} @@ -763,7 +764,7 @@ func TestService_GetReport_Search(t *testing.T) { } got, err := s.GetReport(makeContext(t), &in) - assert.NoError(t, err, "Unexpected error in Service.GetReport()") + require.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Search_search_queryid.json") marshaler := jsonpb.MarshalOptions{Indent: "\t"} @@ -794,7 +795,7 @@ func TestService_GetReport_Search(t *testing.T) { } got, err := s.GetReport(makeContext(t), &in) - assert.NoError(t, err, "Unexpected error in Service.GetReport()") + require.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Search_search_fingerprint.json") marshaler := jsonpb.MarshalOptions{Indent: "\t"} @@ -825,7 +826,7 @@ func TestService_GetReport_Search(t *testing.T) { } got, err := s.GetReport(makeContext(t), &in) - assert.NoError(t, err, "Unexpected error in Service.GetReport()") + require.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Search_search_service_name.json") marshaler := jsonpb.MarshalOptions{Indent: "\t"} @@ -863,7 +864,7 @@ func TestServiceGetReportSpecialMetrics(t *testing.T) { } got, err := s.GetReport(makeContext(t), &in) - assert.NoError(t, err, "Unexpected error in Service.GetReport()") + require.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestServiceGetReportSpecialMetrics_num_queries_with_errors.json") marshaler := jsonpb.MarshalOptions{Indent: "\t"} diff --git a/qan-api2/utils/templatefs/templatefs_test.go b/qan-api2/utils/templatefs/templatefs_test.go index 61575026d08..3d51e628dbd 100644 --- a/qan-api2/utils/templatefs/templatefs_test.go +++ b/qan-api2/utils/templatefs/templatefs_test.go @@ -85,7 +85,7 @@ func TestTemplateFS_ReadFile_InvalidTemplate(t *testing.T) { func TestTemplateFS_ReadFile_NonexistentFile(t *testing.T) { tfs := NewTemplateFS(testFS, nil, "") _, err := tfs.ReadFile("nonexistent.sql") - assert.Error(t, err) + require.Error(t, err) } func TestTemplateFS_ReadDir(t *testing.T) { @@ -100,7 +100,7 @@ func TestTemplateFS_ReadDir(t *testing.T) { func TestTemplateFS_ReadDir_NonexistentDir(t *testing.T) { tfs := NewTemplateFS(testFS, nil, "nonexistent") _, err := tfs.Names() - assert.Error(t, err) + require.Error(t, err) } func TestTemplateFS_FilenameExtraction(t *testing.T) { From 60484a25bb4eccda91c6a59d79f8b9889f596623 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Tue, 19 May 2026 10:41:51 +0300 Subject: [PATCH 04/23] fix --- managed/services/grafana/client_test.go | 1 - managed/utils/tests/asserts.go | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/managed/services/grafana/client_test.go b/managed/services/grafana/client_test.go index d84f67340f9..cdd7ce1f8fd 100644 --- a/managed/services/grafana/client_test.go +++ b/managed/services/grafana/client_test.go @@ -478,7 +478,6 @@ func TestCurrentUserHTTPResponse(t *testing.T) { } func TestClient(t *testing.T) { - logrus.SetLevel(logrus.TraceLevel) l := logrus.WithField("test", t.Name()) ctx := t.Context() diff --git a/managed/utils/tests/asserts.go b/managed/utils/tests/asserts.go index 681a65831ae..12b68f186f8 100644 --- a/managed/utils/tests/asserts.go +++ b/managed/utils/tests/asserts.go @@ -34,7 +34,7 @@ func AssertGRPCError(tb testing.TB, expected *status.Status, actual error) { return } err := s.Err() - require.NoError(tb, err) + require.Error(tb, err) assert.Equal(tb, expected.Err().Error(), err.Error()) // gives the best error message } From cdec538f83a5c7ddcc3322b1f172a9f1f589d9be Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Tue, 19 May 2026 11:05:43 +0300 Subject: [PATCH 05/23] fix --- .../mongodb/mongolog/internal/monitor_test.go | 5 ----- .../internal/collector/collector_test.go | 3 --- .../profiler/internal/parser/parser_test.go | 2 +- .../profiler/internal/profiler_test.go | 19 ++++++++----------- .../pgstatmonitor/pgstatmonitor_test.go | 2 +- .../pgstatstatements/pgstatstatements_test.go | 6 +++--- .../mongodb_query_admincommand_action_test.go | 10 +++++----- .../actions/mysql_explain_action_test.go | 6 +++--- .../mysql_show_table_status_action_test.go | 6 +++--- api-tests/alerting/alerting_test.go | 4 ++-- managed/models/postgresql_version_test.go | 2 +- 11 files changed, 27 insertions(+), 38 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index f1ab0bf470c..1fe64e188be 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -47,11 +47,6 @@ const ( func TestCollector(t *testing.T) { t.Parallel() - logrus.SetLevel(logrus.TraceLevel) - t.Cleanup(func() { - logrus.SetLevel(logrus.InfoLevel) - }) - tests, err := testFileNames(t) require.NoError(t, err) for _, test := range tests { diff --git a/agent/agents/mongodb/profiler/internal/collector/collector_test.go b/agent/agents/mongodb/profiler/internal/collector/collector_test.go index dee034baaec..6c3584e00f2 100644 --- a/agent/agents/mongodb/profiler/internal/collector/collector_test.go +++ b/agent/agents/mongodb/profiler/internal/collector/collector_test.go @@ -120,9 +120,6 @@ func TestCollector(t *testing.T) { // cursorTimeout*time.Duration(maxLoops*2): Wait time between loops to produce iter.TryNext to return a false timeout := time.Millisecond*time.Duration(maxDocs*maxLoops) + cursorTimeout*time.Duration(maxLoops*2) + 5*time.Second - logrus.SetLevel(logrus.TraceLevel) - defer logrus.SetLevel(logrus.InfoLevel) - ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() diff --git a/agent/agents/mongodb/profiler/internal/parser/parser_test.go b/agent/agents/mongodb/profiler/internal/parser/parser_test.go index c6c8dd00c2c..349a497a749 100644 --- a/agent/agents/mongodb/profiler/internal/parser/parser_test.go +++ b/agent/agents/mongodb/profiler/internal/parser/parser_test.go @@ -136,7 +136,7 @@ func TestParserRunning(t *testing.T) { assert.Equal(t, expected.StartTS, actual.StartTS) assert.Equal(t, expected.EndTS, actual.EndTS) assert.Len(t, actual.Buckets, 1) - assert.InEpsilon(t, 1, actual.Buckets[0].Common.NumQueries, 0.001) + assert.InDelta(t, 1, actual.Buckets[0].Common.NumQueries, 0.001) case <-time.After(d + 5*time.Second): t.Error("test timeout") diff --git a/agent/agents/mongodb/profiler/internal/profiler_test.go b/agent/agents/mongodb/profiler/internal/profiler_test.go index ae5c00aaf4c..1c0a3b9e873 100644 --- a/agent/agents/mongodb/profiler/internal/profiler_test.go +++ b/agent/agents/mongodb/profiler/internal/profiler_test.go @@ -59,9 +59,6 @@ func TestProfiler(t *testing.T) { aggregator.DefaultInterval = time.Second defer func() { aggregator.DefaultInterval = defaultInterval }() - logrus.SetLevel(logrus.TraceLevel) - defer logrus.SetLevel(logrus.InfoLevel) - sslDSNTemplate, files := tests.GetTestMongoDBWithSSLDSN(t, "../../../../") tempDir := t.TempDir() sslDSN, err := templates.RenderDSN(sslDSNTemplate, files, tempDir) @@ -186,17 +183,17 @@ func testProfiler(t *testing.T, url string) { MResponseLengthP99: responseLength, } // TODO: fix protobuf equality https://jira.percona.com/browse/PMM-6743 - assert.InEpsilonf(t, expected.MDocsReturnedCnt, bucket.Mongodb.MDocsReturnedCnt, 0.0001, "wrong metrics MDocsReturnedCnt for db %s", bucket.Common.Database) - assert.InEpsilonf(t, expected.MResponseLengthCnt, bucket.Mongodb.MResponseLengthCnt, 0.0001, "wrong metrics MResponseLengthCnt for db %s", bucket.Common.Database) - assert.InEpsilonf(t, expected.MResponseLengthSum, bucket.Mongodb.MResponseLengthSum, 0.0001, "wrong metrics MResponseLengthSum for db %s", bucket.Common.Database) - assert.InEpsilonf(t, expected.MResponseLengthMin, bucket.Mongodb.MResponseLengthMin, 0.0001, "wrong metrics MResponseLengthMin for db %s", bucket.Common.Database) - assert.InEpsilonf(t, expected.MResponseLengthMax, bucket.Mongodb.MResponseLengthMax, 0.0001, "wrong metrics MResponseLengthMax for db %s", bucket.Common.Database) - assert.InEpsilonf(t, expected.MResponseLengthP99, bucket.Mongodb.MResponseLengthP99, 0.0001, "wrong metrics MResponseLengthP99 for db %s", bucket.Common.Database) - assert.InEpsilonf(t, expected.MDocsExaminedCnt, bucket.Mongodb.MDocsExaminedCnt, 0.0001, "wrong metrics MDocsExaminedCnt for db %s", bucket.Common.Database) + assert.InDeltaf(t, expected.MDocsReturnedCnt, bucket.Mongodb.MDocsReturnedCnt, 0.0001, "wrong metrics MDocsReturnedCnt for db %s", bucket.Common.Database) + assert.InDeltaf(t, expected.MResponseLengthCnt, bucket.Mongodb.MResponseLengthCnt, 0.0001, "wrong metrics MResponseLengthCnt for db %s", bucket.Common.Database) + assert.InDeltaf(t, expected.MResponseLengthSum, bucket.Mongodb.MResponseLengthSum, 0.0001, "wrong metrics MResponseLengthSum for db %s", bucket.Common.Database) + assert.InDeltaf(t, expected.MResponseLengthMin, bucket.Mongodb.MResponseLengthMin, 0.0001, "wrong metrics MResponseLengthMin for db %s", bucket.Common.Database) + assert.InDeltaf(t, expected.MResponseLengthMax, bucket.Mongodb.MResponseLengthMax, 0.0001, "wrong metrics MResponseLengthMax for db %s", bucket.Common.Database) + assert.InDeltaf(t, expected.MResponseLengthP99, bucket.Mongodb.MResponseLengthP99, 0.0001, "wrong metrics MResponseLengthP99 for db %s", bucket.Common.Database) + assert.InDeltaf(t, expected.MDocsExaminedCnt, bucket.Mongodb.MDocsExaminedCnt, 0.0001, "wrong metrics MDocsExaminedCnt for db %s", bucket.Common.Database) } require.NotNil(t, findBucket) assert.Equal(t, `db.people.find({"name_00\ufffd":"?"})`, findBucket.Common.Fingerprint) - assert.InEpsilon(t, docsCount, findBucket.Mongodb.MDocsReturnedSum, 0.0001) + assert.InDelta(t, docsCount, findBucket.Mongodb.MDocsReturnedSum, 0.0001) } func cleanUpDBs(t *testing.T, sess *mongo.Client) { diff --git a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go index 7271f3b2101..c830b7ed1b4 100644 --- a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go +++ b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go @@ -224,7 +224,7 @@ func TestPGStatMonitorSchema(t *testing.T) { actual := buckets[0] actual.Common.Username = strings.ReplaceAll(actual.Common.Username, `"`, "") assert.InDelta(t, 0, actual.Common.MQueryTimeSum, 0.09) - assert.InEpsilon(t, float32(5), actual.Postgresql.MSharedBlksHitSum+actual.Postgresql.MSharedBlksReadSum, 0.0001) + assert.InDelta(t, float32(5), actual.Postgresql.MSharedBlksHitSum+actual.Postgresql.MSharedBlksReadSum, 0.0001) assert.InDelta(t, 1.5, actual.Postgresql.MSharedBlksHitCnt+actual.Postgresql.MSharedBlksReadCnt, 0.5) example := "" diff --git a/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go b/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go index be0cd9f1d28..c3d9db40336 100644 --- a/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go +++ b/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go @@ -204,7 +204,7 @@ func TestPGStatStatementsQAN(t *testing.T) { actual := buckets[0] assert.InDelta(t, 0, actual.Common.MQueryTimeSum, 0.09) - assert.InEpsilon(t, mSharedBlksHitSum, actual.Postgresql.MSharedBlksHitSum+actual.Postgresql.MSharedBlksReadSum, 0.0001) + assert.InDelta(t, mSharedBlksHitSum, actual.Postgresql.MSharedBlksHitSum+actual.Postgresql.MSharedBlksReadSum, 0.0001) assert.InDelta(t, 1.5, actual.Postgresql.MSharedBlksHitCnt+actual.Postgresql.MSharedBlksReadCnt, 0.5) expected := &agentv1.MetricsBucket{ Common: &agentv1.MetricsBucket_Common{ @@ -437,7 +437,7 @@ func TestPGStatStatementsQAN(t *testing.T) { actual := buckets[0] assert.NotZero(t, actual.Postgresql.MSharedBlkReadTimeSum+actual.Postgresql.MSharedBlkWriteTimeSum) - assert.InEpsilon(t, float32(n), actual.Postgresql.MSharedBlkReadTimeCnt+actual.Postgresql.MSharedBlkWriteTimeCnt, 0.0001) + assert.InDelta(t, float32(n), actual.Postgresql.MSharedBlkReadTimeCnt+actual.Postgresql.MSharedBlkWriteTimeCnt, 0.0001) expected := &agentv1.MetricsBucket{ Common: &agentv1.MetricsBucket_Common{ Queryid: actual.Common.Queryid, @@ -536,7 +536,7 @@ func TestPGStatStatementsQPS(t *testing.T) { insertBuckets := filterInsertQueries(t, buckets) mismatchedCount := 0 for _, b := range insertBuckets { - assert.InEpsilon(t, float32(1), b.Common.NumQueries, 0.0001) + assert.InDelta(t, float32(1), b.Common.NumQueries, 0.0001) if b.Common.NumQueries != 1 { mismatchedCount++ } diff --git a/agent/runner/actions/mongodb_query_admincommand_action_test.go b/agent/runner/actions/mongodb_query_admincommand_action_test.go index a5352401ec6..2db62492d88 100644 --- a/agent/runner/actions/mongodb_query_admincommand_action_test.go +++ b/agent/runner/actions/mongodb_query_admincommand_action_test.go @@ -195,14 +195,14 @@ func convertToObjxMap(t *testing.T, b []byte) objx.Map { func getParameterAssertions(t *testing.T, b []byte) { //nolint:thelper assert.LessOrEqual(t, 5000, len(b)) objxM := convertToObjxMap(t, b) - assert.InEpsilon(t, 1.0, objxM.Get("ok").Data(), 0.0001) + assert.InDelta(t, 1.0, objxM.Get("ok").Data(), 0.0001) assert.Contains(t, objxM.Get("authenticationMechanisms").Data(), "SCRAM-SHA-1") } func buildInfoAssertions(t *testing.T, b []byte) { //nolint:thelper assert.LessOrEqual(t, 1000, len(b)) objxM := convertToObjxMap(t, b) - assert.InEpsilon(t, 1.0, objxM.Get("ok").Data(), 0.0001) + assert.InDelta(t, 1.0, objxM.Get("ok").Data(), 0.0001) assert.Equal(t, "mozjs", objxM.Get("javascriptEngine").Data()) assert.Equal(t, "x86_64", objxM.Get("buildEnvironment.distarch").Data()) } @@ -210,15 +210,15 @@ func buildInfoAssertions(t *testing.T, b []byte) { //nolint:thelper func getDiagnosticDataAssertions(t *testing.T, b []byte) { //nolint:thelper assert.LessOrEqual(t, 25000, len(b)) objxM := convertToObjxMap(t, b) - assert.InEpsilon(t, 1.0, objxM.Get("ok").Data(), 0.0001) - assert.InEpsilon(t, 1.0, objxM.Get("data.serverStatus.ok").Data(), 0.0001) + assert.InDelta(t, 1.0, objxM.Get("ok").Data(), 0.0001) + assert.InDelta(t, 1.0, objxM.Get("data.serverStatus.ok").Data(), 0.0001) assert.Equal(t, "mongod", objxM.Get("data.serverStatus.process").Data()) } func replSetGetStatusAssertionsReplicated(t *testing.T, b []byte) { //nolint:thelper assert.LessOrEqual(t, 1000, len(b)) objxM := convertToObjxMap(t, b) - assert.InEpsilon(t, 1.0, objxM.Get("ok").Data(), 0.0001) + assert.InDelta(t, 1.0, objxM.Get("ok").Data(), 0.0001) assert.Len(t, objxM.Get("members").Data(), 2) } diff --git a/agent/runner/actions/mysql_explain_action_test.go b/agent/runner/actions/mysql_explain_action_test.go index d0fb4b51bb9..2e314a27663 100644 --- a/agent/runner/actions/mysql_explain_action_test.go +++ b/agent/runner/actions/mysql_explain_action_test.go @@ -182,9 +182,9 @@ func TestMySQLExplain(t *testing.T) { assert.Contains(t, actual[0], "Extra") // Checks some stable values - assert.InEpsilon(t, float64(1), actual[1][0], 0.0001) // id - assert.Equal(t, "SIMPLE", actual[1][1]) // select_type - assert.Equal(t, "city", actual[1][2]) // table + assert.InDelta(t, float64(1), actual[1][0], 0.0001) // id + assert.Equal(t, "SIMPLE", actual[1][1]) // select_type + assert.Equal(t, "city", actual[1][2]) // table } }) diff --git a/agent/runner/actions/mysql_show_table_status_action_test.go b/agent/runner/actions/mysql_show_table_status_action_test.go index 7716ef76da6..401d5272dbf 100644 --- a/agent/runner/actions/mysql_show_table_status_action_test.go +++ b/agent/runner/actions/mysql_show_table_status_action_test.go @@ -74,9 +74,9 @@ func TestShowTableStatus(t *testing.T) { assert.Contains(t, actual[0], "Comment") // Checks some stable values - assert.Equal(t, "city", actual[1][0]) // Name - assert.Equal(t, "InnoDB", actual[1][1]) // Engine - assert.InEpsilon(t, 10.0, actual[1][2], 0.0001) // Version + assert.Equal(t, "city", actual[1][0]) // Name + assert.Equal(t, "InnoDB", actual[1][1]) // Engine + assert.InDelta(t, 10.0, actual[1][2], 0.0001) // Version }) t.Run("Error", func(t *testing.T) { diff --git a/api-tests/alerting/alerting_test.go b/api-tests/alerting/alerting_test.go index a22db9c7a6e..f062e72d17b 100644 --- a/api-tests/alerting/alerting_test.go +++ b/api-tests/alerting/alerting_test.go @@ -569,14 +569,14 @@ func assertTemplate(t *testing.T, expectedTemplate alert.Template, listTemplates require.NotNil(t, param.Float) value, err := expectedParam.GetValueForFloat() require.NoError(t, err) - assert.InEpsilon(t, value, *param.Float.Default, 0.0001) + assert.InDelta(t, value, *param.Float.Default, 0.0001) } if len(expectedParam.Range) != 0 { minR, maxR, err := expectedParam.GetRangeForFloat() require.NoError(t, err) assert.InDelta(t, minR, *param.Float.Min, 0.0001) - assert.InEpsilon(t, maxR, *param.Float.Max, 0.0001) + assert.InDelta(t, maxR, *param.Float.Max, 0.0001) } assert.Nil(t, param.Bool) diff --git a/managed/models/postgresql_version_test.go b/managed/models/postgresql_version_test.go index 300a3ff8d05..505d57d8e76 100644 --- a/managed/models/postgresql_version_test.go +++ b/managed/models/postgresql_version_test.go @@ -88,7 +88,7 @@ func TestGetPostgreSQLVersion(t *testing.T) { if tc.wantError { require.Error(t, err) } else { - assert.InEpsilon(t, tc.wantVersion.Float(), version.Float(), 0.0001) + assert.InDelta(t, tc.wantVersion.Float(), version.Float(), 0.0001) assert.Equal(t, tc.wantVersion.String(), version.String()) require.NoError(t, err) } From c2b14ed8745f3ea03be82f74fe003c533386aff8 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Tue, 19 May 2026 11:17:54 +0300 Subject: [PATCH 06/23] fix --- agent/runner/actions/mongodb_query_admincommand_action_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/runner/actions/mongodb_query_admincommand_action_test.go b/agent/runner/actions/mongodb_query_admincommand_action_test.go index 2db62492d88..e58aa51573a 100644 --- a/agent/runner/actions/mongodb_query_admincommand_action_test.go +++ b/agent/runner/actions/mongodb_query_admincommand_action_test.go @@ -230,7 +230,7 @@ func replSetGetStatusAssertionsStandalone(t *testing.T, id string, timeout time. defer cancel() b, err := a.Run(ctx) require.Nil(t, b) - var targetErr *mongo.CommandError + var targetErr mongo.CommandError require.ErrorAs(t, err, &targetErr) require.Equal(t, "(NoReplicationEnabled) not running with --replSet", err.Error()) } From 5c8289c5631fc652868a283e2ede34dd05f63caa Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Tue, 19 May 2026 14:13:04 +0300 Subject: [PATCH 07/23] fix --- admin/commands/management/add_mysql_test.go | 2 +- agent/runner/actions/mysql_show_index_action_test.go | 2 +- managed/services/checks/funcs_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/admin/commands/management/add_mysql_test.go b/admin/commands/management/add_mysql_test.go index c0b61008c49..a38b3d901ec 100644 --- a/admin/commands/management/add_mysql_test.go +++ b/admin/commands/management/add_mysql_test.go @@ -156,6 +156,6 @@ func TestRun(t *testing.T) { _, err := cmd.RunCmd() expected := "Unrecognized option. To create a user, see https://docs.percona.com/percona-monitoring-and-management/3/install-pmm/install-pmm-client/connect-database/mysql/mysql.html#create-a-database-account-for-pmm" - require.Error(t, err, expected) + require.EqualError(t, err, expected) }) } diff --git a/agent/runner/actions/mysql_show_index_action_test.go b/agent/runner/actions/mysql_show_index_action_test.go index bfd3432fd4f..8f01f0033ae 100644 --- a/agent/runner/actions/mysql_show_index_action_test.go +++ b/agent/runner/actions/mysql_show_index_action_test.go @@ -125,7 +125,7 @@ func TestMySQLShowIndex(t *testing.T) { _, err := a.Run(ctx) expected := "Error 1146 (42S02): Table 'world.city; DROP TABLE city; --' doesn't exist" - require.Equal(t, expected, err.Error()) + require.EqualError(t, err, expected) var count int err = q.QueryRow("SELECT COUNT(*) FROM city").Scan(&count) diff --git a/managed/services/checks/funcs_test.go b/managed/services/checks/funcs_test.go index 1f623bff6c4..0ed4ffb50c4 100644 --- a/managed/services/checks/funcs_test.go +++ b/managed/services/checks/funcs_test.go @@ -63,7 +63,7 @@ Traceback (most recent call last): TestVersion:2:22: in check_context : in parse_version `) + "\n" - require.Error(t, err, expectedErr) + require.EqualError(t, err, expectedErr) assert.Empty(t, res) input = []map[string]interface{}{ From d67473f795f3267ab3442bf2c653c439ce7c471e Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Wed, 20 May 2026 14:43:09 +0300 Subject: [PATCH 08/23] PMM-7 Fix intrange linter warnings --- .golangci.yml | 1 + .../agents/mongodb/mongolog/internal/mongolog.go | 2 +- .../mongodb/profiler/internal/profiler_test.go | 2 +- .../mysql/slowlog/parser/parser_bench_test.go | 2 +- agent/agents/postgres/parser/parser_test.go | 2 +- .../postgres/pgstatmonitor/pgstatmonitor_test.go | 6 +++--- .../pgstatstatements/pgstatstatements_test.go | 10 +++++----- agent/agents/supervisor/supervisor.go | 2 +- .../actions/mongodb_explain_action_test.go | 2 +- agent/runner/actions/query_transform.go | 2 +- agent/runner/runner_test.go | 4 ++-- agent/utils/tests/db.go | 2 +- api-tests/management/action/explain_test.go | 2 +- api-tests/server/advisors_test.go | 2 +- api-tests/server/serialization_test.go | 2 +- api/agent/v1/query.go | 2 +- managed/models/job_helpers_test.go | 2 +- .../backup/pitr_timerange_service_test.go | 2 +- managed/services/ha/services_test.go | 2 +- .../management/backup/backup_service_test.go | 2 +- .../management/backup/restore_service_test.go | 4 ++-- managed/services/telemetry/uievents/uievents.go | 6 +++--- .../victoriametrics/scrape_configs_test.go | 16 ++++++++-------- version/parsed_test.go | 4 ++-- 24 files changed, 42 insertions(+), 41 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index d156d4bc126..67449047bf6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -115,6 +115,7 @@ linters: - third_party$ - builtin$ - examples$ + - ui/ formatters: enable: - gci diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index 66426d20eef..24a157a871d 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -254,7 +254,7 @@ func getLogFilePath(ctx context.Context, client *mongo.Client) (string, error) { } if argv, ok := result["argv"].([]any); ok { - for i := 0; i < len(argv); i++ { + for i := range argv { if arg, ok := argv[i].(string); ok && arg == "--logpath" && i+1 < len(argv) { if value, ok := argv[i+1].(string); ok { return value, nil diff --git a/agent/agents/mongodb/profiler/internal/profiler_test.go b/agent/agents/mongodb/profiler/internal/profiler_test.go index 1c0a3b9e873..ea5d9844e1c 100644 --- a/agent/agents/mongodb/profiler/internal/profiler_test.go +++ b/agent/agents/mongodb/profiler/internal/profiler_test.go @@ -112,7 +112,7 @@ func testProfiler(t *testing.T, url string) { dbNumber := i / int(docsCount) fieldsCount := dbNumber + 1 doc := bson.M{} - for j := 0; j < fieldsCount; j++ { + for j := range fieldsCount { doc[fmt.Sprintf("name_%02d\xff", j)] = fmt.Sprintf("value_%02d\xff", j) // to generate different fingerprints and test UTF8 } dbName := fmt.Sprintf("test_%02d", dbNumber) diff --git a/agent/agents/mysql/slowlog/parser/parser_bench_test.go b/agent/agents/mysql/slowlog/parser/parser_bench_test.go index 206b2d3a60a..03709d4b9e5 100644 --- a/agent/agents/mysql/slowlog/parser/parser_bench_test.go +++ b/agent/agents/mysql/slowlog/parser/parser_bench_test.go @@ -46,7 +46,7 @@ func benchmarkFile(b *testing.B, name string) { b.ReportAllocs() b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { b.StopTimer() r, err := filereader.NewSimpleFileReader(name) diff --git a/agent/agents/postgres/parser/parser_test.go b/agent/agents/postgres/parser/parser_test.go index b22120cbb17..ba0011d1c8c 100644 --- a/agent/agents/postgres/parser/parser_test.go +++ b/agent/agents/postgres/parser/parser_test.go @@ -90,7 +90,7 @@ func BenchmarkExtractTables(b *testing.B) { b.ReportAllocs() b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { actualB, err = ExtractTables(query) } diff --git a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go index c830b7ed1b4..7e6a8e42c6b 100644 --- a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go +++ b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go @@ -344,7 +344,7 @@ func TestPGStatMonitorSchema(t *testing.T) { const n = 500 placeholders := db.Placeholders(1, n) args := make([]interface{}, n) - for i := 0; i < n; i++ { + for i := range n { args[i] = i } q := fmt.Sprintf("SELECT /* AllCountriesTruncated:PGStatMonitor controller='test' */ * FROM country WHERE capital IN (%s)", strings.Join(placeholders, ", ")) @@ -496,7 +496,7 @@ func TestPGStatMonitorSchema(t *testing.T) { var waitGroup sync.WaitGroup n := 1000 - for i := 0; i < n; i++ { + for i := range n { id := i query := fmt.Sprintf(`INSERT /* CheckMBlkReadTime controller='test' */ INTO %s (customer_id, first_name, last_name, active) VALUES (%d, 'John', 'Dow', TRUE)`, tableName, id) waitGroup.Go(func() { @@ -512,7 +512,7 @@ func TestPGStatMonitorSchema(t *testing.T) { require.NoError(t, err) var buckets []*agentv1.MetricsBucket - for i := 0; i < 100; i++ { + for range 100 { buckets, err = m.getNewBuckets(context.Background(), 60, normalizedQuery) require.NoError(t, err) buckets = filter(buckets) diff --git a/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go b/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go index c3d9db40336..0cb995cc71f 100644 --- a/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go +++ b/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go @@ -286,7 +286,7 @@ func TestPGStatStatementsQAN(t *testing.T) { const n = 500 placeholders := db.Placeholders(1, n) args := make([]interface{}, n) - for i := 0; i < n; i++ { + for i := range n { args[i] = i } q := fmt.Sprintf("SELECT /* AllCitiesTruncated:pgstatstatements controller='test' */ * FROM city WHERE id IN (%s)", strings.Join(placeholders, ", ")) @@ -401,7 +401,7 @@ func TestPGStatStatementsQAN(t *testing.T) { var waitGroup sync.WaitGroup n := 1000 errChan := make(chan error, 1) - for i := 0; i < n; i++ { + for i := range n { id := i waitGroup.Add(1) go func() { @@ -519,12 +519,12 @@ func TestPGStatStatementsQPS(t *testing.T) { runTimes := 7000 t.Cleanup(func() { - for i := 0; i < runTimes; i++ { + for i := range runTimes { _, _ = db.Exec(fmt.Sprintf("drop table if exists t%d", i)) } }) - for i := 0; i < runTimes; i++ { + for i := range runTimes { _, err = db.Exec(fmt.Sprintf("create /* controller='test' */ table t%d (id int);", i)) require.NoError(t, err) _, err = db.Exec(fmt.Sprintf("insert /* controller='test' */ into t%d values(1);", i)) @@ -543,7 +543,7 @@ func TestPGStatStatementsQPS(t *testing.T) { } assert.Zero(t, mismatchedCount) - for i := 0; i < runTimes; i++ { + for i := range runTimes { _, err = db.Exec(fmt.Sprintf("insert /* controller='test' */ into t%d values(1);", i)) require.NoError(t, err) } diff --git a/agent/agents/supervisor/supervisor.go b/agent/agents/supervisor/supervisor.go index 956aaef8080..4462e025688 100644 --- a/agent/agents/supervisor/supervisor.go +++ b/agent/agents/supervisor/supervisor.go @@ -445,7 +445,7 @@ const ( func (s *Supervisor) tryStartProcess(agentID string, agentProcess *agentv1.SetStateRequest_AgentProcess, port uint16) error { var err error - for i := 0; i < process_Retry_Time; i++ { + for range process_Retry_Time { if port == 0 { _port, err := s.portsRegistry.Reserve() if err != nil { diff --git a/agent/runner/actions/mongodb_explain_action_test.go b/agent/runner/actions/mongodb_explain_action_test.go index f0309634605..fa6a606a1f7 100644 --- a/agent/runner/actions/mongodb_explain_action_test.go +++ b/agent/runner/actions/mongodb_explain_action_test.go @@ -383,7 +383,7 @@ func prepareData(ctx context.Context, client *mongo.Client, database, collection count, _ := client.Database(database).Collection(collection).CountDocuments(ctx, nil) if count < limit { - for i := int64(0); i < limit; i++ { + for i := range limit { doc := primitive.M{"f1": i, "f2": fmt.Sprintf("text_%5d", limit-i)} if _, err := client.Database(database).Collection(collection).InsertOne(ctx, doc); err != nil { return err diff --git a/agent/runner/actions/query_transform.go b/agent/runner/actions/query_transform.go index 8e0bd2aa339..a0c7bdb4741 100644 --- a/agent/runner/actions/query_transform.go +++ b/agent/runner/actions/query_transform.go @@ -122,7 +122,7 @@ func insertToSelect(matches []string) string { if len(fields) == len(values) { query := fmt.Sprintf("SELECT * FROM %s WHERE ", matches[1]) sep := "" - for i := 0; i < len(fields); i++ { + for i := range fields { query += fmt.Sprintf(`%s%s=%s`, sep, strings.TrimSpace(fields[i]), values[i]) sep = " and " } diff --git a/agent/runner/runner_test.go b/agent/runner/runner_test.go index b499c3a3812..6717ebac5de 100644 --- a/agent/runner/runner_test.go +++ b/agent/runner/runner_test.go @@ -123,7 +123,7 @@ func TestDefaultCapacityLimit(t *testing.T) { go cr.Run(ctx) totalJobs := 2 * defaultTotalCapacity - for i := 0; i < totalJobs; i++ { + for i := range totalJobs { require.NoError(t, cr.StartJob(testJob{id: fmt.Sprintf("test-%d", i), timeout: time.Second})) } @@ -131,7 +131,7 @@ func TestDefaultCapacityLimit(t *testing.T) { time.Sleep(500 * time.Millisecond) var running int - for i := 0; i < totalJobs; i++ { + for i := range totalJobs { // Check that running jobs amount is not exceeded default capacity. if cr.IsRunning(fmt.Sprintf("test-%d", i)) { running++ diff --git a/agent/utils/tests/db.go b/agent/utils/tests/db.go index a38bddc8eeb..6ef8322989c 100644 --- a/agent/utils/tests/db.go +++ b/agent/utils/tests/db.go @@ -29,7 +29,7 @@ func waitForTestDataLoad(tb testing.TB, db *sql.DB) { var count int var err error - for i := 0; i < 30; i++ { + for range 30 { if err = db.QueryRow("SELECT /* pmm-agent-tests:waitForTestDataLoad */ COUNT(*) FROM city").Scan(&count); err == nil { return } diff --git a/api-tests/management/action/explain_test.go b/api-tests/management/action/explain_test.go index f16ebae7b19..0f6606d68e1 100644 --- a/api-tests/management/action/explain_test.go +++ b/api-tests/management/action/explain_test.go @@ -80,7 +80,7 @@ func TestRunMongoDBExplain(t *testing.T) { var actionOK *actions.GetActionOK - for i := 0; i < 6; i++ { + for range 6 { var err error actionOK, err = client.Default.ActionsService.GetAction(&actions.GetActionParams{ Context: pmmapitests.Context, diff --git a/api-tests/server/advisors_test.go b/api-tests/server/advisors_test.go index 1cbce4d4534..47dc2fb45a3 100644 --- a/api-tests/server/advisors_test.go +++ b/api-tests/server/advisors_test.go @@ -127,7 +127,7 @@ func TestChangeAdvisorChecks(t *testing.T) { // enable ⥁ disable loop, it checks current state of first returned check and changes its state, // then in second iteration it returns state to its origin. - for i := 0; i < 2; i++ { + for range 2 { check = resp.Payload.Checks[0] params := &advisor.ChangeAdvisorChecksParams{ Body: advisor.ChangeAdvisorChecksBody{ diff --git a/api-tests/server/serialization_test.go b/api-tests/server/serialization_test.go index 60ac1bd07ff..e0f5394fc2f 100644 --- a/api-tests/server/serialization_test.go +++ b/api-tests/server/serialization_test.go @@ -68,7 +68,7 @@ func TestSerialization(t *testing.T) { func extractJSONTagNames(v any) []string { var res []string t := reflect.ValueOf(v).Type() - for i := 0; i < t.NumField(); i++ { + for i := range t.NumField() { if tag, ok := t.Field(i).Tag.Lookup("json"); ok { s := strings.Split(tag, ",") res = append(res, s[0]) diff --git a/api/agent/v1/query.go b/api/agent/v1/query.go index de852fb3209..a15ed85eeef 100644 --- a/api/agent/v1/query.go +++ b/api/agent/v1/query.go @@ -116,7 +116,7 @@ func makeValue(value interface{}) (*QueryActionValue, error) { //nolint:cyclop case reflect.Slice: size := v.Len() s := make([]*QueryActionValue, size) - for i := 0; i < size; i++ { + for i := range size { s[i], err = makeValue(v.Index(i).Interface()) if err != nil { return nil, err diff --git a/managed/models/job_helpers_test.go b/managed/models/job_helpers_test.go index 2eeaef9b05e..5169cc23d7f 100644 --- a/managed/models/job_helpers_test.go +++ b/managed/models/job_helpers_test.go @@ -76,7 +76,7 @@ func TestJobs(t *testing.T) { const jobsCount = 3 jobs := make([]*models.Job, 0, jobsCount) - for i := 0; i < jobsCount; i++ { + for i := range jobsCount { id := strconv.Itoa(i) job, err := models.CreateJob(findTX.Querier, models.CreateJobParams{ PMMAgentID: "agentid", diff --git a/managed/services/backup/pitr_timerange_service_test.go b/managed/services/backup/pitr_timerange_service_test.go index b50478434cf..76ee969c65b 100644 --- a/managed/services/backup/pitr_timerange_service_test.go +++ b/managed/services/backup/pitr_timerange_service_test.go @@ -481,7 +481,7 @@ func BenchmarkMergeTimelines(b *testing.B) { {Start: 20, End: 30}, }, } - for i := 0; i < b.N; i++ { + for range b.N { mergeTimelines(tl...) } } diff --git a/managed/services/ha/services_test.go b/managed/services/ha/services_test.go index 0742b3a84cf..007c2f96994 100644 --- a/managed/services/ha/services_test.go +++ b/managed/services/ha/services_test.go @@ -95,7 +95,7 @@ func TestServices_Add(t *testing.T) { const numServices = 10 var wg sync.WaitGroup - for i := 0; i < numServices; i++ { + for i := range numServices { wg.Add(1) go func(id int) { defer wg.Done() diff --git a/managed/services/management/backup/backup_service_test.go b/managed/services/management/backup/backup_service_test.go index af159692450..295b7904f9c 100644 --- a/managed/services/management/backup/backup_service_test.go +++ b/managed/services/management/backup/backup_service_test.go @@ -479,7 +479,7 @@ func TestGetLogs(t *testing.T) { }, }) require.NoError(t, err) - for chunkID := 0; chunkID < 5; chunkID++ { + for chunkID := range 5 { _, err = models.CreateJobLog(db.Querier, models.CreateJobLogParams{ JobID: job.ID, ChunkID: chunkID, diff --git a/managed/services/management/backup/restore_service_test.go b/managed/services/management/backup/restore_service_test.go index c1c2e11c5ca..0399b16d333 100644 --- a/managed/services/management/backup/restore_service_test.go +++ b/managed/services/management/backup/restore_service_test.go @@ -89,7 +89,7 @@ func TestRestoreServiceGetLogs(t *testing.T) { }, }) require.NoError(t, err) - for chunkID := 0; chunkID < 5; chunkID++ { + for chunkID := range 5 { _, err = models.CreateJobLog(db.Querier, models.CreateJobLogParams{ JobID: job.ID, ChunkID: chunkID, @@ -126,7 +126,7 @@ func TestRestoreServiceGetLogs(t *testing.T) { }, }) require.NoError(t, err) - for chunkID := 0; chunkID < 5; chunkID++ { + for chunkID := range 5 { _, err = models.CreateJobLog(db.Querier, models.CreateJobLogParams{ JobID: logicalRestore.ID, ChunkID: chunkID, diff --git a/managed/services/telemetry/uievents/uievents.go b/managed/services/telemetry/uievents/uievents.go index 72d0f9a4446..f88a34552ce 100644 --- a/managed/services/telemetry/uievents/uievents.go +++ b/managed/services/telemetry/uievents/uievents.go @@ -144,7 +144,7 @@ func (s *Service) processDashboardMetrics() *telemetryv1.GenericReport_Metric { sort.SliceStable(keys, func(i, j int) bool { return s.dashboardUsage[keys[i]].useCount > s.dashboardUsage[keys[j]].useCount }) - for i := 0; i < len(keys); i++ { + for i := range keys { sortedKey := keys[i] stat := s.dashboardUsage[sortedKey] dashboardStat.TopDashboards = append(dashboardStat.TopDashboards, stat.uid) @@ -154,7 +154,7 @@ func (s *Service) processDashboardMetrics() *telemetryv1.GenericReport_Metric { sort.SliceStable(keys, func(i, j int) bool { return s.dashboardUsage[keys[i]].loadTime.ValueAtPercentile(p95Percentile) > s.dashboardUsage[keys[j]].loadTime.ValueAtPercentile(p95Percentile) }) - for i := 0; i < len(keys); i++ { + for i := range keys { sortedKey := keys[i] stat := s.dashboardUsage[sortedKey] p95 := stat.loadTime.ValueAtPercentile(p95Percentile) @@ -205,7 +205,7 @@ func (s *Service) processComponentMetrics() *telemetryv1.GenericReport_Metric { sort.SliceStable(keys, func(i, j int) bool { return s.componentsUsage[keys[i]].loadTime.ValueAtPercentile(p95Percentile) > s.componentsUsage[keys[j]].loadTime.ValueAtPercentile(p95Percentile) }) - for i := 0; i < len(keys); i++ { + for i := range keys { sortedKey := keys[i] stat := s.componentsUsage[sortedKey] p95 := stat.loadTime.ValueAtPercentile(p95Percentile) diff --git a/managed/services/victoriametrics/scrape_configs_test.go b/managed/services/victoriametrics/scrape_configs_test.go index 921b61909f3..4798c705f1c 100644 --- a/managed/services/victoriametrics/scrape_configs_test.go +++ b/managed/services/victoriametrics/scrape_configs_test.go @@ -686,7 +686,7 @@ func TestScrapeConfig(t *testing.T) { }) require.NoError(t, err) require.Len(t, actual, len(expected)) - for i := 0; i < len(expected); i++ { + for i := range expected { assertScrapeConfigsEqual(t, expected[i], actual[i]) } }) @@ -808,7 +808,7 @@ func TestScrapeConfig(t *testing.T) { }) require.NoError(t, err) require.Len(t, actual, len(expected)) - for i := 0; i < len(expected); i++ { + for i := range expected { assertScrapeConfigsEqual(t, expected[i], actual[i]) } }) @@ -909,7 +909,7 @@ func TestScrapeConfig(t *testing.T) { }) require.NoError(t, err) require.Len(t, actual, len(expected)) - for i := 0; i < len(expected); i++ { + for i := range expected { assertScrapeConfigsEqual(t, expected[i], actual[i]) } }) @@ -1061,7 +1061,7 @@ func TestScrapeConfig(t *testing.T) { }) require.NoError(t, err) require.Len(t, actual, len(expected)) - for i := 0; i < len(expected); i++ { + for i := range expected { assertScrapeConfigsEqual(t, expected[i], actual[i]) } }) @@ -1145,7 +1145,7 @@ func TestScrapeConfig(t *testing.T) { }) require.NoError(t, err) require.Len(t, actual, len(expected)) - for i := 0; i < len(expected); i++ { + for i := range expected { assertScrapeConfigsEqual(t, expected[i], actual[i]) } }) @@ -1267,7 +1267,7 @@ func TestScrapeConfig(t *testing.T) { actual := scrapeConfigsForRDSExporter(params) require.Len(t, actual, len(expected)) - for i := 0; i < len(expected); i++ { + for i := range expected { assertScrapeConfigsEqual(t, expected[i], actual[i]) } }) @@ -1327,7 +1327,7 @@ func TestScrapeConfig(t *testing.T) { }) require.NoError(t, err) require.Len(t, actual, len(expected)) - for i := 0; i < len(expected); i++ { + for i := range expected { assertScrapeConfigsEqual(t, expected[i], actual[i]) } }) @@ -1389,7 +1389,7 @@ func TestScrapeConfig(t *testing.T) { }) require.NoError(t, err) require.Len(t, actual, len(expected)) - for i := 0; i < len(expected); i++ { + for i := range expected { assertScrapeConfigsEqual(t, expected[i], actual[i]) } }) diff --git a/version/parsed_test.go b/version/parsed_test.go index 0f1302fd317..dd3e48dfd91 100644 --- a/version/parsed_test.go +++ b/version/parsed_test.go @@ -64,7 +64,7 @@ func TestParsed(t *testing.T) { assert.Equal(t, *expected.p, *actual) assert.Equal(t, expected.s, actual.String()) - for j := 0; j < i; j++ { + for j := range i { assert.True(t, data[j].p.Less(actual), "%s is expected to be less than %s", data[j].p, actual) } for j := i + 1; j < len(data); j++ { @@ -106,7 +106,7 @@ func TestParsed(t *testing.T) { assert.Equal(t, *expected.p, *actual) assert.Equal(t, expected.s, actual.String()) - for j := 0; j < i; j++ { + for j := range i { assert.True(t, data[j].p.Less(actual), "%s is expected to be less than %s", data[j].p, actual) } for j := i + 1; j < len(data); j++ { From a9536e7ca8807d9463a011c1214d5bb1ab370a10 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Wed, 20 May 2026 16:05:43 +0300 Subject: [PATCH 09/23] fix --- api-tests/server/serialization_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api-tests/server/serialization_test.go b/api-tests/server/serialization_test.go index e0f5394fc2f..5250ab48809 100644 --- a/api-tests/server/serialization_test.go +++ b/api-tests/server/serialization_test.go @@ -68,8 +68,8 @@ func TestSerialization(t *testing.T) { func extractJSONTagNames(v any) []string { var res []string t := reflect.ValueOf(v).Type() - for i := range t.NumField() { - if tag, ok := t.Field(i).Tag.Lookup("json"); ok { + for field := range t.Fields() { + if tag, ok := field.Tag.Lookup("json"); ok { s := strings.Split(tag, ",") res = append(res, s[0]) } From 4efd669eedffd5b23ec98058746f75db0579578a Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Thu, 21 May 2026 16:04:39 +0300 Subject: [PATCH 10/23] PMM-7 Fix modernize linter warnings --- admin/cmd/pmm-admin/main_test.go | 2 +- admin/commands/base.go | 2 +- admin/commands/base/setup.go | 2 +- admin/commands/status_test.go | 4 +- agent/agents/cache/cache.go | 14 +- agent/agents/cache/cache_test.go | 9 +- .../mongodb/profiler/internal/monitors.go | 5 +- .../shared/fingerprinter/fingerprinter.go | 6 +- agent/agents/mysql/slowlog/parser/parser.go | 26 +- agent/agents/mysql/slowlog/slowlog_test.go | 2 +- agent/agents/postgres/parser/parser_test.go | 2 +- .../pgstatmonitor/pgstatmonitor_models.go | 14 +- .../pgstatmonitor/pgstatmonitor_test.go | 2 +- .../pgstatmonitor/stat_monitor_cache.go | 5 +- .../pg_stat_statements_models.go | 14 +- .../pgstatstatements/pgstatstatements_test.go | 8 +- agent/agents/process/process.go | 2 +- agent/agents/supervisor/supervisor.go | 2 +- agent/agents/supervisor/supervisor_test.go | 3 +- agent/client/channel/channel.go | 4 +- agent/client/client.go | 14 +- agent/commands/clients.go | 2 +- agent/config/logger.go | 6 +- .../connection_checker_test.go | 1 - agent/connectionuptime/service.go | 5 +- agent/queryparser/helpers.go | 5 +- agent/runner/actions/common.go | 8 +- .../actions/mongodb_explain_action_test.go | 24 +- .../mongodb_query_admincommand_action.go | 8 +- .../mongodb_query_admincommand_action_test.go | 10 +- agent/runner/actions/mysql_explain_action.go | 34 +- .../actions/mysql_explain_action_test.go | 6 +- .../actions/mysql_query_select_action_test.go | 2 +- .../actions/mysql_show_index_action_test.go | 26 +- .../mysql_show_table_status_action_test.go | 2 +- .../postgresql_query_select_action_test.go | 4 +- .../postgresql_show_create_table_action.go | 2 +- .../actions/postgresql_show_index_action.go | 2 +- .../postgresql_show_index_action_test.go | 8 +- agent/runner/actions/query_transform.go | 13 +- agent/runner/jobs/pbm_helpers.go | 13 +- agent/runner/runner_test.go | 21 +- agent/tailog/store.go | 4 +- .../filereader/continuous_file_reader.go | 11 +- agent/utils/filereader/logger.go | 8 +- agent/utils/filereader/logger_test.go | 8 +- agent/utils/templates/template.go | 6 +- api-tests/init.go | 2 +- api-tests/management/action/explain_test.go | 16 +- api-tests/server/advisor_metrics_test.go | 2 +- api-tests/server/auth_test.go | 6 +- api-tests/server/serialization_test.go | 2 +- api/agent/v1/query.go | 26 +- api/agent/v1/query_test.go | 52 +-- managed/cmd/pmm-managed-starlark/main_test.go | 2 +- managed/cmd/pmm-managed/main.go | 6 +- managed/models/agent_helpers.go | 19 +- managed/models/agent_model.go | 22 +- managed/models/agentversion_test.go | 1 - managed/models/artifact_helpers.go | 4 +- managed/models/artifact_model.go | 2 +- managed/models/common_helpers.go | 14 +- managed/models/dump_helpers.go | 6 +- managed/models/job_helpers.go | 4 +- managed/models/job_helpers_test.go | 1 - managed/models/job_models.go | 4 +- managed/models/location_helpers.go | 2 +- managed/models/location_model.go | 4 +- managed/models/models.go | 17 +- managed/models/node_helpers_test.go | 4 - managed/models/restore_history_helpers.go | 2 +- managed/models/scheduled_task_models.go | 2 +- managed/models/scheduled_tasks_helpers.go | 2 +- managed/models/service_helpers.go | 2 +- managed/models/service_helpers_test.go | 4 - managed/models/settings.go | 2 +- managed/models/software_version.go | 2 +- managed/models/software_version_helpers.go | 2 +- managed/models/template_helpers_test.go | 4 +- managed/models/template_model.go | 4 +- managed/pi/alert/parameter.go | 14 +- managed/services/agents/agents_test.go | 4 +- managed/services/agents/channel/channel.go | 4 +- .../agents/connection_checker_test.go | 1 - managed/services/agents/nomad.go | 2 +- managed/services/agents/versioner_test.go | 1 - managed/services/alert_rule.go | 4 +- managed/services/alerting/service.go | 5 +- .../backup/compatibility_service_test.go | 2 - managed/services/checks/checks.go | 6 +- managed/services/checks/checks_test.go | 5 - managed/services/checks/funcs.go | 8 +- managed/services/checks/funcs_test.go | 7 +- managed/services/dump/dump.go | 8 +- managed/services/grafana/client.go | 18 +- managed/services/inventory/agents.go | 5 +- managed/services/inventory/agents_test.go | 48 +-- managed/services/inventory/services_test.go | 24 +- managed/services/management/azure_database.go | 18 +- managed/services/management/checks.go | 9 +- managed/services/management/checks_test.go | 2 - managed/services/management/dump/dump.go | 4 +- managed/services/qan/client.go | 5 +- managed/services/qan/client_test.go | 10 +- managed/services/server/logs.go | 20 +- managed/services/supervisord/supervisord.go | 384 +++++++++--------- managed/services/telemetry/datasources.go | 2 +- managed/utils/dir/dir.go | 12 +- managed/utils/interceptors/interceptors.go | 8 +- managed/utils/interceptors/service.go | 4 +- managed/utils/irt/logger.go | 4 +- managed/utils/tests/id.go | 4 +- managed/utils/validators/validators.go | 10 +- qan-api2/models/base.go | 6 +- qan-api2/models/metrics.go | 20 +- qan-api2/services/analytics/profile.go | 4 +- qan-api2/utils/interceptors/interceptors.go | 6 +- qan-api2/utils/logger/grpc.go | 6 +- utils/logger/grpc.go | 6 +- utils/pdeathsig/pdeathsig.go | 1 - utils/sqlmetrics/reform.go | 12 +- utils/sqlrows/sqlrows.go | 8 +- version/update.go | 2 +- 123 files changed, 648 insertions(+), 710 deletions(-) diff --git a/admin/cmd/pmm-admin/main_test.go b/admin/cmd/pmm-admin/main_test.go index b9291ad1db8..6810445c6c1 100644 --- a/admin/cmd/pmm-admin/main_test.go +++ b/admin/cmd/pmm-admin/main_test.go @@ -47,7 +47,7 @@ func TestVersionJson(t *testing.T) { b, err := cmd.CombinedOutput() require.NoError(t, err, "%s", b) - var jsonStruct interface{} + var jsonStruct any if err := json.Unmarshal(b, &jsonStruct); err != nil { t.Errorf("pmm-admin --version --json produces incorrect output format") } diff --git a/admin/commands/base.go b/admin/commands/base.go index 96feffc7c1a..134ac2e1a2f 100644 --- a/admin/commands/base.go +++ b/admin/commands/base.go @@ -146,7 +146,7 @@ func ParseTemplate(text string) *template.Template { } // RenderTemplate renders given template with given data and returns result as string. -func RenderTemplate(t *template.Template, data interface{}) string { +func RenderTemplate(t *template.Template, data any) string { var buf bytes.Buffer if err := t.Execute(&buf, data); err != nil { logrus.Panicf("Failed to render response.\n%s.\nTemplate data: %#v.\nPlease report this bug.", err, data) diff --git a/admin/commands/base/setup.go b/admin/commands/base/setup.go index bbf52687cf3..a3d3f63d558 100644 --- a/admin/commands/base/setup.go +++ b/admin/commands/base/setup.go @@ -101,7 +101,7 @@ func SetupClients(ctx context.Context, globalFlags *flags.GlobalFlags) { transport.Context = ctx // set error handlers for nginx responses if pmm-managed is down - errorConsumer := runtime.ConsumerFunc(func(reader io.Reader, _ interface{}) error { + errorConsumer := runtime.ConsumerFunc(func(reader io.Reader, _ any) error { b, _ := io.ReadAll(reader) return nginxError(string(b)) }) diff --git a/admin/commands/status_test.go b/admin/commands/status_test.go index 4e9e902af69..4a6eb055f1f 100644 --- a/admin/commands/status_test.go +++ b/admin/commands/status_test.go @@ -84,11 +84,11 @@ func TestStatusJSON(t *testing.T) { b, err := json.MarshalIndent(res, "", " ") require.NoError(t, err) - var m map[string]interface{} + var m map[string]any err = json.Unmarshal(b, &m) require.NoError(t, err) // String, not JSON object with Scheme, Host, etc. Username and password are stripped. - m = m["pmm_agent_status"].(map[string]interface{}) + m = m["pmm_agent_status"].(map[string]any) assert.Equal(t, "https://address/", m["server_url"]) } diff --git a/agent/agents/cache/cache.go b/agent/agents/cache/cache.go index 5e0da049a2a..1c0066c9031 100644 --- a/agent/agents/cache/cache.go +++ b/agent/agents/cache/cache.go @@ -39,7 +39,7 @@ type Cache struct { l *logrus.Entry rw sync.RWMutex - items map[interface{}]*list.Element + items map[any]*list.Element itemsList *list.List updatedN uint addedN uint @@ -49,14 +49,14 @@ type Cache struct { // cacheItem is an element stored in Cache. type cacheItem struct { - key interface{} - value interface{} + key any + value any added time.Time } // New creates new Cache. // Argument typ is an instance of type to be stored in Cache, must be a map with chosen key and value types. -func New(typ interface{}, retain time.Duration, sizeLimit uint, l *logrus.Entry) (*Cache, error) { +func New(typ any, retain time.Duration, sizeLimit uint, l *logrus.Entry) (*Cache, error) { if reflect.TypeOf(typ).Kind() != reflect.Map { return nil, fmt.Errorf("%w: typ must be of map kind", ErrWrongType) } @@ -65,13 +65,13 @@ func New(typ interface{}, retain time.Duration, sizeLimit uint, l *logrus.Entry) retain: retain, sizeLimit: sizeLimit, l: l, - items: make(map[interface{}]*list.Element), + items: make(map[any]*list.Element), itemsList: list.New(), }, nil } // Get fills dest argument with all current items if the cache. -func (c *Cache) Get(dest interface{}) error { +func (c *Cache) Get(dest any) error { if reflect.TypeOf(dest) != c.typ { return fmt.Errorf("%w: must be %v, got %v", ErrWrongType, c.typ, reflect.TypeOf(dest)) } @@ -86,7 +86,7 @@ func (c *Cache) Get(dest interface{}) error { } // Set removes expired items from cache, then adds current items, then trims the cache if it's length is more than specified. -func (c *Cache) Set(current interface{}) error { +func (c *Cache) Set(current any) error { if reflect.TypeOf(current) != c.typ { return fmt.Errorf("%w: must be %v, got %v", ErrWrongType, c.typ, reflect.TypeOf(current)) } diff --git a/agent/agents/cache/cache_test.go b/agent/agents/cache/cache_test.go index 277ad3efda8..b3c502f7506 100644 --- a/agent/agents/cache/cache_test.go +++ b/agent/agents/cache/cache_test.go @@ -15,6 +15,7 @@ package cache import ( + "maps" "reflect" "testing" "time" @@ -81,9 +82,7 @@ func TestCache(t *testing.T) { _ = c.Get(actual) expected := make(map[int64]*someType) - for k, v := range set1 { - expected[k] = v - } + maps.Copy(expected, set1) expected[6] = &someType{} expected[7] = &someType{} @@ -110,9 +109,7 @@ func TestCache(t *testing.T) { _ = c.Get(actual) expected := make(map[int64]*someType) - for k, v := range set2 { - expected[k] = v - } + maps.Copy(expected, set2) assert.True(t, reflect.DeepEqual(actual, expected)) assert.Equal(t, uint(6), stats.Current) diff --git a/agent/agents/mongodb/profiler/internal/monitors.go b/agent/agents/mongodb/profiler/internal/monitors.go index 9b617952d48..00d00d17f14 100644 --- a/agent/agents/mongodb/profiler/internal/monitors.go +++ b/agent/agents/mongodb/profiler/internal/monitors.go @@ -16,6 +16,7 @@ package profiler import ( "context" + "maps" "sync" "time" @@ -133,9 +134,7 @@ func (ms *monitors) GetAll() map[string]*monitor { defer ms.rw.RUnlock() list := make(map[string]*monitor) - for dbName, m := range ms.monitors { - list[dbName] = m - } + maps.Copy(list, ms.monitors) return list } diff --git a/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go b/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go index d7a7e79eaf2..0676bb5b98d 100644 --- a/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go @@ -95,7 +95,7 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d case bson.D: sortJSON, _ := json.Marshal(s.Map()) //nolint:errchkjson,staticcheck // PMM-13964 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) - case map[string]interface{}: + case map[string]any: sortJSON, _ := json.Marshal(s) //nolint:errchkjson // PMM-13964 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) default: @@ -130,7 +130,7 @@ func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, fp.Keys = string(filterJSON) if command["upsert"] == true || command["multi"] == true { - options := make(map[string]interface{}) + options := make(map[string]any) if command["upsert"] == true { options["upsert"] = true } @@ -224,7 +224,7 @@ type maskOption struct { } // maskValues replaces all values within a map or slice with "?" recursively and removes keys in the filter. -func maskValues(data interface{}, options map[string]maskOption) interface{} { +func maskValues(data any, options map[string]maskOption) any { switch v := data.(type) { case bson.D: masked := make(bson.M) diff --git a/agent/agents/mysql/slowlog/parser/parser.go b/agent/agents/mysql/slowlog/parser/parser.go index 867f26d1483..3a48503cd59 100644 --- a/agent/agents/mysql/slowlog/parser/parser.go +++ b/agent/agents/mysql/slowlog/parser/parser.go @@ -90,18 +90,6 @@ func NewSlowLogParser(r filereader.Reader, opts log.Options) *SlowLogParser { return p } -// logf logs with configured logger. -func (p *SlowLogParser) logf(format string, v ...interface{}) { - if !p.opts.Debug { - return - } - if p.opts.Debugf != nil { - p.opts.Debugf(format, v...) - return - } - stdlog.Printf(format, v...) -} - // Parse returns next parsed event, or nil, when parsing is done. func (p *SlowLogParser) Parse() *log.Event { return <-p.eventChan @@ -173,6 +161,18 @@ func (p *SlowLogParser) Run() { } } +// logf logs with configured logger. +func (p *SlowLogParser) logf(format string, v ...any) { + if !p.opts.Debug { + return + } + if p.opts.Debugf != nil { + p.opts.Debugf(format, v...) + return + } + stdlog.Printf(format, v...) +} + func (p *SlowLogParser) parseHeader(line string) { p.logf("header") @@ -250,7 +250,7 @@ func (p *SlowLogParser) parseMetrics(line string) { // we need to skip redundant space to correct the split process line = strings.Replace(line, ": ", ":", -1) //nolint:gocritic - for _, kv := range strings.Split(line, " ") { + for kv := range strings.SplitSeq(line, " ") { if len(kv) == 0 { continue } diff --git a/agent/agents/mysql/slowlog/slowlog_test.go b/agent/agents/mysql/slowlog/slowlog_test.go index 08c42428aed..8807acd2814 100644 --- a/agent/agents/mysql/slowlog/slowlog_test.go +++ b/agent/agents/mysql/slowlog/slowlog_test.go @@ -37,7 +37,7 @@ import ( inventoryv1 "github.com/percona/pmm/api/inventory/v1" ) -func getDataFromFile(t *testing.T, filePath string, data interface{}) { +func getDataFromFile(t *testing.T, filePath string, data any) { t.Helper() jsonData, err := os.ReadFile(filePath) //nolint:gosec diff --git a/agent/agents/postgres/parser/parser_test.go b/agent/agents/postgres/parser/parser_test.go index ba0011d1c8c..53ebf14fb7e 100644 --- a/agent/agents/postgres/parser/parser_test.go +++ b/agent/agents/postgres/parser/parser_test.go @@ -66,7 +66,7 @@ func TestExtractTables(t *testing.T) { } } -var actualB interface{} +var actualB any func BenchmarkExtractTables(b *testing.B) { files, err := filepath.Glob(filepath.FromSlash("./testdata/*.sql")) diff --git a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_models.go b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_models.go index fd120ef5751..af06d271da8 100644 --- a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_models.go +++ b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_models.go @@ -106,13 +106,13 @@ type pgStatMonitor struct { ParallelWorkersLaunched int64 // reform related fields - pointers []interface{} + pointers []any view reform.View } type field struct { info parse.FieldInfo - pointer interface{} + pointer any } func newPgStatMonitorStructs(vPGSM pgStatMonitorVersion, vPG pgVersion) (*pgStatMonitor, reform.View) { //nolint:ireturn @@ -248,7 +248,7 @@ func newPgStatMonitorStructs(vPGSM pgStatMonitorVersion, vPG pgVersion) (*pgStat field{info: parse.FieldInfo{Name: "UserName", Type: "string", Column: "username"}, pointer: &s.UserName}) } - s.pointers = make([]interface{}, len(fields)) + s.pointers = make([]any, len(fields)) pgStatMonitorDefaultView := &pgStatMonitorAllViewType{ s: parse.StructInfo{ Type: "pgStatMonitor", @@ -272,7 +272,7 @@ func newPgStatMonitorStructs(vPGSM pgStatMonitorVersion, vPG pgVersion) (*pgStat type pgStatMonitorAllViewType struct { s parse.StructInfo - z []interface{} + z []any c []string vPGSM pgStatMonitorVersion vPG pgVersion @@ -361,8 +361,8 @@ func (s pgStatMonitor) String() string { // Values returns a slice of struct or record field values. // Returned interface{} values are never untyped nils. -func (s *pgStatMonitor) Values() []interface{} { - values := make([]interface{}, len(s.pointers)) +func (s *pgStatMonitor) Values() []any { + values := make([]any, len(s.pointers)) for i, pointer := range s.pointers { values[i] = reflect.ValueOf(pointer).Interface() } @@ -371,7 +371,7 @@ func (s *pgStatMonitor) Values() []interface{} { // Pointers returns a slice of pointers to struct or record fields. // Returned interface{} values are never untyped nils. -func (s *pgStatMonitor) Pointers() []interface{} { +func (s *pgStatMonitor) Pointers() []any { return s.pointers } diff --git a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go index 7e6a8e42c6b..ca426881b37 100644 --- a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go +++ b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go @@ -343,7 +343,7 @@ func TestPGStatMonitorSchema(t *testing.T) { const n = 500 placeholders := db.Placeholders(1, n) - args := make([]interface{}, n) + args := make([]any, n) for i := range n { args[i] = i } diff --git a/agent/agents/postgres/pgstatmonitor/stat_monitor_cache.go b/agent/agents/postgres/pgstatmonitor/stat_monitor_cache.go index 0b69dcca73e..7d8b6a3dfdb 100644 --- a/agent/agents/postgres/pgstatmonitor/stat_monitor_cache.go +++ b/agent/agents/postgres/pgstatmonitor/stat_monitor_cache.go @@ -17,6 +17,7 @@ package pgstatmonitor import ( "context" "fmt" + "maps" "sync" "time" @@ -80,9 +81,7 @@ func (ssc *statMonitorCache) getStatMonitorExtended( ssc.rw.RLock() current := make(map[time.Time]map[string]*pgStatMonitorExtended) cache := make(map[time.Time]map[string]*pgStatMonitorExtended) - for k, v := range ssc.items { - cache[k] = v - } + maps.Copy(cache, ssc.items) ssc.rw.RUnlock() // load all databases and usernames first as we can't use querier while iterating over rows below diff --git a/agent/agents/postgres/pgstatstatements/pg_stat_statements_models.go b/agent/agents/postgres/pgstatstatements/pg_stat_statements_models.go index 8f360188bb4..73d876a252e 100644 --- a/agent/agents/postgres/pgstatstatements/pg_stat_statements_models.go +++ b/agent/agents/postgres/pgstatstatements/pg_stat_statements_models.go @@ -53,13 +53,13 @@ type pgStatStatements struct { LocalBlkWriteTime float64 // reform related fields - pointers []interface{} + pointers []any view reform.View } type field struct { info parse.FieldInfo - pointer interface{} + pointer any } func newPgStatMonitorStructs(vPGSS semver.Version) (*pgStatStatements, reform.View) { //nolint:ireturn @@ -103,7 +103,7 @@ func newPgStatMonitorStructs(vPGSS semver.Version) (*pgStatStatements, reform.Vi field{info: parse.FieldInfo{Name: "LocalBlkWriteTime", Type: "float64", Column: "local_blk_write_time"}, pointer: &s.LocalBlkWriteTime}) } - s.pointers = make([]interface{}, len(fields)) + s.pointers = make([]any, len(fields)) pgStatStatementsDefaultView := &pgStatStatementsAllViewType{ s: parse.StructInfo{ Type: "pgStatStatements", @@ -127,7 +127,7 @@ func newPgStatMonitorStructs(vPGSS semver.Version) (*pgStatStatements, reform.Vi type pgStatStatementsAllViewType struct { s parse.StructInfo - z []interface{} + z []any c []string vPGSS semver.Version } @@ -155,8 +155,8 @@ func (v *pgStatStatementsAllViewType) NewStruct() reform.Struct { //nolint:iretu // Values returns a slice of struct or record field values. // Returned interface{} values are never untyped nils. -func (s *pgStatStatements) Values() []interface{} { - values := make([]interface{}, len(s.pointers)) +func (s *pgStatStatements) Values() []any { + values := make([]any, len(s.pointers)) for i, pointer := range s.pointers { values[i] = reflect.ValueOf(pointer).Interface() } @@ -165,7 +165,7 @@ func (s *pgStatStatements) Values() []interface{} { // Pointers returns a slice of pointers to struct or record fields. // Returned interface{} values are never untyped nils. -func (s *pgStatStatements) Pointers() []interface{} { +func (s *pgStatStatements) Pointers() []any { return s.pointers } diff --git a/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go b/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go index 0cb995cc71f..b07bc059a7d 100644 --- a/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go +++ b/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go @@ -285,7 +285,7 @@ func TestPGStatStatementsQAN(t *testing.T) { const n = 500 placeholders := db.Placeholders(1, n) - args := make([]interface{}, n) + args := make([]any, n) for i := range n { args[i] = i } @@ -403,16 +403,14 @@ func TestPGStatStatementsQAN(t *testing.T) { errChan := make(chan error, 1) for i := range n { id := i - waitGroup.Add(1) - go func() { - defer waitGroup.Done() + waitGroup.Go(func() { _, err := db.Exec( fmt.Sprintf(`INSERT /* CheckMBlkReadTime controller='test' */ INTO %s (customer_id, first_name, last_name, active) VALUES (%d, 'John', 'Dow', TRUE)`, tableName, id), ) if err != nil { errChan <- err } - }() + }) } go func() { waitGroup.Wait() diff --git a/agent/agents/process/process.go b/agent/agents/process/process.go index 57152c4fbfb..aae1ca2227c 100644 --- a/agent/agents/process/process.go +++ b/agent/agents/process/process.go @@ -78,7 +78,7 @@ type Params struct { Env []string Type inventoryv1.AgentType TemplateRenderer *templates.TemplateRenderer - TemplateParams map[string]interface{} + TemplateParams map[string]any } func (p *Params) String() string { diff --git a/agent/agents/supervisor/supervisor.go b/agent/agents/supervisor/supervisor.go index 4462e025688..b7a1e03072e 100644 --- a/agent/agents/supervisor/supervisor.go +++ b/agent/agents/supervisor/supervisor.go @@ -746,7 +746,7 @@ func (s *Supervisor) processParams(agentID string, agentProcess *agentv1.SetStat processParams.Type = agentProcess.Type cfg := s.cfg.Get() - templateParams := map[string]interface{}{ + templateParams := map[string]any{ "listen_port": port, } switch agentProcess.Type { diff --git a/agent/agents/supervisor/supervisor_test.go b/agent/agents/supervisor/supervisor_test.go index 20a15c4e6f5..725559e23b9 100644 --- a/agent/agents/supervisor/supervisor_test.go +++ b/agent/agents/supervisor/supervisor_test.go @@ -259,8 +259,7 @@ func TestSupervisor(t *testing.T) { } func TestStartProcessFail(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() tempDir := t.TempDir() cfgStorage := config.NewStorage(&config.Config{ Paths: config.Paths{TempDir: tempDir}, diff --git a/agent/client/channel/channel.go b/agent/client/channel/channel.go index e28d1c445a6..2dbe742ae57 100644 --- a/agent/client/channel/channel.go +++ b/agent/client/channel/channel.go @@ -71,7 +71,7 @@ type Channel struct { mRecv, mSend prometheus.Counter - lastSentRequestID uint32 + lastSentRequestID atomic.Uint32 sendM sync.Mutex @@ -167,7 +167,7 @@ func (c *Channel) Send(resp *AgentResponse) { // Response and error will be both nil if channel is closed. // It is no-op once channel is closed (see Wait). func (c *Channel) SendAndWaitResponse(payload agentv1.AgentRequestPayload) (agentv1.ServerResponsePayload, error) { //nolint:ireturn,nolintlint - id := atomic.AddUint32(&c.lastSentRequestID, 1) + id := c.lastSentRequestID.Add(1) ch := c.subscribe(id) c.send(&agentv1.AgentMessage{ diff --git a/agent/client/client.go b/agent/client/client.go index da3bb25397d..b4c12e18163 100644 --- a/agent/client/client.go +++ b/agent/client/client.go @@ -359,10 +359,7 @@ func (c *Client) processJobsResults(ctx context.Context) { func (c *Client) processSupervisorRequests(ctx context.Context) { //nolint:gocognit var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() - + wg.Go(func() { for { select { case state := <-c.supervisor.Changes(): @@ -382,12 +379,9 @@ func (c *Client) processSupervisorRequests(ctx context.Context) { //nolint:gocog return } } - }() - - wg.Add(1) - go func() { - defer wg.Done() + }) + wg.Go(func() { for { select { case collect := <-c.supervisor.QANRequests(): @@ -407,7 +401,7 @@ func (c *Client) processSupervisorRequests(ctx context.Context) { //nolint:gocog return } } - }() + }) wg.Go(func() { for { diff --git a/agent/commands/clients.go b/agent/commands/clients.go index 0c537a0e0a0..0ed0869ffa9 100644 --- a/agent/commands/clients.go +++ b/agent/commands/clients.go @@ -171,7 +171,7 @@ func serverRegister(cfgSetup *config.Setup) (agentID, token string, _ error) { / } var disableCollectors []string - for _, v := range strings.Split(cfgSetup.DisableCollectors, ",") { + for v := range strings.SplitSeq(cfgSetup.DisableCollectors, ",") { disableCollector := strings.TrimSpace(v) if disableCollector != "" { disableCollectors = append(disableCollectors, disableCollector) diff --git a/agent/config/logger.go b/agent/config/logger.go index 018784fe72b..fa1482939f0 100644 --- a/agent/config/logger.go +++ b/agent/config/logger.go @@ -33,9 +33,9 @@ func (v *gRPCLogger) V(l int) bool { //nolint:revive } // override InfoXXX methods with TraceXXX to keep gRPC and logrus levels in sync. -func (v *gRPCLogger) Info(args ...interface{}) { v.Trace(args...) } -func (v *gRPCLogger) Infoln(args ...interface{}) { v.Traceln(args...) } -func (v *gRPCLogger) Infof(format string, args ...interface{}) { v.Tracef(format, args...) } +func (v *gRPCLogger) Info(args ...any) { v.Trace(args...) } +func (v *gRPCLogger) Infoln(args ...any) { v.Traceln(args...) } +func (v *gRPCLogger) Infof(format string, args ...any) { v.Tracef(format, args...) } var initLogger sync.Once diff --git a/agent/connectionchecker/connection_checker_test.go b/agent/connectionchecker/connection_checker_test.go index 24cd4dcdd63..7c755d38c45 100644 --- a/agent/connectionchecker/connection_checker_test.go +++ b/agent/connectionchecker/connection_checker_test.go @@ -237,7 +237,6 @@ func TestConnectionChecker(t *testing.T) { } for _, tt := range testCases { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() diff --git a/agent/connectionuptime/service.go b/agent/connectionuptime/service.go index b831bed8130..dd94c9adbaa 100644 --- a/agent/connectionuptime/service.go +++ b/agent/connectionuptime/service.go @@ -17,6 +17,7 @@ package connectionuptime import ( "context" + "slices" "sync" "time" @@ -84,8 +85,8 @@ func (c *Service) deleteOldEvents(toTime time.Time) { // The latest expired element in the slice will be the first one to calculate // uptime correctly during set up window time boundaryTimestamp := toTime.Add(-c.windowPeriod) - for i := len(c.events) - 1; i >= 0; i-- { - if c.events[i].Timestamp.Before(boundaryTimestamp) { + for i, v := range slices.Backward(c.events) { + if v.Timestamp.Before(boundaryTimestamp) { c.removeFirstElementsUntilIndex(i) return diff --git a/agent/queryparser/helpers.go b/agent/queryparser/helpers.go index 081e3860951..9ed6e04d552 100644 --- a/agent/queryparser/helpers.go +++ b/agent/queryparser/helpers.go @@ -16,6 +16,7 @@ package queryparser import ( + "maps" "regexp" "strings" ) @@ -40,9 +41,7 @@ func parseComments(query string, quotedRegexp *regexp.Regexp, commentRegexp *reg result := make(map[string]string) comments := extractComments(query, quotedRegexp, commentRegexp) for _, c := range comments { - for k, v := range parseKeyValueFromComment(c) { - result[k] = v - } + maps.Copy(result, parseKeyValueFromComment(c)) } return result, nil diff --git a/agent/runner/actions/common.go b/agent/runner/actions/common.go index 655036889b2..f02beaa7bab 100644 --- a/agent/runner/actions/common.go +++ b/agent/runner/actions/common.go @@ -41,16 +41,16 @@ var whiteSpacesRegExp = regexp.MustCompile(`\s+`) // … // // ]. -func jsonRows(columns []string, dataRows [][]interface{}) ([]byte, error) { - res := make([][]interface{}, len(dataRows)+1) +func jsonRows(columns []string, dataRows [][]any) ([]byte, error) { + res := make([][]any, len(dataRows)+1) - res[0] = make([]interface{}, len(columns)) + res[0] = make([]any, len(columns)) for i, col := range columns { res[0][i] = col } for i, row := range dataRows { - res[i+1] = make([]interface{}, len(columns)) + res[i+1] = make([]any, len(columns)) copy(res[i+1], row) } diff --git a/agent/runner/actions/mongodb_explain_action_test.go b/agent/runner/actions/mongodb_explain_action_test.go index fa6a606a1f7..3356590c928 100644 --- a/agent/runner/actions/mongodb_explain_action_test.go +++ b/agent/runner/actions/mongodb_explain_action_test.go @@ -276,40 +276,40 @@ func TestMongoDBExplain(t *testing.T) { res, err := ex.Run(ctx) require.NoError(t, err) - want := map[string]interface{}{ + want := map[string]any{ "indexFilterSet": false, "namespace": "test.coll", - "parsedQuery": map[string]interface{}{ - "k": map[string]interface{}{"$lte": map[string]interface{}{"$numberInt": "1"}}, + "parsedQuery": map[string]any{ + "k": map[string]any{"$lte": map[string]any{"$numberInt": "1"}}, }, - "rejectedPlans": []interface{}{}, - "winningPlan": map[string]interface{}{"stage": "EOF"}, + "rejectedPlans": []any{}, + "winningPlan": map[string]any{"stage": "EOF"}, } mongoDBVersion, _ := tests.MongoDBVersion(t, client) switch { case mongoDBVersion.Major < 5: - want["plannerVersion"] = map[string]interface{}{"$numberInt": "1"} + want["plannerVersion"] = map[string]any{"$numberInt": "1"} case mongoDBVersion.Major < 8: want["maxIndexedAndSolutionsReached"] = false want["maxIndexedOrSolutionsReached"] = false want["maxScansToExplodeReached"] = false if mongoDBVersion.Major == 7 { - want["optimizationTimeMillis"] = map[string]interface{}{"$numberInt": "0"} + want["optimizationTimeMillis"] = map[string]any{"$numberInt": "0"} } case mongoDBVersion.Major == 8: want["maxIndexedAndSolutionsReached"] = false want["maxIndexedOrSolutionsReached"] = false want["maxScansToExplodeReached"] = false - want["optimizationTimeMillis"] = map[string]interface{}{"$numberInt": "0"} - want["winningPlan"] = map[string]interface{}{"stage": "EOF", "isCached": false} + want["optimizationTimeMillis"] = map[string]any{"$numberInt": "0"} + want["winningPlan"] = map[string]any{"stage": "EOF", "isCached": false} want["prunedSimilarIndexes"] = false if mongoDBVersion.Minor >= 2 { - want["winningPlan"] = map[string]interface{}{"stage": "EOF", "isCached": false, "type": "nonExistentNamespace"} + want["winningPlan"] = map[string]any{"stage": "EOF", "isCached": false, "type": "nonExistentNamespace"} } } - explainM := make(map[string]interface{}) + explainM := make(map[string]any) err = json.Unmarshal(res, &explainM) require.NoError(t, err) queryPlanner, ok := explainM["queryPlanner"] @@ -367,7 +367,7 @@ func TestNewMongoDBExplain(t *testing.T) { res, err := ex.Run(ctx) require.NoError(t, err) - explainM := make(map[string]interface{}) + explainM := make(map[string]any) err = json.Unmarshal(res, &explainM) require.NoError(t, err) diff --git a/agent/runner/actions/mongodb_query_admincommand_action.go b/agent/runner/actions/mongodb_query_admincommand_action.go index cb9209425b5..49b1f2ebc6b 100644 --- a/agent/runner/actions/mongodb_query_admincommand_action.go +++ b/agent/runner/actions/mongodb_query_admincommand_action.go @@ -37,7 +37,7 @@ type mongodbQueryAdmincommandAction struct { dsn string files *agentv1.TextFiles //nolint:unused command string - arg interface{} + arg any tmpDir string } @@ -48,7 +48,7 @@ func NewMongoDBQueryAdmincommandAction( dsn string, files *agentv1.TextFiles, command string, - arg interface{}, + arg any, tempDir string, ) (Action, error) { tmpDir := filepath.Join(tempDir, mongoDBQueryAdminCommandActionType, id) @@ -104,12 +104,12 @@ func (a *mongodbQueryAdmincommandAction) Run(ctx context.Context) ([]byte, error runCommand := bson.D{{a.command, a.arg}} //nolint:govet res := client.Database("admin").RunCommand(ctx, runCommand) - var doc map[string]interface{} + var doc map[string]any if err = res.Decode(&doc); err != nil { return nil, errors.WithStack(err) } - data := []map[string]interface{}{doc} + data := []map[string]any{doc} return agentv1.MarshalActionQueryDocsResult(data) } diff --git a/agent/runner/actions/mongodb_query_admincommand_action_test.go b/agent/runner/actions/mongodb_query_admincommand_action_test.go index e58aa51573a..11df579b5e8 100644 --- a/agent/runner/actions/mongodb_query_admincommand_action_test.go +++ b/agent/runner/actions/mongodb_query_admincommand_action_test.go @@ -171,7 +171,7 @@ func TestMongoDBActionsReplWithSSL(t *testing.T) { }) } -func runAction(t *testing.T, id string, timeout time.Duration, dsn string, files *agentv1.TextFiles, command string, arg interface{}, tempDir string) []byte { //nolint:unparam +func runAction(t *testing.T, id string, timeout time.Duration, dsn string, files *agentv1.TextFiles, command string, arg any, tempDir string) []byte { //nolint:unparam t.Helper() a, err := NewMongoDBQueryAdmincommandAction(id, timeout, dsn, files, command, arg, tempDir) require.NoError(t, err) @@ -222,7 +222,7 @@ func replSetGetStatusAssertionsReplicated(t *testing.T, b []byte) { //nolint:the assert.Len(t, objxM.Get("members").Data(), 2) } -func replSetGetStatusAssertionsStandalone(t *testing.T, id string, timeout time.Duration, dsn string, files *agentv1.TextFiles, command string, arg interface{}, tempDir string) { //nolint:thelper +func replSetGetStatusAssertionsStandalone(t *testing.T, id string, timeout time.Duration, dsn string, files *agentv1.TextFiles, command string, arg any, tempDir string) { //nolint:thelper a, err := NewMongoDBQueryAdmincommandAction(id, timeout, dsn, files, command, arg, tempDir) require.NoError(t, err) @@ -248,7 +248,7 @@ func getCmdLineOptsAssertionsWithAuth(t *testing.T, b []byte) { //nolint:thelper assert.Equal(t, "enabled", security.Get("authorization").String()) argv := objxM.Get("argv").InterSlice() - for _, v := range []interface{}{"mongod", "--profile=2", "--auth"} { + for _, v := range []any{"mongod", "--profile=2", "--auth"} { assert.Contains(t, argv, v) } } @@ -266,7 +266,7 @@ func getCmdLineOptsAssertionsWithoutAuth(t *testing.T, b []byte) { //nolint:thel assert.Equal(t, "disabled", security.Get("authorization").String()) argv := objxM.Get("argv").InterSlice() - for _, v := range []interface{}{"mongod", "--profile=2", "--noauth"} { + for _, v := range []any{"mongod", "--profile=2", "--noauth"} { assert.Contains(t, argv, v) } } @@ -283,6 +283,6 @@ func getCmdLineOptsAssertionsWithSSL(t *testing.T, b []byte) { //nolint:thelper assert.Empty(t, security) argv := objxM.Get("argv").InterSlice() - expected := []interface{}{"mongod", "--tlsMode=requireTLS", "--tlsCertificateKeyFile=/etc/tls/certificates/server.pem"} + expected := []any{"mongod", "--tlsMode=requireTLS", "--tlsCertificateKeyFile=/etc/tls/certificates/server.pem"} assert.Subset(t, argv, expected) } diff --git a/agent/runner/actions/mysql_explain_action.go b/agent/runner/actions/mysql_explain_action.go index 333490e322f..fc9925b9c55 100644 --- a/agent/runner/actions/mysql_explain_action.go +++ b/agent/runner/actions/mysql_explain_action.go @@ -20,6 +20,7 @@ import ( "database/sql" "encoding/json" "fmt" + "io" "strings" "text/tabwriter" "time" @@ -185,17 +186,32 @@ func (a *mysqlExplainAction) explainDefault(ctx context.Context, tx *sql.Tx) ([] var buf bytes.Buffer w := tabwriter.NewWriter(&buf, 0, 0, 1, ' ', tabwriter.Debug) - w.Write([]byte(strings.Join(columns, "\t"))) //nolint:errcheck + _, wErr := io.WriteString(w, strings.Join(columns, "\t")) + if wErr != nil { + return nil, wErr + } for _, dataRow := range dataRows { - row := "\n" + _, wErr = w.Write([]byte{'\n'}) + if wErr != nil { + return nil, wErr + } for _, d := range dataRow { - v := "NULL" if d != nil { - v = fmt.Sprint(d) + _, wErr := io.WriteString(w, fmt.Sprint(d)) + if wErr != nil { + return nil, wErr + } + } else { + _, wErr = io.WriteString(w, "NULL") + if wErr != nil { + return nil, wErr + } + } + _, wErr = w.Write([]byte{'\t'}) + if wErr != nil { + return nil, wErr } - row += v + "\t" } - w.Write([]byte(row)) //nolint:errcheck } if err = w.Flush(); err != nil { return nil, err @@ -214,7 +230,7 @@ func (a *mysqlExplainAction) explainJSON(ctx context.Context, tx *sql.Tx) ([]byt return nil, err } - var m map[string]interface{} + var m map[string]any if err = json.Unmarshal(b, &m); err != nil { return nil, err } @@ -227,14 +243,14 @@ func (a *mysqlExplainAction) explainJSON(ctx context.Context, tx *sql.Tx) ([]byt } defer rows.Close() //nolint:errcheck - var warnings []map[string]interface{} + var warnings []map[string]any for rows.Next() { var level, message string var code int if err = rows.Scan(&level, &code, &message); err != nil { continue } - warnings = append(warnings, map[string]interface{}{ + warnings = append(warnings, map[string]any{ "Level": level, "Code": code, "Message": message, diff --git a/agent/runner/actions/mysql_explain_action_test.go b/agent/runner/actions/mysql_explain_action_test.go index 2e314a27663..0d2261e2094 100644 --- a/agent/runner/actions/mysql_explain_action_test.go +++ b/agent/runner/actions/mysql_explain_action_test.go @@ -112,7 +112,7 @@ func TestMySQLExplain(t *testing.T) { default: assert.Equal(t, 1, m.Get("query_block.select_id").Int()) - var table map[string]interface{} + var table map[string]any if mySQLVendor == version.MariaDBVendor { if mySQLVersion.Float() >= 11 { table = m.Get("query_block.nested_loop[0].read_sorted_file.filesort.table").MSI() @@ -126,7 +126,7 @@ func TestMySQLExplain(t *testing.T) { assert.Equal(t, "city", table["table_name"]) if mySQLVersion.String() != "5.6" && mySQLVendor != version.MariaDBVendor { - assert.Equal(t, []interface{}{"ID", "Name", "CountryCode", "District", "Population"}, table["used_columns"]) + assert.Equal(t, []any{"ID", "Name", "CountryCode", "District", "Population"}, table["used_columns"]) } if mySQLVendor != version.MariaDBVendor { @@ -160,7 +160,7 @@ func TestMySQLExplain(t *testing.T) { err = json.Unmarshal(b, &er) require.NoError(t, err) - var actual [][]interface{} + var actual [][]any err = json.Unmarshal(er.ExplainResult, &actual) require.NoError(t, err) require.Len(t, actual, 2) diff --git a/agent/runner/actions/mysql_query_select_action_test.go b/agent/runner/actions/mysql_query_select_action_test.go index ab654bb7ff7..1617c1da991 100644 --- a/agent/runner/actions/mysql_query_select_action_test.go +++ b/agent/runner/actions/mysql_query_select_action_test.go @@ -75,7 +75,7 @@ func TestMySQLQuerySelect(t *testing.T) { require.NoError(t, err) t.Log(spew.Sdump(data)) assert.InDelta(t, 1, len(data), 0) - expected := map[string]interface{}{ + expected := map[string]any{ "bytes": "\x00\x01\xfe\xff", } assert.Equal(t, expected, data[0]) diff --git a/agent/runner/actions/mysql_show_index_action_test.go b/agent/runner/actions/mysql_show_index_action_test.go index 8f01f0033ae..0b25e49d202 100644 --- a/agent/runner/actions/mysql_show_index_action_test.go +++ b/agent/runner/actions/mysql_show_index_action_test.go @@ -55,7 +55,7 @@ func TestMySQLShowIndex(t *testing.T) { require.NoError(t, err) t.Logf("Full JSON:\n%s", b) - var actual [][]interface{} + var actual [][]any err = json.Unmarshal(b, &actual) require.NoError(t, err) require.Len(t, actual, 3) @@ -66,36 +66,36 @@ func TestMySQLShowIndex(t *testing.T) { switch { case mySQLVendor == version.MariaDBVendor && mySQLVersion.Float() >= 10.5: - assert.Equal(t, []interface{}{ + assert.Equal(t, []any{ "Table", "Non_unique", "Key_name", "Seq_in_index", "Column_name", "Collation", "Cardinality", "Sub_part", "Packed", "Null", "Index_type", "Comment", "Index_comment", "Ignored", }, actual[0]) - assert.Equal(t, []interface{}{"city", float64(0), "PRIMARY", float64(1), "ID", "A", "CARDINALITY", nil, nil, "", "BTREE", "", "", "NO"}, actual[1]) - assert.Equal(t, []interface{}{"city", float64(1), "CountryCode", float64(1), "CountryCode", "A", "CARDINALITY", nil, nil, "", "BTREE", "", "", "NO"}, actual[2]) + assert.Equal(t, []any{"city", float64(0), "PRIMARY", float64(1), "ID", "A", "CARDINALITY", nil, nil, "", "BTREE", "", "", "NO"}, actual[1]) + assert.Equal(t, []any{"city", float64(1), "CountryCode", float64(1), "CountryCode", "A", "CARDINALITY", nil, nil, "", "BTREE", "", "", "NO"}, actual[2]) case mySQLVersion.String() == "5.6" || mySQLVendor == version.MariaDBVendor: - assert.Equal(t, []interface{}{ + assert.Equal(t, []any{ "Table", "Non_unique", "Key_name", "Seq_in_index", "Column_name", "Collation", "Cardinality", "Sub_part", "Packed", "Null", "Index_type", "Comment", "Index_comment", }, actual[0]) - assert.Equal(t, []interface{}{"city", float64(0), "PRIMARY", float64(1), "ID", "A", "CARDINALITY", nil, nil, "", "BTREE", "", ""}, actual[1]) - assert.Equal(t, []interface{}{"city", float64(1), "CountryCode", float64(1), "CountryCode", "A", "CARDINALITY", nil, nil, "", "BTREE", "", ""}, actual[2]) + assert.Equal(t, []any{"city", float64(0), "PRIMARY", float64(1), "ID", "A", "CARDINALITY", nil, nil, "", "BTREE", "", ""}, actual[1]) + assert.Equal(t, []any{"city", float64(1), "CountryCode", float64(1), "CountryCode", "A", "CARDINALITY", nil, nil, "", "BTREE", "", ""}, actual[2]) case mySQLVersion.String() == "5.7": - assert.Equal(t, []interface{}{ + assert.Equal(t, []any{ "Table", "Non_unique", "Key_name", "Seq_in_index", "Column_name", "Collation", "Cardinality", "Sub_part", "Packed", "Null", "Index_type", "Comment", "Index_comment", }, actual[0]) - assert.Equal(t, []interface{}{"city", float64(0), "PRIMARY", float64(1), "ID", "A", "CARDINALITY", nil, nil, "", "BTREE", "", ""}, actual[1]) - assert.Equal(t, []interface{}{"city", float64(1), "CountryCode", float64(1), "CountryCode", "A", "CARDINALITY", nil, nil, "", "BTREE", "", ""}, actual[2]) + assert.Equal(t, []any{"city", float64(0), "PRIMARY", float64(1), "ID", "A", "CARDINALITY", nil, nil, "", "BTREE", "", ""}, actual[1]) + assert.Equal(t, []any{"city", float64(1), "CountryCode", float64(1), "CountryCode", "A", "CARDINALITY", nil, nil, "", "BTREE", "", ""}, actual[2]) default: // >= MySQL 8.0 - assert.Equal(t, []interface{}{ + assert.Equal(t, []any{ "Table", "Non_unique", "Key_name", "Seq_in_index", "Column_name", "Collation", "Cardinality", "Sub_part", "Packed", "Null", "Index_type", "Comment", "Index_comment", "Visible", "Expression", }, actual[0]) - assert.Equal(t, []interface{}{"city", float64(0), "PRIMARY", float64(1), "ID", "A", "CARDINALITY", nil, nil, "", "BTREE", "", "", "YES", nil}, actual[1]) - assert.Equal(t, []interface{}{"city", float64(1), "CountryCode", float64(1), "CountryCode", "A", "CARDINALITY", nil, nil, "", "BTREE", "", "", "YES", nil}, actual[2]) + assert.Equal(t, []any{"city", float64(0), "PRIMARY", float64(1), "ID", "A", "CARDINALITY", nil, nil, "", "BTREE", "", "", "YES", nil}, actual[1]) + assert.Equal(t, []any{"city", float64(1), "CountryCode", float64(1), "CountryCode", "A", "CARDINALITY", nil, nil, "", "BTREE", "", "", "YES", nil}, actual[2]) } }) diff --git a/agent/runner/actions/mysql_show_table_status_action_test.go b/agent/runner/actions/mysql_show_table_status_action_test.go index 401d5272dbf..0a6a26757fd 100644 --- a/agent/runner/actions/mysql_show_table_status_action_test.go +++ b/agent/runner/actions/mysql_show_table_status_action_test.go @@ -48,7 +48,7 @@ func TestShowTableStatus(t *testing.T) { require.NoError(t, err) t.Logf("Full JSON:\n%s", b) - var actual [][]interface{} + var actual [][]any err = json.Unmarshal(b, &actual) require.NoError(t, err) require.Len(t, actual, 2) diff --git a/agent/runner/actions/postgresql_query_select_action_test.go b/agent/runner/actions/postgresql_query_select_action_test.go index ca3863c1066..e5341c43bb4 100644 --- a/agent/runner/actions/postgresql_query_select_action_test.go +++ b/agent/runner/actions/postgresql_query_select_action_test.go @@ -58,7 +58,7 @@ func TestPostgreSQLQuerySelect(t *testing.T) { assert.LessOrEqual(t, 1, len(data)) assert.LessOrEqual(t, len(data), 3) delete(data[0], "oid") - expected := map[string]interface{}{ + expected := map[string]any{ "extname": "plpgsql", "extowner": "10", "extnamespace": "11", @@ -90,7 +90,7 @@ func TestPostgreSQLQuerySelect(t *testing.T) { require.NoError(t, err) t.Log(spew.Sdump(data)) assert.InDelta(t, 1, len(data), 0) - expected := map[string]interface{}{ + expected := map[string]any{ "bytes": "\x00\x01\xfe\xff", } assert.Equal(t, expected, data[0]) diff --git a/agent/runner/actions/postgresql_show_create_table_action.go b/agent/runner/actions/postgresql_show_create_table_action.go index 5b95670ce17..b1ce252202a 100644 --- a/agent/runner/actions/postgresql_show_create_table_action.go +++ b/agent/runner/actions/postgresql_show_create_table_action.go @@ -167,7 +167,7 @@ func (a *postgresqlShowCreateTableAction) Run(ctx context.Context) ([]byte, erro func (a *postgresqlShowCreateTableAction) printTableInit(ctx context.Context, w io.Writer, db *sql.DB) (string, error) { var tableID, schema, relname string var namespaceQuery string - var args []interface{} + var args []any table := strings.Split(a.params.Table, ".") switch len(table) { case 2: diff --git a/agent/runner/actions/postgresql_show_index_action.go b/agent/runner/actions/postgresql_show_index_action.go index 436ce4e1517..b4449792b17 100644 --- a/agent/runner/actions/postgresql_show_index_action.go +++ b/agent/runner/actions/postgresql_show_index_action.go @@ -91,7 +91,7 @@ func (a *postgresqlShowIndexAction) Run(ctx context.Context) ([]byte, error) { defer db.Close() //nolint:errcheck var namespaceQuery string - var args []interface{} + var args []any table := strings.Split(a.params.Table, ".") switch len(table) { case 2: diff --git a/agent/runner/actions/postgresql_show_index_action_test.go b/agent/runner/actions/postgresql_show_index_action_test.go index 986abc937ef..3d497dc7d33 100644 --- a/agent/runner/actions/postgresql_show_index_action_test.go +++ b/agent/runner/actions/postgresql_show_index_action_test.go @@ -52,12 +52,12 @@ func TestPostgreSQLShowIndex(t *testing.T) { require.NoError(t, err) t.Logf("Full JSON:\n%s", b) - var actual [][]interface{} + var actual [][]any err = json.Unmarshal(b, &actual) require.NoError(t, err) require.Len(t, actual, 2) - assert.Equal(t, [][]interface{}{ + assert.Equal(t, [][]any{ {"schemaname", "tablename", "indexname", "tablespace", "indexdef"}, {"public", "city", "city_pkey", nil, "CREATE UNIQUE INDEX city_pkey ON public.city USING btree (id)"}, }, actual) @@ -80,12 +80,12 @@ func TestPostgreSQLShowIndex(t *testing.T) { require.NoError(t, err) t.Logf("Full JSON:\n%s", b) - var actual [][]interface{} + var actual [][]any err = json.Unmarshal(b, &actual) require.NoError(t, err) require.Len(t, actual, 2) - assert.Equal(t, [][]interface{}{ + assert.Equal(t, [][]any{ {"schemaname", "tablename", "indexname", "tablespace", "indexdef"}, {"public", "city", "city_pkey", nil, "CREATE UNIQUE INDEX city_pkey ON public.city USING btree (id)"}, }, actual) diff --git a/agent/runner/actions/query_transform.go b/agent/runner/actions/query_transform.go index a0c7bdb4741..fde02687bb2 100644 --- a/agent/runner/actions/query_transform.go +++ b/agent/runner/actions/query_transform.go @@ -100,13 +100,13 @@ func updateToSelect(matches []string) string { matches = matches[1:] matches[0], matches[1] = matches[1], matches[0] format := []string{"SELECT %s", " FROM %s", " WHERE %s"} - result := "" + var result strings.Builder for i, match := range matches { if match != "" { - result += fmt.Sprintf(format[i], match) + fmt.Fprintf(&result, format[i], match) } } - return result + return result.String() } func deleteToSelect(matches []string) string { @@ -120,13 +120,14 @@ func insertToSelect(matches []string) string { fields := strings.Split(matches[2], ",") values := strings.Split(matches[3], ",") if len(fields) == len(values) { - query := fmt.Sprintf("SELECT * FROM %s WHERE ", matches[1]) + var query strings.Builder + fmt.Fprintf(&query, "SELECT * FROM %s WHERE ", matches[1]) //nolint:unqueryvet sep := "" for i := range fields { - query += fmt.Sprintf(`%s%s=%s`, sep, strings.TrimSpace(fields[i]), values[i]) + fmt.Fprintf(&query, `%s%s=%s`, sep, strings.TrimSpace(fields[i]), values[i]) sep = " and " } - return query + return query.String() } return fmt.Sprintf("SELECT * FROM %s LIMIT 1", matches[1]) } diff --git a/agent/runner/jobs/pbm_helpers.go b/agent/runner/jobs/pbm_helpers.go index 99cbe2ae770..227792b2d0e 100644 --- a/agent/runner/jobs/pbm_helpers.go +++ b/agent/runner/jobs/pbm_helpers.go @@ -21,6 +21,7 @@ import ( "os" "os/exec" "path" + "slices" "strings" "time" @@ -175,7 +176,7 @@ type pbmConfigParams struct { dsn string } -func execPBMCommand(ctx context.Context, dsn string, to interface{}, args ...string) error { +func execPBMCommand(ctx context.Context, dsn string, to any, args ...string) error { nCtx, cancel := context.WithTimeout(ctx, cmdTimeout) defer cancel() @@ -289,13 +290,13 @@ func waitForPBMBackup(ctx context.Context, l logrus.FieldLogger, dsn string, nam } func findPITRRestore(list []pbmListRestore, restoreInfoPITRTime int64, startedAt time.Time) *pbmListRestore { - for i := len(list) - 1; i >= 0; i-- { + for _, v := range slices.Backward(list) { // TODO when PITR restore invoked with wrong timestamp pbm marks this restore operation as "snapshot" type. - if list[i].Type == "snapshot" && list[i].Snapshot != "" { + if v.Type == "snapshot" && v.Snapshot != "" { continue } // list[i].Name is a string which represents time the restore was started. - restoreStartedAt, err := time.Parse(time.RFC3339Nano, list[i].Name) + restoreStartedAt, err := time.Parse(time.RFC3339Nano, v.Name) if err != nil { continue } @@ -303,8 +304,8 @@ func findPITRRestore(list []pbmListRestore, restoreInfoPITRTime int64, startedAt // 1. We received PITR field as a response on starting process // 2. There is a record with the same PITR field in the list of restoring records // 3. Start time of this record is not before the time we asked for restoring. - if list[i].PITR == restoreInfoPITRTime && !restoreStartedAt.Before(startedAt) { - return &list[i] + if v.PITR == restoreInfoPITRTime && !restoreStartedAt.Before(startedAt) { + return &v } } return nil diff --git a/agent/runner/runner_test.go b/agent/runner/runner_test.go index 6717ebac5de..63ba415227a 100644 --- a/agent/runner/runner_test.go +++ b/agent/runner/runner_test.go @@ -44,8 +44,7 @@ func TestConcurrentRunnerRun(t *testing.T) { t.Parallel() cr := New(0, 0) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() go cr.Run(ctx) a1 := actions.NewProcessAction("6a479303-5081-46d0-baa0-87d6248c987b", 5*time.Second, "echo", []string{"test"}) a2 := actions.NewProcessAction("84140ab2-612d-4d93-9360-162a4bd5de14", 5*time.Second, "echo", []string{"test2"}) @@ -69,8 +68,7 @@ func TestCapacityLimit(t *testing.T) { t.Parallel() cr := New(2, 0) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() go cr.Run(ctx) j1 := testJob{id: "test-1", timeout: time.Second} @@ -118,8 +116,7 @@ func TestDefaultCapacityLimit(t *testing.T) { // Use default capacity cr := New(0, 0) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() go cr.Run(ctx) totalJobs := 2 * defaultTotalCapacity @@ -145,8 +142,7 @@ func TestPerDBInstanceLimit(t *testing.T) { t.Parallel() cr := New(10, 1) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() go cr.Run(ctx) db1j1 := testJob{id: "test-1", timeout: time.Second, dsn: "postgresql://db1"} @@ -192,8 +188,7 @@ func TestDefaultPerDBInstanceLimit(t *testing.T) { t.Parallel() cr := New(10, 0) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() go cr.Run(ctx) db1j1 := testJob{id: "test-1", timeout: time.Second, dsn: "postgresql://db1"} @@ -239,8 +234,7 @@ func TestConcurrentRunnerTimeout(t *testing.T) { t.Parallel() cr := New(0, 0) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() go cr.Run(ctx) a1 := actions.NewProcessAction("6a479303-5081-46d0-baa0-87d6248c987b", time.Second, "sleep", []string{"20"}) a2 := actions.NewProcessAction("84140ab2-612d-4d93-9360-162a4bd5de14", time.Second, "sleep", []string{"30"}) @@ -265,8 +259,7 @@ func TestConcurrentRunnerStop(t *testing.T) { t.Parallel() cr := New(0, 0) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() go cr.Run(ctx) a1 := actions.NewProcessAction("6a479303-5081-46d0-baa0-87d6248c987b", 5*time.Second, "sleep", []string{"20"}) a2 := actions.NewProcessAction("84140ab2-612d-4d93-9360-162a4bd5de14", 5*time.Second, "sleep", []string{"30"}) diff --git a/agent/tailog/store.go b/agent/tailog/store.go index dcb41e96d46..9c0a40c1251 100644 --- a/agent/tailog/store.go +++ b/agent/tailog/store.go @@ -67,7 +67,7 @@ func (l *Store) Resize(capacity uint) { return } - old.Do(func(p interface{}) { + old.Do(func(p any) { if p != nil { l.log.Value = p l.log = l.log.Next() @@ -87,7 +87,7 @@ func (l *Store) GetLogs() ([]string, uint) { logs := make([]string, 0, l.capacity) replacer := getColorReplacer() - l.log.Do(func(p interface{}) { + l.log.Do(func(p any) { if p != nil { logs = append(logs, replacer.Replace(p.(string))) //nolint:forcetypeassert } diff --git a/agent/utils/filereader/continuous_file_reader.go b/agent/utils/filereader/continuous_file_reader.go index c294b098a7c..c876e618995 100644 --- a/agent/utils/filereader/continuous_file_reader.go +++ b/agent/utils/filereader/continuous_file_reader.go @@ -20,6 +20,7 @@ import ( "bytes" "io" "os" + "strings" "sync" "time" ) @@ -65,25 +66,25 @@ func (r *ContinuousFileReader) NextLine() (string, error) { r.m.Lock() defer r.m.Unlock() - var line string + var line strings.Builder for { l, err := r.r.ReadString('\n') r.l.Tracef("ReadLine: %q %v", l, err) - line += l + line.WriteString(l) switch { case err == nil: // Full line successfully read - return it. - return line, nil + return line.String(), nil case r.closed: // If file is closed, err would be os.PathError{"read", filename, os.ErrClosed}. // Return simple io.EOF instead. - return line, io.EOF + return line.String(), io.EOF case err != io.EOF: // Return unexpected error as is. - return line, err + return line.String(), err default: // err is io.EOF, but reader is not closed - reopen or sleep. diff --git a/agent/utils/filereader/logger.go b/agent/utils/filereader/logger.go index 4d1d78a8e08..d4246e91178 100644 --- a/agent/utils/filereader/logger.go +++ b/agent/utils/filereader/logger.go @@ -16,8 +16,8 @@ package filereader // Logger defines the interface for a MySQL slow log parser logger. type Logger interface { - Warnf(format string, v ...interface{}) - Infof(format string, v ...interface{}) - Debugf(format string, v ...interface{}) - Tracef(format string, v ...interface{}) + Warnf(format string, v ...any) + Infof(format string, v ...any) + Debugf(format string, v ...any) + Tracef(format string, v ...any) } diff --git a/agent/utils/filereader/logger_test.go b/agent/utils/filereader/logger_test.go index 5b322f2af3c..3f5c68e0f9c 100644 --- a/agent/utils/filereader/logger_test.go +++ b/agent/utils/filereader/logger_test.go @@ -20,22 +20,22 @@ type testLogger struct { t testing.TB } -func (tl *testLogger) Warnf(format string, v ...interface{}) { +func (tl *testLogger) Warnf(format string, v ...any) { tl.t.Helper() tl.t.Logf("WARN : "+format, v...) } -func (tl *testLogger) Infof(format string, v ...interface{}) { +func (tl *testLogger) Infof(format string, v ...any) { tl.t.Helper() tl.t.Logf("INFO : "+format, v...) } -func (tl *testLogger) Debugf(format string, v ...interface{}) { +func (tl *testLogger) Debugf(format string, v ...any) { tl.t.Helper() tl.t.Logf("DEBUG: "+format, v...) } -func (tl *testLogger) Tracef(format string, v ...interface{}) { +func (tl *testLogger) Tracef(format string, v ...any) { tl.t.Helper() tl.t.Logf("TRACE: "+format, v...) } diff --git a/agent/utils/templates/template.go b/agent/utils/templates/template.go index e23cbe77dfd..9426110e1a9 100644 --- a/agent/utils/templates/template.go +++ b/agent/utils/templates/template.go @@ -40,7 +40,7 @@ type TemplateRenderer struct { } // RenderTemplate replaces placeholders with real values in text. -func (tr *TemplateRenderer) RenderTemplate(name, text string, templateParams map[string]interface{}) ([]byte, error) { +func (tr *TemplateRenderer) RenderTemplate(name, text string, templateParams map[string]any) ([]byte, error) { t := template.New(name) t.Delims(tr.TemplateLeftDelim, tr.TemplateRightDelim) t.Option("missingkey=error") @@ -56,7 +56,7 @@ func (tr *TemplateRenderer) RenderTemplate(name, text string, templateParams map } // RenderFiles creates temporary files and returns paths to created files. -func (tr *TemplateRenderer) RenderFiles(templateParams map[string]interface{}) (map[string]interface{}, error) { +func (tr *TemplateRenderer) RenderFiles(templateParams map[string]any) (map[string]any, error) { // render files only if they are present to avoid creating temporary directory for every agent if len(tr.TextFiles) == 0 { return templateParams, nil @@ -108,7 +108,7 @@ func RenderDSN(dsn string, files *agentv1.TextFiles, tempDir string) (string, er TempDir: tempDir, } - templateParams, err := tr.RenderFiles(make(map[string]interface{})) + templateParams, err := tr.RenderFiles(make(map[string]any)) if err != nil { return "", err } diff --git a/api-tests/init.go b/api-tests/init.go index 1272f5c018e..66deabfc77a 100644 --- a/api-tests/init.go +++ b/api-tests/init.go @@ -96,7 +96,7 @@ func Transport(baseURL *url.URL, insecureTLS bool) *httptransport.Runtime { transport.Context = context.Background() // not Context - do not cancel the whole transport // set error handlers for nginx responses if pmm-managed is down - errorConsumer := runtime.ConsumerFunc(func(reader io.Reader, _ interface{}) error { + errorConsumer := runtime.ConsumerFunc(func(reader io.Reader, _ any) error { b, _ := io.ReadAll(reader) return new(NginxError(string(b))) }) diff --git a/api-tests/management/action/explain_test.go b/api-tests/management/action/explain_test.go index 0f6606d68e1..5125f9228fd 100644 --- a/api-tests/management/action/explain_test.go +++ b/api-tests/management/action/explain_test.go @@ -97,25 +97,25 @@ func TestRunMongoDBExplain(t *testing.T) { } assert.True(t, actionOK.Payload.Done) - want := map[string]interface{}{ - "winningPlan": map[string]interface{}{ + want := map[string]any{ + "winningPlan": map[string]any{ "stage": "EOF", }, - "rejectedPlans": []interface{}{}, - "plannerVersion": map[string]interface{}{ + "rejectedPlans": []any{}, + "plannerVersion": map[string]any{ "$numberInt": "1", }, "namespace": "test.coll", "indexFilterSet": bool(false), - "parsedQuery": map[string]interface{}{ - "k": map[string]interface{}{ - "$lte": map[string]interface{}{ + "parsedQuery": map[string]any{ + "k": map[string]any{ + "$lte": map[string]any{ "$numberInt": "1", }, }, }, } - m := make(map[string]interface{}) + m := make(map[string]any) err = json.Unmarshal([]byte(actionOK.Payload.Output), &m) require.NoError(t, err) assert.Equal(t, want, m["queryPlanner"]) diff --git a/api-tests/server/advisor_metrics_test.go b/api-tests/server/advisor_metrics_test.go index d065fc46575..4db9d843d56 100644 --- a/api-tests/server/advisor_metrics_test.go +++ b/api-tests/server/advisor_metrics_test.go @@ -78,7 +78,7 @@ func TestAdvisorMetrics(t *testing.T) { tc.query, time.Now()) var actualValues []string - for _, s := range strings.Split(result.String(), "\n") { + for s := range strings.SplitSeq(result.String(), "\n") { // remove the timestamp from the values metric := strings.Split(s, " @") actualValues = append(actualValues, metric[0]) diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index b1ae5810462..d8631eba12b 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -285,7 +285,7 @@ func createUser(t *testing.T, login string) int { require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to create user, status code: %d, response: %s", resp.StatusCode, b) - var m map[string]interface{} + var m map[string]any err = json.Unmarshal(b, &m) require.NoError(t, err) @@ -426,7 +426,7 @@ func createServiceAccountWithRole(t *testing.T, role, nodeName string) int { require.Equalf(t, http.StatusCreated, resp.StatusCode, "failed to create Service account, status code: %d, response: %s", resp.StatusCode, b) - var m map[string]interface{} + var m map[string]any err = json.Unmarshal(b, &m) require.NoError(t, err) @@ -487,7 +487,7 @@ func createServiceToken(t *testing.T, serviceAccountID int, nodeName string) (in require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to create Service account, status code: %d, response: %s", resp.StatusCode, b) - var m map[string]interface{} + var m map[string]any err = json.Unmarshal(b, &m) require.NoError(t, err) diff --git a/api-tests/server/serialization_test.go b/api-tests/server/serialization_test.go index 5250ab48809..4afd8264c6d 100644 --- a/api-tests/server/serialization_test.go +++ b/api-tests/server/serialization_test.go @@ -55,7 +55,7 @@ func TestSerialization(t *testing.T) { b, err := io.ReadAll(resp.Body) require.NoError(t, err) - var data map[string]interface{} + var data map[string]any err = json.Unmarshal(b, &data) require.NoError(t, err) diff --git a/api/agent/v1/query.go b/api/agent/v1/query.go index a15ed85eeef..fbc9ab4c1d2 100644 --- a/api/agent/v1/query.go +++ b/api/agent/v1/query.go @@ -28,7 +28,7 @@ import ( //go-sumtype:decl isQueryActionValue_Kind -func makeValue(value interface{}) (*QueryActionValue, error) { //nolint:cyclop +func makeValue(value any) (*QueryActionValue, error) { //nolint:cyclop // In the future, we may decide to: // * dereference pointers; // * handle other types of the same kind (like `type String string`); @@ -156,7 +156,7 @@ func makeValue(value interface{}) (*QueryActionValue, error) { //nolint:cyclop // - time.Time; // - []T for any T from above, including other slices and maps; // - map[string]T for any T from above, including other slices and maps. -func MarshalActionQuerySQLResult(columns []string, rows [][]interface{}) ([]byte, error) { +func MarshalActionQuerySQLResult(columns []string, rows [][]any) ([]byte, error) { res := QueryActionResult{ Columns: columns, Rows: make([]*QueryActionSlice, len(rows)), @@ -189,7 +189,7 @@ func MarshalActionQuerySQLResult(columns []string, rows [][]interface{}) ([]byte // // It supports the same types as MarshalActionQuerySQLResult plus: // * MongoDB's primitive.DateTime and primitive.Timestamp are converted to time.Time. -func MarshalActionQueryDocsResult(docs []map[string]interface{}) ([]byte, error) { +func MarshalActionQueryDocsResult(docs []map[string]any) ([]byte, error) { res := QueryActionResult{ Docs: make([]*QueryActionMap, len(docs)), } @@ -219,7 +219,7 @@ type BinaryActionValue struct { Bytes []byte `json:"bytes"` } -func makeInterface(value *QueryActionValue) (interface{}, error) { +func makeInterface(value *QueryActionValue) (any, error) { var err error switch v := value.Kind.(type) { case *QueryActionValue_Nil: @@ -244,7 +244,7 @@ func makeInterface(value *QueryActionValue) (interface{}, error) { return v.Timestamp.AsTime(), nil case *QueryActionValue_Slice: - s := make([]interface{}, len(v.Slice.Slice)) + s := make([]any, len(v.Slice.Slice)) for i, v := range v.Slice.Slice { s[i], err = makeInterface(v) if err != nil { @@ -254,7 +254,7 @@ func makeInterface(value *QueryActionValue) (interface{}, error) { return s, nil case *QueryActionValue_Map: - m := make(map[string]interface{}, len(v.Map.Map)) + m := make(map[string]any, len(v.Map.Map)) for k, v := range v.Map.Map { m[k], err = makeInterface(v) if err != nil { @@ -273,8 +273,8 @@ func makeInterface(value *QueryActionValue) (interface{}, error) { } } -func unmarshalActionQuerySQLResult(columns []string, rows []*QueryActionSlice) ([]map[string]interface{}, error) { - data := make([]map[string]interface{}, len(rows)) +func unmarshalActionQuerySQLResult(columns []string, rows []*QueryActionSlice) ([]map[string]any, error) { + data := make([]map[string]any, len(rows)) var err error for i, s := range rows { @@ -282,7 +282,7 @@ func unmarshalActionQuerySQLResult(columns []string, rows []*QueryActionSlice) ( return nil, errors.Errorf("invalid result: expected %d columns in row %d, got %d", len(columns), i, len(s.Slice)) } - row := make(map[string]interface{}, len(s.Slice)) + row := make(map[string]any, len(s.Slice)) for si, sv := range s.Slice { row[columns[si]], err = makeInterface(sv) @@ -297,12 +297,12 @@ func unmarshalActionQuerySQLResult(columns []string, rows []*QueryActionSlice) ( return data, nil } -func unmarshalActionQueryDocsResult(docs []*QueryActionMap) ([]map[string]interface{}, error) { - data := make([]map[string]interface{}, len(docs)) +func unmarshalActionQueryDocsResult(docs []*QueryActionMap) ([]map[string]any, error) { + data := make([]map[string]any, len(docs)) var err error for i, m := range docs { - row := make(map[string]interface{}, len(m.Map)) + row := make(map[string]any, len(m.Map)) for mk, mv := range m.Map { row[mk], err = makeInterface(mv) @@ -318,7 +318,7 @@ func unmarshalActionQueryDocsResult(docs []*QueryActionMap) ([]map[string]interf } // UnmarshalActionQueryResult returns deserialized form of query Action result, both SQL and documents. -func UnmarshalActionQueryResult(b []byte) ([]map[string]interface{}, error) { +func UnmarshalActionQueryResult(b []byte) ([]map[string]any, error) { var res QueryActionResult if err := proto.Unmarshal(b, &res); err != nil { return nil, err diff --git a/api/agent/v1/query_test.go b/api/agent/v1/query_test.go index 03c0105a9dd..2ae1a615b8c 100644 --- a/api/agent/v1/query_test.go +++ b/api/agent/v1/query_test.go @@ -39,7 +39,7 @@ func TestQuerySQLResultsSerialization(t *testing.T) { "map", "binary", } - rows := [][]interface{}{ + rows := [][]any{ // non-zero values { true, @@ -49,8 +49,8 @@ func TestQuerySQLResultsSerialization(t *testing.T) { "\x00\x01\xFE\xFF", []byte{0x00, 0x01, 0xFE, 0xFF}, now, - []interface{}{int64(1), int64(2), int64(3)}, - map[string]interface{}{"k": int64(42)}, + []any{int64(1), int64(2), int64(3)}, + map[string]any{"k": int64(42)}, primitive.Binary{ Subtype: 5, Data: []byte{0, 1, 2, 3}, @@ -66,8 +66,8 @@ func TestQuerySQLResultsSerialization(t *testing.T) { "", []byte{}, time.Time{}, - []interface{}{}, - make(map[string]interface{}), + []any{}, + make(map[string]any), primitive.Binary{}, }, @@ -80,12 +80,12 @@ func TestQuerySQLResultsSerialization(t *testing.T) { "\x00", []byte{0x00}, time.Time{}, - []interface{}{int64(0), int64(0), int64(0)}, - map[string]interface{}{"": int64(0)}, + []any{int64(0), int64(0), int64(0)}, + map[string]any{"": int64(0)}, primitive.Binary{}, }, } - expected := []map[string]interface{}{ + expected := []map[string]any{ // non-zero values { "bool": true, @@ -95,8 +95,8 @@ func TestQuerySQLResultsSerialization(t *testing.T) { "string": "\x00\x01\xFE\xFF", "bytes": "\x00\x01\xFE\xFF", "time": now, - "slice": []interface{}{int64(1), int64(2), int64(3)}, - "map": map[string]interface{}{"k": int64(42)}, + "slice": []any{int64(1), int64(2), int64(3)}, + "map": map[string]any{"k": int64(42)}, "binary": []byte(`{"subtype":5,"bytes":"AAECAw=="}`), }, @@ -109,8 +109,8 @@ func TestQuerySQLResultsSerialization(t *testing.T) { "string": "", "bytes": "", "time": time.Time{}, - "slice": []interface{}{}, - "map": make(map[string]interface{}), + "slice": []any{}, + "map": make(map[string]any), "binary": []byte(`{"subtype":0,"bytes":null}`), }, @@ -123,8 +123,8 @@ func TestQuerySQLResultsSerialization(t *testing.T) { "string": "\x00", "bytes": "\x00", "time": time.Time{}, - "slice": []interface{}{int64(0), int64(0), int64(0)}, - "map": map[string]interface{}{"": int64(0)}, + "slice": []any{int64(0), int64(0), int64(0)}, + "map": map[string]any{"": int64(0)}, "binary": []byte(`{"subtype":0,"bytes":null}`), }, } @@ -140,7 +140,7 @@ func TestQuerySQLResultsSerialization(t *testing.T) { t.Run("InvalidColumns", func(t *testing.T) { columns := []string{"foo"} - rows := [][]interface{}{{}} + rows := [][]any{{}} _, err := MarshalActionQuerySQLResult(columns, rows) require.EqualError(t, err, "invalid result: expected 1 columns in row 0, got 0") @@ -150,7 +150,7 @@ func TestQuerySQLResultsSerialization(t *testing.T) { func TestQueryDocsResultsSerialization(t *testing.T) { t.Run("Basic", func(t *testing.T) { now := time.Now().UTC().Round(0) // strip monotonic clock reading - expected := []map[string]interface{}{ + expected := []map[string]any{ {}, // non-zero values @@ -161,8 +161,8 @@ func TestQueryDocsResultsSerialization(t *testing.T) { "double": float64(7.42), "string": "\x00\x01\xFE\xFF", "time": now, - "slice": []interface{}{int64(1), int64(2), int64(3)}, - "map": map[string]interface{}{"k": int64(42)}, + "slice": []any{int64(1), int64(2), int64(3)}, + "map": map[string]any{"k": int64(42)}, }, // zero values @@ -174,8 +174,8 @@ func TestQueryDocsResultsSerialization(t *testing.T) { "double": float64(0), "string1": "", "string2": "\x00", "time": time.Time{}, - "slice1": []interface{}{}, "slice2": []interface{}{int64(0), int64(0), int64(0)}, - "map1": make(map[string]interface{}), "map2": map[string]interface{}{"": int64(0)}, + "slice1": []any{}, "slice2": []any{int64(0), int64(0), int64(0)}, + "map1": make(map[string]any), "map2": map[string]any{"": int64(0)}, }, } @@ -190,7 +190,7 @@ func TestQueryDocsResultsSerialization(t *testing.T) { t.Run("Conversions", func(t *testing.T) { now := time.Now().UTC().Round(0) // strip monotonic clock reading - b, err := MarshalActionQueryDocsResult([]map[string]interface{}{ + b, err := MarshalActionQueryDocsResult([]map[string]any{ // non-zero values { "int": int(-1), "int8": int8(-1), "int16": int16(-1), "int32": int32(-1), @@ -221,7 +221,7 @@ func TestQueryDocsResultsSerialization(t *testing.T) { actual, err := UnmarshalActionQueryResult(b) require.NoError(t, err) - expected := []map[string]interface{}{ + expected := []map[string]any{ { "int": int64(-1), "int8": int64(-1), "int16": int64(-1), "int32": int64(-1), "uint": uint64(1), "uint8": uint64(1), "uint16": uint64(1), "uint32": uint64(1), @@ -229,8 +229,8 @@ func TestQueryDocsResultsSerialization(t *testing.T) { "bytes1": "funyarinpa", "bytes2": "\x00\x01\xFE\xFF", "mongoTimestamp": now.Truncate(time.Second).Add(42 * time.Nanosecond), // resolution is up to a second; cram I (ordinal) into nanoseconds "mongoDateTime": now.Truncate(time.Millisecond), // resolution is up to a millisecond - "slice": []interface{}{int64(1), int64(2), int64(3)}, - "map": map[string]interface{}{"k": int64(42)}, + "slice": []any{int64(1), int64(2), int64(3)}, + "map": map[string]any{"k": int64(42)}, }, { @@ -240,8 +240,8 @@ func TestQueryDocsResultsSerialization(t *testing.T) { "bytes": "", "mongoTimestamp": time.Time{}, "mongoDateTime": time.Time{}, - "slice1": []interface{}{}, "slice2": []interface{}{int64(0)}, - "map1": make(map[string]interface{}), "map2": map[string]interface{}{"": int64(0)}, + "slice1": []any{}, "slice2": []any{int64(0)}, + "map1": make(map[string]any), "map2": map[string]any{"": int64(0)}, }, } assert.Equal(t, expected, actual) diff --git a/managed/cmd/pmm-managed-starlark/main_test.go b/managed/cmd/pmm-managed-starlark/main_test.go index 2944af3cfa2..603e1af0aac 100644 --- a/managed/cmd/pmm-managed-starlark/main_test.go +++ b/managed/cmd/pmm-managed-starlark/main_test.go @@ -41,7 +41,7 @@ const ( memoryConsumingScriptStderr = "out of memory" ) -var validQueryActionResult = []map[string]interface{}{ +var validQueryActionResult = []map[string]any{ {"Value": "5.7.30-33-log", "Variable_name": "version"}, {"Value": "Percona Server (GPL), Release 33, Revision 6517692", "Variable_name": "version_comment"}, {"Value": "x86_64", "Variable_name": "version_compile_machine"}, diff --git a/managed/cmd/pmm-managed/main.go b/managed/cmd/pmm-managed/main.go index 90f6eb5fcc6..e7d1384180a 100644 --- a/managed/cmd/pmm-managed/main.go +++ b/managed/cmd/pmm-managed/main.go @@ -1214,14 +1214,12 @@ func main() { //nolint:gocognit,maintidx,cyclop return nil })) - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { err := haService.Run(ctx) if err != nil { l.Panicf("cannot start high availability service: %+v", err) } - }() + }) wg.Wait() } diff --git a/managed/models/agent_helpers.go b/managed/models/agent_helpers.go index 0f2f88b5e00..6a15b98c825 100644 --- a/managed/models/agent_helpers.go +++ b/managed/models/agent_helpers.go @@ -17,6 +17,7 @@ package models import ( "fmt" + "slices" "strings" "time" @@ -232,7 +233,7 @@ type AgentFilters struct { // FindAgents returns Agents by filters. func FindAgents(q *reform.Querier, filters AgentFilters) ([]*Agent, error) { var conditions []string - var args []interface{} + var args []any idx := 1 if filters.PMMAgentID != "" { if _, err := FindAgentByID(q, filters.PMMAgentID); err != nil { @@ -322,7 +323,7 @@ func FindAgentsByIDs(q *reform.Querier, ids []string) ([]*Agent, error) { p := strings.Join(q.Placeholders(1, len(ids)), ", ") tail := fmt.Sprintf("WHERE agent_id IN (%s) ORDER BY agent_id", p) - args := make([]interface{}, len(ids)) + args := make([]any, len(ids)) for i, id := range ids { args[i] = id } @@ -373,7 +374,7 @@ func FindDBConfigForService(q *reform.Querier, serviceID string) (*DBConfig, err p := strings.Join(q.Placeholders(2, len(agentTypes)), ", ") //nolint:mnd tail := fmt.Sprintf("WHERE service_id = $1 AND agent_type IN (%s) ORDER BY agent_id", p) - args := make([]interface{}, len(agentTypes)+1) + args := make([]any, len(agentTypes)+1) args[0] = serviceID for i, agentType := range agentTypes { args[i+1] = agentType @@ -433,7 +434,7 @@ func FindPMMAgentsForService(q *reform.Querier, serviceID string) ([]*Agent, err if err != nil { return nil, status.Errorf(codes.FailedPrecondition, "Couldn't get all agents for service %s", serviceID) } - pmmAgentIDs := make([]interface{}, len(allAgents)) + pmmAgentIDs := make([]any, len(allAgents)) for _, str := range allAgents { row := str.(*Agent) //nolint:forcetypeassert if row.PMMAgentID != nil { @@ -518,7 +519,7 @@ func FindPMMAgentsForVersion(logger *logrus.Entry, agents []*Agent, minPMMAgentV // FindAgentsForScrapeConfig returns Agents for scrape config generation by pmm_agent_id and push_metrics value. func FindAgentsForScrapeConfig(q *reform.Querier, pmmAgentID *string, pushMetrics bool) ([]*Agent, error) { var ( - args []interface{} + args []any conditions []string ) if pmmAgentID != nil { @@ -890,13 +891,7 @@ func compatibleServiceAndAgent(serviceType ServiceType, agentType AgentType) boo return false } - for _, svcType := range allowed { - if svcType == serviceType { - return true - } - } - - return false + return slices.Contains(allowed, serviceType) } // CreateAgent creates Agent with given type. diff --git a/managed/models/agent_model.go b/managed/models/agent_model.go index 69f308efc3c..acdb3dd839e 100644 --- a/managed/models/agent_model.go +++ b/managed/models/agent_model.go @@ -119,7 +119,7 @@ type ExporterOptions struct { func (c ExporterOptions) Value() (driver.Value, error) { return jsonValue(c) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (c *ExporterOptions) Scan(src interface{}) error { return jsonScan(c, src) } +func (c *ExporterOptions) Scan(src any) error { return jsonScan(c, src) } // IsEmpty returns true if all ExporterOptions fields are unset or have zero values, otherwise returns false. func (c ExporterOptions) IsEmpty() bool { @@ -144,7 +144,7 @@ type QANOptions struct { func (c QANOptions) Value() (driver.Value, error) { return jsonValue(c) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (c *QANOptions) Scan(src interface{}) error { return jsonScan(c, src) } +func (c *QANOptions) Scan(src any) error { return jsonScan(c, src) } // IsEmpty returns true if all QANOptions fields are unset or have zero values, otherwise returns false. func (c QANOptions) IsEmpty() bool { @@ -166,7 +166,7 @@ type AWSOptions struct { func (c AWSOptions) Value() (driver.Value, error) { return jsonValue(c) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (c *AWSOptions) Scan(src interface{}) error { return jsonScan(c, src) } +func (c *AWSOptions) Scan(src any) error { return jsonScan(c, src) } // IsEmpty returns true if all AWSOptions fields are unset or have zero values, otherwise returns false. func (c AWSOptions) IsEmpty() bool { @@ -189,7 +189,7 @@ type AzureOptions struct { func (c AzureOptions) Value() (driver.Value, error) { return jsonValue(c) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (c *AzureOptions) Scan(src interface{}) error { return jsonScan(c, src) } +func (c *AzureOptions) Scan(src any) error { return jsonScan(c, src) } // IsEmpty returns true if all AzureOptions fields are unset or have zero values, otherwise returns false. func (c AzureOptions) IsEmpty() bool { @@ -216,7 +216,7 @@ type MongoDBOptions struct { func (c MongoDBOptions) Value() (driver.Value, error) { return jsonValue(c) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (c *MongoDBOptions) Scan(src interface{}) error { return jsonScan(c, src) } +func (c *MongoDBOptions) Scan(src any) error { return jsonScan(c, src) } // IsEmpty returns true if all MongoDBOptions fields are unset or have zero values, otherwise returns false. func (c MongoDBOptions) IsEmpty() bool { @@ -253,7 +253,7 @@ type MySQLOptions struct { func (c MySQLOptions) Value() (driver.Value, error) { return jsonValue(c) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (c *MySQLOptions) Scan(src interface{}) error { return jsonScan(c, src) } +func (c *MySQLOptions) Scan(src any) error { return jsonScan(c, src) } // IsEmpty returns true if all MySQLOptions fields are unset or have zero values, otherwise returns false. func (c MySQLOptions) IsEmpty() bool { @@ -279,7 +279,7 @@ type PostgreSQLOptions struct { func (c PostgreSQLOptions) Value() (driver.Value, error) { return jsonValue(c) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (c *PostgreSQLOptions) Scan(src interface{}) error { return jsonScan(c, src) } +func (c *PostgreSQLOptions) Scan(src any) error { return jsonScan(c, src) } // IsEmpty returns true if all PostgreSQLOptions fields are unset or have zero values, otherwise returns false. func (c PostgreSQLOptions) IsEmpty() bool { @@ -577,9 +577,7 @@ func (a *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, p if a.MySQLOptions.ExtraDSNParams != nil { // Add extra DSN parameters if they are set. - for k, v := range a.MySQLOptions.ExtraDSNParams { - cfg.Params[k] = v - } + maps.Copy(cfg.Params, a.MySQLOptions.ExtraDSNParams) } // MultiStatements must not be used as it enables SQL injections (in particular, in pmm-agent's Actions) @@ -619,9 +617,7 @@ func (a *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, p if a.MySQLOptions.ExtraDSNParams != nil { // Add extra DSN parameters if they are set. - for k, v := range a.MySQLOptions.ExtraDSNParams { - cfg.Params[k] = v - } + maps.Copy(cfg.Params, a.MySQLOptions.ExtraDSNParams) } // MultiStatements must not be used as it enables SQL injections (in particular, in pmm-agent's Actions) diff --git a/managed/models/agentversion_test.go b/managed/models/agentversion_test.go index 208086c5e58..ba8fd143545 100644 --- a/managed/models/agentversion_test.go +++ b/managed/models/agentversion_test.go @@ -158,7 +158,6 @@ func TestIsPostgreSQLSSLSniSupported(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.pmmAgentID, func(t *testing.T) { actual, err := models.IsPostgreSQLSSLSniSupported(q, tt.pmmAgentID) assert.Equal(t, tt.expected, actual) diff --git a/managed/models/artifact_helpers.go b/managed/models/artifact_helpers.go index 1cf76d1dd60..9216aac213f 100644 --- a/managed/models/artifact_helpers.go +++ b/managed/models/artifact_helpers.go @@ -43,7 +43,7 @@ type ArtifactFilters struct { // FindArtifacts returns artifact list sorted by creation time in DESCENDING order. func FindArtifacts(q *reform.Querier, filters ArtifactFilters) ([]*Artifact, error) { var conditions []string - var args []interface{} + var args []any idx := 1 if filters.ServiceID != "" { conditions = append(conditions, fmt.Sprintf("service_id = %s", q.Placeholder(idx))) @@ -103,7 +103,7 @@ func FindArtifactsByIDs(q *reform.Querier, ids []string) (map[string]*Artifact, p := strings.Join(q.Placeholders(1, len(ids)), ", ") tail := fmt.Sprintf("WHERE id IN (%s)", p) - args := make([]interface{}, 0, len(ids)) + args := make([]any, 0, len(ids)) for _, id := range ids { args = append(args, id) } diff --git a/managed/models/artifact_model.go b/managed/models/artifact_model.go index 9b429f96f4a..2d24793aa3b 100644 --- a/managed/models/artifact_model.go +++ b/managed/models/artifact_model.go @@ -149,7 +149,7 @@ type MetadataList []Metadata func (p MetadataList) Value() (driver.Value, error) { return jsonValue(p) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (p *MetadataList) Scan(src interface{}) error { return jsonScan(p, src) } +func (p *MetadataList) Scan(src any) error { return jsonScan(p, src) } // Artifact represents result of a backup. // diff --git a/managed/models/common_helpers.go b/managed/models/common_helpers.go index ee79c6a5904..0dd59dabb61 100644 --- a/managed/models/common_helpers.go +++ b/managed/models/common_helpers.go @@ -15,18 +15,20 @@ package models -import "fmt" +import ( + "fmt" +) // InvalidArgumentError returned when some passed argument is invalid. type InvalidArgumentError struct { Details string } -func (e *InvalidArgumentError) Error() string { - return "invalid argument: " + e.Details -} - // NewInvalidArgumentError creates InvalidArgumentError with given formatting. -func NewInvalidArgumentError(format string, a ...interface{}) *InvalidArgumentError { +func NewInvalidArgumentError(format string, a ...any) *InvalidArgumentError { return &InvalidArgumentError{Details: fmt.Sprintf(format, a...)} } + +func (e *InvalidArgumentError) Error() string { + return "invalid argument: " + e.Details +} diff --git a/managed/models/dump_helpers.go b/managed/models/dump_helpers.go index 7f4e1feb97e..b625b3a33e5 100644 --- a/managed/models/dump_helpers.go +++ b/managed/models/dump_helpers.go @@ -100,7 +100,7 @@ func CreateDump(q *reform.Querier, params CreateDumpParams) (*Dump, error) { // FindDumps returns dumps list sorted by creation time in DESCENDING order. func FindDumps(q *reform.Querier, filters DumpFilters) ([]*Dump, error) { var conditions []string - var args []interface{} + var args []any var idx int if filters.Status != "" { @@ -134,7 +134,7 @@ func FindDumpsByIDs(q *reform.Querier, ids []string) (map[string]*Dump, error) { p := strings.Join(q.Placeholders(1, len(ids)), ", ") tail := fmt.Sprintf("WHERE id IN (%s)", p) - args := make([]interface{}, 0, len(ids)) + args := make([]any, 0, len(ids)) for _, id := range ids { args = append(args, id) } @@ -234,7 +234,7 @@ func FindDumpLogs(q *reform.Querier, filters DumpLogsFilter) ([]*DumpLog, error) if filters.Limit != nil { limit = *filters.Limit } - args := []interface{}{ + args := []any{ filters.DumpID, filters.Offset, limit, diff --git a/managed/models/job_helpers.go b/managed/models/job_helpers.go index 47d539c3d90..e0d3fce1039 100644 --- a/managed/models/job_helpers.go +++ b/managed/models/job_helpers.go @@ -59,7 +59,7 @@ type JobsFilter struct { // FindJobs returns logs satisfying filters. func FindJobs(q *reform.Querier, filters JobsFilter) ([]*Job, error) { - var args []interface{} + var args []any var andConds []string idx := 1 if len(filters.Types) != 0 { @@ -193,7 +193,7 @@ func FindJobLogs(q *reform.Querier, filters JobLogsFilter) ([]*JobLog, error) { if filters.Limit != nil { limit = *filters.Limit } - args := []interface{}{ + args := []any{ filters.JobID, filters.Offset, limit, diff --git a/managed/models/job_helpers_test.go b/managed/models/job_helpers_test.go index 5169cc23d7f..a3c72c1de3e 100644 --- a/managed/models/job_helpers_test.go +++ b/managed/models/job_helpers_test.go @@ -234,7 +234,6 @@ func TestJobLogs(t *testing.T) { } for _, tc := range testCases { - tc := tc t.Run(tc.Name, func(t *testing.T) { logs, err := models.FindJobLogs(tx.Querier, tc.Filters) require.NoError(t, err) diff --git a/managed/models/job_models.go b/managed/models/job_models.go index d8209d4b2be..2847b9e2e3a 100644 --- a/managed/models/job_models.go +++ b/managed/models/job_models.go @@ -59,7 +59,7 @@ type JobResult struct { func (r JobResult) Value() (driver.Value, error) { return jsonValue(r) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (r *JobResult) Scan(src interface{}) error { return jsonScan(r, src) } +func (r *JobResult) Scan(src any) error { return jsonScan(r, src) } // MySQLBackupJobData stores MySQL job specific result data. type MySQLBackupJobData struct { @@ -100,7 +100,7 @@ type JobData struct { func (c JobData) Value() (driver.Value, error) { return jsonValue(c) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (c *JobData) Scan(src interface{}) error { return jsonScan(c, src) } +func (c *JobData) Scan(src any) error { return jsonScan(c, src) } // Job describes a job result which is storing in persistent storage. // diff --git a/managed/models/location_helpers.go b/managed/models/location_helpers.go index 28479fdedb2..f39ecb82945 100644 --- a/managed/models/location_helpers.go +++ b/managed/models/location_helpers.go @@ -195,7 +195,7 @@ func FindBackupLocationsByIDs(q *reform.Querier, ids []string) (map[string]*Back p := strings.Join(q.Placeholders(1, len(ids)), ", ") tail := fmt.Sprintf("WHERE id IN (%s)", p) - args := make([]interface{}, 0, len(ids)) + args := make([]any, 0, len(ids)) for _, id := range ids { args = append(args, id) } diff --git a/managed/models/location_model.go b/managed/models/location_model.go index f67f15cb770..2a1a2863c14 100644 --- a/managed/models/location_model.go +++ b/managed/models/location_model.go @@ -82,7 +82,7 @@ type S3LocationConfig struct { func (c S3LocationConfig) Value() (driver.Value, error) { return jsonValue(c) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (c *S3LocationConfig) Scan(src interface{}) error { return jsonScan(c, src) } +func (c *S3LocationConfig) Scan(src any) error { return jsonScan(c, src) } // FilesystemLocationConfig contains require properties for accessing file system on pmm-client-node. type FilesystemLocationConfig struct { @@ -93,7 +93,7 @@ type FilesystemLocationConfig struct { func (c FilesystemLocationConfig) Value() (driver.Value, error) { return jsonValue(c) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (c *FilesystemLocationConfig) Scan(src interface{}) error { return jsonScan(c, src) } +func (c *FilesystemLocationConfig) Scan(src any) error { return jsonScan(c, src) } // check interfaces. var ( diff --git a/managed/models/models.go b/managed/models/models.go index 56c13afc01e..f153fb8dc07 100644 --- a/managed/models/models.go +++ b/managed/models/models.go @@ -28,6 +28,7 @@ package models import ( "database/sql/driver" "encoding/json" + "maps" "regexp" "sort" "strings" @@ -62,9 +63,7 @@ func MergeLabels(node *Node, service *Service, agent *Agent) (map[string]string, if err != nil { return nil, err } - for name, value := range labels { - res[name] = value - } + maps.Copy(res, labels) } if service != nil { @@ -72,9 +71,7 @@ func MergeLabels(node *Node, service *Service, agent *Agent) (map[string]string, if err != nil { return nil, err } - for name, value := range labels { - res[name] = value - } + maps.Copy(res, labels) } if agent != nil { @@ -82,9 +79,7 @@ func MergeLabels(node *Node, service *Service, agent *Agent) (map[string]string, if err != nil { return nil, err } - for name, value := range labels { - res[name] = value - } + maps.Copy(res, labels) } return res, nil @@ -163,7 +158,7 @@ func setLabels(m map[string]string, res *[]byte) error { } // jsonValue implements database/sql/driver.Valuer interface for v that should be a value. -func jsonValue(v interface{}) (driver.Value, error) { +func jsonValue(v any) (driver.Value, error) { b, err := json.Marshal(v) if err != nil { return nil, errors.Wrap(err, "failed to marshal JSON column") @@ -172,7 +167,7 @@ func jsonValue(v interface{}) (driver.Value, error) { } // jsonScan implements database/sql.Scanner interface for v that should be a pointer. -func jsonScan(v, src interface{}) error { +func jsonScan(v, src any) error { var b []byte switch v := src.(type) { case []byte: diff --git a/managed/models/node_helpers_test.go b/managed/models/node_helpers_test.go index 9a01814ae87..c95212ab38d 100644 --- a/managed/models/node_helpers_test.go +++ b/managed/models/node_helpers_test.go @@ -256,7 +256,3 @@ func TestNodeHelpers(t *testing.T) { require.Len(t, nodes, 1) // PMM Server }) } - -func pointerToNodeType(nodeType models.NodeType) *models.NodeType { - return &nodeType -} diff --git a/managed/models/restore_history_helpers.go b/managed/models/restore_history_helpers.go index 796ab3aa4ea..ef3a6eaf897 100644 --- a/managed/models/restore_history_helpers.go +++ b/managed/models/restore_history_helpers.go @@ -38,7 +38,7 @@ type RestoreHistoryItemFilters struct { // FindRestoreHistoryItems returns restore history list. func FindRestoreHistoryItems(q *reform.Querier, filters RestoreHistoryItemFilters) ([]*RestoreHistoryItem, error) { var conditions []string - var args []interface{} + var args []any idx := 1 if filters.ServiceID != "" { diff --git a/managed/models/scheduled_task_models.go b/managed/models/scheduled_task_models.go index 86562613c9e..e006c7116ea 100644 --- a/managed/models/scheduled_task_models.go +++ b/managed/models/scheduled_task_models.go @@ -86,7 +86,7 @@ type MongoBackupTaskData struct { func (c ScheduledTaskData) Value() (driver.Value, error) { return jsonValue(c) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (c *ScheduledTaskData) Scan(src interface{}) error { return jsonScan(c, src) } +func (c *ScheduledTaskData) Scan(src any) error { return jsonScan(c, src) } // BeforeInsert implements reform.BeforeInserter interface. func (s *ScheduledTask) BeforeInsert() error { diff --git a/managed/models/scheduled_tasks_helpers.go b/managed/models/scheduled_tasks_helpers.go index 4293ac01572..c6e8e56e55b 100644 --- a/managed/models/scheduled_tasks_helpers.go +++ b/managed/models/scheduled_tasks_helpers.go @@ -60,7 +60,7 @@ type ScheduledTasksFilter struct { // FindScheduledTasks returns all scheduled tasks satisfying filter. func FindScheduledTasks(q *reform.Querier, filters ScheduledTasksFilter) ([]*ScheduledTask, error) { - var args []interface{} + var args []any var andConds []string idx := 1 if len(filters.Types) != 0 { diff --git a/managed/models/service_helpers.go b/managed/models/service_helpers.go index 169a18c567e..733ec5fce26 100644 --- a/managed/models/service_helpers.go +++ b/managed/models/service_helpers.go @@ -96,7 +96,7 @@ type ServiceFilters struct { // FindServices returns Services by filters. func FindServices(q *reform.Querier, filters ServiceFilters) ([]*Service, error) { var conditions []string - var args []interface{} + var args []any idx := 1 if filters.NodeID != "" { conditions = append(conditions, fmt.Sprintf("node_id = %s", q.Placeholder(idx))) diff --git a/managed/models/service_helpers_test.go b/managed/models/service_helpers_test.go index bc915570e1d..1faaf5bdba8 100644 --- a/managed/models/service_helpers_test.go +++ b/managed/models/service_helpers_test.go @@ -538,7 +538,3 @@ func TestServiceHelpers(t *testing.T) { } }) } - -func pointerToServiceType(serviceType models.ServiceType) *models.ServiceType { - return &serviceType -} diff --git a/managed/models/settings.go b/managed/models/settings.go index 49be797841d..be03684d785 100644 --- a/managed/models/settings.go +++ b/managed/models/settings.go @@ -47,7 +47,7 @@ type MetricsResolutions struct { func (r MetricsResolutions) Value() (driver.Value, error) { return jsonValue(r) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (r *MetricsResolutions) Scan(src interface{}) error { return jsonScan(r, src) } +func (r *MetricsResolutions) Scan(src any) error { return jsonScan(r, src) } // Advisors contains settings related to the Portal Advisors. type Advisors struct { diff --git a/managed/models/software_version.go b/managed/models/software_version.go index 7c7865c86f9..b1ddfe7ada7 100644 --- a/managed/models/software_version.go +++ b/managed/models/software_version.go @@ -67,7 +67,7 @@ func (sv SoftwareVersions) Value() (driver.Value, error) { } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (sv *SoftwareVersions) Scan(src interface{}) error { +func (sv *SoftwareVersions) Scan(src any) error { return jsonScan(sv, src) } diff --git a/managed/models/software_version_helpers.go b/managed/models/software_version_helpers.go index 5a54d3977a9..e4f72a3f2dc 100644 --- a/managed/models/software_version_helpers.go +++ b/managed/models/software_version_helpers.go @@ -187,7 +187,7 @@ func FindServicesSoftwareVersions( filter FindServicesSoftwareVersionsFilter, orderBy SoftwareVersionsOrderBy, ) ([]*ServiceSoftwareVersions, error) { - var args []interface{} + var args []any var tail strings.Builder idx := 1 diff --git a/managed/models/template_helpers_test.go b/managed/models/template_helpers_test.go index 14404deab9b..132d5644e3f 100644 --- a/managed/models/template_helpers_test.go +++ b/managed/models/template_helpers_test.go @@ -219,7 +219,7 @@ func createTemplateParams(name string) *models.CreateTemplateParams { Summary: gofakeit.Quote(), Unit: alert.Percentage, Type: alert.Float, - Range: []interface{}{float64(10), float64(100)}, + Range: []any{float64(10), float64(100)}, Value: float64(50), }}, For: promconfig.Duration(7 * time.Second), @@ -244,7 +244,7 @@ func changeTemplateParams(name string) *models.ChangeTemplateParams { Summary: gofakeit.Quote(), Unit: alert.Seconds, Type: alert.Float, - Range: []interface{}{float64(10), float64(100)}, + Range: []any{float64(10), float64(100)}, Value: float64(50), }}, For: promconfig.Duration(gofakeit.Number(1, 100)), diff --git a/managed/models/template_model.go b/managed/models/template_model.go index 76187f24f17..f0b54551fa0 100644 --- a/managed/models/template_model.go +++ b/managed/models/template_model.go @@ -98,7 +98,7 @@ type AlertExprParamsDefinitions []AlertExprParamDefinition func (p AlertExprParamsDefinitions) Value() (driver.Value, error) { return jsonValue(p) } // Scan implements database/sql.Scanner interface. Should be defined on the pointer. -func (p *AlertExprParamsDefinitions) Scan(src interface{}) error { return jsonScan(p, src) } +func (p *AlertExprParamsDefinitions) Scan(src any) error { return jsonScan(p, src) } // AlertExprParamDefinition represents query parameter definition. type AlertExprParamDefinition struct { @@ -163,7 +163,7 @@ func (s Severity) Value() (driver.Value, error) { } // Scan implements database/sql Scanner interface. -func (s *Severity) Scan(src interface{}) error { +func (s *Severity) Scan(src any) error { switch src := src.(type) { case string: cs := common.ParseSeverity(src) diff --git a/managed/pi/alert/parameter.go b/managed/pi/alert/parameter.go index ccd1bbc89c6..bb2a6a54863 100644 --- a/managed/pi/alert/parameter.go +++ b/managed/pi/alert/parameter.go @@ -23,12 +23,12 @@ import ( // Parameter represents alerting template or rule parameter. type Parameter struct { - Name string `yaml:"name"` // required - Summary string `yaml:"summary"` // required - Unit Unit `yaml:"unit,omitempty"` // optional - Type Type `yaml:"type"` // required - Range []interface{} `yaml:"range,flow,omitempty"` //nolint:modernize - Value interface{} `yaml:"value,omitempty"` //nolint:modernize + Name string `yaml:"name"` // required + Summary string `yaml:"summary"` // required + Unit Unit `yaml:"unit,omitempty"` // optional + Type Type `yaml:"type"` // required + Range []any `yaml:"range,flow,omitempty"` + Value any `yaml:"value,omitempty"` } // GetValueForBool casts parameter value to the bool. @@ -193,7 +193,7 @@ func (p *Parameter) validateRange() error { return fmt.Errorf("unknown parameter type: %s", p.Type) } -func castValueToFloat64(v interface{}) (float64, error) { //nolint:modernize +func castValueToFloat64(v any) (float64, error) { switch v := v.(type) { case nil: return 0, errors.New("value is nil") diff --git a/managed/services/agents/agents_test.go b/managed/services/agents/agents_test.go index 782f9432c5e..1c9d0cd2f31 100644 --- a/managed/services/agents/agents_test.go +++ b/managed/services/agents/agents_test.go @@ -30,8 +30,8 @@ func requireNoDuplicateFlags(t *testing.T, flags []string) { s := make(map[string]struct{}) for _, f := range flags { name := strings.Split(f, "=")[0] - if strings.HasPrefix(name, "--no-") { // kingpin's --no- disables -- - name = "--" + strings.TrimPrefix(name, "--no-") + if after, ok := strings.CutPrefix(name, "--no-"); ok { // kingpin's --no- disables -- + name = "--" + after } if _, present := s[name]; present { assert.Failf(t, "flag (or --no- form) is already present", "%q", name) diff --git a/managed/services/agents/channel/channel.go b/managed/services/agents/channel/channel.go index 26e152b5140..8131e41bd2b 100644 --- a/managed/services/agents/channel/channel.go +++ b/managed/services/agents/channel/channel.go @@ -81,7 +81,7 @@ type Channel struct { mSent, mRecv uint32 - lastSentRequestID uint32 + lastSentRequestID atomic.Uint32 sendM sync.Mutex @@ -162,7 +162,7 @@ func (c *Channel) Send(resp *ServerResponse) { // Response and error will be both nil if channel is closed. // It is no-op once channel is closed (see Wait). func (c *Channel) SendAndWaitResponse(payload agentv1.ServerRequestPayload) (agentv1.AgentResponsePayload, error) { //nolint:ireturn - id := atomic.AddUint32(&c.lastSentRequestID, 1) + id := c.lastSentRequestID.Add(1) ch := c.subscribe(id) c.send(&agentv1.ServerMessage{ diff --git a/managed/services/agents/connection_checker_test.go b/managed/services/agents/connection_checker_test.go index b5e52147fc3..33719c9c244 100644 --- a/managed/services/agents/connection_checker_test.go +++ b/managed/services/agents/connection_checker_test.go @@ -82,7 +82,6 @@ func TestConnectionRequestDialTimeoutRoundsWholeSecondTimeoutsUp(t *testing.T) { agentType: models.PostgresExporterType, }, } { - tc := tc t.Run(string(tc.serviceType), func(t *testing.T) { t.Parallel() diff --git a/managed/services/agents/nomad.go b/managed/services/agents/nomad.go index 94fe603712b..d62641468a6 100644 --- a/managed/services/agents/nomad.go +++ b/managed/services/agents/nomad.go @@ -160,7 +160,7 @@ func generateNomadAgentConfig(node *models.Node, exporter *models.Agent, tdp mod return "", errors.Wrap(err, "Failed to get unified labels") } - nomadConfigParams := map[string]interface{}{ + nomadConfigParams := map[string]any{ "NodeName": node.NodeName, "NodeID": node.NodeID, "Labels": labels, diff --git a/managed/services/agents/versioner_test.go b/managed/services/agents/versioner_test.go index a2bf4ef88b8..8cb40e8229c 100644 --- a/managed/services/agents/versioner_test.go +++ b/managed/services/agents/versioner_test.go @@ -65,7 +65,6 @@ func TestGetVersionRequest(t *testing.T) { } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() res := tc.sw.GetVersionRequest() diff --git a/managed/services/alert_rule.go b/managed/services/alert_rule.go index 8c6517957a6..d15690771c5 100644 --- a/managed/services/alert_rule.go +++ b/managed/services/alert_rule.go @@ -43,8 +43,8 @@ type Data struct { RefID string `json:"refId"` DatasourceUID string `json:"datasourceUid"` QueryType string `json:"queryType"` - RelativeTimeRange RelativeTimeRange `json:"relativeTimeRange,omitempty"` - Model Model `json:"model,omitempty"` + RelativeTimeRange RelativeTimeRange `json:"relativeTimeRange"` + Model Model `json:"model"` } // GrafanaAlert represent grafana alerting rule. diff --git a/managed/services/alerting/service.go b/managed/services/alerting/service.go index 85ed5226a10..616a1f6813a 100644 --- a/managed/services/alerting/service.go +++ b/managed/services/alerting/service.go @@ -20,6 +20,7 @@ import ( "bytes" "context" "fmt" + "maps" "os" "path/filepath" "sort" @@ -104,9 +105,7 @@ func (s *Service) GetTemplates() map[string]models.Template { defer s.rw.RUnlock() res := make(map[string]models.Template, len(s.templates)) - for n, r := range s.templates { - res[n] = r - } + maps.Copy(res, s.templates) return res } diff --git a/managed/services/backup/compatibility_service_test.go b/managed/services/backup/compatibility_service_test.go index d6f6dcbefee..bcddfee0c97 100644 --- a/managed/services/backup/compatibility_service_test.go +++ b/managed/services/backup/compatibility_service_test.go @@ -180,7 +180,6 @@ func TestCheckCompatibility(t *testing.T) { expectedError: ErrIncompatibleService, }, } { - tc := tc t.Run(string(tc.serviceType)+"_"+tc.name, func(t *testing.T) { t.Parallel() var sw []agents.Software @@ -689,7 +688,6 @@ func TestArtifactCompatibility(t *testing.T) { } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() err := cSvc.artifactCompatibility(tc.artifact, tc.service, tc.targetDBVersion) diff --git a/managed/services/checks/checks.go b/managed/services/checks/checks.go index 109919a1fc1..b90cef26f32 100644 --- a/managed/services/checks/checks.go +++ b/managed/services/checks/checks.go @@ -197,11 +197,9 @@ func (s *Service) Run(ctx context.Context) { var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { s.runChecksLoop(ctx) - }() + }) wg.Wait() } diff --git a/managed/services/checks/checks_test.go b/managed/services/checks/checks_test.go index 9d5d4c63730..d51babe7929 100644 --- a/managed/services/checks/checks_test.go +++ b/managed/services/checks/checks_test.go @@ -435,8 +435,6 @@ func TestMinPMMAgents(t *testing.T) { s := New(nil, nil, vmClient, clickhouseDB) for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { t.Parallel() assert.Equal(t, test.minVersion, s.minPMMAgentVersion(test.check)) @@ -531,8 +529,6 @@ func TestFindTargets(t *testing.T) { } for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { t.Parallel() @@ -770,7 +766,6 @@ func TestFillQueryPlaceholders(t *testing.T) { } for _, tt := range cases { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() diff --git a/managed/services/checks/funcs.go b/managed/services/checks/funcs.go index c8fe918a109..6d0bda9bf72 100644 --- a/managed/services/checks/funcs.go +++ b/managed/services/checks/funcs.go @@ -43,7 +43,7 @@ func GetFuncsForVersion(version uint32) (map[string]starlark.GoFunc, error) { // parseVersion accepts a single string argument (version), and returns map[string]interface{} // with keys: major, minor, patch (int64), num (MMmmpp, int64), and rest (string). -func parseVersion(args ...interface{}) (interface{}, error) { +func parseVersion(args ...any) (any, error) { if l := len(args); l != 1 { return nil, errors.Errorf("expected 1 argument, got %d", l) } @@ -58,7 +58,7 @@ func parseVersion(args ...interface{}) (interface{}, error) { return nil, err } - return map[string]interface{}{ + return map[string]any{ "major": int64(p.Major), "minor": int64(p.Minor), "patch": int64(p.Patch), @@ -70,7 +70,7 @@ func parseVersion(args ...interface{}) (interface{}, error) { // formatVersionNum accepts a single int64 argument (version num MMmmpp or MMmmppRRR), and returns // MM.mm.pp or MM.mm.pp-RRR as a string. -func formatVersionNum(args ...interface{}) (interface{}, error) { +func formatVersionNum(args ...any) (any, error) { if l := len(args); l != 1 { return nil, errors.Errorf("expected 1 argument, got %d", l) } @@ -112,7 +112,7 @@ func GetAdditionalContext() map[string]starlark.GoFunc { // ipIsPrivate accepts a single string argument (IP address or a network) and // returns true for a private address, otherwise false. It returns nil in case of an invalid argument. -func ipIsPrivate(args ...interface{}) (interface{}, error) { +func ipIsPrivate(args ...any) (any, error) { log := logrus.WithField("component", "checks") if l := len(args); l != 1 { diff --git a/managed/services/checks/funcs_test.go b/managed/services/checks/funcs_test.go index 0ed4ffb50c4..74de6064fae 100644 --- a/managed/services/checks/funcs_test.go +++ b/managed/services/checks/funcs_test.go @@ -53,7 +53,7 @@ def check_context(rows, context): env, err := starlark.NewEnv(t.Name(), script, funcs) require.NoError(t, err) - input := []map[string]interface{}{ + input := []map[string]any{ {"version": int64(1)}, } res, err := env.Run("type", input, nil, t.Log) @@ -66,7 +66,7 @@ Traceback (most recent call last): require.EqualError(t, err, expectedErr) assert.Empty(t, res) - input = []map[string]interface{}{ + input = []map[string]any{ {"version": "foo"}, } res, err = env.Run("foo", input, nil, t.Log) @@ -79,7 +79,7 @@ Traceback (most recent call last): require.Error(t, err, expectedErr) assert.Empty(t, res) - input = []map[string]interface{}{ + input = []map[string]any{ {"version": "5.7.20-19-log"}, } res, err = env.Run("valid", input, nil, t.Log) @@ -267,7 +267,6 @@ def check_context(rows, context): } for _, tc := range testCases { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() env, err := starlark.NewEnv(t.Name(), tc.script, predeclaredFuncs) diff --git a/managed/services/dump/dump.go b/managed/services/dump/dump.go index a60ec1894f4..495c39dc24d 100644 --- a/managed/services/dump/dump.go +++ b/managed/services/dump/dump.go @@ -282,10 +282,10 @@ func (s *Service) setDumpStatus(dumpID string, status models.DumpStatus) { func (s *Service) persistLogs(dumpID string, r io.Reader) error { scanner := bufio.NewScanner(r) var err error - var chunkN uint32 + var chunkN atomic.Uint32 for scanner.Scan() { - nErr := s.saveLogChunk(dumpID, atomic.AddUint32(&chunkN, 1)-1, scanner.Text(), false) + nErr := s.saveLogChunk(dumpID, chunkN.Add(1)-1, scanner.Text(), false) if nErr != nil { s.l.Warnf("failed to read pmm-dump logs: %v", err) return errors.WithStack(nErr) @@ -294,13 +294,13 @@ func (s *Service) persistLogs(dumpID string, r io.Reader) error { if err = scanner.Err(); err != nil { s.l.Warnf("Failed to read pmm-dump logs: %+v", err) - nErr := s.saveLogChunk(dumpID, atomic.AddUint32(&chunkN, 1)-1, err.Error(), false) + nErr := s.saveLogChunk(dumpID, chunkN.Add(1)-1, err.Error(), false) if nErr != nil { return errors.WithStack(nErr) } } - nErr := s.saveLogChunk(dumpID, atomic.AddUint32(&chunkN, 1)-1, "", true) + nErr := s.saveLogChunk(dumpID, chunkN.Add(1)-1, "", true) if nErr != nil { return errors.WithStack(nErr) } diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 3d5a5be2af5..5edc3808444 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -146,7 +146,7 @@ func CurrentUserHTTPResponse(err error) (int, map[string]string) { // do makes HTTP request with given parameters, and decodes JSON response with 200 OK status // to respBody. It returns wrapped clientError on any other status, or other fatal errors. // Ctx is used only for cancelation. -func (c *Client) do(ctx context.Context, method, path, rawQuery string, headers http.Header, body []byte, target interface{}) error { +func (c *Client) do(ctx context.Context, method, path, rawQuery string, headers http.Header, body []byte, target any) error { //nolint:funcorder u := url.URL{ Scheme: "http", Host: c.addr, @@ -260,7 +260,7 @@ func (c *Client) GetUserID(ctx context.Context) (int, error) { return 0, err } - var m map[string]interface{} + var m map[string]any err = c.do(ctx, http.MethodGet, "/api/user", "", authHeaders, nil, &m) if err != nil { return 0, err @@ -298,7 +298,7 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header, l *lo } // https://grafana.com/docs/http_api/user/#actual-user - works only with Basic Auth - var m map[string]interface{} + var m map[string]any err := c.do(ctx, http.MethodGet, "/api/user", "", authHeaders, nil, &m) if err != nil { if hasAuthorizationHeader(authHeaders) { @@ -332,7 +332,7 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header, l *lo } // works only with Basic auth - var s []interface{} + var s []any if err := c.do(ctx, http.MethodGet, "/api/user/orgs", "", authHeaders, nil, &s); err != nil { return authUser{ role: none, @@ -341,7 +341,7 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header, l *lo } for _, el := range s { - m, _ := el.(map[string]interface{}) + m, _ := el.(map[string]any) if m == nil { continue } @@ -541,7 +541,7 @@ func (c *Client) getRoleForServiceToken(ctx context.Context, token string) (role header := http.Header{} header.Add("Authorization", fmt.Sprintf("Bearer %s", token)) - var k map[string]interface{} + var k map[string]any if err := c.do(ctx, http.MethodGet, "/api/auth/serviceaccount", "", header, nil, &k); err != nil { return none, err } @@ -613,7 +613,7 @@ func (c *Client) testCreateUser(ctx context.Context, login string, role role, au if err != nil { return 0, errors.WithStack(err) } - var m map[string]interface{} + var m map[string]any if err = c.do(ctx, "POST", "/api/admin/users", "", authHeaders, b, &m); err != nil { return 0, err } @@ -873,7 +873,7 @@ func (c *Client) createServiceAccount(ctx context.Context, role role, nodeName s return 0, errors.WithStack(err) } - var m map[string]interface{} + var m map[string]any if err = c.do(ctx, "POST", "/api/serviceaccounts", "", authHeaders, b, &m); err != nil { return 0, err } @@ -907,7 +907,7 @@ func (c *Client) createServiceToken(ctx context.Context, serviceAccountID int, n return 0, "", errors.WithStack(err) } - var m map[string]interface{} + var m map[string]any if err = c.do(ctx, "POST", fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, b, &m); err != nil { return 0, "", err } diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 37347b1e4f0..aa1941ac1d8 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -592,10 +592,7 @@ func (as *AgentsService) AddQANMySQLSlowlogAgent(ctx context.Context, p *invento } e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { // tweak according to API docs - maxSlowlogFileSize := p.MaxSlowlogFileSize - if maxSlowlogFileSize < 0 { - maxSlowlogFileSize = 0 - } + maxSlowlogFileSize := max(p.MaxSlowlogFileSize, 0) params := &models.CreateAgentParams{ PMMAgentID: p.PmmAgentId, diff --git a/managed/services/inventory/agents_test.go b/managed/services/inventory/agents_test.go index 9258c3af474..ef159667844 100644 --- a/managed/services/inventory/agents_test.go +++ b/managed/services/inventory/agents_test.go @@ -63,13 +63,13 @@ func TestAgents(t *testing.T) { as.r.(*mockAgentsRegistry).On("IsConnected", "00000000-0000-4000-8000-000000000005").Return(true) as.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, "00000000-0000-4000-8000-000000000005") as.cc.(*mockConnectionChecker).On("CheckConnectionToService", ctx, - mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())).Return(nil) as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, - mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())).Return(nil) as.vmdb.(*mockPrometheusService).On("RequestConfigurationUpdate").Return() pmmAgent, err := as.AddPMMAgent(ctx, &inventoryv1.AddPMMAgentParams{ @@ -571,13 +571,13 @@ func TestAgents(t *testing.T) { as.r.(*mockAgentsRegistry).On("IsConnected", "00000000-0000-4000-8000-000000000005").Return(true) as.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, "00000000-0000-4000-8000-000000000005") as.cc.(*mockConnectionChecker).On("CheckConnectionToService", ctx, - mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())).Return(nil) as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, - mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())).Return(nil) pmmAgent, err := as.AddPMMAgent(ctx, &inventoryv1.AddPMMAgentParams{ RunsOnNodeId: models.PMMServerNodeID, @@ -663,13 +663,13 @@ func TestAgents(t *testing.T) { as.r.(*mockAgentsRegistry).On("IsConnected", "00000000-0000-4000-8000-000000000005").Return(true) as.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, "00000000-0000-4000-8000-000000000005") as.cc.(*mockConnectionChecker).On("CheckConnectionToService", ctx, - mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())).Return(nil) as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, - mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())).Return(nil) pmmAgent, err := as.AddPMMAgent(ctx, &inventoryv1.AddPMMAgentParams{ RunsOnNodeId: models.PMMServerNodeID, @@ -719,13 +719,13 @@ func TestAgents(t *testing.T) { as.r.(*mockAgentsRegistry).On("IsConnected", "00000000-0000-4000-8000-000000000005").Return(true) as.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, "00000000-0000-4000-8000-000000000005") as.cc.(*mockConnectionChecker).On("CheckConnectionToService", ctx, - mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())).Return(nil) as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, - mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())).Return(nil) pmmAgent, err := as.AddPMMAgent(ctx, &inventoryv1.AddPMMAgentParams{ RunsOnNodeId: models.PMMServerNodeID, diff --git a/managed/services/inventory/services_test.go b/managed/services/inventory/services_test.go index 6b903ca60eb..44e31570d10 100644 --- a/managed/services/inventory/services_test.go +++ b/managed/services/inventory/services_test.go @@ -147,13 +147,13 @@ func TestServices(t *testing.T) { as.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, "pmm-server") as.vmdb.(*mockPrometheusService).On("RequestConfigurationUpdate") as.cc.(*mockConnectionChecker).On("CheckConnectionToService", ctx, - mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())).Return(nil) as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, - mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())).Return(nil) node, err := ns.AddRemoteRDSNode(ctx, &inventoryv1.AddRemoteRDSNodeParams{NodeName: "test1", Region: "test-region", Address: "test"}) require.NoError(t, err) @@ -209,13 +209,13 @@ func TestServices(t *testing.T) { as.vmdb.(*mockPrometheusService).On("RequestConfigurationUpdate") as.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, "pmm-server").Times(0) as.cc.(*mockConnectionChecker).On("CheckConnectionToService", ctx, - mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())).Return(nil) as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, - mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())).Return(nil) node, err := ns.AddRemoteAzureDatabaseNode(ctx, &inventoryv1.AddRemoteAzureNodeParams{NodeName: "test1", Region: "test-region", Address: "test"}) require.NoError(t, err) diff --git a/managed/services/management/azure_database.go b/managed/services/management/azure_database.go index 8d2c141aeb0..a04e258fd41 100644 --- a/managed/services/management/azure_database.go +++ b/managed/services/management/azure_database.go @@ -65,15 +65,15 @@ func (s *ManagementService) isAzureEnabled() bool { // AzureDatabaseInstanceData reflects Azure Database Instance Data of Discovery Response. type AzureDatabaseInstanceData struct { - ID string `json:"id"` - Location string `json:"location"` - Name string `json:"name"` - Properties map[string]interface{} `json:"properties"` - Tags map[string]string `json:"tags"` - Sku map[string]interface{} `json:"sku"` - ResourceGroup string `json:"resourceGroup"` - Type string `json:"type"` - Zones string `json:"zones"` + ID string `json:"id"` + Location string `json:"location"` + Name string `json:"name"` + Properties map[string]any `json:"properties"` + Tags map[string]string `json:"tags"` + Sku map[string]any `json:"sku"` + ResourceGroup string `json:"resourceGroup"` + Type string `json:"type"` + Zones string `json:"zones"` } func (s *ManagementService) getAzureClient(req *managementv1.DiscoverAzureDatabaseRequest) (*armresourcegraph.Client, error) { diff --git a/managed/services/management/checks.go b/managed/services/management/checks.go index 41d0b11d5f2..01a52740881 100644 --- a/managed/services/management/checks.go +++ b/managed/services/management/checks.go @@ -17,6 +17,7 @@ package management import ( "context" + "maps" "strings" "github.com/AlekSi/pointer" @@ -125,12 +126,8 @@ func (s *ChecksAPIService) GetFailedChecks(ctx context.Context, req *advisorsv1. failedChecks := make([]*advisorsv1.CheckResult, 0, len(results)) for _, result := range results { labels := make(map[string]string, len(result.Target.Labels)+len(result.Result.Labels)) - for k, v := range result.Result.Labels { - labels[k] = v - } - for k, v := range result.Target.Labels { - labels[k] = v - } + maps.Copy(labels, result.Result.Labels) + maps.Copy(labels, result.Target.Labels) failedChecks = append(failedChecks, &advisorsv1.CheckResult{ Summary: result.Result.Summary, diff --git a/managed/services/management/checks_test.go b/managed/services/management/checks_test.go index 2a4a20c1540..d126a8f3604 100644 --- a/managed/services/management/checks_test.go +++ b/managed/services/management/checks_test.go @@ -431,8 +431,6 @@ func TestCreateComment(t *testing.T) { }, } for _, tc := range testCases { - tc := tc - t.Run(tc.Name, func(t *testing.T) { t.Parallel() assert.Equal(t, tc.Comment, createComment(tc.Checks)) diff --git a/managed/services/management/dump/dump.go b/managed/services/management/dump/dump.go index e01e3003a77..c4a3ccb5f43 100644 --- a/managed/services/management/dump/dump.go +++ b/managed/services/management/dump/dump.go @@ -103,8 +103,8 @@ func (s *Service) StartDump(ctx context.Context, req *dumpv1beta1.StartDumpReque // If auth cookie is present try to extract cookie value. if len(cookieHeader) != 0 { - cookies := strings.Split(cookieHeader[0], ";") - for _, c := range cookies { + cookies := strings.SplitSeq(cookieHeader[0], ";") + for c := range cookies { // The name of the cookie is defined in `./build/ansible/roles/grafana/files/grafana.ini`. if auth, ok := strings.CutPrefix(strings.TrimSpace(c), "pmm_session="); ok { cookie = auth diff --git a/managed/services/qan/client.go b/managed/services/qan/client.go index e7d6e5ae14f..601aac7809b 100644 --- a/managed/services/qan/client.go +++ b/managed/services/qan/client.go @@ -20,6 +20,7 @@ import ( "context" "encoding/json" "fmt" + "maps" "strings" "time" @@ -298,9 +299,7 @@ func (c *Client) Collect(ctx context.Context, metricsBuckets []*agentv1.MetricsB delete(labels, labelName) } - for k, l := range m.Common.Comments { - labels[k] = l - } + maps.Copy(labels, m.Common.Comments) mb.Labels = labels convertedMetricsBuckets = append(convertedMetricsBuckets, mb) diff --git a/managed/services/qan/client_test.go b/managed/services/qan/client_test.go index 7b06f097ee7..7c9fe2a9fac 100644 --- a/managed/services/qan/client_test.go +++ b/managed/services/qan/client_test.go @@ -131,7 +131,7 @@ func TestClient(t *testing.T) { db: db, l: logrus.WithField("test", t.Name()), } - c.On("Collect", ctx, mock.AnythingOfType(reflect.TypeOf(&qanpb.CollectRequest{}).String())).Return(&qanpb.CollectResponse{}, nil) + c.On("Collect", ctx, mock.AnythingOfType(reflect.TypeFor[*qanpb.CollectRequest]().String())).Return(&qanpb.CollectResponse{}, nil) metricsBuckets := []*agentv1.MetricsBucket{ { Common: &agentv1.MetricsBucket_Common{ @@ -217,7 +217,7 @@ func TestClient(t *testing.T) { db: db, l: logrus.WithField("test", t.Name()), } - c.On("Collect", ctx, mock.AnythingOfType(reflect.TypeOf(&qanpb.CollectRequest{}).String())).Return(&qanpb.CollectResponse{}, nil) + c.On("Collect", ctx, mock.AnythingOfType(reflect.TypeFor[*qanpb.CollectRequest]().String())).Return(&qanpb.CollectResponse{}, nil) metricsBuckets := []*agentv1.MetricsBucket{ { Common: &agentv1.MetricsBucket_Common{ @@ -283,7 +283,7 @@ func TestClient(t *testing.T) { db: db, l: logrus.WithField("test", t.Name()), } - c.On("Collect", ctx, mock.AnythingOfType(reflect.TypeOf(&qanpb.CollectRequest{}).String())).Return(&qanpb.CollectResponse{}, nil) + c.On("Collect", ctx, mock.AnythingOfType(reflect.TypeFor[*qanpb.CollectRequest]().String())).Return(&qanpb.CollectResponse{}, nil) metricsBuckets := []*agentv1.MetricsBucket{ { Common: &agentv1.MetricsBucket_Common{ @@ -418,7 +418,7 @@ func TestClient(t *testing.T) { db: db, l: logrus.WithField("test", t.Name()), } - c.On("Collect", ctx, mock.AnythingOfType(reflect.TypeOf(&qanpb.CollectRequest{}).String())).Return(&qanpb.CollectResponse{}, nil) + c.On("Collect", ctx, mock.AnythingOfType(reflect.TypeFor[*qanpb.CollectRequest]().String())).Return(&qanpb.CollectResponse{}, nil) metricsBuckets := []*agentv1.MetricsBucket{ { Common: &agentv1.MetricsBucket_Common{ @@ -468,7 +468,7 @@ func TestClientPerformance(t *testing.T) { ctx := logger.Set(t.Context(), t.Name()) c := &mockQanCollectorClient{} c.Test(t) - c.On("Collect", ctx, mock.AnythingOfType(reflect.TypeOf(&qanpb.CollectRequest{}).String())).Return(&qanpb.CollectResponse{}, nil) + c.On("Collect", ctx, mock.AnythingOfType(reflect.TypeFor[*qanpb.CollectRequest]().String())).Return(&qanpb.CollectResponse{}, nil) defer c.AssertExpectations(t) reformL.Reset() diff --git a/managed/services/server/logs.go b/managed/services/server/logs.go index 3d25f9b103d..28fb20ea735 100644 --- a/managed/services/server/logs.go +++ b/managed/services/server/logs.go @@ -223,9 +223,7 @@ func (l *Logs) files(ctx context.Context, pprofConfig *PprofConfig, logReadLines if pprofConfig != nil { filesSync := &sync.Mutex{} var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { traceBytes, err := pprofUtils.Trace(ctx, pprofConfig.TraceDuration) filesSync.Lock() files = append(files, fileContent{ @@ -234,11 +232,9 @@ func (l *Logs) files(ctx context.Context, pprofConfig *PprofConfig, logReadLines Err: err, }) filesSync.Unlock() - }() + }) - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { profileBytes, err := pprofUtils.Profile(ctx, pprofConfig.ProfileDuration) filesSync.Lock() files = append(files, fileContent{ @@ -247,11 +243,9 @@ func (l *Logs) files(ctx context.Context, pprofConfig *PprofConfig, logReadLines Err: err, }) filesSync.Unlock() - }() + }) - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { heapBytes, err := pprofUtils.Heap(true) filesSync.Lock() files = append(files, fileContent{ @@ -260,7 +254,7 @@ func (l *Logs) files(ctx context.Context, pprofConfig *PprofConfig, logReadLines Err: err, }) filesSync.Unlock() - }() + }) wg.Wait() } @@ -315,7 +309,7 @@ func readLog(name string, maxLines int) ([]byte, time.Time, error) { } res := []byte{} - r.Do(func(v interface{}) { + r.Do(func(v any) { if v != nil { res = append(res, v.([]byte)...) //nolint:forcetypeassert } diff --git a/managed/services/supervisord/supervisord.go b/managed/services/supervisord/supervisord.go index 27813b4d817..9343774df26 100644 --- a/managed/services/supervisord/supervisord.go +++ b/managed/services/supervisord/supervisord.go @@ -171,194 +171,6 @@ func (s *Service) Run(ctx context.Context) { //nolint:gocognit } } -func (s *Service) supervisorctl(args ...string) ([]byte, error) { - if s.supervisorctlPath == "" { - return nil, errors.New("supervisorctl not found") - } - - cmd := exec.Command(s.supervisorctlPath, args...) //nolint:gosec - cmdLine := strings.Join(cmd.Args, " ") - s.l.Debugf("Running %q...", cmdLine) - pdeathsig.Set(cmd, unix.SIGKILL) - b, err := cmd.Output() - return b, errors.Wrapf(err, "%s failed", cmdLine) -} - -// parseStatus parses `supervisorctl status ` output, returns true if is running, -// false if definitely not, and nil if status can't be determined. -func parseStatus(status string) *bool { - if f := strings.Fields(status); len(f) > 1 { - switch status := f[1]; status { - case "FATAL", "STOPPED": // will not be restarted - return new(false) - case "STARTING", "RUNNING", "BACKOFF", "STOPPING": - return new(true) - case "EXITED": - // it might be restarted - we need to inspect last event - default: - // something else - we need to inspect last event - } - } - return nil -} - -// reload asks supervisord to reload configuration. -func (s *Service) reload(name string) error { - if _, err := s.supervisorctl("reread"); err != nil { - s.l.Warn(err) - } - - path := filepath.Join(s.configDir, name+".ini") - if _, err := os.Stat(path); errors.Is(err, fs.ErrNotExist) { - s.l.Warnf("Config file %s does not exist, skipping update", path) - return nil - } - - _, err := s.supervisorctl("update", name) - return err -} - -// marshalConfig marshals supervisord program configuration. -func (s *Service) marshalConfig(tmpl *template.Template, settings *models.Settings) ([]byte, error) { - clickhouseDatabase := envvars.GetEnv("PMM_CLICKHOUSE_DATABASE", defaultClickhouseDatabase) - clickhouseAddr := envvars.GetEnv("PMM_CLICKHOUSE_ADDR", defaultClickhouseAddr) - clickhouseAddrPair := strings.SplitN(clickhouseAddr, ":", 2) //nolint:mnd - clickhouseUser := envvars.GetEnv("PMM_CLICKHOUSE_USER", defaultClickhouseUser) - clickhousePassword := envvars.GetEnv("PMM_CLICKHOUSE_PASSWORD", defaultClickhousePassword) - vmSearchDisableCache := envvars.GetEnv("VM_search_disableCache", strconv.FormatBool(!settings.IsVictoriaMetricsCacheEnabled())) - vmSearchMaxQueryLen := envvars.GetEnv("VM_search_maxQueryLen", defaultVMSearchMaxQueryLen) - vmSearchLatencyOffset := envvars.GetEnv("VM_search_latencyOffset", defaultVMSearchLatencyOffset) - vmSearchMaxUniqueTimeseries := envvars.GetEnv("VM_search_maxUniqueTimeseries", defaultVMSearchMaxUniqueTimeseries) - vmSearchMaxSamplesPerQuery := envvars.GetEnv("VM_search_maxSamplesPerQuery", defaultVMSearchMaxSamplesPerQuery) - vmSearchMaxQueueDuration := envvars.GetEnv("VM_search_maxQueueDuration", defaultVMSearchMaxQueueDuration) - vmSearchMaxQueryDuration := envvars.GetEnv("VM_search_maxQueryDuration", defaultVMSearchMaxQueryDuration) - vmSearchLogSlowQueryDuration := envvars.GetEnv("VM_search_logSlowQueryDuration", defaultVMSearchLogSlowQueryDuration) - vmPromscrapeStreamParse := envvars.GetEnv("VM_promscrape_streamParse", defaultVMPromscrapeStreamParse) - - templateParams := map[string]interface{}{ - "DataRetentionHours": int(settings.DataRetention.Hours()), - "DataRetentionDays": int(settings.DataRetention.Hours() / 24), //nolint:mnd - "VMAlertFlags": s.vmParams.VMAlertFlags, - "VMSearchDisableCache": vmSearchDisableCache, - "VMSearchMaxQueryLen": vmSearchMaxQueryLen, - "VMSearchLatencyOffset": vmSearchLatencyOffset, - "VMSearchMaxUniqueTimeseries": vmSearchMaxUniqueTimeseries, - "VMSearchMaxSamplesPerQuery": vmSearchMaxSamplesPerQuery, - "VMSearchMaxQueueDuration": vmSearchMaxQueueDuration, - "VMSearchMaxQueryDuration": vmSearchMaxQueryDuration, - "VMSearchLogSlowQueryDuration": vmSearchLogSlowQueryDuration, - "VMPromscrapeStreamParse": vmPromscrapeStreamParse, - "VMURL": s.vmParams.URL(), - "ExternalVM": s.vmParams.ExternalVM(), - "NomadEnabled": settings.IsNomadEnabled(), - "InterfaceToBind": envvars.GetInterfaceToBind(), - "ClickhouseAddr": clickhouseAddr, - "ClickhouseDatabase": clickhouseDatabase, - "ClickhouseHost": clickhouseAddrPair[0], - "ClickhousePort": clickhouseAddrPair[1], - "ClickhouseUser": clickhouseUser, - "ClickhousePassword": clickhousePassword, - "PMMServerHost": "", - } - - s.addPostgresParams(templateParams) - s.addClusterParams(templateParams) - - if settings.PMMPublicAddress != "" { - pmmPublicAddress := settings.PMMPublicAddress - if !strings.HasPrefix(pmmPublicAddress, "https://") && !strings.HasPrefix(pmmPublicAddress, "http://") { - pmmPublicAddress = "https://" + pmmPublicAddress - } - publicURL, err := url.Parse(pmmPublicAddress) - if err != nil { - return nil, errors.Wrap(err, "failed to parse PMM public address.") //nolint:revive - } - templateParams["PMMServerHost"] = publicURL.Host - } - - var buf bytes.Buffer - if err := tmpl.Execute(&buf, templateParams); err != nil { - return nil, errors.Wrapf(err, "failed to render template %q", tmpl.Name()) - } - b := append([]byte("; Managed by pmm-managed. DO NOT EDIT.\n"), buf.Bytes()...) - return b, nil -} - -// addPostgresParams adds pmm-server postgres database params to template config for grafana. -func (s *Service) addPostgresParams(templateParams map[string]interface{}) { - if s.pgParams == nil { - return - } - templateParams["PostgresAddr"] = s.pgParams.Addr - templateParams["PostgresDBName"] = s.pgParams.DBName - templateParams["PostgresDBUsername"] = s.pgParams.DBUsername - templateParams["PostgresDBPassword"] = s.pgParams.DBPassword - templateParams["PostgresSSLMode"] = s.pgParams.SSLMode - templateParams["PostgresSSLCAPath"] = s.pgParams.SSLCAPath - templateParams["PostgresSSLKeyPath"] = s.pgParams.SSLKeyPath - templateParams["PostgresSSLCertPath"] = s.pgParams.SSLCertPath -} - -func (s *Service) addClusterParams(templateParams map[string]interface{}) { - templateParams["HAEnabled"] = s.haParams.Enabled - if s.haParams.Enabled { - templateParams["GrafanaGossipPort"] = s.haParams.GrafanaGossipPort - templateParams["HAAdvertiseAddress"] = s.haParams.AdvertiseAddress - nodes := make([]string, len(s.haParams.Nodes)) - for i, node := range s.haParams.Nodes { - nodes[i] = fmt.Sprintf("%s:%d", node, s.haParams.GrafanaGossipPort) - } - templateParams["HANodes"] = strings.Join(nodes, ",") - } - // - GF_UNIFIED_ALERTING_HA_ADVERTISE_ADDRESS=172.20.0.5:9095 - // - GF_UNIFIED_ALERTING_HA_PEERS=pmm-server-active:9095,pmm-server-passive:9095 -} - -// saveConfigAndReload saves given supervisord program configuration to file and reloads it. -// If configuration can't be reloaded for some reason, old file is restored, and configuration is reloaded again. -// Returns true if configuration was changed. -func (s *Service) saveConfigAndReload(name string, cfg []byte) (bool, error) { - // read existing content - path := filepath.Join(s.configDir, name+".ini") - oldCfg, err := os.ReadFile(path) //nolint:gosec - if errors.Is(err, fs.ErrNotExist) { - err = nil - } - if err != nil { - return false, errors.WithStack(err) - } - - // compare with new config - if reflect.DeepEqual(cfg, oldCfg) { - s.l.Infof("%s configuration not changed, doing nothing.", name) - return false, nil - } - - // restore old content and reload in case of error - restore := oldCfg != nil - defer func() { - if restore { - if err = os.WriteFile(path, oldCfg, 0o664); err != nil { //nolint:gosec,mnd - s.l.Errorf("Failed to restore: %s.", err) - } - if err = s.reload(name); err != nil { - s.l.Errorf("Failed to restore/reload: %s.", err) - } - } - }() - - // write and reload - if err = os.WriteFile(path, cfg, 0o664); err != nil { //nolint:gosec,mnd - return false, errors.WithStack(err) - } - if err = s.reload(name); err != nil { - return false, err - } - s.l.Infof("%s configuration reloaded.", name) - restore = false - return true, nil -} - // UpdateConfiguration updates VictoriaMetrics, Grafana and qan-api2 configurations, restarting them if needed. func (s *Service) UpdateConfiguration(settings *models.Settings) error { if s.supervisorctlPath == "" { @@ -588,3 +400,199 @@ stdout_logfile_backups = 3 redirect_stderr = true {{end}} `)) + +func (s *Service) supervisorctl(args ...string) ([]byte, error) { //nolint:unparam + if s.supervisorctlPath == "" { + return nil, errors.New("supervisorctl not found") + } + + cmd := exec.Command(s.supervisorctlPath, args...) //nolint:gosec,noctx + cmdLine := strings.Join(cmd.Args, " ") + s.l.Debugf("Running %q...", cmdLine) + pdeathsig.Set(cmd, unix.SIGKILL) + b, err := cmd.Output() + return b, errors.Wrapf(err, "%s failed", cmdLine) +} + +// parseStatus parses `supervisorctl status ` output, returns true if is running, +// false if definitely not, and nil if status can't be determined. +func parseStatus(status string) *bool { + if f := strings.Fields(status); len(f) > 1 { + switch status := f[1]; status { + case "FATAL", "STOPPED": // will not be restarted + return new(false) + case "STARTING", "RUNNING", "BACKOFF", "STOPPING": + return new(true) + case "EXITED": + // it might be restarted - we need to inspect last event + default: + // something else - we need to inspect last event + } + } + return nil +} + +// reload asks supervisord to reload configuration. +func (s *Service) reload(name string) error { + _, err := s.supervisorctl("reread") + if err != nil { + s.l.Warn(err) + } + + path := filepath.Join(s.configDir, name+".ini") + _, err = os.Stat(path) + if errors.Is(err, fs.ErrNotExist) { + s.l.Warnf("Config file %s does not exist, skipping update", path) + return nil + } + + _, err = s.supervisorctl("update", name) + return err +} + +// marshalConfig marshals supervisord program configuration. +func (s *Service) marshalConfig(tmpl *template.Template, settings *models.Settings) ([]byte, error) { + clickhouseDatabase := envvars.GetEnv("PMM_CLICKHOUSE_DATABASE", defaultClickhouseDatabase) + clickhouseAddr := envvars.GetEnv("PMM_CLICKHOUSE_ADDR", defaultClickhouseAddr) + clickhouseAddrPair := strings.SplitN(clickhouseAddr, ":", 2) //nolint:mnd + clickhouseUser := envvars.GetEnv("PMM_CLICKHOUSE_USER", defaultClickhouseUser) + clickhousePassword := envvars.GetEnv("PMM_CLICKHOUSE_PASSWORD", defaultClickhousePassword) + vmSearchDisableCache := envvars.GetEnv("VM_search_disableCache", strconv.FormatBool(!settings.IsVictoriaMetricsCacheEnabled())) + vmSearchMaxQueryLen := envvars.GetEnv("VM_search_maxQueryLen", defaultVMSearchMaxQueryLen) + vmSearchLatencyOffset := envvars.GetEnv("VM_search_latencyOffset", defaultVMSearchLatencyOffset) + vmSearchMaxUniqueTimeseries := envvars.GetEnv("VM_search_maxUniqueTimeseries", defaultVMSearchMaxUniqueTimeseries) + vmSearchMaxSamplesPerQuery := envvars.GetEnv("VM_search_maxSamplesPerQuery", defaultVMSearchMaxSamplesPerQuery) + vmSearchMaxQueueDuration := envvars.GetEnv("VM_search_maxQueueDuration", defaultVMSearchMaxQueueDuration) + vmSearchMaxQueryDuration := envvars.GetEnv("VM_search_maxQueryDuration", defaultVMSearchMaxQueryDuration) + vmSearchLogSlowQueryDuration := envvars.GetEnv("VM_search_logSlowQueryDuration", defaultVMSearchLogSlowQueryDuration) + vmPromscrapeStreamParse := envvars.GetEnv("VM_promscrape_streamParse", defaultVMPromscrapeStreamParse) + + templateParams := map[string]any{ + "DataRetentionHours": int(settings.DataRetention.Hours()), + "DataRetentionDays": int(settings.DataRetention.Hours() / 24), //nolint:mnd + "VMAlertFlags": s.vmParams.VMAlertFlags, + "VMSearchDisableCache": vmSearchDisableCache, + "VMSearchMaxQueryLen": vmSearchMaxQueryLen, + "VMSearchLatencyOffset": vmSearchLatencyOffset, + "VMSearchMaxUniqueTimeseries": vmSearchMaxUniqueTimeseries, + "VMSearchMaxSamplesPerQuery": vmSearchMaxSamplesPerQuery, + "VMSearchMaxQueueDuration": vmSearchMaxQueueDuration, + "VMSearchMaxQueryDuration": vmSearchMaxQueryDuration, + "VMSearchLogSlowQueryDuration": vmSearchLogSlowQueryDuration, + "VMPromscrapeStreamParse": vmPromscrapeStreamParse, + "VMURL": s.vmParams.URL(), + "ExternalVM": s.vmParams.ExternalVM(), + "NomadEnabled": settings.IsNomadEnabled(), + "InterfaceToBind": envvars.GetInterfaceToBind(), + "ClickhouseAddr": clickhouseAddr, + "ClickhouseDatabase": clickhouseDatabase, + "ClickhouseHost": clickhouseAddrPair[0], + "ClickhousePort": clickhouseAddrPair[1], + "ClickhouseUser": clickhouseUser, + "ClickhousePassword": clickhousePassword, + "PMMServerHost": "", + } + + s.addPostgresParams(templateParams) + s.addClusterParams(templateParams) + + if settings.PMMPublicAddress != "" { + pmmPublicAddress := settings.PMMPublicAddress + if !strings.HasPrefix(pmmPublicAddress, "https://") && !strings.HasPrefix(pmmPublicAddress, "http://") { + pmmPublicAddress = "https://" + pmmPublicAddress + } + publicURL, err := url.Parse(pmmPublicAddress) + if err != nil { + return nil, errors.Wrap(err, "failed to parse PMM public address.") //nolint:revive + } + templateParams["PMMServerHost"] = publicURL.Host + } + + var buf bytes.Buffer + err := tmpl.Execute(&buf, templateParams) + if err != nil { + return nil, errors.Wrapf(err, "failed to render template %q", tmpl.Name()) + } + b := append([]byte("; Managed by pmm-managed. DO NOT EDIT.\n"), buf.Bytes()...) + return b, nil +} + +// addPostgresParams adds pmm-server postgres database params to template config for grafana. +func (s *Service) addPostgresParams(templateParams map[string]any) { + if s.pgParams == nil { + return + } + templateParams["PostgresAddr"] = s.pgParams.Addr + templateParams["PostgresDBName"] = s.pgParams.DBName + templateParams["PostgresDBUsername"] = s.pgParams.DBUsername + templateParams["PostgresDBPassword"] = s.pgParams.DBPassword + templateParams["PostgresSSLMode"] = s.pgParams.SSLMode + templateParams["PostgresSSLCAPath"] = s.pgParams.SSLCAPath + templateParams["PostgresSSLKeyPath"] = s.pgParams.SSLKeyPath + templateParams["PostgresSSLCertPath"] = s.pgParams.SSLCertPath +} + +func (s *Service) addClusterParams(templateParams map[string]any) { + templateParams["HAEnabled"] = s.haParams.Enabled + if s.haParams.Enabled { + templateParams["GrafanaGossipPort"] = s.haParams.GrafanaGossipPort + templateParams["HAAdvertiseAddress"] = s.haParams.AdvertiseAddress + nodes := make([]string, len(s.haParams.Nodes)) + for i, node := range s.haParams.Nodes { + nodes[i] = fmt.Sprintf("%s:%d", node, s.haParams.GrafanaGossipPort) + } + templateParams["HANodes"] = strings.Join(nodes, ",") + } + // - GF_UNIFIED_ALERTING_HA_ADVERTISE_ADDRESS=172.20.0.5:9095 + // - GF_UNIFIED_ALERTING_HA_PEERS=pmm-server-active:9095,pmm-server-passive:9095 +} + +// saveConfigAndReload saves given supervisord program configuration to file and reloads it. +// If configuration can't be reloaded for some reason, old file is restored, and configuration is reloaded again. +// Returns true if configuration was changed. +func (s *Service) saveConfigAndReload(name string, cfg []byte) (bool, error) { + // read existing content + path := filepath.Join(s.configDir, name+".ini") + oldCfg, err := os.ReadFile(path) //nolint:gosec + if errors.Is(err, fs.ErrNotExist) { + err = nil + } + if err != nil { + return false, errors.WithStack(err) + } + + // compare with new config + if reflect.DeepEqual(cfg, oldCfg) { + s.l.Infof("%s configuration not changed, doing nothing.", name) + return false, nil + } + + // restore old content and reload in case of error + restore := oldCfg != nil + defer func() { + if restore { + err = os.WriteFile(path, oldCfg, 0o664) //nolint:gosec,mnd + if err != nil { + s.l.Errorf("Failed to restore: %s.", err) + } + err = s.reload(name) + if err != nil { + s.l.Errorf("Failed to restore/reload: %s.", err) + } + } + }() + + // write and reload + err = os.WriteFile(path, cfg, 0o664) //nolint:gosec,mnd + if err != nil { + return false, errors.WithStack(err) + } + + err = s.reload(name) + if err != nil { + return false, err + } + s.l.Infof("%s configuration reloaded.", name) + restore = false + return true, nil +} diff --git a/managed/services/telemetry/datasources.go b/managed/services/telemetry/datasources.go index 07a11e44d26..e83814624e2 100644 --- a/managed/services/telemetry/datasources.go +++ b/managed/services/telemetry/datasources.go @@ -98,7 +98,7 @@ func fetchMetricsFromDB(ctx context.Context, l *logrus.Entry, timeout time.Durat return nil, err } strs := make([]*string, len(columns)) - values := make([]interface{}, len(columns)) + values := make([]any, len(columns)) for i := range values { values[i] = &strs[i] } diff --git a/managed/utils/dir/dir.go b/managed/utils/dir/dir.go index 5f90a23de8f..5b3feb37587 100644 --- a/managed/utils/dir/dir.go +++ b/managed/utils/dir/dir.go @@ -19,6 +19,7 @@ package dir import ( "os" "path/filepath" + "slices" "github.com/pkg/errors" ) @@ -43,15 +44,6 @@ func CreateDataDir(path string, perm os.FileMode) error { // File name is joined with provided path. func FindFilesWithExtensions(path string, extensions ...string) ([]string, error) { var paths []string - match := func(ext string) bool { - for _, e := range extensions { - if e == ext { - return true - } - } - return false - } - entries, err := os.ReadDir(path) if err != nil { return nil, err @@ -61,7 +53,7 @@ func FindFilesWithExtensions(path string, extensions ...string) ([]string, error if entry.IsDir() { continue } - if ext := filepath.Ext(entry.Name()); len(ext) > 0 && match(ext[1:]) { + if ext := filepath.Ext(entry.Name()); len(ext) > 0 && slices.Contains(extensions, ext[1:]) { paths = append(paths, filepath.Join(path, entry.Name())) } } diff --git a/managed/utils/interceptors/interceptors.go b/managed/utils/interceptors/interceptors.go index 721b109fb52..4613d97f06a 100644 --- a/managed/utils/interceptors/interceptors.go +++ b/managed/utils/interceptors/interceptors.go @@ -81,13 +81,13 @@ func logRequest(l *logrus.Entry, prefix string, f func() error) (err error) { } // UnaryInterceptorType represents the type of a unary gRPC interceptor. -type UnaryInterceptorType = func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) +type UnaryInterceptorType = func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) var dropEndpointsRE = regexp.MustCompile(`^/server.v1.ServerService/(Readiness|LeaderHealthCheck)$`) // Unary adds context logger and Prometheus metrics to unary server RPC. func UnaryAdd(interceptor grpc.UnaryServerInterceptor) UnaryInterceptorType { - return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + return func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) { // add pprof labels for more useful profiles defer pprof.SetGoroutineLabels(ctx) ctx = pprof.WithLabels(ctx, pprof.Labels("method", info.FullMethod)) @@ -130,8 +130,8 @@ func UnaryAdd(interceptor grpc.UnaryServerInterceptor) UnaryInterceptorType { } // Stream adds context logger and Prometheus metrics to stream server RPC. -func Stream(interceptor grpc.StreamServerInterceptor) func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { - return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { +func Stream(interceptor grpc.StreamServerInterceptor) func(srv any, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { + return func(srv any, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { ctx := ss.Context() // add pprof labels for more useful profiles diff --git a/managed/utils/interceptors/service.go b/managed/utils/interceptors/service.go index 86c5040e41a..d6f5d8b2e3f 100644 --- a/managed/utils/interceptors/service.go +++ b/managed/utils/interceptors/service.go @@ -32,7 +32,7 @@ type serviceEnabled interface { // // Request on disabled service will be rejected with `FailedPrecondition` before reaching any userspace handlers. func UnaryServiceEnabledInterceptor() grpc.UnaryServerInterceptor { - return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + return func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) { if svc, ok := info.Server.(serviceEnabled); ok && !svc.Enabled() { return nil, status.Errorf(codes.FailedPrecondition, "Service %s is disabled.", extractServiceName(info.FullMethod)) } @@ -42,7 +42,7 @@ func UnaryServiceEnabledInterceptor() grpc.UnaryServerInterceptor { // StreamServiceEnabledInterceptor returns a new stream server interceptor that checks if service is enabled. func StreamServiceEnabledInterceptor() grpc.StreamServerInterceptor { - return func(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { + return func(srv any, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { if svc, ok := srv.(serviceEnabled); ok && !svc.Enabled() { return status.Errorf(codes.FailedPrecondition, "Service %s is disabled.", extractServiceName(info.FullMethod)) } diff --git a/managed/utils/irt/logger.go b/managed/utils/irt/logger.go index 5a28fe31b09..4d5ee5e8fd0 100644 --- a/managed/utils/irt/logger.go +++ b/managed/utils/irt/logger.go @@ -21,7 +21,7 @@ import ( ) // WithLogger returns http.RoundTripper with request/response logger. -func WithLogger(t http.RoundTripper, printf func(format string, v ...interface{})) http.RoundTripper { +func WithLogger(t http.RoundTripper, printf func(format string, v ...any)) http.RoundTripper { return &loggerRoundTripper{ t: t, printf: printf, @@ -30,7 +30,7 @@ func WithLogger(t http.RoundTripper, printf func(format string, v ...interface{} type loggerRoundTripper struct { t http.RoundTripper - printf func(format string, v ...interface{}) + printf func(format string, v ...any) } func (lrt *loggerRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { diff --git a/managed/utils/tests/id.go b/managed/utils/tests/id.go index d49ccc706e9..d97355ac941 100644 --- a/managed/utils/tests/id.go +++ b/managed/utils/tests/id.go @@ -27,7 +27,7 @@ import ( // IDReader is used in tests for ID/UUID generation. type IDReader struct { - lastID uint64 + lastID atomic.Uint64 } // Read returns non-random data for ID/UUID generation. @@ -39,7 +39,7 @@ func (t *IDReader) Read(b []byte) (int, error) { for i := range b { b[i] = 0 } - id := atomic.AddUint64(&t.lastID, 1) + id := t.lastID.Add(1) binary.BigEndian.PutUint64(b[8:], id) return len(b), nil } diff --git a/managed/utils/validators/validators.go b/managed/utils/validators/validators.go index 5fa83bec81b..6832bd740b7 100644 --- a/managed/utils/validators/validators.go +++ b/managed/utils/validators/validators.go @@ -19,6 +19,7 @@ package validators import ( "errors" "fmt" + "slices" "time" "unicode" ) @@ -87,14 +88,7 @@ func ValidateAWSPartitions(partitions []string) error { } for _, p := range partitions { - var valid bool - for _, partition := range AWSPartitions() { - if p == partition { - valid = true - break - } - } - if !valid { + if !slices.Contains(AWSPartitions(), p) { return fmt.Errorf("aws_partitions: partition %q is invalid", p) } } diff --git a/qan-api2/models/base.go b/qan-api2/models/base.go index 3e73a223f9f..f59613937b9 100644 --- a/qan-api2/models/base.go +++ b/qan-api2/models/base.go @@ -105,8 +105,8 @@ var sparklinePointAllFields = []string{ "m_storage_time_reading_micros_sum_per_sec", } -func getPointFieldsList(point *qanv1.Point, fields []string) []interface{} { - sparklinePointValuesMap := map[string]interface{}{ +func getPointFieldsList(point *qanv1.Point, fields []string) []any { + sparklinePointValuesMap := map[string]any{ "point": &point.Point, "timestamp": &point.Timestamp, "time_frame": &point.TimeFrame, @@ -186,7 +186,7 @@ func getPointFieldsList(point *qanv1.Point, fields []string) []interface{} { "m_storage_time_reading_micros_sum_per_sec": &point.MStorageTimeReadingMicrosSumPerSec, } - sparklinePointValuesList := []interface{}{} + sparklinePointValuesList := make([]any, 0, len(fields)) for _, v := range fields { sparklinePointValuesList = append(sparklinePointValuesList, sparklinePointValuesMap[v]) } diff --git a/qan-api2/models/metrics.go b/qan-api2/models/metrics.go index eebd36de14f..b0809214df3 100644 --- a/qan-api2/models/metrics.go +++ b/qan-api2/models/metrics.go @@ -59,7 +59,7 @@ func NewMetrics(db *sqlx.DB) Metrics { func (m *Metrics) Get(ctx context.Context, periodStartFromSec, periodStartToSec int64, filter, group string, dimensions, labels map[string][]string, totals bool, ) ([]M, error) { - arg := map[string]interface{}{ + arg := map[string]any{ "period_start_from": periodStartFromSec, "period_start_to": periodStartToSec, } @@ -519,7 +519,7 @@ func (m *Metrics) SelectSparklines(ctx context.Context, periodStartFromSec, peri amountOfPoints += remainder / minutesInPoint timeFrame := minutesInPoint * secondsPerMinute - arg := map[string]interface{}{ + arg := map[string]any{ "period_start_from": periodStartFromSec, "period_start_to": periodStartToSec, } @@ -626,7 +626,7 @@ var tmplQueryExample = template.Must(template.New("queryExampleTmpl").Funcs(func func (m *Metrics) SelectQueryExamples(ctx context.Context, periodStartFrom, periodStartTo time.Time, filter, group string, limit uint32, dimensions, labels map[string][]string, ) (*qanv1.GetQueryExampleResponse, error) { - arg := map[string]interface{}{ + arg := map[string]any{ "filter": filter, "group": group, "period_start_to": periodStartTo, @@ -739,7 +739,7 @@ type queryRowsLabels struct { func (m *Metrics) SelectObjectDetailsLabels(ctx context.Context, periodStartFrom, periodStartTo time.Time, filter, group string, ) (*qanv1.GetLabelsResponse, error) { - arg := map[string]interface{}{ + arg := map[string]any{ "filter": filter, "group": group, "period_start_to": periodStartTo, @@ -890,7 +890,7 @@ func (m *Metrics) GetFingerprintByQueryID(ctx context.Context, queryID string) ( defer cancel() var fingerprint string - err := m.db.GetContext(queryCtx, &fingerprint, fingerprintByQueryID, []interface{}{queryID}...) + err := m.db.GetContext(queryCtx, &fingerprint, fingerprintByQueryID, []any{queryID}...) if err != nil && !errors.Is(err, sql.ErrNoRows) { return "", fmt.Errorf("QueryxContext error:%v", err) //nolint:errorlint } @@ -934,7 +934,7 @@ ORDER BY period_start DESC; func (m *Metrics) SelectHistogram(ctx context.Context, periodStartFromSec, periodStartToSec int64, dimensions, labels map[string][]string, queryID string, ) (*qanv1.GetHistogramResponse, error) { - arg := map[string]interface{}{ + arg := map[string]any{ "period_start_from": periodStartFromSec, "period_start_to": periodStartToSec, "queryid": queryID, @@ -1025,7 +1025,7 @@ WHERE service_id = :service_id AND example = :query LIMIT 1; // QueryExists check if query value in request exists by example in clickhouse. func (m *Metrics) QueryExists(ctx context.Context, serviceID, query string) (bool, error) { - arg := map[string]interface{}{ + arg := map[string]any{ "service_id": serviceID, "query": query, } @@ -1064,7 +1064,7 @@ WHERE service_id = :service_id AND queryid = :query_id LIMIT 1;` // SchemaByQueryID returns schema for given queryID and serviceID. func (m *Metrics) SchemaByQueryID(ctx context.Context, serviceID, queryID string) (*qanv1.SchemaByQueryIDResponse, error) { - arg := map[string]interface{}{ + arg := map[string]any{ "service_id": serviceID, "query_id": queryID, } @@ -1110,7 +1110,7 @@ WHERE service_id = :service_id AND queryid = :query_id LIMIT 1; // ExplainFingerprintByQueryID get explain fingerprint and placeholders count for given queryid. func (m *Metrics) ExplainFingerprintByQueryID(ctx context.Context, serviceID, queryID string) (*qanv1.ExplainFingerprintByQueryIDResponse, error) { - arg := map[string]interface{}{ + arg := map[string]any{ "service_id": serviceID, "query_id": queryID, } @@ -1198,7 +1198,7 @@ WHERE period_start >= :period_start_from AND period_start <= :period_start_to func (m *Metrics) GetSelectedQueryMetadata(ctx context.Context, periodStartFromSec, periodStartToSec int64, filter, group string, dimensions, labels map[string][]string, totals bool, ) (*qanv1.GetSelectedQueryMetadataResponse, error) { - arg := map[string]interface{}{ + arg := map[string]any{ "period_start_from": periodStartFromSec, "period_start_to": periodStartToSec, } diff --git a/qan-api2/services/analytics/profile.go b/qan-api2/services/analytics/profile.go index ea90092e43b..c517d8de5b3 100644 --- a/qan-api2/services/analytics/profile.go +++ b/qan-api2/services/analytics/profile.go @@ -238,8 +238,8 @@ func makeStats(metricNameRoot string, total, res models.M, numQueries float32, p func getOrderBy(reqOrder, defaultOrder string) (string, string) { var queryOrder, orderCol string direction := "ASC" - if strings.HasPrefix(reqOrder, "-") { - reqOrder = strings.TrimPrefix(reqOrder, "-") + if after, ok := strings.CutPrefix(reqOrder, "-"); ok { + reqOrder = after direction = "DESC" } diff --git a/qan-api2/utils/interceptors/interceptors.go b/qan-api2/utils/interceptors/interceptors.go index 66cfd1d55d4..2b5fbfb4888 100644 --- a/qan-api2/utils/interceptors/interceptors.go +++ b/qan-api2/utils/interceptors/interceptors.go @@ -80,7 +80,7 @@ func logRequest(l *logrus.Entry, prefix string, f func() error) (err error) { } // Unary adds context logger and Prometheus metrics to unary server RPC. -func Unary(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { +func Unary(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) { ctx, cancel := context.WithTimeout(ctx, responseTimeout) defer cancel() @@ -93,7 +93,7 @@ func Unary(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, han l := logrus.WithField("request", logger.MakeRequestID()) ctx = logger.SetEntry(ctx, l) - var res interface{} + var res any err := logRequest(l, "RPC "+info.FullMethod, func() error { var origErr error res, origErr = grpc_prometheus.UnaryServerInterceptor(ctx, req, info, handler) @@ -104,7 +104,7 @@ func Unary(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, han } // Stream adds context logger and Prometheus metrics to stream server RPC. -func Stream(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { +func Stream(srv any, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { ctx := ss.Context() // add pprof labels for more useful profiles diff --git a/qan-api2/utils/logger/grpc.go b/qan-api2/utils/logger/grpc.go index 32d84c72cb2..bfa25f98293 100644 --- a/qan-api2/utils/logger/grpc.go +++ b/qan-api2/utils/logger/grpc.go @@ -35,13 +35,13 @@ func (v *GRPC) V(l int) bool { //nolint:revive // Override InfoXXX methods with TraceXXX to keep gRPC and logrus levels in sync. // // Info logs a message at the Info level. -func (v *GRPC) Info(args ...interface{}) { v.Trace(args...) } +func (v *GRPC) Info(args ...any) { v.Trace(args...) } // Infoln logs a message at the Info level. -func (v *GRPC) Infoln(args ...interface{}) { v.Traceln(args...) } +func (v *GRPC) Infoln(args ...any) { v.Traceln(args...) } // Infof logs a formatted message at the Info level. -func (v *GRPC) Infof(format string, args ...interface{}) { v.Tracef(format, args...) } +func (v *GRPC) Infof(format string, args ...any) { v.Tracef(format, args...) } // check interfaces. var ( diff --git a/utils/logger/grpc.go b/utils/logger/grpc.go index 12a67c9d65f..4597402eac6 100644 --- a/utils/logger/grpc.go +++ b/utils/logger/grpc.go @@ -33,13 +33,13 @@ func (v *GRPC) V(l int) bool { //nolint:revive // Info logs a message at the Info level. // Override InfoXXX methods with TraceXXX to keep gRPC and logrus levels in sync. -func (v *GRPC) Info(args ...interface{}) { v.Trace(args...) } +func (v *GRPC) Info(args ...any) { v.Trace(args...) } // Infoln logs a message at the Info level. -func (v *GRPC) Infoln(args ...interface{}) { v.Traceln(args...) } +func (v *GRPC) Infoln(args ...any) { v.Traceln(args...) } // Infof logs a formatted message at the Info level. -func (v *GRPC) Infof(format string, args ...interface{}) { v.Tracef(format, args...) } +func (v *GRPC) Infof(format string, args ...any) { v.Tracef(format, args...) } // check interfaces. var ( diff --git a/utils/pdeathsig/pdeathsig.go b/utils/pdeathsig/pdeathsig.go index 1f5c7dd4d6d..c14791a5bea 100644 --- a/utils/pdeathsig/pdeathsig.go +++ b/utils/pdeathsig/pdeathsig.go @@ -14,7 +14,6 @@ // along with this program. If not, see . //go:build !linux -// +build !linux // Package pdeathsig contains function for setting deaths singal. package pdeathsig diff --git a/utils/sqlmetrics/reform.go b/utils/sqlmetrics/reform.go index c7d85771401..73abaf1e484 100644 --- a/utils/sqlmetrics/reform.go +++ b/utils/sqlmetrics/reform.go @@ -27,7 +27,7 @@ import ( // Reform is a SQL logger with metrics. type Reform struct { l *reform.PrintfLogger - requests int64 + requests atomic.Int64 mRequests *prom.CounterVec mResponses *prom.SummaryVec } @@ -69,16 +69,16 @@ func statement(query string) string { } // Before implements reform.Logger. -func (r *Reform) Before(query string, args []interface{}) { +func (r *Reform) Before(query string, args []any) { r.l.Before(query, args) - atomic.AddInt64(&r.requests, 1) + r.requests.Add(1) r.mRequests.WithLabelValues(statement(query)).Inc() } // After implements reform.Logger. -func (r *Reform) After(query string, args []interface{}, d time.Duration, err error) { +func (r *Reform) After(query string, args []any, d time.Duration, err error) { r.l.After(query, args, d, err) e := "0" @@ -102,12 +102,12 @@ func (r *Reform) Collect(ch chan<- prom.Metric) { // Requests returns a total number of queries started. func (r *Reform) Requests() int { - return int(atomic.LoadInt64(&r.requests)) + return int(r.requests.Load()) } // Reset sets all metrics to 0. func (r *Reform) Reset() { - atomic.StoreInt64(&r.requests, 0) + r.requests.Store(0) r.mRequests.Reset() r.mResponses.Reset() diff --git a/utils/sqlrows/sqlrows.go b/utils/sqlrows/sqlrows.go index 0b4925b40f6..000f25e1848 100644 --- a/utils/sqlrows/sqlrows.go +++ b/utils/sqlrows/sqlrows.go @@ -19,9 +19,9 @@ package sqlrows import "database/sql" // ReadRows reads and closes given *sql.Rows, returning columns, data rows, and first encountered error. -func ReadRows(rows *sql.Rows) ([]string, [][]interface{}, error) { +func ReadRows(rows *sql.Rows) ([]string, [][]any, error) { var columns []string - var dataRows [][]interface{} + var dataRows [][]any var err error defer func() { @@ -37,9 +37,9 @@ func ReadRows(rows *sql.Rows) ([]string, [][]interface{}, error) { } for rows.Next() { - dest := make([]interface{}, len(columns)) + dest := make([]any, len(columns)) for i := range dest { - var ei interface{} + var ei any dest[i] = &ei } if err = rows.Scan(dest...); err != nil { diff --git a/version/update.go b/version/update.go index 575203783a8..5cd90c78f9a 100644 --- a/version/update.go +++ b/version/update.go @@ -28,7 +28,7 @@ type PackageInfo struct { // UpdateCheckResult describes the latest update check result. type UpdateCheckResult struct { Installed PackageInfo `json:"installed"` - Latest DockerVersionInfo `json:"latest,omitempty"` + Latest DockerVersionInfo `json:"latest"` UpdateAvailable bool `json:"update_available"` LatestNewsURL string `json:"latest_news_url"` } From 16d9a3280b7b1971c088a2bb31d7960ace91b413 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Fri, 22 May 2026 09:55:32 +0300 Subject: [PATCH 11/23] Update managed/cmd/pmm-managed/main.go Co-authored-by: Ante Gulin <8070595+4nte@users.noreply.github.com> --- managed/cmd/pmm-managed/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/cmd/pmm-managed/main.go b/managed/cmd/pmm-managed/main.go index e7d1384180a..05ee5d4ca09 100644 --- a/managed/cmd/pmm-managed/main.go +++ b/managed/cmd/pmm-managed/main.go @@ -1217,7 +1217,7 @@ func main() { //nolint:gocognit,maintidx,cyclop wg.Go(func() { err := haService.Run(ctx) if err != nil { - l.Panicf("cannot start high availability service: %+v", err) + l.Fatalf("cannot start high availability service: %+v", err) } }) From 5b2e263c39d584fd3ec17473698739b2b38816a1 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Fri, 22 May 2026 10:12:56 +0300 Subject: [PATCH 12/23] replace panic with Fatal for func in waitGroup --- managed/cmd/pmm-managed/main.go | 12 ++++++------ managed/services/victoriametrics/victoriametrics.go | 2 +- managed/services/vmalert/vmalert.go | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/managed/cmd/pmm-managed/main.go b/managed/cmd/pmm-managed/main.go index 05ee5d4ca09..d2749a36d70 100644 --- a/managed/cmd/pmm-managed/main.go +++ b/managed/cmd/pmm-managed/main.go @@ -320,7 +320,7 @@ func runGRPCServer(ctx context.Context, deps *gRPCServerDeps) { // run server until it is stopped gracefully or not listener, err := net.Listen("tcp", gRPCAddr) if err != nil { - l.Panic(err) + l.Fatal(err) } go func() { for { @@ -383,7 +383,7 @@ func runHTTP1Server(ctx context.Context, deps *http1ServerDeps) { // Create a shared gRPC connection for handlers that use Register*Handler sharedConn, err := grpc.NewClient(gRPCAddr, opts...) if err != nil { - l.Panic(err) + l.Fatal(err) } go func() { <-ctx.Done() @@ -423,7 +423,7 @@ func runHTTP1Server(ctx context.Context, deps *http1ServerDeps) { hav1beta1.RegisterHAServiceHandler, } { if err := r(ctx, proxyMux, sharedConn); err != nil { - l.Panic(err) + l.Fatal(err) } } @@ -441,7 +441,7 @@ func runHTTP1Server(ctx context.Context, deps *http1ServerDeps) { } go func() { if err := server.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { - l.Panic(err) + l.Fatal(err) } l.Info("Server stopped.") }() @@ -489,7 +489,7 @@ func runDebugServer(ctx context.Context) { `)).Execute(&buf, handlers) if err != nil { - l.Panic(err) + l.Fatal(err) } http.HandleFunc("/debug", func(rw http.ResponseWriter, _ *http.Request) { rw.Write(buf.Bytes()) //nolint:errcheck @@ -502,7 +502,7 @@ func runDebugServer(ctx context.Context) { } go func() { if err := server.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { - l.Panic(err) + l.Fatal(err) } l.Info("Server stopped.") }() diff --git a/managed/services/victoriametrics/victoriametrics.go b/managed/services/victoriametrics/victoriametrics.go index ce4277027d9..5af81891f83 100644 --- a/managed/services/victoriametrics/victoriametrics.go +++ b/managed/services/victoriametrics/victoriametrics.go @@ -105,7 +105,7 @@ func (svc *Service) Run(ctx context.Context) { // is reloaded when requested, but several requests are batched together to avoid too frequent reloads. // That allows the caller to just call RequestConfigurationUpdate when it seems fit. if cap(svc.reloadCh) != 1 { - panic("reloadCh should have capacity 1") + svc.l.Fatal("reloadCh should have capacity 1") } for { diff --git a/managed/services/vmalert/vmalert.go b/managed/services/vmalert/vmalert.go index 2a37d62717d..9ebd69989bf 100644 --- a/managed/services/vmalert/vmalert.go +++ b/managed/services/vmalert/vmalert.go @@ -98,7 +98,7 @@ func (svc *Service) Run(ctx context.Context) { // is reloaded when requested, but several requests are batched together to avoid too often reloads. // That allows the caller to just call RequestConfigurationUpdate when it seems fit. if cap(svc.reloadCh) != 1 { - panic("reloadCh should have capacity 1") + svc.l.Fatal("reloadCh should have capacity 1") } for { From 0528a5ef3a9ce368fdf6ee708a243b51274a77a4 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Fri, 22 May 2026 13:31:10 +0300 Subject: [PATCH 13/23] PMM-7 Fix staticcheck linter warnings --- admin/commands/config.go | 4 ++-- admin/commands/inventory/add_agent_node_exporter.go | 2 +- .../inventory/add_agent_qan_mongodb_mongolog_agent.go | 2 +- .../inventory/add_agent_qan_mongodb_profiler_agent.go | 2 +- .../inventory/add_agent_qan_mysql_perfschema_agent.go | 4 ++-- .../inventory/add_agent_qan_mysql_slowlog_agent.go | 4 ++-- .../add_agent_qan_postgres_pgstatements_agent.go | 4 ++-- .../add_agent_qan_postgres_pgstatmonitor_agent.go | 4 ++-- admin/commands/inventory/add_agent_rds_exporter.go | 2 +- admin/commands/management/add_external.go | 2 +- admin/commands/management/add_haproxy.go | 2 +- admin/commands/management/add_mongodb.go | 2 +- admin/commands/management/add_mysql.go | 4 ++-- admin/commands/management/add_postgresql.go | 4 ++-- admin/commands/management/add_proxysql.go | 2 +- admin/commands/management/add_valkey.go | 2 +- admin/commands/management/register.go | 2 +- agent/agents/mysql/perfschema/perfschema_test.go | 6 ++---- agent/agents/mysql/slowlog/parser/parser.go | 2 +- agent/agents/postgres/pgstatmonitor/pgstatmonitor.go | 8 ++++---- .../postgres/pgstatmonitor/stat_monitor_cache.go | 2 +- agent/runner/jobs/mysql_backup_job.go | 4 ++-- managed/models/agent_helpers.go | 2 +- managed/models/dump_helpers_test.go | 2 +- managed/models/role_helpers.go | 2 +- managed/models/software_version_helpers.go | 10 ++++++++-- managed/services/agents/jobs.go | 7 ++++--- managed/services/backup/removal_service.go | 2 +- managed/services/management/accesscontrol.go | 5 +++-- managed/services/management/accesscontrol_test.go | 4 ++-- managed/services/minio/client.go | 5 +---- managed/services/scheduler/scheduler.go | 4 ++-- 32 files changed, 58 insertions(+), 55 deletions(-) diff --git a/admin/commands/config.go b/admin/commands/config.go index 665ff3c8c10..cc2875ffd28 100644 --- a/admin/commands/config.go +++ b/admin/commands/config.go @@ -119,8 +119,8 @@ func (cmd *ConfigCommand) args(globals *flags.GlobalFlags) ([]string, bool) { res = append(res, "--force") } - if cmd.MetricsModeFlags.MetricsMode != "" { - res = append(res, fmt.Sprintf("--metrics-mode=%s", cmd.MetricsModeFlags.MetricsMode)) + if cmd.MetricsMode != "" { + res = append(res, fmt.Sprintf("--metrics-mode=%s", cmd.MetricsMode)) } if len(cmd.DisableCollectors) != 0 { diff --git a/admin/commands/inventory/add_agent_node_exporter.go b/admin/commands/inventory/add_agent_node_exporter.go index b1c62b80aab..415598eca88 100644 --- a/admin/commands/inventory/add_agent_node_exporter.go +++ b/admin/commands/inventory/add_agent_node_exporter.go @@ -64,7 +64,7 @@ func (cmd *AddAgentNodeExporterCommand) RunCmd() (commands.Result, error) { PushMetrics: cmd.PushMetrics, ExposeExporter: cmd.ExposeExporter, DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), - LogLevel: cmd.LogLevelNoFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), }, }, Context: commands.Ctx, diff --git a/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go b/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go index 3dee2a0b208..a0eaaeb56a9 100644 --- a/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go +++ b/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go @@ -96,7 +96,7 @@ func (cmd *AddAgentQANMongoDBMongologAgentCommand) RunCmd() (commands.Result, er TLSCa: tlsCa, AuthenticationMechanism: cmd.AuthenticationMechanism, AuthenticationDatabase: cmd.AuthenticationDatabase, - LogLevel: cmd.LogLevelFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), }, }, Context: commands.Ctx, diff --git a/admin/commands/inventory/add_agent_qan_mongodb_profiler_agent.go b/admin/commands/inventory/add_agent_qan_mongodb_profiler_agent.go index 9d76af85482..774a2f192e0 100644 --- a/admin/commands/inventory/add_agent_qan_mongodb_profiler_agent.go +++ b/admin/commands/inventory/add_agent_qan_mongodb_profiler_agent.go @@ -94,7 +94,7 @@ func (cmd *AddAgentQANMongoDBProfilerAgentCommand) RunCmd() (commands.Result, er TLSCertificateKeyFilePassword: cmd.TLSCertificateKeyFilePassword, TLSCa: tlsCa, AuthenticationMechanism: cmd.AuthenticationMechanism, - LogLevel: cmd.LogLevelFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), }, }, Context: commands.Ctx, diff --git a/admin/commands/inventory/add_agent_qan_mysql_perfschema_agent.go b/admin/commands/inventory/add_agent_qan_mysql_perfschema_agent.go index d1214a423c6..bd96180cb50 100644 --- a/admin/commands/inventory/add_agent_qan_mysql_perfschema_agent.go +++ b/admin/commands/inventory/add_agent_qan_mysql_perfschema_agent.go @@ -107,7 +107,7 @@ func (cmd *AddAgentQANMySQLPerfSchemaAgentCommand) RunCmd() (commands.Result, er Password: cmd.Password, CustomLabels: *customLabels, SkipConnectionCheck: cmd.SkipConnectionCheck, - DisableCommentsParsing: !cmd.CommentsParsingFlags.CommentsParsingEnabled(), + DisableCommentsParsing: !cmd.CommentsParsingEnabled(), MaxQueryLength: cmd.MaxQueryLength, DisableQueryExamples: cmd.DisableQueryExamples, TLS: cmd.TLS, @@ -115,7 +115,7 @@ func (cmd *AddAgentQANMySQLPerfSchemaAgentCommand) RunCmd() (commands.Result, er TLSCa: tlsCa, TLSCert: tlsCert, TLSKey: tlsKey, - LogLevel: cmd.LogLevelFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), }, }, Context: commands.Ctx, diff --git a/admin/commands/inventory/add_agent_qan_mysql_slowlog_agent.go b/admin/commands/inventory/add_agent_qan_mysql_slowlog_agent.go index e0a8e22d8a6..f83cdfca137 100644 --- a/admin/commands/inventory/add_agent_qan_mysql_slowlog_agent.go +++ b/admin/commands/inventory/add_agent_qan_mysql_slowlog_agent.go @@ -120,7 +120,7 @@ func (cmd *AddAgentQANMySQLSlowlogAgentCommand) RunCmd() (commands.Result, error Password: cmd.Password, CustomLabels: *customLabels, SkipConnectionCheck: cmd.SkipConnectionCheck, - DisableCommentsParsing: !cmd.CommentsParsingFlags.CommentsParsingEnabled(), + DisableCommentsParsing: !cmd.CommentsParsingEnabled(), MaxQueryLength: cmd.MaxQueryLength, DisableQueryExamples: cmd.DisableQueryExamples, MaxSlowlogFileSize: strconv.FormatInt(int64(cmd.MaxSlowlogFileSize), 10), @@ -129,7 +129,7 @@ func (cmd *AddAgentQANMySQLSlowlogAgentCommand) RunCmd() (commands.Result, error TLSCa: tlsCa, TLSCert: tlsCert, TLSKey: tlsKey, - LogLevel: cmd.LogLevelFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), }, }, Context: commands.Ctx, diff --git a/admin/commands/inventory/add_agent_qan_postgres_pgstatements_agent.go b/admin/commands/inventory/add_agent_qan_postgres_pgstatements_agent.go index 6e69f0ae5c3..ceb0240f19c 100644 --- a/admin/commands/inventory/add_agent_qan_postgres_pgstatements_agent.go +++ b/admin/commands/inventory/add_agent_qan_postgres_pgstatements_agent.go @@ -98,7 +98,7 @@ func (cmd *AddAgentQANPostgreSQLPgStatementsAgentCommand) RunCmd() (commands.Res Password: cmd.Password, CustomLabels: *customLabels, SkipConnectionCheck: cmd.SkipConnectionCheck, - DisableCommentsParsing: !cmd.CommentsParsingFlags.CommentsParsingEnabled(), + DisableCommentsParsing: !cmd.CommentsParsingEnabled(), MaxQueryLength: cmd.MaxQueryLength, TLS: cmd.TLS, @@ -106,7 +106,7 @@ func (cmd *AddAgentQANPostgreSQLPgStatementsAgentCommand) RunCmd() (commands.Res TLSCa: tlsCa, TLSCert: tlsCert, TLSKey: tlsKey, - LogLevel: cmd.LogLevelFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), }, }, Context: commands.Ctx, diff --git a/admin/commands/inventory/add_agent_qan_postgres_pgstatmonitor_agent.go b/admin/commands/inventory/add_agent_qan_postgres_pgstatmonitor_agent.go index 9cf6c856902..deb97cf6ba0 100644 --- a/admin/commands/inventory/add_agent_qan_postgres_pgstatmonitor_agent.go +++ b/admin/commands/inventory/add_agent_qan_postgres_pgstatmonitor_agent.go @@ -100,7 +100,7 @@ func (cmd *AddAgentQANPostgreSQLPgStatMonitorAgentCommand) RunCmd() (commands.Re Password: cmd.Password, CustomLabels: *customLabels, SkipConnectionCheck: cmd.SkipConnectionCheck, - DisableCommentsParsing: !cmd.CommentsParsingFlags.CommentsParsingEnabled(), + DisableCommentsParsing: !cmd.CommentsParsingEnabled(), MaxQueryLength: cmd.MaxQueryLength, DisableQueryExamples: cmd.QueryExamplesDisabled, @@ -109,7 +109,7 @@ func (cmd *AddAgentQANPostgreSQLPgStatMonitorAgentCommand) RunCmd() (commands.Re TLSCa: tlsCa, TLSCert: tlsCert, TLSKey: tlsKey, - LogLevel: cmd.LogLevelFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), }, }, Context: commands.Ctx, diff --git a/admin/commands/inventory/add_agent_rds_exporter.go b/admin/commands/inventory/add_agent_rds_exporter.go index 42a40d030e9..f903dd12fcf 100644 --- a/admin/commands/inventory/add_agent_rds_exporter.go +++ b/admin/commands/inventory/add_agent_rds_exporter.go @@ -75,7 +75,7 @@ func (cmd *AddAgentRDSExporterCommand) RunCmd() (commands.Result, error) { DisableBasicMetrics: cmd.DisableBasicMetrics, DisableEnhancedMetrics: cmd.DisableEnhancedMetrics, PushMetrics: cmd.PushMetrics, - LogLevel: cmd.LogLevelFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), }, }, Context: commands.Ctx, diff --git a/admin/commands/management/add_external.go b/admin/commands/management/add_external.go index acc5aed1c05..f536ae37524 100644 --- a/admin/commands/management/add_external.go +++ b/admin/commands/management/add_external.go @@ -136,7 +136,7 @@ func (cmd *AddExternalCommand) RunCmd() (commands.Result, error) { Cluster: cmd.Cluster, ReplicationSet: cmd.ReplicationSet, CustomLabels: *customLabels, - MetricsMode: cmd.MetricsModeFlags.MetricsMode.EnumValue(), + MetricsMode: cmd.MetricsMode.EnumValue(), Group: cmd.Group, SkipConnectionCheck: cmd.SkipConnectionCheck, TLSSkipVerify: cmd.TLSSkipVerify, diff --git a/admin/commands/management/add_haproxy.go b/admin/commands/management/add_haproxy.go index 73d5c9aaa59..38f55edaec6 100644 --- a/admin/commands/management/add_haproxy.go +++ b/admin/commands/management/add_haproxy.go @@ -118,7 +118,7 @@ func (cmd *AddHAProxyCommand) RunCmd() (commands.Result, error) { Cluster: cmd.Cluster, ReplicationSet: cmd.ReplicationSet, CustomLabels: *customLabels, - MetricsMode: cmd.MetricsModeFlags.MetricsMode.EnumValue(), + MetricsMode: cmd.MetricsMode.EnumValue(), SkipConnectionCheck: cmd.SkipConnectionCheck, TLSSkipVerify: cmd.TLSSkipVerify, }, diff --git a/admin/commands/management/add_mongodb.go b/admin/commands/management/add_mongodb.go index 526f0c5180b..47b9d54ff16 100644 --- a/admin/commands/management/add_mongodb.go +++ b/admin/commands/management/add_mongodb.go @@ -198,7 +198,7 @@ func (cmd *AddMongoDBCommand) RunCmd() (commands.Result, error) { AuthenticationMechanism: cmd.AuthenticationMechanism, AuthenticationDatabase: cmd.AuthenticationDatabase, - MetricsMode: cmd.MetricsModeFlags.MetricsMode.EnumValue(), + MetricsMode: cmd.MetricsMode.EnumValue(), EnableAllCollectors: cmd.EnableAllCollectors, DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), diff --git a/admin/commands/management/add_mysql.go b/admin/commands/management/add_mysql.go index e820464f5ec..25210e9aea2 100644 --- a/admin/commands/management/add_mysql.go +++ b/admin/commands/management/add_mysql.go @@ -230,7 +230,7 @@ func (cmd *AddMySQLCommand) RunCmd() (commands.Result, error) { QANMysqlPerfschema: cmd.QuerySource == MysqlQuerySourcePerfSchema, SkipConnectionCheck: cmd.SkipConnectionCheck, - DisableCommentsParsing: !cmd.CommentsParsingFlags.CommentsParsingEnabled(), + DisableCommentsParsing: !cmd.CommentsParsingEnabled(), MaxQueryLength: cmd.MaxQueryLength, DisableQueryExamples: cmd.DisableQueryExamples, @@ -241,7 +241,7 @@ func (cmd *AddMySQLCommand) RunCmd() (commands.Result, error) { TLSCert: tlsCert, TLSKey: tlsKey, TablestatsGroupTableLimit: tablestatsGroupTableLimit, - MetricsMode: cmd.MetricsModeFlags.MetricsMode.EnumValue(), + MetricsMode: cmd.MetricsMode.EnumValue(), DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), LogLevel: cmd.LogLevel.EnumValue(), ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), diff --git a/admin/commands/management/add_postgresql.go b/admin/commands/management/add_postgresql.go index a4333d0b00d..d5c81d2fea3 100644 --- a/admin/commands/management/add_postgresql.go +++ b/admin/commands/management/add_postgresql.go @@ -191,7 +191,7 @@ func (cmd *AddPostgreSQLCommand) RunCmd() (commands.Result, error) { Database: cmd.Database, AgentPassword: cmd.AgentPassword, SkipConnectionCheck: cmd.SkipConnectionCheck, - DisableCommentsParsing: !cmd.CommentsParsingFlags.CommentsParsingEnabled(), + DisableCommentsParsing: !cmd.CommentsParsingEnabled(), PMMAgentID: cmd.PMMAgentID, Environment: cmd.Environment, @@ -210,7 +210,7 @@ func (cmd *AddPostgreSQLCommand) RunCmd() (commands.Result, error) { MaxQueryLength: cmd.MaxQueryLength, DisableQueryExamples: cmd.DisableQueryExamples, - MetricsMode: cmd.MetricsModeFlags.MetricsMode.EnumValue(), + MetricsMode: cmd.MetricsMode.EnumValue(), DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), AutoDiscoveryLimit: cmd.AutoDiscoveryLimit, MaxExporterConnections: cmd.MaxExporterConnections, diff --git a/admin/commands/management/add_proxysql.go b/admin/commands/management/add_proxysql.go index 318edc07ade..dfc46b378e3 100644 --- a/admin/commands/management/add_proxysql.go +++ b/admin/commands/management/add_proxysql.go @@ -151,7 +151,7 @@ func (cmd *AddProxySQLCommand) RunCmd() (commands.Result, error) { SkipConnectionCheck: cmd.SkipConnectionCheck, TLS: cmd.TLS, TLSSkipVerify: cmd.TLSSkipVerify, - MetricsMode: cmd.MetricsModeFlags.MetricsMode.EnumValue(), + MetricsMode: cmd.MetricsMode.EnumValue(), DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), LogLevel: cmd.LogLevel.EnumValue(), ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), diff --git a/admin/commands/management/add_valkey.go b/admin/commands/management/add_valkey.go index 7243ca3c2a2..61e82e8ac58 100644 --- a/admin/commands/management/add_valkey.go +++ b/admin/commands/management/add_valkey.go @@ -160,7 +160,7 @@ func (cmd *AddValkeyCommand) RunCmd() (commands.Result, error) { TLSCa: tlsCa, TLSCert: tlsCert, TLSKey: tlsKey, - MetricsMode: cmd.MetricsModeFlags.MetricsMode.EnumValue(), + MetricsMode: cmd.MetricsMode.EnumValue(), LogLevel: cmd.LogLevel.EnumValue(), ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), }, diff --git a/admin/commands/management/register.go b/admin/commands/management/register.go index 2942c99992a..120640b33da 100644 --- a/admin/commands/management/register.go +++ b/admin/commands/management/register.go @@ -83,7 +83,7 @@ func (cmd *RegisterCommand) RunCmd() (commands.Result, error) { AgentPassword: cmd.AgentPassword, Reregister: cmd.Force, - MetricsMode: cmd.MetricsModeFlags.MetricsMode.EnumValue(), + MetricsMode: cmd.MetricsMode.EnumValue(), DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), }, Context: commands.Ctx, diff --git a/agent/agents/mysql/perfschema/perfschema_test.go b/agent/agents/mysql/perfschema/perfschema_test.go index e4308136bba..94d8b068119 100644 --- a/agent/agents/mysql/perfschema/perfschema_test.go +++ b/agent/agents/mysql/perfschema/perfschema_test.go @@ -538,10 +538,8 @@ func TestPerfSchema(t *testing.T) { require.NoError(t, m.refreshHistoryCache(t.Context())) var example string - isTruncated := true - if mySQLVendor != version.MariaDBVendor && mySQLVersion.Float() >= 8.0 { - isTruncated = false - } + isTruncated := !(mySQLVendor != version.MariaDBVendor && mySQLVersion.Float() >= 8.0) + switch { // Perf schema truncates queries with non-utf8 characters. case (mySQLVendor == version.PerconaVendor || mySQLVendor == version.OracleVendor) && mySQLVersion.Float() >= 8.0: diff --git a/agent/agents/mysql/slowlog/parser/parser.go b/agent/agents/mysql/slowlog/parser/parser.go index 3a48503cd59..c27fccd8811 100644 --- a/agent/agents/mysql/slowlog/parser/parser.go +++ b/agent/agents/mysql/slowlog/parser/parser.go @@ -249,7 +249,7 @@ func (p *SlowLogParser) parseMetrics(line string) { } // we need to skip redundant space to correct the split process - line = strings.Replace(line, ": ", ":", -1) //nolint:gocritic + line = strings.ReplaceAll(line, ": ", ":") for kv := range strings.SplitSeq(line, " ") { if len(kv) == 0 { continue diff --git a/agent/agents/postgres/pgstatmonitor/pgstatmonitor.go b/agent/agents/postgres/pgstatmonitor/pgstatmonitor.go index 9dd857b57f0..f2311a5e1a3 100644 --- a/agent/agents/postgres/pgstatmonitor/pgstatmonitor.go +++ b/agent/agents/postgres/pgstatmonitor/pgstatmonitor.go @@ -604,12 +604,12 @@ func (m *PGStatMonitorQAN) makeBuckets(current, cache map[time.Time]map[string]* }, Postgresql: &agentv1.MetricsBucket_PostgreSQL{}, } - if currentPSM.pgStatMonitor.CmdType >= 0 && - currentPSM.pgStatMonitor.CmdType < int32(len(commandTypeToText)) { //nolint:gosec // len(commandTypeToText) is not expected to overflow int32 - mb.Postgresql.CmdType = commandTypeToText[currentPSM.pgStatMonitor.CmdType] + if currentPSM.CmdType >= 0 && + currentPSM.CmdType < int32(len(commandTypeToText)) { //nolint:gosec // len(commandTypeToText) is not expected to overflow int32 + mb.Postgresql.CmdType = commandTypeToText[currentPSM.CmdType] } else { mb.Postgresql.CmdType = commandTextNotAvailable - m.l.Warnf("failed to translate command type '%d' into text", currentPSM.pgStatMonitor.CmdType) + m.l.Warnf("failed to translate command type '%d' into text", currentPSM.CmdType) } mb.Postgresql.TopQueryid = pointer.GetString(currentPSM.TopQueryID) diff --git a/agent/agents/postgres/pgstatmonitor/stat_monitor_cache.go b/agent/agents/postgres/pgstatmonitor/stat_monitor_cache.go index 7d8b6a3dfdb..ea04f87a69a 100644 --- a/agent/agents/postgres/pgstatmonitor/stat_monitor_cache.go +++ b/agent/agents/postgres/pgstatmonitor/stat_monitor_cache.go @@ -173,7 +173,7 @@ func (ssc *statMonitorCache) getStatMonitorExtended( } if err != nil { // Either real syntax error in the query or pg_stat_monitor truncated the query and it causes the syntax error. - if c.pgStatMonitor.Elevel != 0 { + if c.Elevel != 0 { c.IsQueryTruncated = false ssc.l.Warnf("generating fingerprint failed for query with id %v: %v", c.QueryID, err) } else { diff --git a/agent/runner/jobs/mysql_backup_job.go b/agent/runner/jobs/mysql_backup_job.go index c5a24605368..51c10cf9dea 100644 --- a/agent/runner/jobs/mysql_backup_job.go +++ b/agent/runner/jobs/mysql_backup_job.go @@ -171,8 +171,8 @@ func (j *MySQLBackupJob) backup(ctx context.Context) (rerr error) { } var xbcloudCmd *exec.Cmd - switch { - case j.locationConfig.Type == S3BackupLocationType: + switch j.locationConfig.Type { + case S3BackupLocationType: xtrabackupCmd.Args = append(xtrabackupCmd.Args, "--stream=xbstream") artifactFolder := path.Join(j.folder, j.name) diff --git a/managed/models/agent_helpers.go b/managed/models/agent_helpers.go index 6a15b98c825..92c82e1ea96 100644 --- a/managed/models/agent_helpers.go +++ b/managed/models/agent_helpers.go @@ -719,7 +719,7 @@ type CreateExternalExporterParams struct { // CreateExternalExporter creates ExternalExporter. func CreateExternalExporter(q *reform.Querier, params *CreateExternalExporterParams) (*Agent, error) { - if !(params.ListenPort > 0 && params.ListenPort < 65536) { + if params.ListenPort <= 0 || params.ListenPort >= 65536 { return nil, status.Errorf(codes.InvalidArgument, "Listen port should be between 1 and 65535.") } var pmmAgentID *string diff --git a/managed/models/dump_helpers_test.go b/managed/models/dump_helpers_test.go index ed76ac7e5a9..be5fbd27863 100644 --- a/managed/models/dump_helpers_test.go +++ b/managed/models/dump_helpers_test.go @@ -135,7 +135,7 @@ func TestDumps(t *testing.T) { }) require.NoError(t, err) dump3.Status = models.DumpStatusError - err = findTX.Querier.Update(dump3) + err = findTX.Update(dump3) require.NoError(t, err) type testCase struct { diff --git a/managed/models/role_helpers.go b/managed/models/role_helpers.go index 7f8cc162bf8..12f784e2ffc 100644 --- a/managed/models/role_helpers.go +++ b/managed/models/role_helpers.go @@ -173,7 +173,7 @@ func replaceRole(tx *reform.TX, roleID, newRoleID int) error { // findRole retrieves a role by ID. func findRole(tx *reform.TX, roleID int, role *Role) error { - err := tx.Querier.SelectOneTo(role, "WHERE id = $1", roleID) + err := tx.SelectOneTo(role, "WHERE id = $1", roleID) if err != nil { if errors.Is(err, reform.ErrNoRows) { return ErrRoleNotFound diff --git a/managed/models/software_version_helpers.go b/managed/models/software_version_helpers.go index e4f72a3f2dc..43b945f5453 100644 --- a/managed/models/software_version_helpers.go +++ b/managed/models/software_version_helpers.go @@ -195,7 +195,10 @@ func FindServicesSoftwareVersions( if err := ValidateServiceType(*filter.ServiceType); err != nil { return nil, errors.WithStack(err) } - tail.WriteString(fmt.Sprintf("WHERE service_type = %s ", q.Placeholder(idx))) + _, err := fmt.Fprintf(&tail, "WHERE service_type = %s ", q.Placeholder(idx)) + if err != nil { + return nil, errors.WithStack(err) + } args = append(args, string(*filter.ServiceType)) idx++ } @@ -207,7 +210,10 @@ func FindServicesSoftwareVersions( } if filter.Limit != nil { - tail.WriteString(fmt.Sprintf("LIMIT %s", q.Placeholder(idx))) + _, err := fmt.Fprintf(&tail, "LIMIT %s", q.Placeholder(idx)) + if err != nil { + return nil, errors.WithStack(err) + } args = append(args, *filter.Limit) } diff --git a/managed/services/agents/jobs.go b/managed/services/agents/jobs.go index 266ec5bef7f..82e21dd64ad 100644 --- a/managed/services/agents/jobs.go +++ b/managed/services/agents/jobs.go @@ -238,7 +238,7 @@ func (s *JobsService) handleJobResult(_ context.Context, l *logrus.Entry, result return errors.Wrapf(err, "cannot get scheduled task %s", scheduleID) } taskData := task.Data - taskData.MongoDBBackupTask.CommonBackupTaskData.Folder = artifact.Name + taskData.MongoDBBackupTask.Folder = artifact.Name params := models.ChangeScheduledTaskParams{ Data: taskData, @@ -272,9 +272,10 @@ func (s *JobsService) handleJobResult(_ context.Context, l *logrus.Entry, result return errors.Errorf("result type %s doesn't match job type %s", models.MongoDBRestoreBackupJob, job.Type) } - if job.Data.MongoDBRestoreBackup.DataModel == models.LogicalDataModel { + switch job.Data.MongoDBRestoreBackup.DataModel { + case models.LogicalDataModel: s.l.Info("restore successfully completed") - } else if job.Data.MongoDBRestoreBackup.DataModel == models.PhysicalDataModel { + case models.PhysicalDataModel: s.l.Info("restore successfully completed, PMM will restart mongod and pbm-agent") if err := s.runMongoPostRestore(t.Querier, job.Data.MongoDBRestoreBackup.ServiceID); err != nil { s.l.WithError(err).Error("failed to restart components after restore from a physical backup") diff --git a/managed/services/backup/removal_service.go b/managed/services/backup/removal_service.go index f6f35848f88..ae9824daea2 100644 --- a/managed/services/backup/removal_service.go +++ b/managed/services/backup/removal_service.go @@ -186,7 +186,7 @@ func (s *RemovalService) lockArtifact(artifactID string, lockingStatus models.Ba err error ) - errTx := s.db.InTransactionContext(s.db.Querier.Context(), &sql.TxOptions{Isolation: sql.LevelSerializable}, func(tx *reform.TX) error { + errTx := s.db.InTransactionContext(s.db.Context(), &sql.TxOptions{Isolation: sql.LevelSerializable}, func(tx *reform.TX) error { artifact, err = models.FindArtifactByID(tx.Querier, artifactID) if err != nil { return err diff --git a/managed/services/management/accesscontrol.go b/managed/services/management/accesscontrol.go index d0e5941543c..f149ee95ec9 100644 --- a/managed/services/management/accesscontrol.go +++ b/managed/services/management/accesscontrol.go @@ -128,7 +128,8 @@ func (acs *AccessControlService) DeleteRole(ctx context.Context, req *rolev1beta // GetRole retrieves a Role. func (acs *AccessControlService) GetRole(_ context.Context, req *rolev1beta1.GetRoleRequest) (*rolev1beta1.GetRoleResponse, error) { var role models.Role - if err := acs.db.Querier.FindByPrimaryKeyTo(&role, req.RoleId); err != nil { + err := acs.db.FindByPrimaryKeyTo(&role, req.RoleId) + if err != nil { if errors.As(err, &reform.ErrNoRows) { return nil, status.Errorf(codes.NotFound, "Role not found") } @@ -146,7 +147,7 @@ func (acs *AccessControlService) GetRole(_ context.Context, req *rolev1beta1.Get // ListRoles lists all Roles. func (acs *AccessControlService) ListRoles(_ context.Context, _ *rolev1beta1.ListRolesRequest) (*rolev1beta1.ListRolesResponse, error) { - rows, err := acs.db.Querier.SelectAllFrom(models.RoleTable, "") + rows, err := acs.db.SelectAllFrom(models.RoleTable, "") if err != nil { return nil, err } diff --git a/managed/services/management/accesscontrol_test.go b/managed/services/management/accesscontrol_test.go index dc8418dc357..2b4d94ddede 100644 --- a/managed/services/management/accesscontrol_test.go +++ b/managed/services/management/accesscontrol_test.go @@ -53,9 +53,9 @@ func TestAccessControlService(t *testing.T) { teardown := func(t *testing.T) { t.Helper() - _, err := db.Querier.DeleteFrom(models.RoleTable, "") + _, err := db.DeleteFrom(models.RoleTable, "") require.NoError(t, err) - _, err = db.Querier.DeleteFrom(models.UserDetailsTable, "") + _, err = db.DeleteFrom(models.UserDetailsTable, "") require.NoError(t, err) } diff --git a/managed/services/minio/client.go b/managed/services/minio/client.go index 037d6c84cb7..9ae6640036f 100644 --- a/managed/services/minio/client.go +++ b/managed/services/minio/client.go @@ -208,10 +208,7 @@ func createMinioClient(endpoint, accessKey, secretKey string) (*minio.Client, er return nil, err } - secure := true - if url.Scheme == "http" { - secure = false - } + secure := url.Scheme != "http" return minio.New(url.Host, &minio.Options{ Secure: secure, diff --git a/managed/services/scheduler/scheduler.go b/managed/services/scheduler/scheduler.go index 401445dc07c..b526eac2099 100644 --- a/managed/services/scheduler/scheduler.go +++ b/managed/services/scheduler/scheduler.go @@ -85,7 +85,7 @@ func (s *Service) Add(task Task, params AddParams) (*models.ScheduledTask, error var scheduledTask *models.ScheduledTask // This transaction is valid only with serializable isolation level. On lower isolation levels it can produce anomalies. - errTx := s.db.InTransactionContext(s.db.Querier.Context(), &sql.TxOptions{Isolation: sql.LevelSerializable}, func(tx *reform.TX) error { + errTx := s.db.InTransactionContext(s.db.Context(), &sql.TxOptions{Isolation: sql.LevelSerializable}, func(tx *reform.TX) error { var err error if err = checkAddPreconditions(tx.Querier, task.Data(), !params.Disabled, ""); err != nil { return err @@ -157,7 +157,7 @@ func (s *Service) Remove(id string) error { // Update changes scheduled task in DB and re-add it to scheduler. func (s *Service) Update(id string, params models.ChangeScheduledTaskParams) error { - return s.db.InTransactionContext(s.db.Querier.Context(), &sql.TxOptions{Isolation: sql.LevelSerializable}, func(tx *reform.TX) error { + return s.db.InTransactionContext(s.db.Context(), &sql.TxOptions{Isolation: sql.LevelSerializable}, func(tx *reform.TX) error { if err := checkUpdatePreconditions(tx.Querier, params.Data, !pointer.GetBool(params.Disable), id); err != nil { return err } From 20441b47741b1472f7a2c72c4f711d95279f835a Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Fri, 22 May 2026 16:19:23 +0300 Subject: [PATCH 14/23] fix noerrcheck linter warnings --- .../mongodb/mongolog/internal/monitor_test.go | 32 +++++++---- .../internal/collector/collector_test.go | 53 +++++++++++++++---- .../profiler/internal/profiler_test.go | 41 ++++++++++---- .../fingerprinter/fingerprinter_test.go | 37 ++++++++----- agent/agents/mongodb/shared/sender/sender.go | 1 - .../mysql/perfschema/perfschema_test.go | 4 +- agent/agents/mysql/slowlog/slowlog_test.go | 4 +- .../pgstatmonitor/pgstatmonitor_test.go | 4 +- .../pgstatmonitor/stat_monitor_cache_test.go | 5 +- .../pgstatstatements/pgstatstatements_test.go | 8 ++- .../agents/supervisor/ports_registry_test.go | 15 ++++-- agent/main_test.go | 14 +++-- .../actions/mongodb_explain_action_test.go | 12 +++-- .../actions/mysql_explain_action_test.go | 10 ++-- .../actions/mysql_query_select_action_test.go | 4 +- .../actions/mysql_query_show_action_test.go | 4 +- .../mysql_show_create_table_action_test.go | 4 +- .../actions/mysql_show_index_action_test.go | 4 +- .../mysql_show_table_status_action_test.go | 4 +- .../postgresql_query_select_action_test.go | 4 +- .../postgresql_query_show_action_test.go | 4 +- ...ostgresql_show_create_table_action_test.go | 4 +- .../postgresql_show_index_action_test.go | 4 +- agent/utils/version/mysql_test.go | 4 +- api-tests/server/auth_test.go | 48 ++++++++++++----- api-tests/server/readyz_test.go | 5 +- api-tests/server/serialization_test.go | 4 +- api-tests/server/settings/settings_test.go | 8 ++- api-tests/server/version_test.go | 4 +- managed/cmd/pmm-managed/main_test.go | 9 ++-- managed/models/database_test.go | 4 +- managed/models/dump_helpers_test.go | 4 +- managed/models/job_helpers_test.go | 4 +- managed/models/postgresql_version_test.go | 4 +- .../agents/connection_checker_test.go | 8 ++- managed/services/agents/handler_test.go | 20 +++++-- .../encryption/encryption_rotation_test.go | 5 +- .../inventory/inventory_metrics_test.go | 4 +- .../add_service_exporter_timeout_test.go | 4 +- managed/services/management/rds_test.go | 4 +- managed/services/server/logs_test.go | 18 ++++--- managed/utils/dir/dir_test.go | 6 ++- version/release_test.go | 12 ++--- vmproxy/proxy/proxy_test.go | 8 ++- 44 files changed, 335 insertions(+), 128 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index 1fe64e188be..5ad12411b19 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -32,6 +32,7 @@ import ( "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" @@ -63,9 +64,9 @@ func TestCollector(t *testing.T) { file, err := os.Create(destination) //nolint:gosec require.NoError(t, err) - file.Close() //nolint:errcheck + require.NoError(t, file.Close()) t.Cleanup(func() { - os.Remove(destination) //nolint:errcheck + assert.NoError(t, os.Remove(destination)) }) reader, err := filereader.NewContinuousFileReader(destination, l) @@ -87,12 +88,11 @@ func TestCollector(t *testing.T) { go readSourceWriteDestination(ctx, t, errChan, fmt.Sprintf("./testdata/logs/%s.log", test), destination, delay) var wg sync.WaitGroup - wg.Add(2) + wg.Add(1) monitor.Start(ctx, docsChan, doneChan, &wg) var data []proto.SystemProfile - go func() { - defer wg.Done() + wg.Go(func() { for { select { case <-ctx.Done(): @@ -106,7 +106,7 @@ func TestCollector(t *testing.T) { data = append(data, row) } } - }() + }) err = <-errChan require.NoError(t, err) @@ -120,7 +120,8 @@ func TestCollector(t *testing.T) { expectedFile := fmt.Sprintf("./testdata/expected/%s", test) if os.Getenv("REFRESH_TEST_DATA") != "" { - writeData(t, data, expectedFile) + err = writeData(t, data, expectedFile) + require.NoError(t, err) return } @@ -218,7 +219,9 @@ func writeData(t *testing.T, data []proto.SystemProfile, name string) error { if err != nil { return err } - defer file.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, file.Close()) + }) jsonData, err := dataToJSON(t, data) if err != nil { @@ -239,7 +242,9 @@ func readData(t *testing.T, name string) ([]proto.SystemProfile, error) { if err != nil { return nil, err } - defer file.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, file.Close()) + }) var data []proto.SystemProfile err = json.NewDecoder(file).Decode(&data) @@ -258,6 +263,10 @@ func readSourceWriteDestination(ctx context.Context, t *testing.T, errChan chan errChan <- err return } + defer func() { + assert.NoError(t, srcFile.Close()) + }() + scanner := bufio.NewScanner(srcFile) var lines []string for scanner.Scan() { @@ -273,14 +282,15 @@ func readSourceWriteDestination(ctx context.Context, t *testing.T, errChan chan errChan <- err return } - srcFile.Close() //nolint:errcheck dstFile, err := os.Create(destination) //nolint:gosec if err != nil { errChan <- err return } - defer dstFile.Close() //nolint:errcheck + defer func() { + assert.NoError(t, dstFile.Close()) + }() writer := bufio.NewWriter(dstFile) for _, line := range lines { diff --git a/agent/agents/mongodb/profiler/internal/collector/collector_test.go b/agent/agents/mongodb/profiler/internal/collector/collector_test.go index 6c3584e00f2..496bd2ec319 100644 --- a/agent/agents/mongodb/profiler/internal/collector/collector_test.go +++ b/agent/agents/mongodb/profiler/internal/collector/collector_test.go @@ -55,7 +55,7 @@ func BenchmarkCollector(b *testing.B) { timeout := time.Millisecond*time.Duration(maxDocs*maxLoops) + cursorTimeout*time.Duration(maxLoops*2) + time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := context.WithTimeout(b.Context(), timeout) defer cancel() url := "mongodb://root:root-password@127.0.0.1:27017" @@ -64,14 +64,29 @@ func BenchmarkCollector(b *testing.B) { client, err := createSession(url, "pmm-agent") if err != nil { + b.Fatal(err) return } - cleanUpDBs(b, client) // Just in case there are old dbs with matching names - defer cleanUpDBs(b, client) + // Just in case there are old dbs with matching names + err = cleanUpDBs(b, client) + if err != nil { + b.Fatal(err) + return + } + defer func() { + err = cleanUpDBs(b, client) + if err != nil { + return + } + }() - ps := ProfilerStatus{} + var ps ProfilerStatus err = client.Database("admin").RunCommand(ctx, primitive.M{"profile": -1}).Decode(&ps) + if err != nil { + b.Fatal(err) + return + } defer func() { // restore profiler status client.Database("admin").RunCommand(ctx, primitive.D{{"profile", ps.Was}, {"slowms", ps.SlowMs}}) }() @@ -79,6 +94,7 @@ func BenchmarkCollector(b *testing.B) { // Enable profilling all queries (2, slowms = 0) res := client.Database("admin").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}}) if res.Err() != nil { + b.Fatal(err) return } @@ -120,18 +136,27 @@ func TestCollector(t *testing.T) { // cursorTimeout*time.Duration(maxLoops*2): Wait time between loops to produce iter.TryNext to return a false timeout := time.Millisecond*time.Duration(maxDocs*maxLoops) + cursorTimeout*time.Duration(maxLoops*2) + 5*time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := context.WithTimeout(t.Context(), timeout) defer cancel() client, err := createSession(url, "pmm-agent") require.NoError(t, err) - cleanUpDBs(t, client) // Just in case there are old dbs with matching names - defer cleanUpDBs(t, client) + require.NoError(t, cleanUpDBs(t, client)) // Just in case there are old dbs with matching names + defer func() { + err = cleanUpDBs(t, client) + if err != nil { + return + } + }() // It's done create DB before the test. doc := bson.M{} - client.Database("test_collector").Collection("test").InsertOne(context.TODO(), doc) + _, err = client.Database("test_collector").Collection("test").InsertOne(t.Context(), doc) + if err != nil { + t.Fatal(err) + return + } <-time.After(time.Second) ctr := New(client, "test_collector", logrus.WithField("component", "collector-test")) @@ -139,6 +164,10 @@ func TestCollector(t *testing.T) { // Start the collector var profiles []proto.SystemProfile docsChan, err := ctr.Start(ctx) + if err != nil { + t.Fatal(err) + return + } wg := &sync.WaitGroup{} wg.Add(1) <-time.After(time.Second) @@ -220,13 +249,17 @@ func createSession(dsn string, agentID string) (*mongo.Client, error) { func cleanUpDBs[T testing.TB](t T, sess *mongo.Client) error { t.Helper() - dbs, err := sess.ListDatabaseNames(context.TODO(), bson.M{}) + dbs, err := sess.ListDatabaseNames(t.Context(), bson.M{}) if err != nil { return err } for _, dbname := range dbs { if strings.HasPrefix(dbname, "test_") { - err = sess.Database(dbname).Drop(context.TODO()) + err = sess.Database(dbname).Drop(t.Context()) + if err != nil { + t.Logf("failed to drop database %q: %v", dbname, err) + continue + } } } return nil diff --git a/agent/agents/mongodb/profiler/internal/profiler_test.go b/agent/agents/mongodb/profiler/internal/profiler_test.go index ea5d9844e1c..3c255fd543e 100644 --- a/agent/agents/mongodb/profiler/internal/profiler_test.go +++ b/agent/agents/mongodb/profiler/internal/profiler_test.go @@ -77,7 +77,9 @@ func testProfiler(t *testing.T, url string) { sess, err := createSession(url, "pmm-agent") require.NoError(t, err) - cleanUpDBs(t, sess) // Just in case there are old dbs with matching names + // Just in case there are old dbs with matching names + err = cleanUpDBs(t, sess) + require.NoError(t, err) dbsCount := 10 docsCount := float32(10) @@ -90,7 +92,7 @@ func testProfiler(t *testing.T, url string) { doc := bson.M{"id": i} dbName := fmt.Sprintf("test_%02d", i) logrus.Traceln("create db", dbName) - _, err := sess.Database(dbName).Collection("test").InsertOne(context.TODO(), doc) + _, err = sess.Database(dbName).Collection("test").InsertOne(t.Context(), doc) require.NoError(t, err) i++ } @@ -102,8 +104,11 @@ func testProfiler(t *testing.T, url string) { } prof := New(url, logrus.WithField("component", "profiler-test"), ms, "test-id", truncate.GetMongoDBDefaultMaxQueryLength()) err = prof.Start() - defer prof.Stop() require.NoError(t, err) + defer func() { + err = prof.Stop() + require.NoError(t, err) + }() <-time.After(aggregator.DefaultInterval * 2) // give it some time to start profiler i = 0 @@ -117,20 +122,26 @@ func testProfiler(t *testing.T, url string) { } dbName := fmt.Sprintf("test_%02d", dbNumber) logrus.Tracef("inserting value %d to %s", i, dbName) - _, err := sess.Database(dbName).Collection("people").InsertOne(context.TODO(), doc) + _, err = sess.Database(dbName).Collection("people").InsertOne(t.Context(), doc) require.NoError(t, err) i++ } - cursor, err := sess.Database("test_00").Collection("people").Find(context.TODO(), bson.M{"name_00\xff": "value_00\xff"}) + cursor, err := sess.Database("test_00").Collection("people").Find(t.Context(), bson.M{"name_00\xff": "value_00\xff"}) require.NoError(t, err) - defer cursor.Close(context.TODO()) + defer func() { + err = cursor.Close(t.Context()) + require.NoError(t, err) + }() <-time.After(aggregator.DefaultInterval * 6) // give it some time to catch all metrics err = prof.Stop() require.NoError(t, err) - defer cleanUpDBs(t, sess) + defer func() { + err = cleanUpDBs(t, sess) + require.NoError(t, err) + }() require.GreaterOrEqual(t, len(ms.reports), 1) @@ -196,14 +207,22 @@ func testProfiler(t *testing.T, url string) { assert.InDelta(t, docsCount, findBucket.Mongodb.MDocsReturnedSum, 0.0001) } -func cleanUpDBs(t *testing.T, sess *mongo.Client) { - dbs, err := sess.ListDatabaseNames(context.TODO(), bson.M{}) +func cleanUpDBs[T testing.TB](t T, sess *mongo.Client) error { + t.Helper() + dbs, err := sess.ListDatabaseNames(t.Context(), bson.M{}) + if err != nil { + return err + } for _, dbname := range dbs { if strings.HasPrefix(dbname, "test_") { - err = sess.Database(dbname).Drop(context.TODO()) - require.NoError(t, err) + err = sess.Database(dbname).Drop(t.Context()) + if err != nil { + t.Logf("failed to drop database %q: %v", dbname, err) + continue + } } } + return nil } type testWriter struct { diff --git a/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go index 31b5e369c29..2e8b66f24a9 100644 --- a/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go +++ b/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go @@ -91,26 +91,27 @@ func TestProfilerFingerprinter(t *testing.T) { dbName := "test_fingerprint" client, err := createSession(url, "pmm-agent") - if err != nil { - return - } + require.NoError(t, err) ctx, cancel := context.WithTimeout(t.Context(), mgoTimeoutSessionSync) defer cancel() - _ = client.Database(dbName).Drop(ctx) - defer client.Database(dbName).Drop(context.TODO()) //nolint:errcheck + err = client.Database(dbName).Drop(ctx) + require.NoError(t, err) + defer func() { + err = client.Database(dbName).Drop(t.Context()) + require.NoError(t, err) + }() ps := ProfilerStatus{} err = client.Database("admin").RunCommand(ctx, primitive.M{"profile": -1}).Decode(&ps) + require.NoError(t, err) defer func() { // restore profiler status client.Database("admin").RunCommand(ctx, primitive.D{{"profile", ps.Was}, {"slowms", ps.SlowMs}}) }() // Enable profilling all queries (2, slowms = 0) res := client.Database("admin").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}}) - if res.Err() != nil { - return - } + require.NoError(t, res.Err()) database := client.Database(dbName) _, err = database.Collection("test").InsertOne(ctx, bson.M{"id": 0, "name": "test", "value": 1, "time": time.Now()}) @@ -121,8 +122,9 @@ func TestProfilerFingerprinter(t *testing.T) { database.Collection("test").FindOne(ctx, bson.M{"id": 1, "name": "test", "time": time.Now()}) database.Collection("test").FindOneAndUpdate(ctx, bson.M{"id": 0}, bson.M{"$set": bson.M{"name": "new"}}) database.Collection("test").FindOneAndDelete(ctx, bson.M{"id": 1}) - database.Collection("secondcollection").Find(ctx, bson.M{"name": "sec"}, options.Find().SetLimit(1).SetSort(bson.M{"id": -1})) //nolint:errcheck - database.Collection("test").Aggregate( + _, err = database.Collection("secondcollection").Find(ctx, bson.M{"name": "sec"}, options.Find().SetLimit(1).SetSort(bson.M{"id": -1})) + require.NoError(t, err) + _, err = database.Collection("test").Aggregate( ctx, []bson.M{ { @@ -136,7 +138,8 @@ func TestProfilerFingerprinter(t *testing.T) { }, }, ) - database.Collection("secondcollection").Aggregate(ctx, mongo.Pipeline{ //nolint:errcheck + require.NoError(t, err) + _, err = database.Collection("secondcollection").Aggregate(ctx, mongo.Pipeline{ bson.D{ { Key: "$collStats", @@ -156,15 +159,21 @@ func TestProfilerFingerprinter(t *testing.T) { }, }, }) - database.Collection("secondcollection").DeleteOne(ctx, bson.M{"id": 0}) //nolint:errcheck - database.Collection("test").DeleteMany(ctx, bson.M{"name": "test"}) //nolint:errcheck + require.NoError(t, err) + _, err = database.Collection("secondcollection").DeleteOne(ctx, bson.M{"id": 0}) + require.NoError(t, err) + _, err = database.Collection("test").DeleteMany(ctx, bson.M{"name": "test"}) + require.NoError(t, err) profilerCollection := database.Collection("system.profile") query := createQuery(dbName, time.Now().Add(-10*time.Minute)) cursor, err := createIterator(ctx, profilerCollection, query) require.NoError(t, err) // do not cancel cursor closing when ctx is canceled - defer cursor.Close(context.Background()) //nolint:errcheck + defer func() { + err = cursor.Close(t.Context()) + require.NoError(t, err) + }() pf := &ProfilerFingerprinter{} diff --git a/agent/agents/mongodb/shared/sender/sender.go b/agent/agents/mongodb/shared/sender/sender.go index 0f96fb23e34..be316c53b32 100644 --- a/agent/agents/mongodb/shared/sender/sender.go +++ b/agent/agents/mongodb/shared/sender/sender.go @@ -88,7 +88,6 @@ func (s *Sender) Stop() { // wait for goroutines to exit s.wg.Wait() - return } func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Report, w Writer, logger *logrus.Entry, doneChan <-chan struct{}) { diff --git a/agent/agents/mysql/perfschema/perfschema_test.go b/agent/agents/mysql/perfschema/perfschema_test.go index 94d8b068119..1f6fb143bee 100644 --- a/agent/agents/mysql/perfschema/perfschema_test.go +++ b/agent/agents/mysql/perfschema/perfschema_test.go @@ -266,7 +266,9 @@ func prepareDBCopy(t *testing.T, db *reform.DB) { func TestPerfSchema(t *testing.T) { sqlDB := tests.OpenTestMySQL(t) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, mysql.Dialect, reform.NewPrintfLogger(t.Logf)) updateQuery := fmt.Sprintf("UPDATE /* %s */ ", queryTag) diff --git a/agent/agents/mysql/slowlog/slowlog_test.go b/agent/agents/mysql/slowlog/slowlog_test.go index 8807acd2814..c1e264cb475 100644 --- a/agent/agents/mysql/slowlog/slowlog_test.go +++ b/agent/agents/mysql/slowlog/slowlog_test.go @@ -117,7 +117,9 @@ func TestSlowLogMakeBuckets(t *testing.T) { func TestSlowLog(t *testing.T) { t.Parallel() sqlDB := tests.OpenTestMySQL(t) - t.Cleanup(func() { sqlDB.Close() }) //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) q := reform.NewDB(sqlDB, mysql.Dialect, reform.NewPrintfLogger(t.Logf)).WithTag(queryTag) ctx := context.Background() diff --git a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go index ca426881b37..80f613db584 100644 --- a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go +++ b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go @@ -98,7 +98,9 @@ func TestVersion(t *testing.T) { func TestPGStatMonitorSchema(t *testing.T) { t.Skip("Skip it until the sandbox supports pg_stat_monitor by default. The current PostgreSQL image is the official, not the one from PerconaLab") sqlDB := tests.OpenTestPostgreSQL(t) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) majorVersion, _ := tests.PostgreSQLVersion(t, sqlDB) diff --git a/agent/agents/postgres/pgstatmonitor/stat_monitor_cache_test.go b/agent/agents/postgres/pgstatmonitor/stat_monitor_cache_test.go index 6e3246a4257..04c4a4df34f 100644 --- a/agent/agents/postgres/pgstatmonitor/stat_monitor_cache_test.go +++ b/agent/agents/postgres/pgstatmonitor/stat_monitor_cache_test.go @@ -18,6 +18,7 @@ import ( "context" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "gopkg.in/reform.v1" "gopkg.in/reform.v1/dialects/postgresql" @@ -28,7 +29,9 @@ import ( func TestPGStatMonitorStructs(t *testing.T) { sqlDB := tests.OpenTestPostgreSQL(t) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) majorVersion, _ := tests.PostgreSQLVersion(t, sqlDB) diff --git a/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go b/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go index b07bc059a7d..c767eb5b989 100644 --- a/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go +++ b/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go @@ -67,7 +67,9 @@ func filter(mb []*agentv1.MetricsBucket) []*agentv1.MetricsBucket { func TestPGStatStatementsQAN(t *testing.T) { sqlDB := tests.OpenTestPostgreSQL(t) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) _, err := db.Exec("CREATE EXTENSION IF NOT EXISTS pg_stat_statements SCHEMA public") @@ -478,7 +480,9 @@ func TestPGStatStatementsQAN(t *testing.T) { func TestPGStatStatementsQPS(t *testing.T) { sqlDB := tests.OpenTestPostgreSQL(t) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, postgresql.Dialect, nil) _, err := db.Exec("CREATE EXTENSION IF NOT EXISTS pg_stat_statements SCHEMA public") diff --git a/agent/agents/supervisor/ports_registry_test.go b/agent/agents/supervisor/ports_registry_test.go index d15cc70a9c9..eb6bda7a4f7 100644 --- a/agent/agents/supervisor/ports_registry_test.go +++ b/agent/agents/supervisor/ports_registry_test.go @@ -15,6 +15,7 @@ package supervisor import ( + "errors" "net" "testing" @@ -27,7 +28,10 @@ func TestRegistry(t *testing.T) { r := newPortsRegistry(65000, 65002, []uint16{65000}) l1, err := net.Listen("tcp", "127.0.0.1:65001") require.NoError(t, err) - defer l1.Close() //nolint:gosec,errcheck,nolintlint + t.Cleanup(func() { + err, _ = errors.AsType[*net.OpError](l1.Close()) + require.Error(t, err) + }) p, err := r.Reserve() require.NoError(t, err) @@ -37,7 +41,10 @@ func TestRegistry(t *testing.T) { l2, err := net.Listen("tcp", "127.0.0.1:65002") require.NoError(t, err) - defer l2.Close() //nolint:errcheck,gosec,nolintlint + t.Cleanup(func() { + err, _ = errors.AsType[*net.OpError](l2.Close()) + require.Error(t, err) + }) err = r.Release(65000) require.NoError(t, err) @@ -46,8 +53,8 @@ func TestRegistry(t *testing.T) { err = r.Release(65002) assert.Equal(t, errPortBusy, err) - l1.Close() //nolint:errcheck - l2.Close() //nolint:errcheck + require.NoError(t, l1.Close()) + require.NoError(t, l2.Close()) p, err = r.Reserve() require.NoError(t, err) diff --git a/agent/main_test.go b/agent/main_test.go index 801d561dfc6..1af0ac0127e 100644 --- a/agent/main_test.go +++ b/agent/main_test.go @@ -21,6 +21,7 @@ import ( "strings" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/tools/go/packages" ) @@ -210,7 +211,9 @@ func TestImports(t *testing.T) { f, err := os.Create("packages.dot") require.NoError(t, err) - defer func() { require.NoError(t, f.Close()) }() + t.Cleanup(func() { + assert.NoError(t, f.Close()) + }) var lines []string for _, p := range allPkgs { @@ -230,15 +233,18 @@ func TestImports(t *testing.T) { } sort.Strings(lines) - fmt.Fprintf(f, "digraph packages {\n") + _, err = fmt.Fprintf(f, "digraph packages {\n") + require.NoError(t, err) duplicate := make(map[string]struct{}) for _, line := range lines { if _, ok := duplicate[line]; !ok { duplicate[line] = struct{}{} - fmt.Fprint(f, line) //nolint:errcheck + _, err = fmt.Fprint(f, line) + require.NoError(t, err) } } - fmt.Fprintf(f, "}\n") + _, err = fmt.Fprintf(f, "}\n") + require.NoError(t, err) } func formatPkgName(t *testing.T, name string) string { diff --git a/agent/runner/actions/mongodb_explain_action_test.go b/agent/runner/actions/mongodb_explain_action_test.go index 3356590c928..72ba88ae86e 100644 --- a/agent/runner/actions/mongodb_explain_action_test.go +++ b/agent/runner/actions/mongodb_explain_action_test.go @@ -43,8 +43,8 @@ func TestQueryExplain(t *testing.T) { dsn := tests.GetTestMongoDBDSN(t) client := tests.OpenTestMongoDB(t, dsn) t.Cleanup(func() { - defer client.Disconnect(ctx) //nolint:errcheck - defer client.Database(database).Drop(ctx) //nolint:errcheck + assert.Error(t, client.Disconnect(ctx)) + assert.Error(t, client.Database(database).Drop(ctx)) }) t.Run("Find", func(t *testing.T) { @@ -259,7 +259,9 @@ func TestMongoDBExplain(t *testing.T) { dsn := tests.GetTestMongoDBDSN(t) client := tests.OpenTestMongoDB(t, dsn) - defer client.Database(database).Drop(ctx) //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, client.Database(database).Drop(ctx)) + }) err := prepareData(ctx, client, database, collection) require.NoError(t, err) @@ -327,7 +329,9 @@ func TestNewMongoDBExplain(t *testing.T) { dsn := tests.GetTestMongoDBDSN(t) client := tests.OpenTestMongoDB(t, dsn) - defer client.Database(database).Drop(ctx) //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, client.Database(database).Drop(ctx)) + }) _, err := client.Database(database).Collection("people").InsertOne(ctx, bson.M{"last_name": "Brannigan", "first_name": "Zapp"}) require.NoError(t, err) diff --git a/agent/runner/actions/mysql_explain_action_test.go b/agent/runner/actions/mysql_explain_action_test.go index 0d2261e2094..e15c7d2e57c 100644 --- a/agent/runner/actions/mysql_explain_action_test.go +++ b/agent/runner/actions/mysql_explain_action_test.go @@ -38,7 +38,9 @@ func TestMySQLExplain(t *testing.T) { dsn := tests.GetTestMySQLDSN(t) sqlDB := tests.OpenTestMySQL(t) - t.Cleanup(func() { sqlDB.Close() }) //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) q := reform.NewDB(sqlDB, mysql.Dialect, reform.NewPrintfLogger(t.Logf)).WithTag(queryTag) ctx := context.Background() @@ -303,11 +305,13 @@ func TestMySQLExplain(t *testing.T) { // setup func(t *testing.T) { t.Helper() - ctx, cancel := context.WithTimeout(context.Background(), time.Second*2) + ctx, cancel := context.WithTimeout(t.Context(), time.Second*2) defer cancel() conn, err := sqlDB.Conn(ctx) require.NoError(t, err) - defer conn.Close() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, conn.Close()) + }) _, err = conn.ExecContext(ctx, "DROP TABLE IF EXISTS test_explain_table") require.NoError(t, err) diff --git a/agent/runner/actions/mysql_query_select_action_test.go b/agent/runner/actions/mysql_query_select_action_test.go index 1617c1da991..354a44b3f47 100644 --- a/agent/runner/actions/mysql_query_select_action_test.go +++ b/agent/runner/actions/mysql_query_select_action_test.go @@ -32,7 +32,9 @@ func TestMySQLQuerySelect(t *testing.T) { dsn := tests.GetTestMySQLDSN(t) db := tests.OpenTestMySQL(t) - t.Cleanup(func() { db.Close() }) //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, db.Close()) + }) t.Run("Default", func(t *testing.T) { t.Parallel() diff --git a/agent/runner/actions/mysql_query_show_action_test.go b/agent/runner/actions/mysql_query_show_action_test.go index 3c6c73fca33..a9f879b1481 100644 --- a/agent/runner/actions/mysql_query_show_action_test.go +++ b/agent/runner/actions/mysql_query_show_action_test.go @@ -32,7 +32,9 @@ func TestMySQLQueryShow(t *testing.T) { dsn := tests.GetTestMySQLDSN(t) db := tests.OpenTestMySQL(t) - t.Cleanup(func() { db.Close() }) //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, db.Close()) + }) t.Run("Default", func(t *testing.T) { t.Parallel() diff --git a/agent/runner/actions/mysql_show_create_table_action_test.go b/agent/runner/actions/mysql_show_create_table_action_test.go index 2bad8c77557..4e8b036bdfc 100644 --- a/agent/runner/actions/mysql_show_create_table_action_test.go +++ b/agent/runner/actions/mysql_show_create_table_action_test.go @@ -35,7 +35,9 @@ func TestMySQLShowCreateTable(t *testing.T) { dsn := tests.GetTestMySQLDSN(t) sqlDB := tests.OpenTestMySQL(t) - t.Cleanup(func() { sqlDB.Close() }) //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) q := reform.NewDB(sqlDB, mysql.Dialect, reform.NewPrintfLogger(t.Logf)).WithTag(queryTag) ctx := context.Background() diff --git a/agent/runner/actions/mysql_show_index_action_test.go b/agent/runner/actions/mysql_show_index_action_test.go index 0b25e49d202..7bd8edd4264 100644 --- a/agent/runner/actions/mysql_show_index_action_test.go +++ b/agent/runner/actions/mysql_show_index_action_test.go @@ -35,7 +35,9 @@ func TestMySQLShowIndex(t *testing.T) { dsn := tests.GetTestMySQLDSN(t) sqlDB := tests.OpenTestMySQL(t) - t.Cleanup(func() { sqlDB.Close() }) //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) q := reform.NewDB(sqlDB, mysql.Dialect, reform.NewPrintfLogger(t.Logf)).WithTag(queryTag) ctx := context.Background() diff --git a/agent/runner/actions/mysql_show_table_status_action_test.go b/agent/runner/actions/mysql_show_table_status_action_test.go index 0a6a26757fd..463a1b26436 100644 --- a/agent/runner/actions/mysql_show_table_status_action_test.go +++ b/agent/runner/actions/mysql_show_table_status_action_test.go @@ -32,7 +32,9 @@ func TestShowTableStatus(t *testing.T) { dsn := tests.GetTestMySQLDSN(t) db := tests.OpenTestMySQL(t) - t.Cleanup(func() { db.Close() }) //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, db.Close()) + }) t.Run("Default", func(t *testing.T) { t.Parallel() diff --git a/agent/runner/actions/postgresql_query_select_action_test.go b/agent/runner/actions/postgresql_query_select_action_test.go index e5341c43bb4..f7c5928f1d7 100644 --- a/agent/runner/actions/postgresql_query_select_action_test.go +++ b/agent/runner/actions/postgresql_query_select_action_test.go @@ -33,7 +33,9 @@ func TestPostgreSQLQuerySelect(t *testing.T) { dsn := tests.GetTestPostgreSQLDSN(t) db := tests.OpenTestPostgreSQL(t) - t.Cleanup(func() { db.Close() }) //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, db.Close()) + }) t.Run("Default", func(t *testing.T) { t.Parallel() diff --git a/agent/runner/actions/postgresql_query_show_action_test.go b/agent/runner/actions/postgresql_query_show_action_test.go index 1b5ce7ba248..7c147a6b0a4 100644 --- a/agent/runner/actions/postgresql_query_show_action_test.go +++ b/agent/runner/actions/postgresql_query_show_action_test.go @@ -33,7 +33,9 @@ func TestPostgreSQLQueryShow(t *testing.T) { dsn := tests.GetTestPostgreSQLDSN(t) db := tests.OpenTestPostgreSQL(t) - t.Cleanup(func() { db.Close() }) //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, db.Close()) + }) t.Run("Default", func(t *testing.T) { t.Parallel() diff --git a/agent/runner/actions/postgresql_show_create_table_action_test.go b/agent/runner/actions/postgresql_show_create_table_action_test.go index 5e7cf50744e..e68f1ee154b 100644 --- a/agent/runner/actions/postgresql_show_create_table_action_test.go +++ b/agent/runner/actions/postgresql_show_create_table_action_test.go @@ -32,7 +32,9 @@ func TestPostgreSQLShowCreateTable(t *testing.T) { dsn := tests.GetTestPostgreSQLDSN(t) db := tests.OpenTestPostgreSQL(t) - t.Cleanup(func() { db.Close() }) //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, db.Close()) + }) t.Run("With Schema Name", func(t *testing.T) { t.Parallel() diff --git a/agent/runner/actions/postgresql_show_index_action_test.go b/agent/runner/actions/postgresql_show_index_action_test.go index 3d497dc7d33..00e7f2cebfe 100644 --- a/agent/runner/actions/postgresql_show_index_action_test.go +++ b/agent/runner/actions/postgresql_show_index_action_test.go @@ -33,7 +33,9 @@ func TestPostgreSQLShowIndex(t *testing.T) { dsn := tests.GetTestPostgreSQLDSN(t) db := tests.OpenTestPostgreSQL(t) - t.Cleanup(func() { db.Close() }) //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, db.Close()) + }) t.Run("Default", func(t *testing.T) { t.Parallel() diff --git a/agent/utils/version/mysql_test.go b/agent/utils/version/mysql_test.go index ce3accceaa5..364cf06e9e3 100644 --- a/agent/utils/version/mysql_test.go +++ b/agent/utils/version/mysql_test.go @@ -31,7 +31,9 @@ func TestGetMySQLVersion(t *testing.T) { t.Log("error creating mock database") return } - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) q := reform.NewDB(sqlDB, mysql.Dialect, reform.NewPrintfLogger(t.Logf)).WithTag("pmm-agent:mysqlversion") ctx := context.Background() diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index d8631eba12b..7ec217fad68 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -68,7 +68,9 @@ func TestAuth(t *testing.T) { req, _ := http.NewRequestWithContext(pmmapitests.Context, http.MethodGet, uri.String(), nil) resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + t.Cleanup(func() { + assert.NoError(t, resp.Body.Close()) + }) b, err := httputil.DumpResponse(resp, true) require.NoError(t, err) @@ -126,7 +128,9 @@ func TestSwagger(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, resp.Body.Close()) + }) assert.Equal(t, 401, resp.StatusCode) }) @@ -154,7 +158,9 @@ func TestSwagger(t *testing.T) { resp, err := client.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, resp.Body.Close()) + }) assert.Equal(t, 200, resp.StatusCode) }) @@ -167,7 +173,9 @@ func doRequest(tb testing.TB, client *http.Client, req *http.Request) (*http.Res resp, err := client.Do(req) require.NoError(tb, err) - defer resp.Body.Close() //nolint:errcheck + tb.Cleanup(func() { + assert.Error(tb, resp.Body.Close()) + }) b, err := io.ReadAll(resp.Body) require.NoError(tb, err) @@ -231,7 +239,9 @@ func TestBasicAuthPermissions(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + t.Cleanup(func() { + assert.NoError(t, resp.Body.Close()) + }) assert.Equal(t, user.statusCode, resp.StatusCode) }) @@ -378,7 +388,9 @@ func TestServiceAccountPermissions(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, resp.Body.Close()) + }) assert.Equal(t, user.statusCode, resp.StatusCode) }) @@ -394,7 +406,9 @@ func TestServiceAccountPermissions(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, resp.Body.Close()) + }) assert.Equal(t, user.statusCode, resp.StatusCode) }) @@ -422,7 +436,9 @@ func createServiceAccountWithRole(t *testing.T, role, nodeName string) int { req.Header.Set("Content-Type", "application/json; charset=utf-8") resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, resp.Body.Close()) + }) require.Equalf(t, http.StatusCreated, resp.StatusCode, "failed to create Service account, status code: %d, response: %s", resp.StatusCode, b) @@ -443,7 +459,9 @@ func createServiceAccountWithRole(t *testing.T, role, nodeName string) int { req.Header.Set("Content-Type", "application/json; charset=utf-8") resp1, b := doRequest(t, http.DefaultClient, req) - defer resp1.Body.Close() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, resp1.Body.Close()) + }) require.Equalf(t, http.StatusCreated, resp.StatusCode, "failed to set orgId=1 to Service account, status code: %d, response: %s", resp.StatusCode, b) @@ -460,7 +478,9 @@ func deleteServiceAccount(t *testing.T, serviceAccountID int) { require.NoError(t, err) resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + t.Cleanup(func() { + assert.Error(t, resp.Body.Close()) + }) require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete service account, status code: %d, response: %s", resp.StatusCode, b) } @@ -483,7 +503,9 @@ func createServiceToken(t *testing.T, serviceAccountID int, nodeName string) (in req.Header.Set("Content-Type", "application/json; charset=utf-8") resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + t.Cleanup(func() { + assert.Error(t, resp.Body.Close()) + }) require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to create Service account, status code: %d, response: %s", resp.StatusCode, b) @@ -504,7 +526,9 @@ func deleteServiceToken(t *testing.T, serviceAccountID, serviceTokenID int) { require.NoError(t, err) resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, resp.Body.Close()) + }) require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete service token, status code: %d, response: %s", resp.StatusCode, b) } diff --git a/api-tests/server/readyz_test.go b/api-tests/server/readyz_test.go index 10d49d22286..19d6104bdb8 100644 --- a/api-tests/server/readyz_test.go +++ b/api-tests/server/readyz_test.go @@ -22,6 +22,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" pmmapitests "github.com/percona/pmm/api-tests" @@ -57,7 +58,9 @@ func TestReadyz(t *testing.T) { if err != nil { return false } - defer resp.Body.Close() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, resp.Body.Close()) + }) b, err := io.ReadAll(resp.Body) if err != nil { diff --git a/api-tests/server/serialization_test.go b/api-tests/server/serialization_test.go index 4afd8264c6d..0cd43184a1b 100644 --- a/api-tests/server/serialization_test.go +++ b/api-tests/server/serialization_test.go @@ -50,7 +50,9 @@ func TestSerialization(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, resp.Body.Close()) + }) b, err := io.ReadAll(resp.Body) require.NoError(t, err) diff --git a/api-tests/server/settings/settings_test.go b/api-tests/server/settings/settings_test.go index e4ef24f9cb3..3af7d4c336b 100644 --- a/api-tests/server/settings/settings_test.go +++ b/api-tests/server/settings/settings_test.go @@ -732,7 +732,9 @@ func TestSettings(t *testing.T) { } b, err = io.ReadAll(resp.Body) require.NoError(t, err) - resp.Body.Close() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, resp.Body.Close()) + }) if get == "" { require.Equal(t, 400, resp.StatusCode, "response:\n%s", b) @@ -766,7 +768,9 @@ func TestSettings(t *testing.T) { } b, err = io.ReadAll(resp.Body) require.NoError(t, err) - resp.Body.Close() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, resp.Body.Close()) + }) assert.Equal(t, 200, resp.StatusCode, "response:\n%s", b) p.Settings.MetricsResolutions.LR = "" diff --git a/api-tests/server/version_test.go b/api-tests/server/version_test.go index 8413391697d..5f092d4cbc8 100644 --- a/api-tests/server/version_test.go +++ b/api-tests/server/version_test.go @@ -48,7 +48,9 @@ func TestVersion(t *testing.T) { req, _ := http.NewRequestWithContext(pmmapitests.Context, http.MethodGet, uri.String(), nil) resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + t.Cleanup(func() { + assert.NoError(t, resp.Body.Close()) + }) b, err := io.ReadAll(resp.Body) require.NoError(t, err) diff --git a/managed/cmd/pmm-managed/main_test.go b/managed/cmd/pmm-managed/main_test.go index 065f9cc4d82..17e536726f0 100644 --- a/managed/cmd/pmm-managed/main_test.go +++ b/managed/cmd/pmm-managed/main_test.go @@ -182,15 +182,18 @@ func TestImports(t *testing.T) { } sort.Strings(lines) - fmt.Fprintf(f, "digraph packages {\n") //nolint:errcheck + _, err = fmt.Fprintf(f, "digraph packages {\n") + require.NoError(t, err) duplicate := make(map[string]struct{}) for _, line := range lines { if _, ok := duplicate[line]; !ok { duplicate[line] = struct{}{} - fmt.Fprint(f, line) //nolint:errcheck + _, err = fmt.Fprint(f, line) + require.NoError(t, err) } } - fmt.Fprintf(f, "}\n") + _, err = fmt.Fprintf(f, "}\n") + require.NoError(t, err) } func formatPkgName(t *testing.T, name string) string { diff --git a/managed/models/database_test.go b/managed/models/database_test.go index ad7586d550f..c57d538a3e2 100644 --- a/managed/models/database_test.go +++ b/managed/models/database_test.go @@ -358,7 +358,9 @@ func TestDatabaseChecks(t *testing.T) { func TestDatabaseMigrations(t *testing.T) { t.Run("push metrics field migration: from root to exporter_options", func(t *testing.T) { sqlDB := testdb.Open(t, models.SkipFixtures, new(58)) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) // Insert dummy node in DB _, err := sqlDB.ExecContext( diff --git a/managed/models/dump_helpers_test.go b/managed/models/dump_helpers_test.go index be5fbd27863..9630c6cd5aa 100644 --- a/managed/models/dump_helpers_test.go +++ b/managed/models/dump_helpers_test.go @@ -100,7 +100,9 @@ func TestDumps(t *testing.T) { t.Run("find", func(t *testing.T) { findTX, err := db.Begin() require.NoError(t, err) - defer findTX.Rollback() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, findTX.Rollback()) + }) endTime := time.Now() startTime := endTime.Add(-10 * time.Minute) diff --git a/managed/models/job_helpers_test.go b/managed/models/job_helpers_test.go index a3c72c1de3e..77858708fb2 100644 --- a/managed/models/job_helpers_test.go +++ b/managed/models/job_helpers_test.go @@ -72,7 +72,9 @@ func TestJobs(t *testing.T) { t.Run("find", func(t *testing.T) { findTX, err := db.Begin() require.NoError(t, err) - defer findTX.Rollback() //nolint:errcheck + t.Cleanup(func() { + assert.Error(t, findTX.Rollback()) + }) const jobsCount = 3 jobs := make([]*models.Job, 0, jobsCount) diff --git a/managed/models/postgresql_version_test.go b/managed/models/postgresql_version_test.go index 505d57d8e76..083c820c74d 100644 --- a/managed/models/postgresql_version_test.go +++ b/managed/models/postgresql_version_test.go @@ -74,7 +74,9 @@ func TestGetPostgreSQLVersion(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - t.Cleanup(func() { sqlDB.Close() }) //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) q := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)).WithTag("pmm-agent:postgresqlversion") ctx := t.Context() diff --git a/managed/services/agents/connection_checker_test.go b/managed/services/agents/connection_checker_test.go index 33719c9c244..82cfb922475 100644 --- a/managed/services/agents/connection_checker_test.go +++ b/managed/services/agents/connection_checker_test.go @@ -33,7 +33,9 @@ func TestConnectionRequestUsesExporterConnectionTimeout(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) mock.ExpectQuery(`SELECT .+ FROM "agents" WHERE .+ LIMIT 1`). @@ -120,7 +122,9 @@ func TestConnectionRequestDialTimeoutPostgreSQLCloudDefaults(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) nodeColumns := []string{ diff --git a/managed/services/agents/handler_test.go b/managed/services/agents/handler_test.go index ff145dc05b2..1f787f99ee6 100644 --- a/managed/services/agents/handler_test.go +++ b/managed/services/agents/handler_test.go @@ -46,7 +46,9 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) @@ -66,7 +68,9 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) @@ -118,7 +122,9 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) @@ -170,7 +176,9 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) @@ -222,7 +230,9 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) diff --git a/managed/services/encryption/encryption_rotation_test.go b/managed/services/encryption/encryption_rotation_test.go index b49a53514f0..cf90575c5f3 100644 --- a/managed/services/encryption/encryption_rotation_test.go +++ b/managed/services/encryption/encryption_rotation_test.go @@ -22,6 +22,7 @@ import ( "time" "github.com/pkg/errors" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/percona/pmm/managed/models" @@ -40,7 +41,9 @@ const ( func TestEncryptionRotation(t *testing.T) { db := testdb.Open(t, models.SkipFixtures, nil) - defer db.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, db.Close()) + }) err := createOriginalEncryptionKey(t) require.NoError(t, err) diff --git a/managed/services/inventory/inventory_metrics_test.go b/managed/services/inventory/inventory_metrics_test.go index 08b8f16cb0c..c8c7046bbbc 100644 --- a/managed/services/inventory/inventory_metrics_test.go +++ b/managed/services/inventory/inventory_metrics_test.go @@ -43,7 +43,9 @@ func TestNewInventoryMetricsCollector(t *testing.T) { require.NoError(t, err) resp, err := client.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + t.Cleanup(func() { + assert.NoError(t, resp.Body.Close()) + }) body, err := io.ReadAll(resp.Body) require.NoError(t, err) diff --git a/managed/services/management/add_service_exporter_timeout_test.go b/managed/services/management/add_service_exporter_timeout_test.go index a390b0d9eff..73b5ada35b1 100644 --- a/managed/services/management/add_service_exporter_timeout_test.go +++ b/managed/services/management/add_service_exporter_timeout_test.go @@ -42,7 +42,9 @@ func TestAddServiceExporterTimeout(t *testing.T) { ctx := logger.Set(context.Background(), t.Name()) sqlDB := testdb.Open(t, models.SetupFixtures, nil) - t.Cleanup(func() { sqlDB.Close() }) //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) cc := &mockConnectionChecker{} diff --git a/managed/services/management/rds_test.go b/managed/services/management/rds_test.go index 2b76a26a7b9..fed69a8b71b 100644 --- a/managed/services/management/rds_test.go +++ b/managed/services/management/rds_test.go @@ -50,7 +50,9 @@ func TestRDSService(t *testing.T) { defer uuid.SetRand(nil) sqlDB := testdb.Open(t, models.SetupFixtures, nil) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { + assert.NoError(t, sqlDB.Close()) + }) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) cc := &mockConnectionChecker{} diff --git a/managed/services/server/logs_test.go b/managed/services/server/logs_test.go index 5d0d8bad073..6c9f740058f 100644 --- a/managed/services/server/logs_test.go +++ b/managed/services/server/logs_test.go @@ -72,10 +72,13 @@ func TestReadLog(t *testing.T) { require.NoError(t, err) for i := range 10 { - fmt.Fprintf(f, "line #%03d\n", i) //nolint:errcheck // 10 bytes - fmt.Fprintf(fNoNewLineEnding, "line #%03d\n", i) //nolint:errcheck // 10 bytes + _, err = fmt.Fprintf(f, "line #%03d\n", i) // 10 bytes + require.NoError(t, err) + _, err = fmt.Fprintf(fNoNewLineEnding, "line #%03d\n", i) // 10 bytes + require.NoError(t, err) } - fmt.Fprintf(fNoNewLineEnding, "some string without new line") //nolint:errcheck + _, err = fmt.Fprintf(fNoNewLineEnding, "some string without new line") + require.NoError(t, err) require.NoError(t, f.Close()) require.NoError(t, fNoNewLineEnding.Close()) @@ -107,10 +110,13 @@ func TestReadLogUnlimited(t *testing.T) { require.NoError(t, err) for i := range 10 { - fmt.Fprintf(f, "line #%03d\n", i) // 10 bytes - fmt.Fprintf(fNoNewLineEnding, "line #%03d\n", i) // 10 bytes + _, err = fmt.Fprintf(f, "line #%03d\n", i) // 10 bytes + require.NoError(t, err) + _, err = fmt.Fprintf(fNoNewLineEnding, "line #%03d\n", i) // 10 bytes + require.NoError(t, err) } - fmt.Fprintf(fNoNewLineEnding, "some string without new line") + _, err = fmt.Fprintf(fNoNewLineEnding, "some string without new line") + require.NoError(t, err) require.NoError(t, f.Close()) require.NoError(t, fNoNewLineEnding.Close()) diff --git a/managed/utils/dir/dir_test.go b/managed/utils/dir/dir_test.go index aa9fbe64837..842b815b7f0 100644 --- a/managed/utils/dir/dir_test.go +++ b/managed/utils/dir/dir_test.go @@ -46,7 +46,11 @@ func TestCreateDataDir(t *testing.T) { for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { t.Parallel() - defer os.Remove(tc.path) //nolint:errcheck + if tc.path != "" { + t.Cleanup(func() { + assert.NoError(t, os.Remove(tc.path)) + }) + } err := CreateDataDir(tc.path, tc.perm) if tc.err != "" { diff --git a/version/release_test.go b/version/release_test.go index 026c95fadf2..ffdee0bb892 100644 --- a/version/release_test.go +++ b/version/release_test.go @@ -53,12 +53,12 @@ func TestFullInfoPlainManaged(t *testing.T) { setupDataForManaged() expected := strings.Join([]string{ - fmt.Sprintf("ProjectName: %s", ProjectName), //nolint:errcheck - fmt.Sprintf("Version: %s", Version), //nolint:errcheck - fmt.Sprintf("PMMVersion: %s", PMMVersion), //nolint:errcheck - fmt.Sprintf("Timestamp: %s", timestampFormatted()), //nolint:errcheck - fmt.Sprintf("FullCommit: %s", FullCommit), //nolint:errcheck - fmt.Sprintf("Branch: %s", Branch), //nolint:errcheck + "ProjectName: " + ProjectName, + "Version: " + Version, + "PMMVersion: " + PMMVersion, + "Timestamp: " + timestampFormatted(), + "FullCommit: " + FullCommit, + "Branch: " + Branch, }, "\n") actual := FullInfo() if expected != actual { diff --git a/vmproxy/proxy/proxy_test.go b/vmproxy/proxy/proxy_test.go index 050f607aaf5..6888c9f74c6 100644 --- a/vmproxy/proxy/proxy_test.go +++ b/vmproxy/proxy/proxy_test.go @@ -72,7 +72,9 @@ func TestProxy(t *testing.T) { handler.ServeHTTP(rec, req) resp := rec.Result() - defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + t.Cleanup(func() { + assert.NoError(t, resp.Body.Close()) + }) require.Equal(t, http.StatusOK, resp.StatusCode) }) @@ -159,7 +161,9 @@ func TestProxy(t *testing.T) { handler.ServeHTTP(rec, req) resp := rec.Result() - defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + t.Cleanup(func() { + assert.NoError(t, resp.Body.Close()) + }) require.Equal(t, tc.expectedStatus, resp.StatusCode) }) From 4bb5383cd24b9c9e38adff263d6de96033f1b803 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 22 May 2026 13:43:17 +0000 Subject: [PATCH 15/23] fix: use res.Err() instead of nil err in BenchmarkCollector Agent-Logs-Url: https://github.com/percona/pmm/sessions/de554207-836f-41e3-9a38-568bff945a78 Co-authored-by: maxkondr <13022859+maxkondr@users.noreply.github.com> --- .../mongodb/profiler/internal/collector/collector_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/agents/mongodb/profiler/internal/collector/collector_test.go b/agent/agents/mongodb/profiler/internal/collector/collector_test.go index 496bd2ec319..2446616f120 100644 --- a/agent/agents/mongodb/profiler/internal/collector/collector_test.go +++ b/agent/agents/mongodb/profiler/internal/collector/collector_test.go @@ -94,7 +94,7 @@ func BenchmarkCollector(b *testing.B) { // Enable profilling all queries (2, slowms = 0) res := client.Database("admin").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}}) if res.Err() != nil { - b.Fatal(err) + b.Fatal(res.Err()) return } From fbcea6b7b0e4a65658e9c0f0260807785569f228 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Fri, 22 May 2026 18:29:47 +0300 Subject: [PATCH 16/23] fix --- agent/runner/actions/mongodb_explain_action_test.go | 8 ++++---- agent/runner/actions/mysql_explain_action_test.go | 2 +- agent/utils/version/mysql_test.go | 1 + managed/models/dump_helpers_test.go | 2 +- managed/models/job_helpers_test.go | 2 +- managed/models/postgresql_version_test.go | 1 + managed/services/agents/connection_checker_test.go | 2 ++ managed/services/agents/handler_test.go | 5 +++++ 8 files changed, 16 insertions(+), 7 deletions(-) diff --git a/agent/runner/actions/mongodb_explain_action_test.go b/agent/runner/actions/mongodb_explain_action_test.go index 72ba88ae86e..6c5e58020b0 100644 --- a/agent/runner/actions/mongodb_explain_action_test.go +++ b/agent/runner/actions/mongodb_explain_action_test.go @@ -43,8 +43,8 @@ func TestQueryExplain(t *testing.T) { dsn := tests.GetTestMongoDBDSN(t) client := tests.OpenTestMongoDB(t, dsn) t.Cleanup(func() { - assert.Error(t, client.Disconnect(ctx)) - assert.Error(t, client.Database(database).Drop(ctx)) + assert.NoError(t, client.Disconnect(ctx)) + assert.NoError(t, client.Database(database).Drop(ctx)) }) t.Run("Find", func(t *testing.T) { @@ -260,7 +260,7 @@ func TestMongoDBExplain(t *testing.T) { dsn := tests.GetTestMongoDBDSN(t) client := tests.OpenTestMongoDB(t, dsn) t.Cleanup(func() { - assert.Error(t, client.Database(database).Drop(ctx)) + assert.NoError(t, client.Database(database).Drop(ctx)) }) err := prepareData(ctx, client, database, collection) @@ -330,7 +330,7 @@ func TestNewMongoDBExplain(t *testing.T) { dsn := tests.GetTestMongoDBDSN(t) client := tests.OpenTestMongoDB(t, dsn) t.Cleanup(func() { - assert.Error(t, client.Database(database).Drop(ctx)) + assert.NoError(t, client.Database(database).Drop(ctx)) }) _, err := client.Database(database).Collection("people").InsertOne(ctx, bson.M{"last_name": "Brannigan", "first_name": "Zapp"}) diff --git a/agent/runner/actions/mysql_explain_action_test.go b/agent/runner/actions/mysql_explain_action_test.go index e15c7d2e57c..4717da760a2 100644 --- a/agent/runner/actions/mysql_explain_action_test.go +++ b/agent/runner/actions/mysql_explain_action_test.go @@ -310,7 +310,7 @@ func TestMySQLExplain(t *testing.T) { conn, err := sqlDB.Conn(ctx) require.NoError(t, err) t.Cleanup(func() { - assert.Error(t, conn.Close()) + assert.NoError(t, conn.Close()) }) _, err = conn.ExecContext(ctx, "DROP TABLE IF EXISTS test_explain_table") diff --git a/agent/utils/version/mysql_test.go b/agent/utils/version/mysql_test.go index 364cf06e9e3..ceaf23c3490 100644 --- a/agent/utils/version/mysql_test.go +++ b/agent/utils/version/mysql_test.go @@ -31,6 +31,7 @@ func TestGetMySQLVersion(t *testing.T) { t.Log("error creating mock database") return } + _ = mock.ExpectClose() t.Cleanup(func() { assert.NoError(t, sqlDB.Close()) }) diff --git a/managed/models/dump_helpers_test.go b/managed/models/dump_helpers_test.go index 9630c6cd5aa..1d0c9672860 100644 --- a/managed/models/dump_helpers_test.go +++ b/managed/models/dump_helpers_test.go @@ -101,7 +101,7 @@ func TestDumps(t *testing.T) { findTX, err := db.Begin() require.NoError(t, err) t.Cleanup(func() { - assert.Error(t, findTX.Rollback()) + assert.NoError(t, findTX.Rollback()) }) endTime := time.Now() diff --git a/managed/models/job_helpers_test.go b/managed/models/job_helpers_test.go index 77858708fb2..45a5d47a023 100644 --- a/managed/models/job_helpers_test.go +++ b/managed/models/job_helpers_test.go @@ -73,7 +73,7 @@ func TestJobs(t *testing.T) { findTX, err := db.Begin() require.NoError(t, err) t.Cleanup(func() { - assert.Error(t, findTX.Rollback()) + assert.NoError(t, findTX.Rollback()) }) const jobsCount = 3 diff --git a/managed/models/postgresql_version_test.go b/managed/models/postgresql_version_test.go index 083c820c74d..543d3049151 100644 --- a/managed/models/postgresql_version_test.go +++ b/managed/models/postgresql_version_test.go @@ -74,6 +74,7 @@ func TestGetPostgreSQLVersion(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) + _ = mock.ExpectClose() t.Cleanup(func() { assert.NoError(t, sqlDB.Close()) }) diff --git a/managed/services/agents/connection_checker_test.go b/managed/services/agents/connection_checker_test.go index 82cfb922475..276644ca3fa 100644 --- a/managed/services/agents/connection_checker_test.go +++ b/managed/services/agents/connection_checker_test.go @@ -33,6 +33,7 @@ func TestConnectionRequestUsesExporterConnectionTimeout(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) + _ = mock.ExpectClose() t.Cleanup(func() { assert.NoError(t, sqlDB.Close()) }) @@ -122,6 +123,7 @@ func TestConnectionRequestDialTimeoutPostgreSQLCloudDefaults(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) + _ = mock.ExpectClose() t.Cleanup(func() { assert.NoError(t, sqlDB.Close()) }) diff --git a/managed/services/agents/handler_test.go b/managed/services/agents/handler_test.go index 1f787f99ee6..d61845ccbf3 100644 --- a/managed/services/agents/handler_test.go +++ b/managed/services/agents/handler_test.go @@ -46,6 +46,7 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) + _ = mock.ExpectClose() t.Cleanup(func() { assert.NoError(t, sqlDB.Close()) }) @@ -68,6 +69,7 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) + _ = mock.ExpectClose() t.Cleanup(func() { assert.NoError(t, sqlDB.Close()) }) @@ -122,6 +124,7 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) + _ = mock.ExpectClose() t.Cleanup(func() { assert.NoError(t, sqlDB.Close()) }) @@ -176,6 +179,7 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) + _ = mock.ExpectClose() t.Cleanup(func() { assert.NoError(t, sqlDB.Close()) }) @@ -230,6 +234,7 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) + _ = mock.ExpectClose() t.Cleanup(func() { assert.NoError(t, sqlDB.Close()) }) From 9f8637dfe0f943645aeeaf20f55c003ad9f09199 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Fri, 22 May 2026 18:58:42 +0300 Subject: [PATCH 17/23] fix --- agent/runner/actions/mongodb_explain_action_test.go | 4 ++-- agent/utils/version/mysql_test.go | 2 +- managed/models/postgresql_version_test.go | 2 +- managed/services/agents/connection_checker_test.go | 4 ++-- managed/services/agents/handler_test.go | 10 +++++----- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/agent/runner/actions/mongodb_explain_action_test.go b/agent/runner/actions/mongodb_explain_action_test.go index 6c5e58020b0..004c0c33e19 100644 --- a/agent/runner/actions/mongodb_explain_action_test.go +++ b/agent/runner/actions/mongodb_explain_action_test.go @@ -38,13 +38,13 @@ import ( func TestQueryExplain(t *testing.T) { database := "testdb" - ctx := context.TODO() + ctx := t.Context() dsn := tests.GetTestMongoDBDSN(t) client := tests.OpenTestMongoDB(t, dsn) t.Cleanup(func() { - assert.NoError(t, client.Disconnect(ctx)) assert.NoError(t, client.Database(database).Drop(ctx)) + assert.NoError(t, client.Disconnect(ctx)) }) t.Run("Find", func(t *testing.T) { diff --git a/agent/utils/version/mysql_test.go b/agent/utils/version/mysql_test.go index ceaf23c3490..f5d322550b9 100644 --- a/agent/utils/version/mysql_test.go +++ b/agent/utils/version/mysql_test.go @@ -31,8 +31,8 @@ func TestGetMySQLVersion(t *testing.T) { t.Log("error creating mock database") return } - _ = mock.ExpectClose() t.Cleanup(func() { + _ = mock.ExpectClose() assert.NoError(t, sqlDB.Close()) }) diff --git a/managed/models/postgresql_version_test.go b/managed/models/postgresql_version_test.go index 543d3049151..9f203dc9227 100644 --- a/managed/models/postgresql_version_test.go +++ b/managed/models/postgresql_version_test.go @@ -74,8 +74,8 @@ func TestGetPostgreSQLVersion(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - _ = mock.ExpectClose() t.Cleanup(func() { + _ = mock.ExpectClose() assert.NoError(t, sqlDB.Close()) }) diff --git a/managed/services/agents/connection_checker_test.go b/managed/services/agents/connection_checker_test.go index 276644ca3fa..f4eaaf9c2f2 100644 --- a/managed/services/agents/connection_checker_test.go +++ b/managed/services/agents/connection_checker_test.go @@ -33,8 +33,8 @@ func TestConnectionRequestUsesExporterConnectionTimeout(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - _ = mock.ExpectClose() t.Cleanup(func() { + _ = mock.ExpectClose() assert.NoError(t, sqlDB.Close()) }) @@ -123,8 +123,8 @@ func TestConnectionRequestDialTimeoutPostgreSQLCloudDefaults(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - _ = mock.ExpectClose() t.Cleanup(func() { + _ = mock.ExpectClose() assert.NoError(t, sqlDB.Close()) }) diff --git a/managed/services/agents/handler_test.go b/managed/services/agents/handler_test.go index d61845ccbf3..f1096c4e73e 100644 --- a/managed/services/agents/handler_test.go +++ b/managed/services/agents/handler_test.go @@ -46,8 +46,8 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - _ = mock.ExpectClose() t.Cleanup(func() { + _ = mock.ExpectClose() assert.NoError(t, sqlDB.Close()) }) @@ -69,8 +69,8 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - _ = mock.ExpectClose() t.Cleanup(func() { + _ = mock.ExpectClose() assert.NoError(t, sqlDB.Close()) }) @@ -124,8 +124,8 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - _ = mock.ExpectClose() t.Cleanup(func() { + _ = mock.ExpectClose() assert.NoError(t, sqlDB.Close()) }) @@ -179,8 +179,8 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - _ = mock.ExpectClose() t.Cleanup(func() { + _ = mock.ExpectClose() assert.NoError(t, sqlDB.Close()) }) @@ -234,8 +234,8 @@ func TestCheckPortChanged(t *testing.T) { sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - _ = mock.ExpectClose() t.Cleanup(func() { + _ = mock.ExpectClose() assert.NoError(t, sqlDB.Close()) }) From 7e43ebf3716b11b54c6f14907e77d814ade661b8 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Fri, 22 May 2026 19:31:54 +0300 Subject: [PATCH 18/23] fix --- agent/runner/actions/mongodb_explain_action_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/agent/runner/actions/mongodb_explain_action_test.go b/agent/runner/actions/mongodb_explain_action_test.go index 004c0c33e19..d48b70a9a91 100644 --- a/agent/runner/actions/mongodb_explain_action_test.go +++ b/agent/runner/actions/mongodb_explain_action_test.go @@ -24,6 +24,7 @@ import ( "path/filepath" "strconv" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -43,8 +44,9 @@ func TestQueryExplain(t *testing.T) { dsn := tests.GetTestMongoDBDSN(t) client := tests.OpenTestMongoDB(t, dsn) t.Cleanup(func() { - assert.NoError(t, client.Database(database).Drop(ctx)) - assert.NoError(t, client.Disconnect(ctx)) + cleanupCtx, _ := context.WithTimeout(context.Background(), 5*time.Second) + assert.NoError(t, client.Database(database).Drop(cleanupCtx)) + assert.NoError(t, client.Disconnect(cleanupCtx)) }) t.Run("Find", func(t *testing.T) { From d9153ad34607ee0c1404a409a8746390417ee8e2 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Fri, 22 May 2026 20:24:10 +0300 Subject: [PATCH 19/23] fix --- agent/runner/actions/mongodb_explain_action_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/agent/runner/actions/mongodb_explain_action_test.go b/agent/runner/actions/mongodb_explain_action_test.go index d48b70a9a91..db6627c0f05 100644 --- a/agent/runner/actions/mongodb_explain_action_test.go +++ b/agent/runner/actions/mongodb_explain_action_test.go @@ -44,7 +44,8 @@ func TestQueryExplain(t *testing.T) { dsn := tests.GetTestMongoDBDSN(t) client := tests.OpenTestMongoDB(t, dsn) t.Cleanup(func() { - cleanupCtx, _ := context.WithTimeout(context.Background(), 5*time.Second) + cleanupCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() assert.NoError(t, client.Database(database).Drop(cleanupCtx)) assert.NoError(t, client.Disconnect(cleanupCtx)) }) From b69b84afac0e6ec82c151ce06d849926a0c5da8b Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Wed, 27 May 2026 16:29:56 +0300 Subject: [PATCH 20/23] fix --- .../internal/collector/collector_test.go | 54 ++++++------------- .../profiler/internal/profiler_test.go | 47 +++++----------- .../fingerprinter/fingerprinter_test.go | 18 +++---- .../agents/supervisor/ports_registry_test.go | 7 +-- api-tests/server/auth_test.go | 35 ++++-------- api-tests/server/readyz_test.go | 2 +- api-tests/server/serialization_test.go | 2 +- api-tests/server/settings/settings_test.go | 4 +- 8 files changed, 52 insertions(+), 117 deletions(-) diff --git a/agent/agents/mongodb/profiler/internal/collector/collector_test.go b/agent/agents/mongodb/profiler/internal/collector/collector_test.go index 2446616f120..9eefdf5e636 100644 --- a/agent/agents/mongodb/profiler/internal/collector/collector_test.go +++ b/agent/agents/mongodb/profiler/internal/collector/collector_test.go @@ -63,40 +63,24 @@ func BenchmarkCollector(b *testing.B) { // cursorTimeout*time.Duration(maxLoops*2): Wait time between loops to produce iter.TryNext to return a false client, err := createSession(url, "pmm-agent") - if err != nil { - b.Fatal(err) - return - } + require.NoError(b, err) // Just in case there are old dbs with matching names - err = cleanUpDBs(b, client) - if err != nil { - b.Fatal(err) - return - } - defer func() { - err = cleanUpDBs(b, client) - if err != nil { - return - } - }() + require.NoError(b, cleanUpDBs(b, client)) + b.Cleanup(func() { + assert.NoError(b, cleanUpDBs(b, client)) + }) var ps ProfilerStatus err = client.Database("admin").RunCommand(ctx, primitive.M{"profile": -1}).Decode(&ps) - if err != nil { - b.Fatal(err) - return - } - defer func() { // restore profiler status + require.NoError(b, err) + b.Cleanup(func() { // restore profiler status client.Database("admin").RunCommand(ctx, primitive.D{{"profile", ps.Was}, {"slowms", ps.SlowMs}}) - }() + }) // Enable profilling all queries (2, slowms = 0) res := client.Database("admin").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}}) - if res.Err() != nil { - b.Fatal(res.Err()) - return - } + require.NoError(b, res.Err()) for b.Loop() { ctr := New(client, "test", logrus.WithField("component", "profiler-test")) @@ -143,20 +127,14 @@ func TestCollector(t *testing.T) { require.NoError(t, err) require.NoError(t, cleanUpDBs(t, client)) // Just in case there are old dbs with matching names - defer func() { - err = cleanUpDBs(t, client) - if err != nil { - return - } - }() + t.Cleanup(func() { + assert.NoError(t, cleanUpDBs(t, client)) + }) // It's done create DB before the test. doc := bson.M{} _, err = client.Database("test_collector").Collection("test").InsertOne(t.Context(), doc) - if err != nil { - t.Fatal(err) - return - } + require.NoError(t, err) <-time.After(time.Second) ctr := New(client, "test_collector", logrus.WithField("component", "collector-test")) @@ -164,10 +142,8 @@ func TestCollector(t *testing.T) { // Start the collector var profiles []proto.SystemProfile docsChan, err := ctr.Start(ctx) - if err != nil { - t.Fatal(err) - return - } + require.NoError(t, err) + wg := &sync.WaitGroup{} wg.Add(1) <-time.After(time.Second) diff --git a/agent/agents/mongodb/profiler/internal/profiler_test.go b/agent/agents/mongodb/profiler/internal/profiler_test.go index 3c255fd543e..9ecc1b30c9c 100644 --- a/agent/agents/mongodb/profiler/internal/profiler_test.go +++ b/agent/agents/mongodb/profiler/internal/profiler_test.go @@ -15,7 +15,6 @@ package profiler import ( - "context" "fmt" "sort" "strings" @@ -37,27 +36,12 @@ import ( inventoryv1 "github.com/percona/pmm/api/inventory/v1" ) -type MongoVersion struct { - VersionString string `bson:"version"` - PSMDBVersion string `bson:"psmdbVersion"` - Version []int `bson:"versionArray"` -} - -func GetMongoVersion(ctx context.Context, client *mongo.Client) (string, error) { - var ver MongoVersion - err := client.Database("admin").RunCommand(ctx, bson.D{{"buildInfo", 1}}).Decode(&ver) - if err != nil { - return "", nil - } - - version := fmt.Sprintf("%d.%d", ver.Version[0], ver.Version[1]) - return version, err -} - func TestProfiler(t *testing.T) { defaultInterval := aggregator.DefaultInterval aggregator.DefaultInterval = time.Second - defer func() { aggregator.DefaultInterval = defaultInterval }() + t.Cleanup(func() { + aggregator.DefaultInterval = defaultInterval + }) sslDSNTemplate, files := tests.GetTestMongoDBWithSSLDSN(t, "../../../../") tempDir := t.TempDir() @@ -78,8 +62,10 @@ func testProfiler(t *testing.T, url string) { require.NoError(t, err) // Just in case there are old dbs with matching names - err = cleanUpDBs(t, sess) - require.NoError(t, err) + require.NoError(t, cleanUpDBs(t, sess)) + t.Cleanup(func() { + assert.NoError(t, cleanUpDBs(t, sess)) + }) dbsCount := 10 docsCount := float32(10) @@ -105,10 +91,9 @@ func testProfiler(t *testing.T, url string) { prof := New(url, logrus.WithField("component", "profiler-test"), ms, "test-id", truncate.GetMongoDBDefaultMaxQueryLength()) err = prof.Start() require.NoError(t, err) - defer func() { - err = prof.Stop() - require.NoError(t, err) - }() + t.Cleanup(func() { + assert.NoError(t, prof.Stop()) + }) <-time.After(aggregator.DefaultInterval * 2) // give it some time to start profiler i = 0 @@ -128,21 +113,15 @@ func testProfiler(t *testing.T, url string) { } cursor, err := sess.Database("test_00").Collection("people").Find(t.Context(), bson.M{"name_00\xff": "value_00\xff"}) require.NoError(t, err) - defer func() { - err = cursor.Close(t.Context()) - require.NoError(t, err) - }() + t.Cleanup(func() { + assert.NoError(t, cursor.Close(t.Context())) + }) <-time.After(aggregator.DefaultInterval * 6) // give it some time to catch all metrics err = prof.Stop() require.NoError(t, err) - defer func() { - err = cleanUpDBs(t, sess) - require.NoError(t, err) - }() - require.GreaterOrEqual(t, len(ms.reports), 1) var findBucket *agentv1.MetricsBucket diff --git a/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go index 2e8b66f24a9..2e97debe774 100644 --- a/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go +++ b/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go @@ -97,17 +97,17 @@ func TestProfilerFingerprinter(t *testing.T) { defer cancel() err = client.Database(dbName).Drop(ctx) require.NoError(t, err) - defer func() { + t.Cleanup(func() { err = client.Database(dbName).Drop(t.Context()) require.NoError(t, err) - }() + }) ps := ProfilerStatus{} err = client.Database("admin").RunCommand(ctx, primitive.M{"profile": -1}).Decode(&ps) require.NoError(t, err) - defer func() { // restore profiler status - client.Database("admin").RunCommand(ctx, primitive.D{{"profile", ps.Was}, {"slowms", ps.SlowMs}}) - }() + t.Cleanup(func() { + client.Database("admin").RunCommand(t.Context(), primitive.D{{Key: "profile", Value: ps.Was}, {Key: "slowms", Value: ps.SlowMs}}) + }) // Enable profilling all queries (2, slowms = 0) res := client.Database("admin").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}}) @@ -169,11 +169,9 @@ func TestProfilerFingerprinter(t *testing.T) { cursor, err := createIterator(ctx, profilerCollection, query) require.NoError(t, err) - // do not cancel cursor closing when ctx is canceled - defer func() { - err = cursor.Close(t.Context()) - require.NoError(t, err) - }() + t.Cleanup(func() { + require.NoError(t, cursor.Close(t.Context())) + }) pf := &ProfilerFingerprinter{} diff --git a/agent/agents/supervisor/ports_registry_test.go b/agent/agents/supervisor/ports_registry_test.go index eb6bda7a4f7..08f27efbd1a 100644 --- a/agent/agents/supervisor/ports_registry_test.go +++ b/agent/agents/supervisor/ports_registry_test.go @@ -15,7 +15,6 @@ package supervisor import ( - "errors" "net" "testing" @@ -29,8 +28,7 @@ func TestRegistry(t *testing.T) { l1, err := net.Listen("tcp", "127.0.0.1:65001") require.NoError(t, err) t.Cleanup(func() { - err, _ = errors.AsType[*net.OpError](l1.Close()) - require.Error(t, err) + _ = l1.Close() }) p, err := r.Reserve() @@ -42,8 +40,7 @@ func TestRegistry(t *testing.T) { l2, err := net.Listen("tcp", "127.0.0.1:65002") require.NoError(t, err) t.Cleanup(func() { - err, _ = errors.AsType[*net.OpError](l2.Close()) - require.Error(t, err) + _ = l2.Close() }) err = r.Release(65000) diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index 7ec217fad68..e451c3d8aef 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -129,7 +129,7 @@ func TestSwagger(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) t.Cleanup(func() { - assert.Error(t, resp.Body.Close()) + assert.NoError(t, resp.Body.Close()) }) assert.Equal(t, 401, resp.StatusCode) @@ -159,7 +159,7 @@ func TestSwagger(t *testing.T) { resp, err := client.Do(req) require.NoError(t, err) t.Cleanup(func() { - assert.Error(t, resp.Body.Close()) + assert.NoError(t, resp.Body.Close()) }) assert.Equal(t, 200, resp.StatusCode) @@ -174,7 +174,7 @@ func doRequest(tb testing.TB, client *http.Client, req *http.Request) (*http.Res require.NoError(tb, err) tb.Cleanup(func() { - assert.Error(tb, resp.Body.Close()) + assert.NoError(tb, resp.Body.Close()) }) b, err := io.ReadAll(resp.Body) @@ -389,7 +389,7 @@ func TestServiceAccountPermissions(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) t.Cleanup(func() { - assert.Error(t, resp.Body.Close()) + assert.NoError(t, resp.Body.Close()) }) assert.Equal(t, user.statusCode, resp.StatusCode) @@ -407,7 +407,7 @@ func TestServiceAccountPermissions(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) t.Cleanup(func() { - assert.Error(t, resp.Body.Close()) + assert.NoError(t, resp.Body.Close()) }) assert.Equal(t, user.statusCode, resp.StatusCode) @@ -435,10 +435,7 @@ func createServiceAccountWithRole(t *testing.T, role, nodeName string) int { req.Header.Set("Content-Type", "application/json; charset=utf-8") - resp, b := doRequest(t, http.DefaultClient, req) - t.Cleanup(func() { - assert.Error(t, resp.Body.Close()) - }) + resp, b := doRequest(t, http.DefaultClient, req) //nolint:bodyclose require.Equalf(t, http.StatusCreated, resp.StatusCode, "failed to create Service account, status code: %d, response: %s", resp.StatusCode, b) @@ -458,10 +455,7 @@ func createServiceAccountWithRole(t *testing.T, role, nodeName string) int { req.Header.Set("Content-Type", "application/json; charset=utf-8") - resp1, b := doRequest(t, http.DefaultClient, req) - t.Cleanup(func() { - assert.Error(t, resp1.Body.Close()) - }) + resp, b = doRequest(t, http.DefaultClient, req) //nolint:bodyclose require.Equalf(t, http.StatusCreated, resp.StatusCode, "failed to set orgId=1 to Service account, status code: %d, response: %s", resp.StatusCode, b) @@ -477,10 +471,7 @@ func deleteServiceAccount(t *testing.T, serviceAccountID int) { req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodDelete, u.String(), nil) require.NoError(t, err) - resp, b := doRequest(t, http.DefaultClient, req) - t.Cleanup(func() { - assert.Error(t, resp.Body.Close()) - }) + resp, b := doRequest(t, http.DefaultClient, req) //nolint:bodyclose require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete service account, status code: %d, response: %s", resp.StatusCode, b) } @@ -502,10 +493,7 @@ func createServiceToken(t *testing.T, serviceAccountID int, nodeName string) (in req.Header.Set("Content-Type", "application/json; charset=utf-8") - resp, b := doRequest(t, http.DefaultClient, req) - t.Cleanup(func() { - assert.Error(t, resp.Body.Close()) - }) + resp, b := doRequest(t, http.DefaultClient, req) //nolint:bodyclose require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to create Service account, status code: %d, response: %s", resp.StatusCode, b) @@ -525,10 +513,7 @@ func deleteServiceToken(t *testing.T, serviceAccountID, serviceTokenID int) { req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodDelete, u.String(), nil) require.NoError(t, err) - resp, b := doRequest(t, http.DefaultClient, req) - t.Cleanup(func() { - assert.Error(t, resp.Body.Close()) - }) + resp, b := doRequest(t, http.DefaultClient, req) //nolint:bodyclose require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete service token, status code: %d, response: %s", resp.StatusCode, b) } diff --git a/api-tests/server/readyz_test.go b/api-tests/server/readyz_test.go index 19d6104bdb8..a2347c6fcff 100644 --- a/api-tests/server/readyz_test.go +++ b/api-tests/server/readyz_test.go @@ -59,7 +59,7 @@ func TestReadyz(t *testing.T) { return false } t.Cleanup(func() { - assert.Error(t, resp.Body.Close()) + assert.NoError(t, resp.Body.Close()) }) b, err := io.ReadAll(resp.Body) diff --git a/api-tests/server/serialization_test.go b/api-tests/server/serialization_test.go index 0cd43184a1b..26dce871cd1 100644 --- a/api-tests/server/serialization_test.go +++ b/api-tests/server/serialization_test.go @@ -51,7 +51,7 @@ func TestSerialization(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) t.Cleanup(func() { - assert.Error(t, resp.Body.Close()) + assert.NoError(t, resp.Body.Close()) }) b, err := io.ReadAll(resp.Body) diff --git a/api-tests/server/settings/settings_test.go b/api-tests/server/settings/settings_test.go index 3af7d4c336b..7e4986776f6 100644 --- a/api-tests/server/settings/settings_test.go +++ b/api-tests/server/settings/settings_test.go @@ -733,7 +733,7 @@ func TestSettings(t *testing.T) { b, err = io.ReadAll(resp.Body) require.NoError(t, err) t.Cleanup(func() { - assert.Error(t, resp.Body.Close()) + assert.NoError(t, resp.Body.Close()) }) if get == "" { @@ -769,7 +769,7 @@ func TestSettings(t *testing.T) { b, err = io.ReadAll(resp.Body) require.NoError(t, err) t.Cleanup(func() { - assert.Error(t, resp.Body.Close()) + assert.NoError(t, resp.Body.Close()) }) assert.Equal(t, 200, resp.StatusCode, "response:\n%s", b) From bcc22a6175a59a76816a47218844c31c8066cf84 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Wed, 27 May 2026 18:57:27 +0300 Subject: [PATCH 21/23] fix --- .../mongodb/profiler/internal/profiler_test.go | 17 +++++++++++------ .../shared/fingerprinter/fingerprinter_test.go | 12 +++++++++--- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/agent/agents/mongodb/profiler/internal/profiler_test.go b/agent/agents/mongodb/profiler/internal/profiler_test.go index 9ecc1b30c9c..5c1c8d64e43 100644 --- a/agent/agents/mongodb/profiler/internal/profiler_test.go +++ b/agent/agents/mongodb/profiler/internal/profiler_test.go @@ -15,6 +15,7 @@ package profiler import ( + "context" "fmt" "sort" "strings" @@ -62,9 +63,11 @@ func testProfiler(t *testing.T, url string) { require.NoError(t, err) // Just in case there are old dbs with matching names - require.NoError(t, cleanUpDBs(t, sess)) + require.NoError(t, cleanUpDBs(t.Context(), t, sess)) t.Cleanup(func() { - assert.NoError(t, cleanUpDBs(t, sess)) + cleanupCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + assert.NoError(t, cleanUpDBs(cleanupCtx, t, sess)) }) dbsCount := 10 @@ -114,7 +117,9 @@ func testProfiler(t *testing.T, url string) { cursor, err := sess.Database("test_00").Collection("people").Find(t.Context(), bson.M{"name_00\xff": "value_00\xff"}) require.NoError(t, err) t.Cleanup(func() { - assert.NoError(t, cursor.Close(t.Context())) + cursorCtx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + assert.NoError(t, cursor.Close(cursorCtx)) }) <-time.After(aggregator.DefaultInterval * 6) // give it some time to catch all metrics @@ -186,15 +191,15 @@ func testProfiler(t *testing.T, url string) { assert.InDelta(t, docsCount, findBucket.Mongodb.MDocsReturnedSum, 0.0001) } -func cleanUpDBs[T testing.TB](t T, sess *mongo.Client) error { +func cleanUpDBs(ctx context.Context, t *testing.T, sess *mongo.Client) error { t.Helper() - dbs, err := sess.ListDatabaseNames(t.Context(), bson.M{}) + dbs, err := sess.ListDatabaseNames(ctx, bson.M{}) if err != nil { return err } for _, dbname := range dbs { if strings.HasPrefix(dbname, "test_") { - err = sess.Database(dbname).Drop(t.Context()) + err = sess.Database(dbname).Drop(ctx) if err != nil { t.Logf("failed to drop database %q: %v", dbname, err) continue diff --git a/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go index 2e97debe774..65a94289ac0 100644 --- a/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go +++ b/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go @@ -98,7 +98,9 @@ func TestProfilerFingerprinter(t *testing.T) { err = client.Database(dbName).Drop(ctx) require.NoError(t, err) t.Cleanup(func() { - err = client.Database(dbName).Drop(t.Context()) + dropCtx, cancelCtx := context.WithTimeout(context.Background(), 5*time.Second) + defer cancelCtx() + err = client.Database(dbName).Drop(dropCtx) require.NoError(t, err) }) @@ -106,7 +108,9 @@ func TestProfilerFingerprinter(t *testing.T) { err = client.Database("admin").RunCommand(ctx, primitive.M{"profile": -1}).Decode(&ps) require.NoError(t, err) t.Cleanup(func() { - client.Database("admin").RunCommand(t.Context(), primitive.D{{Key: "profile", Value: ps.Was}, {Key: "slowms", Value: ps.SlowMs}}) + cmdCtx, cancelCtx := context.WithTimeout(context.Background(), 1*time.Second) + defer cancelCtx() + client.Database("admin").RunCommand(cmdCtx, primitive.D{{Key: "profile", Value: ps.Was}, {Key: "slowms", Value: ps.SlowMs}}) }) // Enable profilling all queries (2, slowms = 0) @@ -170,7 +174,9 @@ func TestProfilerFingerprinter(t *testing.T) { cursor, err := createIterator(ctx, profilerCollection, query) require.NoError(t, err) t.Cleanup(func() { - require.NoError(t, cursor.Close(t.Context())) + cursorCtx, cancelCtx := context.WithTimeout(context.Background(), 1*time.Second) + defer cancelCtx() + require.NoError(t, cursor.Close(cursorCtx)) }) pf := &ProfilerFingerprinter{} From e2b6a480c263b656a17d229a20eed8c47fffbf65 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Wed, 27 May 2026 19:13:04 +0300 Subject: [PATCH 22/23] fix --- .../internal/collector/collector_test.go | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/agent/agents/mongodb/profiler/internal/collector/collector_test.go b/agent/agents/mongodb/profiler/internal/collector/collector_test.go index 9eefdf5e636..d8b8f07ecb7 100644 --- a/agent/agents/mongodb/profiler/internal/collector/collector_test.go +++ b/agent/agents/mongodb/profiler/internal/collector/collector_test.go @@ -66,16 +66,20 @@ func BenchmarkCollector(b *testing.B) { require.NoError(b, err) // Just in case there are old dbs with matching names - require.NoError(b, cleanUpDBs(b, client)) + require.NoError(b, cleanUpDBs(b.Context(), b, client)) b.Cleanup(func() { - assert.NoError(b, cleanUpDBs(b, client)) + cleanupCtx, cancelCtx := context.WithTimeout(context.Background(), 5*time.Second) + defer cancelCtx() + assert.NoError(b, cleanUpDBs(cleanupCtx, b, client)) }) var ps ProfilerStatus err = client.Database("admin").RunCommand(ctx, primitive.M{"profile": -1}).Decode(&ps) require.NoError(b, err) b.Cleanup(func() { // restore profiler status - client.Database("admin").RunCommand(ctx, primitive.D{{"profile", ps.Was}, {"slowms", ps.SlowMs}}) + cmdCtx, cancelCtx := context.WithTimeout(context.Background(), 1*time.Second) + defer cancelCtx() + client.Database("admin").RunCommand(cmdCtx, primitive.D{{"profile", ps.Was}, {"slowms", ps.SlowMs}}) }) // Enable profilling all queries (2, slowms = 0) @@ -126,9 +130,11 @@ func TestCollector(t *testing.T) { client, err := createSession(url, "pmm-agent") require.NoError(t, err) - require.NoError(t, cleanUpDBs(t, client)) // Just in case there are old dbs with matching names + require.NoError(t, cleanUpDBs(t.Context(), t, client)) // Just in case there are old dbs with matching names t.Cleanup(func() { - assert.NoError(t, cleanUpDBs(t, client)) + cleanupCtx, cancelCtx := context.WithTimeout(context.Background(), 5*time.Second) + defer cancelCtx() + assert.NoError(t, cleanUpDBs(cleanupCtx, t, client)) }) // It's done create DB before the test. @@ -223,15 +229,15 @@ func createSession(dsn string, agentID string) (*mongo.Client, error) { return client, nil } -func cleanUpDBs[T testing.TB](t T, sess *mongo.Client) error { +func cleanUpDBs[T testing.TB](ctx context.Context, t T, sess *mongo.Client) error { t.Helper() - dbs, err := sess.ListDatabaseNames(t.Context(), bson.M{}) + dbs, err := sess.ListDatabaseNames(ctx, bson.M{}) if err != nil { return err } for _, dbname := range dbs { if strings.HasPrefix(dbname, "test_") { - err = sess.Database(dbname).Drop(t.Context()) + err = sess.Database(dbname).Drop(ctx) if err != nil { t.Logf("failed to drop database %q: %v", dbname, err) continue From 0a1f6fb9ab5d4c8b02dcb9a666ab1853dd8024bd Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Wed, 27 May 2026 19:27:17 +0300 Subject: [PATCH 23/23] fix --- .../mongodb/profiler/internal/collector/collector_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agent/agents/mongodb/profiler/internal/collector/collector_test.go b/agent/agents/mongodb/profiler/internal/collector/collector_test.go index d8b8f07ecb7..a58397d2464 100644 --- a/agent/agents/mongodb/profiler/internal/collector/collector_test.go +++ b/agent/agents/mongodb/profiler/internal/collector/collector_test.go @@ -79,11 +79,11 @@ func BenchmarkCollector(b *testing.B) { b.Cleanup(func() { // restore profiler status cmdCtx, cancelCtx := context.WithTimeout(context.Background(), 1*time.Second) defer cancelCtx() - client.Database("admin").RunCommand(cmdCtx, primitive.D{{"profile", ps.Was}, {"slowms", ps.SlowMs}}) + client.Database("admin").RunCommand(cmdCtx, primitive.D{{Key: "profile", Value: ps.Was}, {Key: "slowms", Value: ps.SlowMs}}) }) // Enable profilling all queries (2, slowms = 0) - res := client.Database("admin").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}}) + res := client.Database("admin").RunCommand(ctx, primitive.D{{Key: "profile", Value: 2}, {Key: "slowms", Value: 0}}) require.NoError(b, res.Err()) for b.Loop() {