/
zap.go
92 lines (76 loc) · 2.18 KB
/
zap.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package pubsubzap
import (
"context"
"time"
"github.com/lileio/pubsub"
opentracing "github.com/opentracing/opentracing-go"
zipkintracing "github.com/openzipkin/zipkin-go-opentracing"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// DefaultLogger creates the default, minimal setup if a no logger is passed
// to the middleware when setup
func DefaultLogger() *zap.Logger {
config := zap.NewDevelopmentConfig()
config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
logger, _ := config.Build()
return logger
}
// Middleware is middleware for zap logging
type Middleware struct {
Logger *zap.Logger
}
// SubscribeInterceptor returns a subscriber middleware with added logging via Zap
func (o Middleware) SubscribeInterceptor(opts pubsub.HandlerOptions, next pubsub.MsgHandler) pubsub.MsgHandler {
return func(ctx context.Context, m pubsub.Msg) error {
if o.Logger == nil {
o.Logger = DefaultLogger()
}
start := time.Now()
err := next(ctx, m)
elapsed := time.Now().Sub(start)
var traceID string
span := opentracing.SpanFromContext(ctx)
if span != nil {
zs, ok := span.Context().(zipkintracing.SpanContext)
if ok {
traceID = zs.TraceID.ToHex()
}
}
fields := []zapcore.Field{
zap.String("component", "pubsub"),
zap.String("topic", opts.Topic),
zap.String("handler", opts.Name),
zap.Duration("duration", elapsed),
zap.Error(err),
}
if m.ID != "" {
fields = append(fields, zap.String("id", m.ID))
}
if traceID != "" {
fields = append(fields, zap.String("trace-id", traceID))
}
o.Logger.Debug("Processed PubSub Msg",
fields...,
)
return err
}
}
// PublisherMsgInterceptor add logging to the publisher
func (o Middleware) PublisherMsgInterceptor(serviceName string, next pubsub.PublishHandler) pubsub.PublishHandler {
return func(ctx context.Context, topic string, m *pubsub.Msg) error {
if o.Logger == nil {
o.Logger = DefaultLogger()
}
start := time.Now()
err := next(ctx, topic, m)
elapsed := time.Now().Sub(start)
o.Logger.Debug("Published PubSub Msg",
zap.String("component", "pubsub"),
zap.String("topic", topic),
zap.Duration("duration", elapsed),
zap.Error(err),
)
return err
}
}