From 1c001ed9df9b7b8a4a319ba743dca4fd00d2b1e0 Mon Sep 17 00:00:00 2001 From: yusing Date: Sat, 29 Mar 2025 02:55:26 +0800 Subject: [PATCH] refactor: clean up logger and metric initialization flow --- cmd/main.go | 5 +++++ internal/docker/client.go | 10 ++++----- internal/logging/logging.go | 4 ++-- internal/logging/memlogger/mem_logger.go | 12 ++--------- internal/metrics/period/poller.go | 24 +++++++++++++--------- internal/metrics/systeminfo/system_info.go | 4 ---- 6 files changed, 27 insertions(+), 32 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 9d49a8fd..d93179a4 100755 --- a/cmd/main.go +++ b/cmd/main.go @@ -15,6 +15,8 @@ import ( "github.com/yusing/go-proxy/internal/gperr" "github.com/yusing/go-proxy/internal/homepage" "github.com/yusing/go-proxy/internal/logging" + "github.com/yusing/go-proxy/internal/logging/memlogger" + "github.com/yusing/go-proxy/internal/metrics/systeminfo" "github.com/yusing/go-proxy/internal/metrics/uptime" "github.com/yusing/go-proxy/internal/net/gphttp/middleware" "github.com/yusing/go-proxy/internal/route/routes/routequery" @@ -73,12 +75,14 @@ func main() { } if args.Command == common.CommandStart { + logging.InitLogger(os.Stderr, memlogger.GetMemLogger()) logging.Info().Msgf("GoDoxy version %s", pkg.GetVersion()) logging.Trace().Msg("trace enabled") parallel( internal.InitIconListCache, homepage.InitOverridesConfig, favicon.InitIconCache, + systeminfo.Poller.Start, ) if common.APIJWTSecret == nil { @@ -111,6 +115,7 @@ func main() { var err gperr.Error if cfg, err = config.Load(); err != nil { gperr.LogWarn("errors in config", err) + err = nil } switch args.Command { diff --git a/internal/docker/client.go b/internal/docker/client.go index 20fcd0e2..a276f610 100644 --- a/internal/docker/client.go +++ b/internal/docker/client.go @@ -35,11 +35,6 @@ type ( var ( clientMap = make(map[string]*SharedClient, 10) clientMapMu sync.RWMutex - - clientOptEnvHost = []client.Opt{ - client.WithHostFromEnv(), - client.WithAPIVersionNegotiation(), - } ) const ( @@ -151,7 +146,10 @@ func NewClient(host string) (*SharedClient, error) { case "": return nil, errors.New("empty docker host") case common.DockerHostFromEnv: - opt = clientOptEnvHost + opt = []client.Opt{ + client.WithHostFromEnv(), + client.WithAPIVersionNegotiation(), + } default: helper, err := connhelper.GetConnectionHelper(host) if err != nil { diff --git a/internal/logging/logging.go b/internal/logging/logging.go index 33c22737..fe77e4a7 100644 --- a/internal/logging/logging.go +++ b/internal/logging/logging.go @@ -45,9 +45,9 @@ func fmtMessage(msg string) string { return strutils.JoinRune(lines, '\n') } -func InitLogger(out io.Writer) { +func InitLogger(out ...io.Writer) { writer := zerolog.ConsoleWriter{ - Out: out, + Out: zerolog.MultiLevelWriter(out...), TimeFormat: timeFmt, FormatMessage: func(msgI interface{}) string { // pad spaces for each line return fmtMessage(msgI.(string)) diff --git a/internal/logging/memlogger/mem_logger.go b/internal/logging/memlogger/mem_logger.go index 37ab2e78..cc0316a4 100644 --- a/internal/logging/memlogger/mem_logger.go +++ b/internal/logging/memlogger/mem_logger.go @@ -5,13 +5,10 @@ import ( "context" "io" "net/http" - "os" "sync" "time" "github.com/coder/websocket" - "github.com/rs/zerolog" - "github.com/yusing/go-proxy/internal/logging" "github.com/yusing/go-proxy/internal/net/gphttp" "github.com/yusing/go-proxy/internal/net/gphttp/gpwebsocket" F "github.com/yusing/go-proxy/internal/utils/functional" @@ -22,7 +19,7 @@ type logEntryRange struct { } type memLogger struct { - bytes.Buffer + *bytes.Buffer sync.RWMutex notifyLock sync.RWMutex connChans F.Map[chan *logEntryRange, struct{}] @@ -42,16 +39,11 @@ const ( ) var memLoggerInstance = &memLogger{ + Buffer: bytes.NewBuffer(make([]byte, maxMemLogSize)), connChans: F.NewMapOf[chan *logEntryRange, struct{}](), listeners: F.NewMapOf[chan []byte, struct{}](), } -func init() { - memLoggerInstance.Grow(maxMemLogSize) - w := zerolog.MultiLevelWriter(os.Stderr, memLoggerInstance) - logging.InitLogger(w) -} - func GetMemLogger() MemLogger { return memLoggerInstance } diff --git a/internal/metrics/period/poller.go b/internal/metrics/period/poller.go index 814f31bc..9422f7a8 100644 --- a/internal/metrics/period/poller.go +++ b/internal/metrics/period/poller.go @@ -7,6 +7,7 @@ import ( "net/url" "os" "path/filepath" + "sync" "time" "github.com/yusing/go-proxy/internal/gperr" @@ -42,9 +43,11 @@ const ( saveBaseDir = "data/metrics" ) -func init() { +var initDataDirOnce sync.Once + +func initDataDir() { if err := os.MkdirAll(saveBaseDir, 0o755); err != nil { - panic(fmt.Sprintf("failed to create metrics data directory: %s", err)) + logging.Error().Err(err).Msg("failed to create metrics data directory") } } @@ -74,6 +77,7 @@ func (p *Poller[T, AggregateT]) load() error { } func (p *Poller[T, AggregateT]) save() error { + initDataDirOnce.Do(initDataDir) entries, err := json.Marshal(p.period) if err != nil { return err @@ -131,16 +135,16 @@ func (p *Poller[T, AggregateT]) pollWithTimeout(ctx context.Context) { func (p *Poller[T, AggregateT]) Start() { t := task.RootTask("poller." + p.name) - go func() { - err := p.load() - if err != nil { - if !os.IsNotExist(err) { - logging.Error().Err(err).Msgf("failed to load last metrics data for %s", p.name) - } - } else { - logging.Debug().Msgf("Loaded last metrics data for %s, %d entries", p.name, p.period.Total()) + err := p.load() + if err != nil { + if !os.IsNotExist(err) { + logging.Error().Err(err).Msgf("failed to load last metrics data for %s", p.name) } + } else { + logging.Debug().Msgf("Loaded last metrics data for %s, %d entries", p.name, p.period.Total()) + } + go func() { pollTicker := time.NewTicker(pollInterval) gatherErrsTicker := time.NewTicker(gatherErrsInterval) saveTicker := time.NewTicker(saveInterval) diff --git a/internal/metrics/systeminfo/system_info.go b/internal/metrics/systeminfo/system_info.go index ba4354b0..569967de 100644 --- a/internal/metrics/systeminfo/system_info.go +++ b/internal/metrics/systeminfo/system_info.go @@ -96,10 +96,6 @@ var allQueries = []string{ var Poller = period.NewPoller("system_info", getSystemInfo, aggregate) -func init() { - Poller.Start() -} - func _() { // check if this behavior is not changed var _ sensors.Warnings = disk.Warnings{} }