Skip to content

Commit

Permalink
Finish work on request logger middleware
Browse files Browse the repository at this point in the history
  • Loading branch information
Pr0Ger committed Apr 15, 2020
1 parent cc9486c commit 7f96896
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 9 deletions.
41 changes: 34 additions & 7 deletions logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ import (
"go.uber.org/zap/zapcore"
)

// NewCore will create handy Core with sensible defaults:
// - messages with error level and higher will go to stderr, everything else to stdout
// - use json encoder for production and console for development
func NewCore(debug bool) zapcore.Core {
var encoder zapcore.Encoder
if debug {
Expand All @@ -29,17 +32,41 @@ func NewCore(debug bool) zapcore.Core {
)
}

// RequestLogger is a middleware for injecting sentry.Hub and zap.Logger into request context.
// If provided logger has sentryCoreWrapper as core injected logger will have core with same local core and
// sentry core based on an empty Hub for each request so breadcrumbs list will be empty each time.
// In other case logger.Core() will be used as a local core and sentry core will be created if sentry is initialized
func RequestLogger(logger *zap.Logger) func(next http.Handler) http.Handler {
core := logger.Core()
rootHub := sentry.CurrentHub()
if wrappedCore, ok := core.(sentryCoreWrapper); ok {
core = wrappedCore.LocalCore()
rootHub = wrappedCore.SentryCore().hub
localCore := logger.Core()
client := sentry.CurrentHub().Client()
var options []SentryCoreOption
if wrappedCore, ok := localCore.(sentryCoreWrapper); ok {
localCore = wrappedCore.LocalCore()
sentryCore := wrappedCore.SentryCore()
client = sentryCore.hub.Client()

if breadcrumbLevel := sentryCore.BreadcrumbLevel; breadcrumbLevel != defaultBreadcrumbLevel {
options = append(options, BreadcrumbLevel(breadcrumbLevel))
}
if eventLevel := sentryCore.BreadcrumbLevel; eventLevel != defaultEventLevel {
options = append(options, EventLevel(eventLevel))
}
}

return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
logger := zap.New(zapcore.NewTee(core, NewSentryCore(rootHub)))
ctx := r.Context()

core := localCore
if client != nil {
hub := sentry.NewHub(client, sentry.NewScope())
core = NewSentryCoreWrapper(localCore, hub, options...)

ctx = WithHub(ctx, hub)
}

logger := zap.New(core)
ctx = WithLogger(ctx, logger)

ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor)

Expand All @@ -54,7 +81,7 @@ func RequestLogger(logger *zap.Logger) func(next http.Handler) http.Handler {
)
}()

next.ServeHTTP(ww, r.WithContext(WithLogger(r.Context(), logger)))
next.ServeHTTP(ww, r.WithContext(ctx))
})
}
}
9 changes: 7 additions & 2 deletions sentry_core.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ import (
"go.uber.org/zap/zapcore"
)

const (
defaultBreadcrumbLevel = zapcore.DebugLevel
defaultEventLevel = zapcore.ErrorLevel
)

type SentryCore struct {
zapcore.LevelEnabler

Expand Down Expand Up @@ -47,8 +52,8 @@ func NewSentryCore(hub *sentry.Hub, options ...SentryCoreOption) zapcore.Core {
core := &SentryCore{
hub: hub,
scope: hub.PushScope(),
BreadcrumbLevel: zapcore.DebugLevel,
EventLevel: zapcore.ErrorLevel,
BreadcrumbLevel: defaultBreadcrumbLevel,
EventLevel: defaultEventLevel,
}

for _, option := range options {
Expand Down

0 comments on commit 7f96896

Please sign in to comment.