Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 35 additions & 15 deletions managed/services/telemetry/telemetry.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,15 @@ 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"

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 (
Expand Down Expand Up @@ -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,
Expand All @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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(": ")
Expand Down
16 changes: 10 additions & 6 deletions utils/logger/global.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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())
}
Loading