From 1a68ff1de96a8733fa73e132c049a701db449985 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Thu, 11 Jun 2026 19:03:36 +0300 Subject: [PATCH] PMM-15129 Fix depguard linter issues (p1) --- managed/services/management/node.go | 11 ++- managed/services/management/rds.go | 5 +- managed/services/management/service.go | 4 +- managed/services/minio/client.go | 13 +-- managed/services/preconditions.go | 15 ++-- managed/services/scheduler/scheduler.go | 4 +- managed/services/scheduler/task.go | 12 +-- managed/services/server/logs.go | 44 +++++----- managed/services/server/server.go | 35 +++++--- managed/services/server/server_test.go | 2 +- managed/services/server/updater.go | 77 ++++++++-------- managed/services/supervisord/pmm_config.go | 13 +-- managed/services/supervisord/supervisord.go | 17 ++-- managed/services/telemetry/config.go | 10 +-- .../telemetry/datasource_grafanadb_select.go | 4 +- .../telemetry/datasource_pmmdb_select.go | 4 +- .../telemetry/datasource_qandb_select.go | 4 +- managed/services/telemetry/datasources.go | 4 +- managed/services/telemetry/telemetry.go | 2 +- managed/services/telemetry/transform.go | 15 ++-- managed/services/user/user.go | 2 +- managed/services/versioncache/versioncache.go | 9 +- .../services/victoriametrics/prometheus.go | 11 +-- managed/utils/dir/dir.go | 7 +- managed/utils/encryption/encryption.go | 2 +- managed/utils/interceptors/interceptors.go | 3 +- managed/utils/platform/client.go | 4 +- managed/utils/pprof/pprof.go | 6 +- managed/utils/signatures/signatures.go | 3 +- managed/utils/validators/alerting_rules.go | 13 +-- qan-api2/models/data_ingestion.go | 12 +-- qan-api2/models/metrics.go | 88 +++++++++---------- qan-api2/utils/interceptors/interceptors.go | 3 +- utils/errors/errors.go | 2 +- version/parsed.go | 4 +- vmproxy/main.go | 2 +- vmproxy/proxy/proxy.go | 5 +- 37 files changed, 242 insertions(+), 229 deletions(-) diff --git a/managed/services/management/node.go b/managed/services/management/node.go index 903f5dedb88..40d0d61375f 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -21,7 +21,6 @@ import ( "time" "github.com/AlekSi/pointer" - "github.com/pkg/errors" "github.com/prometheus/common/model" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -155,7 +154,7 @@ func (s *ManagementService) UnregisterNode(ctx context.Context, req *managementv agents, err := models.FindPMMAgentsRunningOnNode(tx.Querier, node.NodeID) if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to find pmm-agent on node %s: %w", node.NodeID, err) } for _, a := range agents { idsToKick[a.AgentID] = struct{}{} @@ -163,7 +162,7 @@ func (s *ManagementService) UnregisterNode(ctx context.Context, req *managementv agents, err = models.FindAgents(tx.Querier, models.AgentFilters{NodeID: node.NodeID}) if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to find agents on node %s: %w", node.NodeID, err) } for _, a := range agents { if a.PMMAgentID != nil { @@ -173,7 +172,7 @@ func (s *ManagementService) UnregisterNode(ctx context.Context, req *managementv agents, err = models.FindPMMAgentsForServicesOnNode(tx.Querier, node.NodeID) if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to find pmm-agent on node %s: %w", node.NodeID, err) } for _, a := range agents { idsToSetState[a.AgentID] = struct{}{} @@ -291,7 +290,7 @@ func (s *ManagementService) ListNodes(ctx context.Context, req *managementv1.Lis result, _, err := s.vmClient.Query(ctx, upQuery, time.Now()) if err != nil { - return nil, errors.Wrap(err, "failed to execute an instant VM query") + return nil, fmt.Errorf("failed to execute an instant VM query: %w", err) } metrics := make(map[string]int, len(result.(model.Vector))) //nolint:forcetypeassert @@ -368,7 +367,7 @@ func (s *ManagementService) GetNode(ctx context.Context, req *managementv1.GetNo result, _, err := s.vmClient.Query(ctx, fmt.Sprintf(nodeUpQuery, req.NodeId), time.Now()) if err != nil { - return nil, errors.Wrap(err, "failed to execute an instant VM query") + return nil, fmt.Errorf("failed to execute an instant VM query: %w", err) } metrics := make(map[string]int, len(result.(model.Vector))) //nolint:forcetypeassert diff --git a/managed/services/management/rds.go b/managed/services/management/rds.go index 9d6e4e9d3bb..19120cc9828 100644 --- a/managed/services/management/rds.go +++ b/managed/services/management/rds.go @@ -17,6 +17,8 @@ package management import ( "context" + "errors" + "fmt" "net/http" "sort" "time" @@ -27,7 +29,6 @@ import ( "github.com/aws/aws-sdk-go-v2/service/rds" "github.com/aws/aws-sdk-go-v2/service/rds/types" "github.com/aws/smithy-go" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sync/errgroup" "google.golang.org/grpc/codes" @@ -164,7 +165,7 @@ func (s *ManagementService) DiscoverRDS(ctx context.Context, req *managementv1.D cfg, err := config.LoadDefaultConfig(ctx, opts...) if err != nil { - return nil, errors.WithStack(err) + return nil, fmt.Errorf("failed to load RDS default config: %w", err) } // do not break our API if some AWS region is slow or down diff --git a/managed/services/management/service.go b/managed/services/management/service.go index 50a380c91eb..34ae779d538 100644 --- a/managed/services/management/service.go +++ b/managed/services/management/service.go @@ -17,10 +17,10 @@ package management import ( "context" + "fmt" "time" "github.com/AlekSi/pointer" - "github.com/pkg/errors" "github.com/prometheus/common/model" "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" @@ -136,7 +136,7 @@ func (s *ManagementService) ListServices(ctx context.Context, req *managementv1. ` result, _, err := s.vmClient.Query(ctx, query, time.Now()) if err != nil { - return nil, errors.Wrap(err, "failed to execute an instant VM query") + return nil, fmt.Errorf("failed to execute an instant VM query: %w", err) } metrics := make(map[string]statusMetrics, len(result.(model.Vector))) //nolint:forcetypeassert diff --git a/managed/services/minio/client.go b/managed/services/minio/client.go index 9ae6640036f..23e7eece19f 100644 --- a/managed/services/minio/client.go +++ b/managed/services/minio/client.go @@ -18,11 +18,12 @@ package minio import ( "context" + "errors" + "fmt" "strings" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sync/errgroup" @@ -87,7 +88,7 @@ func (c *Client) RemoveRecursive(ctx context.Context, endpoint, accessKey, secre } for object := range mc.ListObjects(ctx, bucketName, options) { if object.Err != nil { - return errors.WithStack(object.Err) + return fmt.Errorf("failed to list objects in bucket %q: %w", bucketName, object.Err) } objectsCh <- object @@ -103,9 +104,9 @@ func (c *Client) RemoveRecursive(ctx context.Context, endpoint, accessKey, secre } if rerr != nil { - rerr = errors.Wrapf(rerr, "listing objects error: %s", err.Error()) + rerr = errors.Join(errors.New("listing objects error"), err, rerr) } else { - rerr = errors.WithStack(err) + rerr = err } }() @@ -116,7 +117,7 @@ func (c *Client) RemoveRecursive(ctx context.Context, endpoint, accessKey, secre } if errorsEncountered { - return errors.Errorf("errors encountered while removing objects from bucket %q", bucketName) + return fmt.Errorf("errors encountered while removing objects from bucket %q", bucketName) } return nil @@ -151,7 +152,7 @@ func (c *Client) List(ctx context.Context, endpoint, accessKey, secretKey, bucke for object := range mc.ListObjects(ctx, bucketName, options) { if object.Err != nil { - return nil, errors.WithStack(object.Err) + return nil, fmt.Errorf("failed to list objects in bucket %q: %w", bucketName, object.Err) } filename := object.Key filename = strings.TrimPrefix(filename, options.Prefix) diff --git a/managed/services/preconditions.go b/managed/services/preconditions.go index 77a0357e076..5d18a8ccdee 100644 --- a/managed/services/preconditions.go +++ b/managed/services/preconditions.go @@ -16,7 +16,8 @@ package services import ( - "github.com/pkg/errors" + "fmt" + "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "gopkg.in/reform.v1" @@ -98,8 +99,8 @@ func CheckArtifactOverlapping(q *reform.Querier, serviceID, locationID, folder s // TODO This doesn't work for all cases. For example, there may exist more than one storage locations pointing to the same place. const ( - usedByArtifactMsg = "Same location and folder already used for artifact %s of other service: %s" - usedByScheduledTaskMsg = "Same location and folder already used for scheduled task %s of other service: %s" + usedByArtifactMsg = "same location and folder already used for artifact %s of other service: %s" + usedByScheduledTaskMsg = "same location and folder already used for scheduled task %s of other service: %s" ) service, err := models.FindServiceByID(q, serviceID) @@ -130,12 +131,12 @@ func CheckArtifactOverlapping(q *reform.Querier, serviceID, locationID, folder s if service.ServiceType == models.MongoDBServiceType && svc.ServiceType == models.MongoDBServiceType { if svc.Cluster != service.Cluster { - return errors.Wrapf(ErrLocationFolderPairAlreadyUsed, usedByArtifactMsg, artifact.ID, serviceID) + return fmt.Errorf(usedByArtifactMsg+": %w", artifact.ID, serviceID, ErrLocationFolderPairAlreadyUsed) } continue } - return errors.Wrapf(ErrLocationFolderPairAlreadyUsed, usedByArtifactMsg, artifact.ID, serviceID) + return fmt.Errorf(usedByArtifactMsg+": %w", artifact.ID, serviceID, ErrLocationFolderPairAlreadyUsed) } } @@ -162,12 +163,12 @@ func CheckArtifactOverlapping(q *reform.Querier, serviceID, locationID, folder s if service.ServiceType == models.MongoDBServiceType && task.Type == models.ScheduledMongoDBBackupTask { if task.Data.MongoDBBackupTask.ClusterName != service.Cluster { - return errors.Wrapf(ErrLocationFolderPairAlreadyUsed, usedByScheduledTaskMsg, task.ID, serviceID) + return fmt.Errorf(usedByScheduledTaskMsg+": %w", task.ID, serviceID, ErrLocationFolderPairAlreadyUsed) } continue } - return errors.Wrapf(ErrLocationFolderPairAlreadyUsed, usedByScheduledTaskMsg, task.ID, serviceID) + return fmt.Errorf(usedByScheduledTaskMsg+": %w", task.ID, serviceID, ErrLocationFolderPairAlreadyUsed) } } diff --git a/managed/services/scheduler/scheduler.go b/managed/services/scheduler/scheduler.go index 024cccdb18d..daaab283500 100644 --- a/managed/services/scheduler/scheduler.go +++ b/managed/services/scheduler/scheduler.go @@ -19,12 +19,12 @@ package scheduler import ( "context" "database/sql" + "fmt" "sync" "time" "github.com/AlekSi/pointer" "github.com/go-co-op/gocron" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "gopkg.in/reform.v1" @@ -350,7 +350,7 @@ func (s *Service) convertDBTask(dbTask *models.ScheduledTask) (Task, error) { // } default: - return nil, errors.Errorf("unknown task type: %s", dbTask.Type) + return nil, fmt.Errorf("unknown task type: %s", dbTask.Type) } return task, nil diff --git a/managed/services/scheduler/task.go b/managed/services/scheduler/task.go index 71b44a8ed44..fab5ba9e843 100644 --- a/managed/services/scheduler/task.go +++ b/managed/services/scheduler/task.go @@ -17,10 +17,10 @@ package scheduler import ( "context" + "errors" + "fmt" "time" - "github.com/pkg/errors" - "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services/backup" ) @@ -92,11 +92,11 @@ func NewMySQLBackupTask(params *BackupTaskParams) (Task, error) { //nolint:iretu } if params.Mode != models.Snapshot { - return nil, errors.Errorf("unsupported backup mode for mySQL: %s", params.Mode) + return nil, fmt.Errorf("unsupported backup mode for mySQL: %s", params.Mode) } if params.DataModel != models.PhysicalDataModel { - return nil, errors.Errorf("unsupported backup data model for mySQL: %s", params.DataModel) + return nil, fmt.Errorf("unsupported backup data model for mySQL: %s", params.DataModel) } return &mySQLBackupTask{ @@ -156,11 +156,11 @@ func NewMongoDBBackupTask(params *BackupTaskParams) (Task, error) { //nolint:ire } if params.Mode != models.Snapshot && params.Mode != models.PITR { - return nil, errors.Errorf("unsupported backup mode for mongoDB: %s", params.Mode) + return nil, fmt.Errorf("unsupported backup mode for mongoDB: %s", params.Mode) } if params.Mode == models.PITR && params.DataModel != models.LogicalDataModel { - return nil, errors.WithMessage(backup.ErrIncompatibleDataModel, "PITR is only supported for logical backups") + return nil, fmt.Errorf("PITR is only supported for logical backups: %w", backup.ErrIncompatibleDataModel) } return &mongoDBBackupTask{ diff --git a/managed/services/server/logs.go b/managed/services/server/logs.go index 00b0985a329..01ef9b51ce9 100644 --- a/managed/services/server/logs.go +++ b/managed/services/server/logs.go @@ -22,6 +22,7 @@ import ( "container/ring" "context" "encoding/json" + "fmt" "io" "mime" "net/http" @@ -32,7 +33,6 @@ import ( "sync" "time" - "github.com/pkg/errors" "golang.org/x/sys/unix" "github.com/percona/pmm/managed/models" @@ -115,11 +115,11 @@ func (l *Logs) Zip(ctx context.Context, w io.Writer, pprofConfig *PprofConfig, l Modified: file.Modified, }) if err != nil { - return errors.Wrap(err, "failed to create zip file header") + return fmt.Errorf("failed to create zip file header: %w", err) } _, err = f.Write(file.Data) if err != nil { - return errors.Wrap(err, "failed to write zip file data") + return fmt.Errorf("failed to write zip file data: %w", err) } } @@ -131,7 +131,7 @@ func (l *Logs) Zip(ctx context.Context, w io.Writer, pprofConfig *PprofConfig, l err = zw.Close() if err != nil { - return errors.Wrap(err, "failed to close zip file") + return fmt.Errorf("failed to close zip file: %w", err) } return nil } @@ -280,13 +280,13 @@ func readLog(name string, maxLines int) ([]byte, time.Time, error) { var m time.Time f, err := os.Open(name) //nolint:gosec if err != nil { - return nil, m, errors.WithStack(err) + return nil, m, fmt.Errorf("failed to open log file %s: %w", name, err) } defer f.Close() //nolint:errcheck fi, err := f.Stat() if err != nil { - return nil, m, errors.WithStack(err) + return nil, m, fmt.Errorf("failed to obtain file info %s: %w", name, err) } m = fi.ModTime() @@ -307,7 +307,7 @@ func readLog(name string, maxLines int) ([]byte, time.Time, error) { r = r.Next() if err != nil { - return nil, m, errors.WithStack(err) + return nil, m, fmt.Errorf("failed to read data from log file %s: %w", name, err) } } @@ -325,13 +325,13 @@ func readLogUnlimited(name string) ([]byte, time.Time, error) { var m time.Time f, err := os.Open(name) //nolint:gosec if err != nil { - return nil, m, errors.WithStack(err) + return nil, m, fmt.Errorf("failed to open log file %s: %w", name, err) } defer f.Close() //nolint:errcheck fi, err := f.Stat() if err != nil { - return nil, m, errors.WithStack(err) + return nil, m, fmt.Errorf("failed to obtain file info %s: %w", name, err) } m = fi.ModTime() @@ -350,7 +350,7 @@ func readLogUnlimited(name string) ([]byte, time.Time, error) { res = append(res, b...) if err != nil { - return nil, m, errors.WithStack(err) + return nil, m, fmt.Errorf("failed to read data from log file %s: %w", name, err) } } @@ -362,7 +362,7 @@ func readFile(name string) ([]byte, time.Time, error) { var m time.Time b, err := os.ReadFile(name) //nolint:gosec if err != nil { - return nil, m, errors.WithStack(err) + return nil, m, err } fi, err := os.Stat(name) @@ -383,19 +383,19 @@ func readCmdOutput(ctx context.Context, args ...string) ([]byte, error) { func readURL(ctx context.Context, url string) ([]byte, error) { req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { - return nil, errors.WithStack(err) + return nil, fmt.Errorf("failed to create http request to %s: %w", url, err) } req = req.WithContext(ctx) resp, err := http.DefaultClient.Do(req) if err != nil { - return nil, errors.WithStack(err) + return nil, fmt.Errorf("failed to send http request to %s: %w", url, err) } defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint b, err := io.ReadAll(resp.Body) if err != nil { - return nil, errors.WithStack(err) + return nil, fmt.Errorf("failed to read response body: %w", err) } // indent JSON output @@ -412,11 +412,11 @@ func readURL(ctx context.Context, url string) ([]byte, error) { func addAdminSummary(ctx context.Context, zw *zip.Writer) error { sf, err := os.CreateTemp("", "*-pmm-admin-summary.zip") if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to create temp file: %w", err) } err = sf.Close() if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to close temp file %s: %w", sf.Name(), err) } defer os.Remove(sf.Name()) //nolint:errcheck @@ -426,12 +426,12 @@ func addAdminSummary(ctx context.Context, zw *zip.Writer) error { cmd.Stderr = os.Stderr err = cmd.Run() if err != nil { - return errors.Wrap(err, "cannot run pmm-admin summary") + return fmt.Errorf("cannot run pmm-admin summary: %w", err) } zr, err := zip.OpenReader(sf.Name()) if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to open zip file %s: %w", sf.Name(), err) } defer zr.Close() //nolint:errcheck @@ -442,23 +442,23 @@ func addAdminSummary(ctx context.Context, zw *zip.Writer) error { Modified: file.Modified, }) if err != nil { - return errors.Wrap(err, "failed to create zip file header") + return fmt.Errorf("failed to create zip file header: %w", err) } fr, err := file.Open() if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to open file %s: %w", file.Name, err) } _, err = io.Copy(fw, fr) //nolint:gosec if err != nil { fr.Close() //nolint:errcheck - return errors.WithStack(err) + return fmt.Errorf("failed to copy data to file %s: %w", file.Name, err) } err = fr.Close() if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to close file %s: %w", file.Name, err) } } diff --git a/managed/services/server/server.go b/managed/services/server/server.go index caa82cf4a84..4e3401da52c 100644 --- a/managed/services/server/server.go +++ b/managed/services/server/server.go @@ -20,6 +20,7 @@ import ( "context" "crypto/subtle" "encoding/json" + "errors" "fmt" "os" "os/user" @@ -32,7 +33,6 @@ import ( "github.com/AlekSi/pointer" "github.com/google/uuid" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/crypto/ssh" "google.golang.org/grpc/codes" @@ -107,7 +107,7 @@ func NewServer(params *Params) (*Server, error) { path := "/srv" _, err := os.Stat(path) if err != nil { - return nil, errors.WithStack(err) + return nil, fmt.Errorf("failed to create a new server: %w", err) } path = filepath.Join(path, "pmm-update.json") @@ -447,7 +447,7 @@ func (s *Server) writeUpdateAuthToken(token string) error { } f, err := os.OpenFile(s.pmmUpdateAuthFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o600|os.ModeExclusive) //nolint:mnd if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to write auth token to file %s: %w", s.pmmUpdateAuthFile, err) } defer func() { err = f.Close() @@ -456,7 +456,11 @@ func (s *Server) writeUpdateAuthToken(token string) error { } }() - return errors.WithStack(json.NewEncoder(f).Encode(a)) + err = json.NewEncoder(f).Encode(a) //nolint:gosec + if err != nil { + return fmt.Errorf("failed to encode auth token to json: %w", err) + } + return nil } // readUpdateAuthToken reads authentication token for getting update status and logs from the file. @@ -466,7 +470,7 @@ func (s *Server) readUpdateAuthToken() (string, error) { f, err := os.OpenFile(s.pmmUpdateAuthFile, os.O_RDONLY, os.ModeExclusive) if err != nil { - return "", errors.WithStack(err) + return "", fmt.Errorf("failed to read auth token from file %s: %w", s.pmmUpdateAuthFile, err) } defer func() { err = f.Close() @@ -477,7 +481,10 @@ func (s *Server) readUpdateAuthToken() (string, error) { var a pmmUpdateAuth err = json.NewDecoder(f).Decode(&a) - return a.AuthToken, errors.WithStack(err) + if err != nil { + return "", fmt.Errorf("failed to decode auth token from json: %w", err) + } + return a.AuthToken, nil } // convertSettings merges database settings and settings from environment variables into API response. @@ -646,10 +653,9 @@ func (s *Server) ChangeSettings(ctx context.Context, req *serverv1.ChangeSetting var newSettings, oldSettings *models.Settings var disableInternalPgQan bool errTX := s.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - var err error oldSettings, err = models.GetSettings(tx) if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to get server settings: %w", err) } metricsRes := req.MetricsResolutions @@ -690,15 +696,16 @@ func (s *Server) ChangeSettings(ctx context.Context, req *serverv1.ChangeSetting case errors.As(err, &errInvalidArgument): return status.Errorf(codes.InvalidArgument, "Invalid argument: %s.", errInvalidArgument.Details) default: - return errors.WithStack(err) + return fmt.Errorf("failed to update server settings: %w", err) } // absent value means "do not change" if req.SshKey != nil { err = s.writeSSHKey(pointer.GetString(req.SshKey)) if err != nil { - s.l.Error(errors.WithStack(err)) - return status.Errorf(codes.Internal, "failed to write SSH key: %s", err.Error()) + err = fmt.Errorf("failed to write SSH key: %w", err) + s.l.Error(err) + return status.Errorf(codes.Internal, "%s", err.Error()) } } @@ -848,18 +855,18 @@ func (s *Server) writeSSHKey(sshKey string) error { username := "pmm" usr, err := user.Lookup(username) if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to lookup OS user %s: %w", username, err) } sshDirPath := path.Join(usr.HomeDir, ".ssh") err = os.MkdirAll(sshDirPath, 0o700) //nolint:mnd if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to create SSH dir %s: %w", sshDirPath, err) } keysPath := path.Join(sshDirPath, "authorized_keys") err = os.WriteFile(keysPath, []byte(sshKey), 0o600) //nolint:mnd if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to write SSH keys to %s: %w", keysPath, err) } return nil } diff --git a/managed/services/server/server_test.go b/managed/services/server/server_test.go index efb36e8a0cf..9b51698e684 100644 --- a/managed/services/server/server_test.go +++ b/managed/services/server/server_test.go @@ -17,10 +17,10 @@ package server import ( "context" + "errors" "testing" "time" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/managed/services/server/updater.go b/managed/services/server/updater.go index 28caaff3def..383331092da 100644 --- a/managed/services/server/updater.go +++ b/managed/services/server/updater.go @@ -19,6 +19,7 @@ import ( "bufio" "context" "encoding/json" + "errors" "fmt" "io" "net" @@ -31,7 +32,6 @@ import ( "sync" "time" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" grpcstatus "google.golang.org/grpc/status" @@ -107,12 +107,12 @@ func (up *Updater) Run(ctx context.Context) { func (up *Updater) sendRequestToWatchtower(ctx context.Context, newImageName string, stopWatchtower bool) error { hostname, err := os.Hostname() if err != nil { - return errors.Wrap(err, "failed to get hostname") + return fmt.Errorf("failed to get hostname: %w", err) } u, err := up.watchtowerHost.Parse("/v1/update") if err != nil { - return errors.Wrap(err, "failed to parse URL") + return fmt.Errorf("failed to parse URL: %w", err) } q := u.Query() q.Set("hostname", hostname) @@ -123,7 +123,7 @@ func (up *Updater) sendRequestToWatchtower(ctx context.Context, newImageName str // Create a new request req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) if err != nil { - return errors.Wrap(err, "failed to create request") + return fmt.Errorf("failed to create request: %w", err) } // Add the token to the request header @@ -136,7 +136,7 @@ func (up *Updater) sendRequestToWatchtower(ctx context.Context, newImageName str client := &http.Client{} resp, err := client.Do(req) if err != nil { - return errors.Wrap(err, "failed to send request") + return fmt.Errorf("failed to send request: %w", err) } defer resp.Body.Close() //nolint:errcheck @@ -144,13 +144,13 @@ func (up *Updater) sendRequestToWatchtower(ctx context.Context, newImageName str resp.StatusCode == http.StatusPreconditionFailed { bytes, err := io.ReadAll(resp.Body) if err != nil { - return errors.Wrap(err, "failed to read response body") + return fmt.Errorf("failed to read response body: %w", err) } return grpcstatus.Error(codes.FailedPrecondition, string(bytes)) } // Check the response if resp.StatusCode != http.StatusOK { - return errors.Errorf("received non-OK response: %v", resp.StatusCode) + return fmt.Errorf("received non-OK response: %v", resp.StatusCode) } up.l.Info("Successfully triggered update") @@ -196,23 +196,23 @@ func (up *Updater) StartUpdate(ctx context.Context, newImageName string) error { watchtowerImageName := strings.Replace(newImageName, "pmm-server-fb", "pmm-watchtower-fb", 1) // for FB images watchtowerImageName = strings.Replace(watchtowerImageName, "3-dev-latest", "dev-latest", 1) // for dev images watchtowerImageName = strings.Replace(watchtowerImageName, "pmm-server", "watchtower", 1) - err := up.updatePodmanEnvironmentVariables(watchtowerEnvfilePath, "WATCHTOWER_IMAGE", watchtowerImageName) + err = up.updatePodmanEnvironmentVariables(watchtowerEnvfilePath, "WATCHTOWER_IMAGE", watchtowerImageName) if err != nil { up.running = false up.l.WithError(err).Error("Failed to update environment variables file for watchtower") - return errors.Wrap(err, "failed to update environment variables file for watchtower") + return fmt.Errorf("failed to update environment variables file for watchtower: %w", err) } err = up.updatePodmanEnvironmentVariables(pmmEnvfilePath, "PMM_IMAGE", newImageName) if err != nil { up.running = false up.l.WithError(err).Error("Failed to update environment variables file") - return errors.Wrap(err, "failed to update environment variables file") + return fmt.Errorf("failed to update environment variables file: %w", err) } restartWatchtower = true } else if !os.IsNotExist(e) { up.running = false up.l.WithError(e).Error("Failed to check environment variables file") - return errors.Wrap(e, "failed to check environment variables file") + return fmt.Errorf("failed to check environment variables file: %w", e) } err = up.sendRequestToWatchtower(ctx, newImageName, restartWatchtower) @@ -257,7 +257,7 @@ func (up *Updater) ListUpdates(ctx context.Context) ([]*version.DockerVersionInf func (up *Updater) latest(ctx context.Context) ([]*version.DockerVersionInfo, *version.DockerVersionInfo, error) { settings, err := models.GetSettings(up.db) if err != nil { - return nil, nil, errors.Wrap(err, "failed to get PMM server settings") + return nil, nil, fmt.Errorf("failed to get PMM server settings: %w", err) } if !settings.IsUpdatesEnabled() { @@ -266,7 +266,7 @@ func (up *Updater) latest(ctx context.Context) ([]*version.DockerVersionInfo, *v info, err := up.readFromFile() if err != nil { - return nil, nil, errors.Wrap(err, "failed to read from file") + return nil, nil, fmt.Errorf("failed to read from file: %w", err) } if info != nil { return nil, info, nil @@ -283,7 +283,7 @@ func (up *Updater) readFromFile() (*version.DockerVersionInfo, error) { content, err := os.ReadFile(fileName) if err != nil && !os.IsNotExist(err) { up.l.WithError(err).Error("Failed to read file") - return nil, errors.Wrap(err, "failed to read file") + return nil, fmt.Errorf("failed to read file: %w", err) } if os.IsNotExist(err) { return nil, nil //nolint:nilnil @@ -292,7 +292,7 @@ func (up *Updater) readFromFile() (*version.DockerVersionInfo, error) { err = json.Unmarshal(content, &info) if err != nil { up.l.WithError(err).Error("Failed to unmarshal file") - return nil, errors.Wrap(err, "failed to unmarshal file") + return nil, fmt.Errorf("failed to unmarshal file: %w", err) } return &info, nil } @@ -326,18 +326,18 @@ func (up *Updater) latestAvailableFromVersionService(ctx context.Context) ([]*ve versionServiceURL, err := envvars.GetPlatformAddress() if err != nil { up.l.WithError(err).Error("Failed to get version service address") - return nil, nil, errors.Wrap(err, "failed to get version service address") + return nil, nil, fmt.Errorf("failed to get version service address: %w", err) } u := versionServiceURL + "/metadata/v2/pmm-server" req, err := http.NewRequestWithContext(ctx, http.MethodGet, u, nil) if err != nil { up.l.WithError(err).Error("Failed to create request") - return nil, nil, errors.Wrap(err, "failed to create request") + return nil, nil, fmt.Errorf("failed to create request: %w", err) } resp, err := http.DefaultClient.Do(req) if err != nil { up.l.WithError(err).Error("Failed to get PMM server versions") - return nil, nil, errors.Wrap(err, "failed to get PMM server versions") + return nil, nil, fmt.Errorf("failed to get PMM server versions: %w", err) } defer resp.Body.Close() //nolint:errcheck @@ -345,7 +345,7 @@ func (up *Updater) latestAvailableFromVersionService(ctx context.Context) ([]*ve err = json.NewDecoder(resp.Body).Decode(&metadataResponse) if err != nil { up.l.WithError(err).Error("Failed to decode response") - return nil, nil, errors.Wrap(err, "failed to decode response") + return nil, nil, fmt.Errorf("failed to decode response: %w", err) } if len(metadataResponse.Versions) != 0 { @@ -465,32 +465,33 @@ func (up *Updater) UpdateLog(offset uint32) ([]string, uint32, error) { f, err := os.Open(pmmInitLog) if err != nil { - return nil, 0, errors.WithStack(err) + return nil, 0, fmt.Errorf("failed to open log file %s: %w", pmmInitLog, err) } defer f.Close() //nolint:errcheck,gosec,nolintlint _, err = f.Seek(int64(offset), io.SeekStart) if err != nil { - return nil, 0, errors.WithStack(err) + return nil, 0, fmt.Errorf("failed to seek to %d in log file %s: %w", offset, pmmInitLog, err) } lines := make([]string, 0, 10) reader := bufio.NewReader(f) newOffset := offset + var line string for { - line, err := reader.ReadString('\n') - if err == nil { - newOffset += uint32(len(line)) - if newOffset-offset > up.gRPCMessageMaxSize { - return lines, newOffset - uint32(len(line)), nil + line, err = reader.ReadString('\n') + if err != nil { + if err == io.EOF { + return lines, newOffset, nil } - lines = append(lines, strings.TrimSuffix(line, "\n")) - continue + // return already read lines even with error + return lines, newOffset, fmt.Errorf("failed to read line from log file %s: %w", pmmInitLog, err) } - if err == io.EOF { - err = nil + newOffset += uint32(len(line)) + if newOffset-offset > up.gRPCMessageMaxSize { + return lines, newOffset - uint32(len(line)), nil } - return lines, newOffset, errors.WithStack(err) + lines = append(lines, strings.TrimSuffix(line, "\n")) } } @@ -519,7 +520,7 @@ func (up *Updater) check(ctx context.Context) error { up.l.Info("PMM updates are disabled") return grpcstatus.Error(codes.FailedPrecondition, "PMM updates are disabled") } - return errors.Wrap(err, "failed to get latest version") + return fmt.Errorf("failed to get latest version: %w", err) } up.lastCheckResult = latest up.lastCheckTime = time.Now() @@ -543,7 +544,7 @@ func (up *Updater) updatePodmanEnvironmentVariables(filename string, key string, } file, err := os.ReadFile(filename) //nolint:gosec if err != nil { - return errors.Wrap(err, "failed to read file") + return fmt.Errorf("failed to read file: %w", err) } lines := strings.Split(string(file), "\n") for i, line := range lines { @@ -553,7 +554,7 @@ func (up *Updater) updatePodmanEnvironmentVariables(filename string, key string, } err = os.WriteFile(filename, []byte(strings.Join(lines, "\n")), 0o644) //nolint:gosec if err != nil { - return errors.Wrap(err, "failed to write file") + return fmt.Errorf("failed to write file: %w", err) } return nil } @@ -587,18 +588,18 @@ func (up *Updater) getReleaseNotesText(ctx context.Context, version version.Pars versionServiceURL, err := envvars.GetPlatformAddress() if err != nil { up.l.WithError(err).Error("Failed to get version service address") - return "", errors.Wrap(err, "failed to get version service address") + return "", fmt.Errorf("failed to get version service address: %w", err) } u := versionServiceURL + "/release-notes/v1/pmm/" + versionString req, err := http.NewRequestWithContext(ctx, http.MethodGet, u, nil) if err != nil { up.l.WithError(err).Error("Failed to create request") - return "", errors.Wrap(err, "failed to create request") + return "", fmt.Errorf("failed to create request: %w", err) } resp, err := http.DefaultClient.Do(req) if err != nil { up.l.WithError(err).Errorf("Failed to get release note for version: %s", versionString) - return "", errors.Wrapf(err, "failed to get release notes for version: %s", versionString) + return "", fmt.Errorf("failed to get release notes for version: %s: %w", versionString, err) } if resp.StatusCode != http.StatusOK { @@ -610,7 +611,7 @@ func (up *Updater) getReleaseNotesText(ctx context.Context, version version.Pars err = json.NewDecoder(resp.Body).Decode(&rnResponse) if err != nil { up.l.WithError(err).Error("Failed to decode response") - return "", errors.Wrap(err, "failed to decode response") + return "", fmt.Errorf("failed to decode response: %w", err) } up.releaseNotes[versionString] = rnResponse.ReleaseNote diff --git a/managed/services/supervisord/pmm_config.go b/managed/services/supervisord/pmm_config.go index 10b794ef4cb..9cf2b3775a2 100644 --- a/managed/services/supervisord/pmm_config.go +++ b/managed/services/supervisord/pmm_config.go @@ -17,10 +17,11 @@ package supervisord import ( "bytes" + "errors" + "fmt" "os" "text/template" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -34,7 +35,7 @@ func SavePMMConfig(params map[string]any) error { } err = saveConfig(pmmConfig, cfg) if err != nil { - return errors.Wrapf(err, "failed to save pmm config") + return fmt.Errorf("failed to save pmm config: %w", err) } logrus.Info("pmm.ini configuration has been updated.") return nil @@ -44,7 +45,7 @@ func marshalConfig(params map[string]any) ([]byte, error) { var buf bytes.Buffer err := pmmTemplate.Execute(&buf, params) if err != nil { - return nil, errors.Wrapf(err, "failed to render pmm template") + return nil, fmt.Errorf("failed to render pmm template: %w", err) } return buf.Bytes(), nil } @@ -57,7 +58,7 @@ func saveConfig(path string, cfg []byte) (err error) { err = nil } if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to read config file %s: %w", path, err) } // compare with new config @@ -73,13 +74,13 @@ func saveConfig(path string, cfg []byte) (err error) { } resErr := os.WriteFile(path, oldCfg, wwrPermissions) //nolint:gosec if resErr != nil { - err = errors.Wrap(err, errors.Wrap(resErr, "failed to restore config").Error()) + err = errors.Join(fmt.Errorf("failed to restore config: %w", resErr), err) } }() err = os.WriteFile(path, cfg, wwrPermissions) if err != nil { - err = errors.Wrap(err, "failed to write new config") + err = fmt.Errorf("failed to write new config: %w", err) } return err } diff --git a/managed/services/supervisord/supervisord.go b/managed/services/supervisord/supervisord.go index ecbe9fbb81a..5120e4dd27b 100644 --- a/managed/services/supervisord/supervisord.go +++ b/managed/services/supervisord/supervisord.go @@ -20,6 +20,7 @@ import ( "bufio" "bytes" "context" + "errors" "fmt" "io/fs" "net/url" @@ -34,7 +35,6 @@ import ( "text/template" "time" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sys/unix" @@ -415,7 +415,10 @@ func (s *Service) supervisorctl(args ...string) ([]byte, error) { //nolint:unpar s.l.Debugf("Running %q...", cmdLine) pdeathsig.Set(cmd, unix.SIGKILL) b, err := cmd.Output() - return b, errors.Wrapf(err, "%s failed", cmdLine) + if err != nil { + return nil, fmt.Errorf("%s failed: %w", cmdLine, err) + } + return b, nil } // parseStatus parses `supervisorctl status ` output, returns true if is running, @@ -507,7 +510,7 @@ func (s *Service) marshalConfig(tmpl *template.Template, settings *models.Settin } publicURL, err := url.Parse(pmmPublicAddress) if err != nil { - return nil, errors.Wrap(err, "failed to parse PMM public address.") //nolint:revive + return nil, fmt.Errorf("failed to parse PMM public address: %w", err) } templateParams["PMMServerHost"] = publicURL.Host } @@ -515,7 +518,7 @@ func (s *Service) marshalConfig(tmpl *template.Template, settings *models.Settin var buf bytes.Buffer err := tmpl.Execute(&buf, templateParams) if err != nil { - return nil, errors.Wrapf(err, "failed to render template %q", tmpl.Name()) + return nil, fmt.Errorf("failed to render template %q: %w", tmpl.Name(), err) } b := append([]byte("; Managed by pmm-managed. DO NOT EDIT.\n"), buf.Bytes()...) return b, nil @@ -562,7 +565,7 @@ func (s *Service) saveConfigAndReload(name string, cfg []byte) (bool, error) { err = nil } if err != nil { - return false, errors.WithStack(err) + return false, err } // compare with new config @@ -577,7 +580,7 @@ func (s *Service) saveConfigAndReload(name string, cfg []byte) (bool, error) { if restore { err = os.WriteFile(path, oldCfg, 0o664) //nolint:gosec,mnd if err != nil { - s.l.Errorf("Failed to restore: %s.", err) + s.l.Errorf("Failed to restore: %v.", err) } err = s.reload(name) if err != nil { @@ -589,7 +592,7 @@ func (s *Service) saveConfigAndReload(name string, cfg []byte) (bool, error) { // write and reload err = os.WriteFile(path, cfg, 0o664) //nolint:gosec,mnd if err != nil { - return false, errors.WithStack(err) + return false, err } err = s.reload(name) diff --git a/managed/services/telemetry/config.go b/managed/services/telemetry/config.go index 74185a94861..219fe1c8c6b 100644 --- a/managed/services/telemetry/config.go +++ b/managed/services/telemetry/config.go @@ -18,11 +18,11 @@ package telemetry import ( _ "embed" + "fmt" "os" "strconv" "time" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "gopkg.in/yaml.v3" @@ -176,7 +176,7 @@ func (c *ServiceConfig) Init(l *logrus.Entry) error { telemetry, err := c.loadMetricsConfig(configFile) if err != nil { - return errors.Wrap(err, "failed to load telemetry config") + return fmt.Errorf("failed to load telemetry config: %w", err) } c.telemetry = telemetry @@ -195,7 +195,7 @@ func (c *ServiceConfig) Init(l *logrus.Entry) error { host, err := envvars.GetPlatformAddress() c.SaasHostname = host if err != nil { - return errors.Wrap(err, "failed to get SaaSHost") + return fmt.Errorf("failed to get SaaSHost: %w", err) } } @@ -243,7 +243,7 @@ func (c *ServiceConfig) loadMetricsConfig(configFile string) ([]Config, error) { } err := yaml.Unmarshal(config, &fileCfg) //nolint:musttag if err != nil { - return nil, errors.Wrap(err, "cannot unmarshal default config") + return nil, fmt.Errorf("cannot unmarshal default config: %w", err) } fileConfigs = append(fileConfigs, fileCfg) @@ -276,7 +276,7 @@ func (c *ServiceConfig) validateConfig(cfgs []FileConfig) error { for _, each := range cfg.Telemetry { _, exist := ids[each.ID] if exist { - return errors.Errorf("telemetry config ID duplication: %s", each.ID) + return fmt.Errorf("telemetry config ID duplication: %s", each.ID) } ids[each.ID] = true } diff --git a/managed/services/telemetry/datasource_grafanadb_select.go b/managed/services/telemetry/datasource_grafanadb_select.go index 4c312d24db8..77c54fe76ae 100644 --- a/managed/services/telemetry/datasource_grafanadb_select.go +++ b/managed/services/telemetry/datasource_grafanadb_select.go @@ -19,10 +19,10 @@ package telemetry import ( "context" "database/sql" + "fmt" "net/url" telemetryv1 "github.com/percona/platform/gen/telemetry/generic" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -77,7 +77,7 @@ func openGrafanaDBConnection(config DSConfigGrafanaDB, l *logrus.Entry) (*sql.DB db, err := sql.Open("postgres", dsn) if err != nil { - return nil, errors.Wrap(err, "failed to create a connection pool to PostgreSQL") + return nil, fmt.Errorf("failed to create a connection pool to PostgreSQL: %w", err) } db.SetConnMaxIdleTime(defaultConnMaxIdleTime) diff --git a/managed/services/telemetry/datasource_pmmdb_select.go b/managed/services/telemetry/datasource_pmmdb_select.go index 790c912150d..b1c90c8091b 100644 --- a/managed/services/telemetry/datasource_pmmdb_select.go +++ b/managed/services/telemetry/datasource_pmmdb_select.go @@ -19,10 +19,10 @@ package telemetry import ( "context" "database/sql" + "fmt" "net/url" telemetryv1 "github.com/percona/platform/gen/telemetry/generic" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -78,7 +78,7 @@ func openPMMDBConnection(config DSConfigPMMDB, l *logrus.Entry) (*sql.DB, error) db, err := sql.Open("postgres", dsn) if err != nil { - return nil, errors.Wrap(err, "failed to create a connection pool to PostgreSQL") + return nil, fmt.Errorf("failed to create a connection pool to PostgreSQL: %w", err) } db.SetConnMaxIdleTime(defaultConnMaxIdleTime) diff --git a/managed/services/telemetry/datasource_qandb_select.go b/managed/services/telemetry/datasource_qandb_select.go index 8be22c199fb..3c2e5e08380 100644 --- a/managed/services/telemetry/datasource_qandb_select.go +++ b/managed/services/telemetry/datasource_qandb_select.go @@ -19,10 +19,10 @@ package telemetry import ( "context" "database/sql" + "fmt" "net/url" telemetryv1 "github.com/percona/platform/gen/telemetry/generic" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -62,7 +62,7 @@ func openQANDBConnection(dsn string, enabled bool, l *logrus.Entry) (*sql.DB, er db, err := sql.Open("clickhouse", dsn) if err != nil { - return nil, errors.Wrap(err, "Failed to open connection to QAN DB") + return nil, fmt.Errorf("failed to open connection to QAN DB: %w", err) } err = db.Ping() //nolint:noctx if err != nil { diff --git a/managed/services/telemetry/datasources.go b/managed/services/telemetry/datasources.go index 3db050168fd..70ec7212e1a 100644 --- a/managed/services/telemetry/datasources.go +++ b/managed/services/telemetry/datasources.go @@ -19,11 +19,11 @@ package telemetry import ( "context" "database/sql" + "fmt" "time" "github.com/AlekSi/pointer" telemetryv1 "github.com/percona/platform/gen/telemetry/generic" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -72,7 +72,7 @@ func NewDataSourceRegistry(config ServiceConfig, l *logrus.Entry) (DataSourceLoc func (r *dataSourceRegistry) LocateTelemetryDataSource(name string) (DataSource, error) { //nolint:ireturn,nolintlint ds, ok := r.dataSources[DataSourceName(name)] if !ok { - return nil, errors.Errorf("data source [%s] is not supported", name) + return nil, fmt.Errorf("data source [%s] is not supported", name) } return ds, nil } diff --git a/managed/services/telemetry/telemetry.go b/managed/services/telemetry/telemetry.go index 53f0da623d7..953d4c62fd7 100644 --- a/managed/services/telemetry/telemetry.go +++ b/managed/services/telemetry/telemetry.go @@ -18,6 +18,7 @@ package telemetry import ( "context" + "errors" "strings" "sync" "time" @@ -25,7 +26,6 @@ import ( "github.com/google/uuid" pmmv1 "github.com/percona/platform/gen/telemetry/events/pmm" telemetryv1 "github.com/percona/platform/gen/telemetry/generic" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/durationpb" diff --git a/managed/services/telemetry/transform.go b/managed/services/telemetry/transform.go index bac9060f474..838c4338c48 100644 --- a/managed/services/telemetry/transform.go +++ b/managed/services/telemetry/transform.go @@ -17,9 +17,10 @@ package telemetry import ( "encoding/json" + "errors" + "fmt" telemetryv1 "github.com/percona/platform/gen/telemetry/generic" - "github.com/pkg/errors" ) type itemsType []map[string]any @@ -30,15 +31,15 @@ func transformToJSON(config *Config, metrics []*telemetryv1.GenericReport_Metric } if config.Transform == nil { - return nil, errors.Errorf("no transformation config is set") + return nil, errors.New("no transformation config is set") } if config.Transform.Type != JSONTransform { - return nil, errors.Errorf("unsupported transformation type [%s], it must be [%s]", config.Transform.Type, JSONTransform) + return nil, fmt.Errorf("unsupported transformation type [%s], it must be [%s]", config.Transform.Type, JSONTransform) } if len(config.Data) == 0 || config.Data[0].MetricName == "" { - return nil, errors.Errorf("invalid metrics config") + return nil, errors.New("invalid metrics config") } // consider first metric is the beginning of the object window @@ -57,7 +58,7 @@ func transformToJSON(config *Config, metrics []*telemetryv1.GenericReport_Metric next = make(map[string]any) } if _, alreadyHasItem := next[metric.Key]; alreadyHasItem { - return nil, errors.Errorf("invalid metrics sequence") + return nil, errors.New("invalid metrics sequence") } next[metric.Key] = metric.Value @@ -92,11 +93,11 @@ func transformExportValues(config *Config, metrics []*telemetryv1.GenericReport_ } if config.Transform.Type != StripValuesTransform { - return nil, errors.Errorf("unspported transformation type [%s], it must be [%s]", config.Transform.Type, StripValuesTransform) + return nil, fmt.Errorf("unspported transformation type [%s], it must be [%s]", config.Transform.Type, StripValuesTransform) } if config.Source != string(dsEnvVars) { - return nil, errors.Errorf("this transform can only be used for %s data source", dsEnvVars) + return nil, fmt.Errorf("this transform can only be used for %s data source", dsEnvVars) } for _, metric := range metrics { diff --git a/managed/services/user/user.go b/managed/services/user/user.go index d989ddbf4f0..deefcadfdc3 100644 --- a/managed/services/user/user.go +++ b/managed/services/user/user.go @@ -18,9 +18,9 @@ package user import ( "context" + "errors" "time" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" diff --git a/managed/services/versioncache/versioncache.go b/managed/services/versioncache/versioncache.go index a19eab5fb43..fdf7a3cb375 100644 --- a/managed/services/versioncache/versioncache.go +++ b/managed/services/versioncache/versioncache.go @@ -18,9 +18,10 @@ package versioncache import ( "context" + "errors" + "fmt" "time" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "gopkg.in/reform.v1" @@ -117,7 +118,7 @@ func (s *Service) findServiceForUpdate() (*service, error) { return err } if len(pmmAgents) == 0 { - return errors.Errorf("pmmAgent not found for service") + return errors.New("pmmAgent not found for service") } results.PMMAgentID = pmmAgents[0].AgentID @@ -155,7 +156,7 @@ func (s *Service) updateVersionsForNextService() (time.Duration, error) { softwareList := serviceForUpdate.BackupSoftwareList if len(softwareList) == 0 { - return minCheckInterval, errors.Wrapf(ErrInvalidArgument, "no required software found for service type %q", serviceForUpdate.ServiceType) + return minCheckInterval, fmt.Errorf("no required software found for service type %q: %w", serviceForUpdate.ServiceType, ErrInvalidArgument) } versions, err := s.v.GetVersions(serviceForUpdate.PMMAgentID, softwareList) @@ -163,7 +164,7 @@ func (s *Service) updateVersionsForNextService() (time.Duration, error) { return minCheckInterval, err } if len(versions) != len(softwareList) { - return minCheckInterval, errors.Errorf("slices length mismatch: versions len %d != softwares len %d", + return minCheckInterval, fmt.Errorf("slices length mismatch: versions len %d != softwares len %d", len(versions), len(softwareList)) } diff --git a/managed/services/victoriametrics/prometheus.go b/managed/services/victoriametrics/prometheus.go index 971bb82c751..df635de059e 100644 --- a/managed/services/victoriametrics/prometheus.go +++ b/managed/services/victoriametrics/prometheus.go @@ -16,9 +16,10 @@ package victoriametrics import ( + "fmt" + "github.com/AlekSi/pointer" config "github.com/percona/promconfig" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "gopkg.in/reform.v1" @@ -33,7 +34,7 @@ func AddScrapeConfigs(l *logrus.Entry, cfg *config.Config, q *reform.Querier, // ) error { agents, err := models.FindAgentsForScrapeConfig(q, pmmAgentID, pushMetrics) if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to find agent for scrape config: %w", err) } var rdsParams []*scrapeConfigParams @@ -78,7 +79,7 @@ func AddScrapeConfigs(l *logrus.Entry, cfg *config.Config, q *reform.Querier, // // find a related pmm-agent to get the node address (runs_on_node_id) pmmAgent, err = models.FindAgentByID(q, *agent.PMMAgentID) if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to find pmm-agent for scrape config: %w", err) } paramPMMAgentVersion, err = version.Parse(pointer.GetString(pmmAgent.Version)) if err != nil { @@ -92,14 +93,14 @@ func AddScrapeConfigs(l *logrus.Entry, cfg *config.Config, q *reform.Querier, // pmmAgentNode = &models.Node{NodeID: pointer.GetString(pmmAgent.RunsOnNodeID)} err = q.Reload(pmmAgentNode) if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to reload Node by pmm-agent for scrape config: %w", err) } paramsHost = pmmAgentNode.Address case agent.RunsOnNodeID != nil: externalExporterNode := &models.Node{NodeID: pointer.GetString(agent.RunsOnNodeID)} err = q.Reload(externalExporterNode) if err != nil { - return errors.WithStack(err) + return fmt.Errorf("failed to reload Node for scrape config: %w", err) } paramsHost = externalExporterNode.Address default: diff --git a/managed/utils/dir/dir.go b/managed/utils/dir/dir.go index 6f04d3d6320..b86951d451c 100644 --- a/managed/utils/dir/dir.go +++ b/managed/utils/dir/dir.go @@ -17,11 +17,10 @@ package dir import ( + "fmt" "os" "path/filepath" "slices" - - "github.com/pkg/errors" ) // CreateDataDir creates/updates directories with the given permissions in the persistent volume. @@ -31,12 +30,12 @@ func CreateDataDir(path string, perm os.FileMode) error { err := os.MkdirAll(path, perm) if err != nil { - storedErr = errors.Wrapf(err, "cannot create path %q", path) + storedErr = fmt.Errorf("cannot create path %q: %w", path, err) } err = os.Chmod(path, perm) if err != nil && storedErr == nil { - storedErr = errors.Wrapf(err, "cannot chmod path %q", path) + storedErr = fmt.Errorf("cannot chmod path %q: %w", path, err) } return storedErr diff --git a/managed/utils/encryption/encryption.go b/managed/utils/encryption/encryption.go index 6bc7763935b..833151dc68a 100644 --- a/managed/utils/encryption/encryption.go +++ b/managed/utils/encryption/encryption.go @@ -19,13 +19,13 @@ package encryption import ( "bytes" "encoding/base64" + "errors" "fmt" "os" "slices" "strings" "sync" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/tink-crypto/tink-go/aead" "github.com/tink-crypto/tink-go/insecurecleartextkeyset" diff --git a/managed/utils/interceptors/interceptors.go b/managed/utils/interceptors/interceptors.go index 4613d97f06a..08f0c315550 100644 --- a/managed/utils/interceptors/interceptors.go +++ b/managed/utils/interceptors/interceptors.go @@ -24,7 +24,6 @@ import ( "time" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/codes" @@ -58,7 +57,7 @@ func logRequest(l *logrus.Entry, prefix string, f func() error) (err error) { } // log gRPC errors as warning, not errors, even if they are wrapped - _, gRPCError := status.FromError(errors.Cause(err)) + _, gRPCError := status.FromError(err) switch { case err == nil: if dur < time.Second { diff --git a/managed/utils/platform/client.go b/managed/utils/platform/client.go index 5af6e3c7d34..7a4c4a3ed76 100644 --- a/managed/utils/platform/client.go +++ b/managed/utils/platform/client.go @@ -20,11 +20,11 @@ import ( "bytes" "context" "encoding/json" + "fmt" "io" "net/http" telemetryv1 "github.com/percona/platform/gen/telemetry/generic" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -74,7 +74,7 @@ func (c *Client) SendTelemetry(ctx context.Context, report *telemetryv1.ReportRe _, err = c.makeRequest(ctx, http.MethodPost, path, bytes.NewReader(body)) if err != nil { - return errors.Wrap(err, "failed to send telemetry data") + return fmt.Errorf("failed to send telemetry data: %w", err) } return nil diff --git a/managed/utils/pprof/pprof.go b/managed/utils/pprof/pprof.go index b8134b4348f..3d4b1a65084 100644 --- a/managed/utils/pprof/pprof.go +++ b/managed/utils/pprof/pprof.go @@ -19,12 +19,12 @@ package pprof import ( "bytes" "context" + "errors" + "fmt" "runtime" "runtime/pprof" "runtime/trace" "time" - - "github.com/pkg/errors" ) // Profile responds with the pprof-formatted cpu profile. @@ -74,7 +74,7 @@ func Heap(gc bool) ([]byte, error) { p := pprof.Lookup(profile) if p == nil { - return nil, errors.Errorf("profile cannot be found: %s", profile) + return nil, fmt.Errorf("profile cannot be found: %q", profile) } if gc { diff --git a/managed/utils/signatures/signatures.go b/managed/utils/signatures/signatures.go index 512de30af0b..4dad5ea7a85 100644 --- a/managed/utils/signatures/signatures.go +++ b/managed/utils/signatures/signatures.go @@ -17,7 +17,8 @@ package signatures import ( - "github.com/pkg/errors" + "errors" + "github.com/sirupsen/logrus" "github.com/percona/pmm/managed/pi/check" diff --git a/managed/utils/validators/alerting_rules.go b/managed/utils/validators/alerting_rules.go index e0990d0a115..a3977c51ae5 100644 --- a/managed/utils/validators/alerting_rules.go +++ b/managed/utils/validators/alerting_rules.go @@ -17,11 +17,12 @@ package validators import ( "context" + "errors" + "fmt" "os" "os/exec" "time" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sys/unix" @@ -45,14 +46,14 @@ func (e *InvalidAlertingRuleError) Error() string { func ValidateAlertingRules(ctx context.Context, rules string) error { tempFile, err := os.CreateTemp("", "temp_rules_*.yml") if err != nil { - return errors.WithStack(err) + return fmt.Errorf("alerting rule validation failed: %w", err) } tempFile.Close() //nolint:errcheck defer os.Remove(tempFile.Name()) //nolint:errcheck err = os.WriteFile(tempFile.Name(), []byte(rules), 0o644) //nolint:gosec,mnd if err != nil { - return errors.WithStack(err) + return fmt.Errorf("alerting rule validation failed: %w", err) } timeoutCtx, cancel := context.WithTimeout(ctx, 3*time.Second) //nolint:mnd @@ -64,13 +65,13 @@ func ValidateAlertingRules(ctx context.Context, rules string) error { b, err := cmd.CombinedOutput() logrus.Debugf("ValidateAlertingRules: %v\n%s", err, b) if err != nil { - var e *exec.ExitError - if errors.As(err, &e) && e.ExitCode() != 0 { + e, ok := errors.AsType[*exec.ExitError](err) + if ok && e.ExitCode() != 0 { return &InvalidAlertingRuleError{ Msg: "Invalid alerting rules.", } } - return errors.WithStack(err) + return fmt.Errorf("alerting rule validation failed: %w", err) } return nil diff --git a/qan-api2/models/data_ingestion.go b/qan-api2/models/data_ingestion.go index 56f38e3ce36..14843e767cc 100644 --- a/qan-api2/models/data_ingestion.go +++ b/qan-api2/models/data_ingestion.go @@ -17,10 +17,10 @@ package models import ( "context" + "fmt" "time" "github.com/jmoiron/sqlx" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/sirupsen/logrus" @@ -729,13 +729,13 @@ func (mb *MetricsBucket) insertBatch(timeout time.Duration) error { var tx *sqlx.Tx tx, err = mb.db.Beginx() if err != nil { - return errors.Wrap(err, "failed to begin transaction") + return fmt.Errorf("failed to begin transaction: %w", err) } defer func() { if err == nil { err = tx.Commit() if err != nil { - err = errors.Wrap(err, "failed to commit transaction") + err = fmt.Errorf("failed to commit transaction: %w", err) } } else { _ = tx.Rollback() @@ -746,12 +746,12 @@ func (mb *MetricsBucket) insertBatch(timeout time.Duration) error { var stmt *sqlx.NamedStmt stmt, err = tx.PrepareNamed(insertSQL) if err != nil { - return errors.Wrap(err, "failed to prepare statement") + return fmt.Errorf("failed to prepare statement: %w", err) } defer func() { e := stmt.Close() if e != nil && err == nil { - err = errors.Wrap(e, "failed to close statement") + err = fmt.Errorf("failed to close statement: %w", e) } }() @@ -794,7 +794,7 @@ func (mb *MetricsBucket) insertBatch(timeout time.Duration) error { _, err = stmt.Exec(q) if err != nil { - return errors.Wrap(err, "failed to exec") + return fmt.Errorf("failed to exec: %w", err) } } diff --git a/qan-api2/models/metrics.go b/qan-api2/models/metrics.go index 296712577be..d40f6afbaf1 100644 --- a/qan-api2/models/metrics.go +++ b/qan-api2/models/metrics.go @@ -20,6 +20,7 @@ import ( "context" "database/sql" "encoding/json" + "errors" "fmt" "log" "sort" @@ -28,7 +29,6 @@ import ( "time" "github.com/jmoiron/sqlx" - "github.com/pkg/errors" "github.com/sirupsen/logrus" qanv1 "github.com/percona/pmm/api/qan/v1" @@ -95,11 +95,11 @@ func (m *Metrics) Get(ctx context.Context, periodStartFromSec, periodStartToSec var results []M query, args, err := sqlx.Named(queryBuffer.String(), arg) if err != nil { - return results, errors.Wrap(err, cannotPrepare) + return results, fmt.Errorf(cannotPrepare+": %w", err) } query, args, err = sqlx.In(query, args...) if err != nil { - return results, errors.Wrap(err, cannotPopulate) + return results, fmt.Errorf(cannotPopulate+": %w", err) } query = m.db.Rebind(query) @@ -108,7 +108,7 @@ func (m *Metrics) Get(ctx context.Context, periodStartFromSec, periodStartToSec rows, err := m.db.QueryxContext(queryCtx, query, args...) if err != nil { - return results, errors.Wrap(err, cannotExecute) + return results, fmt.Errorf(cannotExecute+": %w", err) } defer rows.Close() //nolint:errcheck @@ -551,15 +551,15 @@ func (m *Metrics) SelectSparklines(ctx context.Context, periodStartFromSec, peri var queryBuffer bytes.Buffer err := tmplMetricsSparklines.Execute(&queryBuffer, tmplArgs) if err != nil { - return nil, errors.Wrap(err, "cannot execute tmplMetricsSparklines") + return nil, fmt.Errorf("cannot execute tmplMetricsSparklines: %w", err) } query, args, err := sqlx.Named(queryBuffer.String(), arg) if err != nil { - return nil, errors.Wrap(err, "prepare named") + return nil, fmt.Errorf("prepare named: %w", err) } query, args, err = sqlx.In(query, args...) if err != nil { - return nil, errors.Wrap(err, "populate arguments in IN clause") + return nil, fmt.Errorf("populate arguments in IN clause: %w", err) } query = m.db.Rebind(query) @@ -568,7 +568,7 @@ func (m *Metrics) SelectSparklines(ctx context.Context, periodStartFromSec, peri rows, err := m.db.QueryxContext(queryCtx, query, args...) if err != nil { - return nil, errors.Wrap(err, "metrics sparklines query") + return nil, fmt.Errorf("metrics sparklines query: %w", err) } defer rows.Close() //nolint:errcheck @@ -578,7 +578,7 @@ func (m *Metrics) SelectSparklines(ctx context.Context, periodStartFromSec, peri res := getPointFieldsList(&p, sparklinePointAllFields) err = rows.Scan(res...) if err != nil { - return nil, errors.Wrap(err, "DimensionReport scan error") + return nil, fmt.Errorf("DimensionReport scan error: %w", err) } // Fill deprecated fields for compatibility @@ -653,16 +653,16 @@ func (m *Metrics) SelectQueryExamples(ctx context.Context, periodStartFrom, peri var queryBuffer bytes.Buffer err := tmplQueryExample.Execute(&queryBuffer, tmplArgs) if err != nil { - return nil, errors.Wrap(err, "cannot execute queryExampleTmpl") + return nil, fmt.Errorf("cannot execute queryExampleTmpl: %w", err) } query, queryArgs, err := sqlx.Named(queryBuffer.String(), arg) if err != nil { - return nil, errors.Wrap(err, "prepare named") + return nil, fmt.Errorf("prepare named: %w", err) } query = m.db.Rebind(query) rows, err := m.db.QueryContext(ctx, query, queryArgs...) if err != nil { - return nil, errors.Wrap(err, "cannot select object details labels") + return nil, fmt.Errorf("cannot select object details labels: %w", err) } defer rows.Close() //nolint:errcheck @@ -683,7 +683,7 @@ func (m *Metrics) SelectQueryExamples(ctx context.Context, periodStartFrom, peri &row.ExampleMetrics, ) if err != nil { - return nil, errors.Wrap(err, "failed to scan query example for object details") + return nil, fmt.Errorf("failed to scan query example for object details: %w", err) } res.QueryExamples = append(res.QueryExamples, &row) @@ -754,18 +754,18 @@ func (m *Metrics) SelectObjectDetailsLabels(ctx context.Context, periodStartFrom var queryBuffer bytes.Buffer err := tmplObjectDetailsLabels.Execute(&queryBuffer, arg) if err != nil { - return nil, errors.Wrap(err, "cannot execute tmplObjectDetailsLabels") + return nil, fmt.Errorf("cannot execute tmplObjectDetailsLabels: %w", err) } res := qanv1.GetLabelsResponse{} query, queryArgs, err := sqlx.Named(queryBuffer.String(), arg) if err != nil { - return nil, errors.Wrap(err, "prepare named") + return nil, fmt.Errorf("prepare named: %w", err) } query = m.db.Rebind(query) rows, err := m.db.QueryContext(ctx, query, queryArgs...) if err != nil { - return nil, errors.Wrap(err, "cannot select object details labels") + return nil, fmt.Errorf("cannot select object details labels: %w", err) } defer rows.Close() //nolint:errcheck @@ -828,7 +828,7 @@ func (m *Metrics) SelectObjectDetailsLabels(ctx context.Context, periodStartFrom &row.PlanID, ) if err != nil { - return nil, errors.Wrap(err, "failed to scan labels for object details") + return nil, fmt.Errorf("failed to scan labels for object details: %w", err) } // convert rows to array of unique label keys - values. labels["service_name"][row.ServiceName] = struct{}{} @@ -865,7 +865,7 @@ func (m *Metrics) SelectObjectDetailsLabels(ctx context.Context, periodStartFrom } err = rows.Err() if err != nil { - return nil, errors.Wrap(err, "failed to select labels dimensions") + return nil, fmt.Errorf("failed to select labels dimensions: %w", err) } res.Labels = make(map[string]*qanv1.ListLabelValues) @@ -970,11 +970,11 @@ func (m *Metrics) SelectHistogram(ctx context.Context, periodStartFromSec, perio } query, args, err := sqlx.Named(queryBuffer.String(), arg) if err != nil { - return results, errors.Wrap(err, cannotPrepare) + return results, fmt.Errorf(cannotPrepare+": %w", err) } query, args, err = sqlx.In(query, args...) if err != nil { - return results, errors.Wrap(err, cannotPopulate) + return results, fmt.Errorf(cannotPopulate+": %w", err) } query = m.db.Rebind(query) @@ -983,7 +983,7 @@ func (m *Metrics) SelectHistogram(ctx context.Context, periodStartFromSec, perio rows, err := m.db.QueryxContext(queryCtx, query, args...) if err != nil { - return results, errors.Wrap(err, cannotExecute) + return results, fmt.Errorf(cannotExecute+": %w", err) } defer rows.Close() //nolint:errcheck @@ -994,14 +994,14 @@ func (m *Metrics) SelectHistogram(ctx context.Context, periodStartFromSec, perio &histogramItems, ) if err != nil { - return nil, errors.Wrap(err, "failed to scan histogram items") + return nil, fmt.Errorf("failed to scan histogram items: %w", err) } for _, v := range histogramItems { item := &qanv1.HistogramItem{} - err := json.Unmarshal([]byte(v), item) + err = json.Unmarshal([]byte(v), item) if err != nil { - return nil, errors.Wrap(err, "failed to unmarshal histogram item") + return nil, fmt.Errorf("failed to unmarshal histogram item: %w", err) } keyExists, position := histogramHasKey(histogram, item.Range) @@ -1046,11 +1046,11 @@ func (m *Metrics) QueryExists(ctx context.Context, serviceID, query string) (boo query, args, err := sqlx.Named(queryBuffer.String(), arg) if err != nil { - return false, errors.Wrap(err, cannotPrepare) + return false, fmt.Errorf(cannotPrepare+": %w", err) } query, args, err = sqlx.In(query, args...) if err != nil { - return false, errors.Wrap(err, cannotPopulate) + return false, fmt.Errorf(cannotPopulate+": %w", err) } query = m.db.Rebind(query) @@ -1059,7 +1059,7 @@ func (m *Metrics) QueryExists(ctx context.Context, serviceID, query string) (boo rows, err := m.db.QueryxContext(queryCtx, query, args...) if err != nil { - return false, errors.Wrap(err, cannotExecute) + return false, fmt.Errorf(cannotExecute+": %w", err) } defer rows.Close() //nolint:errcheck @@ -1085,11 +1085,11 @@ func (m *Metrics) SchemaByQueryID(ctx context.Context, serviceID, queryID string query, args, err := sqlx.Named(queryBuffer.String(), arg) if err != nil { - return nil, errors.Wrap(err, cannotPrepare) + return nil, fmt.Errorf(cannotPrepare+": %w", err) } query, args, err = sqlx.In(query, args...) if err != nil { - return nil, errors.Wrap(err, cannotPopulate) + return nil, fmt.Errorf(cannotPopulate+": %w", err) } query = m.db.Rebind(query) @@ -1099,7 +1099,7 @@ func (m *Metrics) SchemaByQueryID(ctx context.Context, serviceID, queryID string row := m.db.QueryRowxContext(queryCtx, query, args...) rowErr := row.Err() if rowErr != nil { - return nil, errors.Wrap(rowErr, cannotExecute) + return nil, fmt.Errorf(cannotExecute+": %w", rowErr) } res := &qanv1.SchemaByQueryIDResponse{} @@ -1108,7 +1108,7 @@ func (m *Metrics) SchemaByQueryID(ctx context.Context, serviceID, queryID string if errors.Is(err, sql.ErrNoRows) { return res, nil } - return res, errors.Wrap(err, "failed to scan query") + return res, fmt.Errorf("failed to scan query: %w", err) } return res, nil @@ -1131,11 +1131,11 @@ func (m *Metrics) ExplainFingerprintByQueryID(ctx context.Context, serviceID, qu res := &qanv1.ExplainFingerprintByQueryIDResponse{} query, args, err := sqlx.Named(queryBuffer.String(), arg) if err != nil { - return res, errors.Wrap(err, cannotPrepare) + return res, fmt.Errorf(cannotPrepare+": %w", err) } query, args, err = sqlx.In(query, args...) if err != nil { - return res, errors.Wrap(err, cannotPopulate) + return res, fmt.Errorf(cannotPopulate+": %w", err) } query = m.db.Rebind(query) @@ -1145,7 +1145,7 @@ func (m *Metrics) ExplainFingerprintByQueryID(ctx context.Context, serviceID, qu row := m.db.QueryRowxContext(queryCtx, query, args...) rowErr := row.Err() if rowErr != nil { - return res, errors.Wrap(rowErr, cannotExecute) + return res, fmt.Errorf(cannotExecute+": %w", rowErr) } var fingerprint, example string @@ -1157,9 +1157,9 @@ func (m *Metrics) ExplainFingerprintByQueryID(ctx context.Context, serviceID, qu ) if err != nil { if errors.Is(err, sql.ErrNoRows) { - return res, errors.New("query_id doesnt exists") + return res, errors.New("query_id doesn't exists") } - return res, errors.Wrap(err, "failed to scan query") + return res, fmt.Errorf("failed to scan query: %w", err) } if example != "" { @@ -1232,20 +1232,20 @@ func (m *Metrics) GetSelectedQueryMetadata(ctx context.Context, periodStartFromS var queryBuffer bytes.Buffer tmpl, err := template.New("selectedQueryMetadataTmpl").Funcs(funcMap).Parse(selectedQueryMetadataTmpl) if err != nil { - return res, errors.Wrap(err, cannotPrepare) + return res, fmt.Errorf(cannotPrepare+": %w", err) } err = tmpl.Execute(&queryBuffer, tmplArgs) if err != nil { - return res, errors.Wrap(err, cannotExecute) + return res, fmt.Errorf(cannotExecute+": %w", err) } query, args, err := sqlx.Named(queryBuffer.String(), arg) if err != nil { - return res, errors.Wrap(err, cannotPrepare) + return res, fmt.Errorf(cannotPrepare+": %w", err) } query, args, err = sqlx.In(query, args...) if err != nil { - return res, errors.Wrap(err, cannotPopulate) + return res, fmt.Errorf(cannotPopulate+": %w", err) } query = m.db.Rebind(query) @@ -1254,14 +1254,14 @@ func (m *Metrics) GetSelectedQueryMetadata(ctx context.Context, periodStartFromS rows, err := m.db.QueryxContext(queryCtx, query, args...) if err != nil { - return res, errors.Wrap(err, cannotExecute) + return res, fmt.Errorf(cannotExecute+": %w", err) } defer rows.Close() //nolint:errcheck metadata := make(map[string]map[string]struct{}) columnNames, err := rows.Columns() if err != nil { - return nil, errors.Wrap(err, "failed to get column names") + return nil, fmt.Errorf("failed to get column names: %w", err) } for _, name := range columnNames { metadata[name] = make(map[string]struct{}) @@ -1276,9 +1276,9 @@ func (m *Metrics) GetSelectedQueryMetadata(ctx context.Context, periodStartFromS err = rows.Scan(row...) if err != nil { if errors.Is(err, sql.ErrNoRows) { - return nil, errors.Wrap(err, "query_id doesnt exists") + return nil, fmt.Errorf("query_id doesn't exists: %w", err) } - return nil, errors.Wrap(err, "failed to scan query") + return nil, fmt.Errorf("failed to scan query: %w", err) } for k, v := range row { diff --git a/qan-api2/utils/interceptors/interceptors.go b/qan-api2/utils/interceptors/interceptors.go index 2b5fbfb4888..e692f9da5da 100644 --- a/qan-api2/utils/interceptors/interceptors.go +++ b/qan-api2/utils/interceptors/interceptors.go @@ -24,7 +24,6 @@ import ( grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/codes" @@ -57,7 +56,7 @@ func logRequest(l *logrus.Entry, prefix string, f func() error) (err error) { } // log gRPC errors as warning, not errors, even if they are wrapped - _, gRPCError := status.FromError(errors.Cause(err)) + _, gRPCError := status.FromError(err) switch { case err == nil: if dur < time.Second { diff --git a/utils/errors/errors.go b/utils/errors/errors.go index 994916c6f6b..19f0e84f2bd 100644 --- a/utils/errors/errors.go +++ b/utils/errors/errors.go @@ -19,6 +19,7 @@ package errors import ( "context" + "errors" "fmt" "io" "net/http" @@ -26,7 +27,6 @@ import ( "strings" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" - "github.com/pkg/errors" "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/status" diff --git a/version/parsed.go b/version/parsed.go index 73054e674e5..2819935e46e 100644 --- a/version/parsed.go +++ b/version/parsed.go @@ -20,8 +20,6 @@ import ( "regexp" "strconv" "strings" - - "github.com/pkg/errors" ) var ( @@ -43,7 +41,7 @@ type Parsed struct { func Parse(s string) (*Parsed, error) { m := versionRE.FindStringSubmatch(s) if len(m) != 5 { - return nil, errors.Errorf("failed to parse %q", s) + return nil, fmt.Errorf("failed to parse %q", s) } res := &Parsed{Rest: m[4]} diff --git a/vmproxy/main.go b/vmproxy/main.go index 9a5de3b734c..a7b3b0fc73e 100644 --- a/vmproxy/main.go +++ b/vmproxy/main.go @@ -17,13 +17,13 @@ package main import ( + "errors" "net" "net/http" "net/url" "strconv" "github.com/alecthomas/kong" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/percona/pmm/version" diff --git a/vmproxy/proxy/proxy.go b/vmproxy/proxy/proxy.go index 0bcf562023c..5a9f6ba5b52 100644 --- a/vmproxy/proxy/proxy.go +++ b/vmproxy/proxy/proxy.go @@ -27,7 +27,6 @@ import ( "strings" "time" - "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -142,12 +141,12 @@ func parseFilters(filters string) ([]string, error) { decoded, err := base64.StdEncoding.DecodeString(filters) if err != nil { - return nil, errors.Wrapf(err, "could not decode filters header") + return nil, fmt.Errorf("could not decode filters header: %w", err) } err = json.Unmarshal(decoded, &parsed) if err != nil { - return nil, errors.Wrapf(err, "could not parse filters JSON") + return nil, fmt.Errorf("could not parse filters JSON: %w", err) } return parsed, nil