add ComponentLogFieldsGetter iface

Component can provide optional fields for the start/stop logger
This commit is contained in:
Roman Khafizianov 2023-06-22 15:59:54 +02:00
parent 78a3bc6aeb
commit 027dcd15a1
No known key found for this signature in database
GPG Key ID: F07A7D55A2684852

View File

@ -4,14 +4,15 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"github.com/anyproto/any-sync/app/logger"
"go.uber.org/zap"
"os" "os"
"runtime" "runtime"
"runtime/debug" "runtime/debug"
"strings" "strings"
"sync" "sync"
"time" "time"
"github.com/anyproto/any-sync/app/logger"
"go.uber.org/zap"
) )
var ( var (
@ -48,6 +49,12 @@ type ComponentRunnable interface {
Close(ctx context.Context) (err error) Close(ctx context.Context) (err error)
} }
type ComponentLogFieldsGetter interface {
// GetLogFields returns additional useful fields for logs to debug log app start time or something else in the future
// You don't need to provide the component name in the field's Key, because it will be added automatically
GetLogFields() []zap.Field
}
type ComponentStatable interface { type ComponentStatable interface {
StateChange(state int) StateChange(state int)
} }
@ -219,7 +226,7 @@ func (app *App) Start(ctx context.Context) (err error) {
case <-done: case <-done:
return return
case <-time.After(StartWarningAfter): case <-time.After(StartWarningAfter):
l := statLogger(app.stopStat, log).With(zap.String("in_progress", currentComponentStarting)) l := app.statLogger(app.stopStat, log).With(zap.String("in_progress", currentComponentStarting))
l.Warn("components start in progress") l.Warn("components start in progress")
} }
}() }()
@ -254,7 +261,8 @@ func (app *App) Start(ctx context.Context) (err error) {
} }
close(done) close(done)
l := statLogger(app.stopStat, log) l := app.statLogger(app.stopStat, log)
if app.startStat.SpentMsTotal > StartWarningAfter.Milliseconds() { if app.startStat.SpentMsTotal > StartWarningAfter.Milliseconds() {
l.Warn("all components started") l.Warn("all components started")
} }
@ -282,13 +290,22 @@ func stackAllGoroutines() []byte {
} }
} }
func statLogger(stat Stat, ctxLogger logger.CtxLogger) logger.CtxLogger { func (app *App) statLogger(stat Stat, ctxLogger logger.CtxLogger) logger.CtxLogger {
l := ctxLogger l := ctxLogger
for k, v := range stat.SpentMsPerComp { for k, v := range stat.SpentMsPerComp {
l = l.With(zap.Int64(k, v)) l = l.With(zap.Int64(k, v))
} }
l = l.With(zap.Int64("total", stat.SpentMsTotal)) l = l.With(zap.Int64("total", stat.SpentMsTotal))
for _, s := range app.components {
// get optional log fields from components
if compLog, ok := s.(ComponentLogFieldsGetter); ok {
for _, val := range compLog.GetLogFields() {
val.Key = s.Name() + "_" + val.Key
l = l.With(val)
}
}
}
return l return l
} }
@ -307,7 +324,7 @@ func (app *App) Close(ctx context.Context) error {
case <-done: case <-done:
return return
case <-time.After(StopWarningAfter): case <-time.After(StopWarningAfter):
statLogger(app.stopStat, log). app.statLogger(app.stopStat, log).
With(zap.String("in_progress", currentComponentStopping)). With(zap.String("in_progress", currentComponentStopping)).
Warn("components close in progress") Warn("components close in progress")
} }
@ -341,7 +358,7 @@ func (app *App) Close(ctx context.Context) error {
return errors.New(strings.Join(errs, "\n")) return errors.New(strings.Join(errs, "\n"))
} }
l := statLogger(app.stopStat, log) l := app.statLogger(app.stopStat, log)
if app.stopStat.SpentMsTotal > StopWarningAfter.Milliseconds() { if app.stopStat.SpentMsTotal > StopWarningAfter.Milliseconds() {
l.Warn("all components have been closed") l.Warn("all components have been closed")
} }