From 500863084248c5c34aa9ba31e588b60e70988de2 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Tue, 24 Mar 2026 18:12:55 +0200 Subject: [PATCH 1/2] PMM-14856 Make multiline output of telemetry metrics - Improve docker-compose.yaml --- docker-compose.yml | 16 ++++---- managed/services/telemetry/telemetry.go | 50 +++++++++++++++++-------- utils/logger/global.go | 16 +++++--- 3 files changed, 54 insertions(+), 28 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5af8ee99faf..e397a20c980 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,7 +19,7 @@ services: - PMM_WATCHTOWER_TOKEN=${PMM_WATCHTOWER_TOKEN:-INSECURE_TOKEN} - PMM_ENABLE_NOMAD=${PMM_ENABLE_NOMAD:-0} - PMM_PUBLIC_ADDRESS=${PMM_PUBLIC_ADDRESS:-localhost} - - PMM_RELEASE_VERSION=3.6.0 + - PMM_RELEASE_VERSION=${PMM_RELEASE_VERSION:-"3.7.0"} - GO_VERSION=1.25.x # - PMM_ENABLE_INTERNAL_PG_QAN=${PMM_ENABLE_INTERNAL_PG_QAN:-1} # - PMM_DISTRIBUTION_METHOD=${PMM_DISTRIBUTION_METHOD:-docker} @@ -27,20 +27,22 @@ services: # - PMM_DEV_PERCONA_PLATFORM_ADDRESS=https://check.localhost # - PMM_DEV_PERCONA_PLATFORM_INSECURE=1 # - PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY= - # - PMM_DEV_TELEMETRY_INTERVAL=10s - # - PMM_DEV_TELEMETRY_DISABLE_START_DELAY=1 - # - PMM_DEV_TELEMETRY_RETRY_BACKOFF=10s + - PMM_ENABLE_TELEMETRY=${PMM_ENABLE_TELEMETRY:-0} + - PMM_DEV_TELEMETRY_DISABLE_SEND=${PMM_DEV_TELEMETRY_DISABLE_SEND:-1} + - PMM_DEV_TELEMETRY_DISABLE_START_DELAY=${PMM_DEV_TELEMETRY_DISABLE_START_DELAY:-1} + - PMM_DEV_TELEMETRY_INTERVAL=${PMM_DEV_TELEMETRY_INTERVAL:-10s} + - PMM_DEV_TELEMETRY_RETRY_BACKOFF=${PMM_DEV_TELEMETRY_RETRY_BACKOFF:-10s} # - PMM_CLICKHOUSE_ADDR=127.0.0.1:9000 # - PMM_CLICKHOUSE_DATABASE=pmm # - PMM_CLICKHOUSE_USER=default # - PMM_CLICKHOUSE_PASSWORD= # - PMM_CLICKHOUSE_IS_CLUSTER=1 # - PMM_CLICKHOUSE_CLUSTER_NAME=pmmclickhouse - # - PMM_DEBUG=1 + - PMM_DEBUG=${PMM_DEBUG:-0} # - PMM_DEV_ADVISOR_CHECKS_FILE=/srv/checks/local-checks.yml # - PMM_POSTGRES_ADDR=pg - # - PMM_POSTGRES_DBNAME=pmm-managed - # - PMM_POSTGRES_USERNAME=pmm-managed + - PMM_POSTGRES_DBNAME=${PMM_POSTGRES_DBNAME:-pmm-managed} + - PMM_POSTGRES_USERNAME=${PMM_POSTGRES_USERNAME:-pmm-managed} # - PMM_POSTGRES_DBPASSWORD= # - PMM_POSTGRES_SSL_MODE=verify-full # - PMM_POSTGRES_SSL_CA_PATH=/tmp/certs/root.crt diff --git a/managed/services/telemetry/telemetry.go b/managed/services/telemetry/telemetry.go index a9fd816e749..70578ae6166 100644 --- a/managed/services/telemetry/telemetry.go +++ b/managed/services/telemetry/telemetry.go @@ -27,6 +27,7 @@ import ( telemetryv1 "github.com/percona/saas/gen/telemetry/generic" "github.com/pkg/errors" "github.com/sirupsen/logrus" + "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/durationpb" "google.golang.org/protobuf/types/known/timestamppb" "gopkg.in/reform.v1" @@ -34,6 +35,7 @@ import ( serverv1 "github.com/percona/pmm/api/server/v1" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/utils/platform" + "github.com/percona/pmm/utils/logger" ) const ( @@ -65,6 +67,26 @@ var ( _ DataSourceLocator = (*Service)(nil) ) +// getLogger returns a copy of global logger instance with reconfigured formatter. +func getLogger() *logrus.Entry { + loggerCopy := logrus.New() + loggerCopy.SetOutput(logrus.StandardLogger().Out) + formatter := logger.GetLoggerFormatter() + // DisableQuote is needed to make gathered telemetry metrics + // multiline formatted and more readable in log. + formatter.DisableQuote = true + loggerCopy.SetFormatter(formatter) + for _, hooks := range logrus.StandardLogger().Hooks { + for _, hook := range hooks { + loggerCopy.AddHook(hook) + } + } + loggerCopy.SetLevel(logrus.StandardLogger().Level) + loggerCopy.SetReportCaller(logrus.StandardLogger().ReportCaller) + + return loggerCopy.WithField("component", "telemetry") +} + // NewService creates a new service. func NewService(db *reform.DB, portalClient *platform.Client, pmmVersion string, dus distributionUtilService, config ServiceConfig, extensions map[ExtensionType]Extension, @@ -73,7 +95,7 @@ func NewService(db *reform.DB, portalClient *platform.Client, pmmVersion string, return nil, errors.New("empty host") } - l := logrus.WithField("component", "telemetry") + l := getLogger() registry, err := NewDataSourceRegistry(config, l) if err != nil { @@ -114,32 +136,29 @@ func (s *Service) Run(ctx context.Context) { defer ticker.Stop() doSend := func() { - var settings *models.Settings - err := s.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - var e error - if settings, e = models.GetSettings(tx); e != nil { - return e - } - return nil - }) + settings, err := models.GetSettings(s.db) if err != nil { - s.l.Debugf("Failed to retrieve settings: %s.", err) + s.l.Errorf("Failed to retrieve settings: %s.", err) return } + if !settings.IsTelemetryEnabled() { - s.l.Info("Disabled via settings.") + s.l.Info("Telemetry is disabled via settings.") return } report := s.prepareReport(ctx) - s.l.Debugf("\nTelemetry captured:\n%s\n", s.Format(report)) + if s.l.Logger.IsLevelEnabled(logrus.DebugLevel) { + s.l.Debugf("\nTelemetry captured:\n%s\n", s.Format(report)) + } - if s.config.Reporting.Send { - s.sendCh <- report - } else { + if !s.config.Reporting.Send { s.l.Info("Sending telemetry is disabled.") + return } + + s.sendCh <- report } if s.config.Reporting.SendOnStart { @@ -389,6 +408,7 @@ func (s *Service) send(ctx context.Context, report *telemetryv1.ReportRequest) e // Format returns the formatted representation of the provided server metric. func (s *Service) Format(report *telemetryv1.GenericReport) string { var builder strings.Builder + builder.Grow(proto.Size(report)) for _, m := range report.Metrics { builder.WriteString(m.Key) builder.WriteString(": ") diff --git a/utils/logger/global.go b/utils/logger/global.go index 9368bb145ce..f8affb417aa 100644 --- a/utils/logger/global.go +++ b/utils/logger/global.go @@ -23,13 +23,11 @@ import ( "github.com/sirupsen/logrus" ) -// SetupGlobalLogger configures logrus.StandardLogger() to enable multiline-friendly formatter -// in both development (with terminal) and production (without terminal) with default prettyfier. -func SetupGlobalLogger() { - logrus.SetFormatter(&logrus.TextFormatter{ +// GetLoggerFormatter returns instance of TextFormatter with predefined parameters. +func GetLoggerFormatter() *logrus.TextFormatter { + return &logrus.TextFormatter{ FullTimestamp: true, TimestampFormat: "2006-01-02T15:04:05.000-07:00", - CallerPrettyfier: func(f *runtime.Frame) (string, string) { _, function := filepath.Split(f.Function) @@ -41,5 +39,11 @@ func SetupGlobalLogger() { return function, file }, - }) + } +} + +// SetupGlobalLogger configures logrus.StandardLogger() to enable multiline-friendly formatter +// in both development (with terminal) and production (without terminal) with default prettyfier. +func SetupGlobalLogger() { + logrus.SetFormatter(GetLoggerFormatter()) } From 78c6eff6317d8850f92e3742c743b942b9c34514 Mon Sep 17 00:00:00 2001 From: Maxim Kondratenko Date: Wed, 25 Mar 2026 10:02:57 +0200 Subject: [PATCH 2/2] revert changes in docker-compose.yaml --- docker-compose.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index e397a20c980..5af8ee99faf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,7 +19,7 @@ services: - PMM_WATCHTOWER_TOKEN=${PMM_WATCHTOWER_TOKEN:-INSECURE_TOKEN} - PMM_ENABLE_NOMAD=${PMM_ENABLE_NOMAD:-0} - PMM_PUBLIC_ADDRESS=${PMM_PUBLIC_ADDRESS:-localhost} - - PMM_RELEASE_VERSION=${PMM_RELEASE_VERSION:-"3.7.0"} + - PMM_RELEASE_VERSION=3.6.0 - GO_VERSION=1.25.x # - PMM_ENABLE_INTERNAL_PG_QAN=${PMM_ENABLE_INTERNAL_PG_QAN:-1} # - PMM_DISTRIBUTION_METHOD=${PMM_DISTRIBUTION_METHOD:-docker} @@ -27,22 +27,20 @@ services: # - PMM_DEV_PERCONA_PLATFORM_ADDRESS=https://check.localhost # - PMM_DEV_PERCONA_PLATFORM_INSECURE=1 # - PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY= - - PMM_ENABLE_TELEMETRY=${PMM_ENABLE_TELEMETRY:-0} - - PMM_DEV_TELEMETRY_DISABLE_SEND=${PMM_DEV_TELEMETRY_DISABLE_SEND:-1} - - PMM_DEV_TELEMETRY_DISABLE_START_DELAY=${PMM_DEV_TELEMETRY_DISABLE_START_DELAY:-1} - - PMM_DEV_TELEMETRY_INTERVAL=${PMM_DEV_TELEMETRY_INTERVAL:-10s} - - PMM_DEV_TELEMETRY_RETRY_BACKOFF=${PMM_DEV_TELEMETRY_RETRY_BACKOFF:-10s} + # - PMM_DEV_TELEMETRY_INTERVAL=10s + # - PMM_DEV_TELEMETRY_DISABLE_START_DELAY=1 + # - PMM_DEV_TELEMETRY_RETRY_BACKOFF=10s # - PMM_CLICKHOUSE_ADDR=127.0.0.1:9000 # - PMM_CLICKHOUSE_DATABASE=pmm # - PMM_CLICKHOUSE_USER=default # - PMM_CLICKHOUSE_PASSWORD= # - PMM_CLICKHOUSE_IS_CLUSTER=1 # - PMM_CLICKHOUSE_CLUSTER_NAME=pmmclickhouse - - PMM_DEBUG=${PMM_DEBUG:-0} + # - PMM_DEBUG=1 # - PMM_DEV_ADVISOR_CHECKS_FILE=/srv/checks/local-checks.yml # - PMM_POSTGRES_ADDR=pg - - PMM_POSTGRES_DBNAME=${PMM_POSTGRES_DBNAME:-pmm-managed} - - PMM_POSTGRES_USERNAME=${PMM_POSTGRES_USERNAME:-pmm-managed} + # - PMM_POSTGRES_DBNAME=pmm-managed + # - PMM_POSTGRES_USERNAME=pmm-managed # - PMM_POSTGRES_DBPASSWORD= # - PMM_POSTGRES_SSL_MODE=verify-full # - PMM_POSTGRES_SSL_CA_PATH=/tmp/certs/root.crt