From e076f8041662e59b8c3cad3741060277dc22d552 Mon Sep 17 00:00:00 2001 From: James Hillyerd Date: Sat, 31 Mar 2018 14:06:58 -0700 Subject: [PATCH] smtp: Use zerolog hooks for warns/errors expvars #90 --- pkg/server/smtp/handler.go | 4 +++- pkg/server/smtp/listener.go | 42 ++++++++++++++++++------------------- pkg/server/smtp/loghook.go | 15 +++++++++++++ 3 files changed, 39 insertions(+), 22 deletions(-) create mode 100644 pkg/server/smtp/loghook.go diff --git a/pkg/server/smtp/handler.go b/pkg/server/smtp/handler.go index fea9817..a86be5e 100644 --- a/pkg/server/smtp/handler.go +++ b/pkg/server/smtp/handler.go @@ -113,7 +113,9 @@ func (s *Session) String() string { * 5. Goto 2 */ func (s *Server) startSession(id int, conn net.Conn) { - logger := log.With().Str("module", "smtp").Str("remote", conn.RemoteAddr().String()). + logger := log.Hook(logHook{}).With(). + Str("module", "smtp"). + Str("remote", conn.RemoteAddr().String()). Int("session", id).Logger() logger.Info().Msg("Starting SMTP session") expConnectsCurrent.Add(1) diff --git a/pkg/server/smtp/listener.go b/pkg/server/smtp/listener.go index e047520..e3a63e2 100644 --- a/pkg/server/smtp/listener.go +++ b/pkg/server/smtp/listener.go @@ -36,6 +36,27 @@ func init() { }) } +var ( + // Raw stat collectors + expConnectsTotal = new(expvar.Int) + expConnectsCurrent = new(expvar.Int) + expReceivedTotal = new(expvar.Int) + expErrorsTotal = new(expvar.Int) + expWarnsTotal = new(expvar.Int) + + // History of certain stats + deliveredHist = list.New() + connectsHist = list.New() + errorsHist = list.New() + warnsHist = list.New() + + // History rendered as comma delim string + expReceivedHist = new(expvar.String) + expConnectsHist = new(expvar.String) + expErrorsHist = new(expvar.String) + expWarnsHist = new(expvar.String) +) + // Server holds the configuration and state of our SMTP server type Server struct { // TODO(#91) Refactor config items out of this struct @@ -59,27 +80,6 @@ type Server struct { waitgroup *sync.WaitGroup // Waitgroup tracks individual sessions } -var ( - // Raw stat collectors - expConnectsTotal = new(expvar.Int) - expConnectsCurrent = new(expvar.Int) - expReceivedTotal = new(expvar.Int) - expErrorsTotal = new(expvar.Int) - expWarnsTotal = new(expvar.Int) - - // History of certain stats - deliveredHist = list.New() - connectsHist = list.New() - errorsHist = list.New() - warnsHist = list.New() - - // History rendered as comma delim string - expReceivedHist = new(expvar.String) - expConnectsHist = new(expvar.String) - expErrorsHist = new(expvar.String) - expWarnsHist = new(expvar.String) -) - // NewServer creates a new Server instance with the specificed config func NewServer( cfg config.SMTP, diff --git a/pkg/server/smtp/loghook.go b/pkg/server/smtp/loghook.go new file mode 100644 index 0000000..59f69da --- /dev/null +++ b/pkg/server/smtp/loghook.go @@ -0,0 +1,15 @@ +package smtp + +import "github.com/rs/zerolog" + +type logHook struct{} + +// Run implements a zerolog hook that updates the SMTP warning/error expvars. +func (h logHook) Run(e *zerolog.Event, level zerolog.Level, msg string) { + switch level { + case zerolog.WarnLevel: + expWarnsTotal.Add(1) + case zerolog.ErrorLevel: + expErrorsTotal.Add(1) + } +}