mirror of
https://github.com/foomo/keel.git
synced 2025-10-16 12:35:34 +00:00
feat: change labeler signiture
This commit is contained in:
parent
fd37e0deee
commit
da9e516c94
@ -38,21 +38,20 @@ func Telemetry() middleware.Middleware {
|
|||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
*r = *gotsrpc.RequestWithStatsContext(r)
|
*r = *gotsrpc.RequestWithStatsContext(r)
|
||||||
|
|
||||||
// retrieve or inject labeler
|
|
||||||
r, labeler := middleware.LoggerLabelerFromRequest(r)
|
|
||||||
|
|
||||||
next.ServeHTTP(w, r)
|
next.ServeHTTP(w, r)
|
||||||
|
|
||||||
if stats, ok := gotsrpc.GetStatsForRequest(r); ok {
|
if stats, ok := gotsrpc.GetStatsForRequest(r); ok {
|
||||||
labeler.Add(
|
if labeler, ok := middleware.LoggerLabelerFromRequest(r); ok {
|
||||||
zap.String(defaultGOTSRPCFunctionLabel, stats.Func),
|
labeler.Add(
|
||||||
zap.String(defaultGOTSRPCServiceLabel, stats.Service),
|
zap.String(defaultGOTSRPCFunctionLabel, stats.Func),
|
||||||
zap.String(defaultGOTSRPCPackageLabel, stats.Package),
|
zap.String(defaultGOTSRPCServiceLabel, stats.Service),
|
||||||
)
|
zap.String(defaultGOTSRPCPackageLabel, stats.Package),
|
||||||
if stats.ErrorCode != 0 {
|
)
|
||||||
labeler.Add(zap.Int(defaultGOTSRPCErrorCode, stats.ErrorCode))
|
if stats.ErrorCode != 0 {
|
||||||
if stats.ErrorMessage != "" {
|
labeler.Add(zap.Int(defaultGOTSRPCErrorCode, stats.ErrorCode))
|
||||||
labeler.Add(zap.String(defaultGOTSRPCErrorMessage, stats.ErrorMessage))
|
if stats.ErrorMessage != "" {
|
||||||
|
labeler.Add(zap.String(defaultGOTSRPCErrorMessage, stats.ErrorMessage))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -35,9 +35,9 @@ func InjectLabeler(ctx context.Context, key LabelerContextKey) (context.Context,
|
|||||||
return context.WithValue(ctx, key, l), l
|
return context.WithValue(ctx, key, l), l
|
||||||
}
|
}
|
||||||
|
|
||||||
func LabelerFromContext(ctx context.Context, key LabelerContextKey) (context.Context, *Labeler) {
|
func LabelerFromContext(ctx context.Context, key LabelerContextKey) (*Labeler, bool) {
|
||||||
if l, ok := ctx.Value(key).(*Labeler); ok {
|
if l, ok := ctx.Value(key).(*Labeler); ok {
|
||||||
return ctx, l
|
return l, true
|
||||||
}
|
}
|
||||||
return InjectLabeler(ctx, key)
|
return nil, false
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,9 +15,10 @@ const loggerLabelerContextKey log.LabelerContextKey = "github.com/foomo/keel/net
|
|||||||
|
|
||||||
type (
|
type (
|
||||||
LoggerOptions struct {
|
LoggerOptions struct {
|
||||||
Message string
|
Message string
|
||||||
MinWarnCode int
|
MinWarnCode int
|
||||||
MinErrorCode int
|
MinErrorCode int
|
||||||
|
InjectLabeler bool
|
||||||
}
|
}
|
||||||
LoggerOption func(*LoggerOptions)
|
LoggerOption func(*LoggerOptions)
|
||||||
)
|
)
|
||||||
@ -25,9 +26,10 @@ type (
|
|||||||
// GetDefaultLoggerOptions returns the default options
|
// GetDefaultLoggerOptions returns the default options
|
||||||
func GetDefaultLoggerOptions() LoggerOptions {
|
func GetDefaultLoggerOptions() LoggerOptions {
|
||||||
return LoggerOptions{
|
return LoggerOptions{
|
||||||
Message: "handled http request",
|
Message: "handled http request",
|
||||||
MinWarnCode: 400,
|
MinWarnCode: 400,
|
||||||
MinErrorCode: 500,
|
MinErrorCode: 500,
|
||||||
|
InjectLabeler: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,6 +65,13 @@ func LoggerWithMinErrorCode(v int) LoggerOption {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoggerWithInjectLabeler middleware option
|
||||||
|
func LoggerWithInjectLabeler(v bool) LoggerOption {
|
||||||
|
return func(o *LoggerOptions) {
|
||||||
|
o.InjectLabeler = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// LoggerWithOptions middleware
|
// LoggerWithOptions middleware
|
||||||
func LoggerWithOptions(opts LoggerOptions) Middleware {
|
func LoggerWithOptions(opts LoggerOptions) Middleware {
|
||||||
return func(l *zap.Logger, name string, next http.Handler) http.Handler {
|
return func(l *zap.Logger, name string, next http.Handler) http.Handler {
|
||||||
@ -74,8 +83,13 @@ func LoggerWithOptions(opts LoggerOptions) Middleware {
|
|||||||
|
|
||||||
l := log.WithHTTPRequest(l, r)
|
l := log.WithHTTPRequest(l, r)
|
||||||
|
|
||||||
// retrieve or inject labeler
|
var labeler *log.Labeler
|
||||||
r, labeler := LoggerLabelerFromRequest(r)
|
|
||||||
|
if labeler == nil && opts.InjectLabeler {
|
||||||
|
var labelerCtx context.Context
|
||||||
|
labelerCtx, labeler = log.InjectLabeler(r.Context(), loggerLabelerContextKey)
|
||||||
|
r = r.WithContext(labelerCtx)
|
||||||
|
}
|
||||||
|
|
||||||
next.ServeHTTP(wr, r)
|
next.ServeHTTP(wr, r)
|
||||||
|
|
||||||
@ -101,11 +115,10 @@ func LoggerWithOptions(opts LoggerOptions) Middleware {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoggerLabelerFromContext(ctx context.Context) (context.Context, *log.Labeler) {
|
func LoggerLabelerFromContext(ctx context.Context) (*log.Labeler, bool) {
|
||||||
return log.LabelerFromContext(ctx, loggerLabelerContextKey)
|
return log.LabelerFromContext(ctx, loggerLabelerContextKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoggerLabelerFromRequest(r *http.Request) (*http.Request, *log.Labeler) {
|
func LoggerLabelerFromRequest(r *http.Request) (*log.Labeler, bool) {
|
||||||
ctx, l := log.LabelerFromContext(r.Context(), loggerLabelerContextKey)
|
return log.LabelerFromContext(r.Context(), loggerLabelerContextKey)
|
||||||
return r.WithContext(ctx), l
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import (
|
|||||||
"github.com/foomo/keel/log"
|
"github.com/foomo/keel/log"
|
||||||
"github.com/foomo/keel/net/http/middleware"
|
"github.com/foomo/keel/net/http/middleware"
|
||||||
keeltest "github.com/foomo/keel/test"
|
keeltest "github.com/foomo/keel/test"
|
||||||
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ExampleLogger() {
|
func ExampleLogger() {
|
||||||
@ -37,3 +38,42 @@ func ExampleLogger() {
|
|||||||
|
|
||||||
// Output: ok
|
// Output: ok
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExampleLoggerWithInjectLabeler() {
|
||||||
|
svr := keeltest.NewServer()
|
||||||
|
|
||||||
|
// get logger
|
||||||
|
l := svr.Logger()
|
||||||
|
|
||||||
|
// create demo service
|
||||||
|
svs := http.NewServeMux()
|
||||||
|
svs.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
_, _ = w.Write([]byte("ok"))
|
||||||
|
fmt.Println("ok")
|
||||||
|
})
|
||||||
|
|
||||||
|
svr.AddService(
|
||||||
|
keeltest.NewServiceHTTP(l, "demo", svs,
|
||||||
|
func(l *zap.Logger, s string, next http.Handler) http.Handler {
|
||||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if labeler, ok := middleware.LoggerLabelerFromRequest(r); ok {
|
||||||
|
labeler.Add(zap.String("injected", "message"))
|
||||||
|
}
|
||||||
|
next.ServeHTTP(w, r)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
middleware.Logger(
|
||||||
|
middleware.LoggerWithInjectLabeler(true),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
svr.Start()
|
||||||
|
|
||||||
|
resp, err := http.Get(svr.GetService("demo").URL() + "/") //nolint:noctx
|
||||||
|
log.Must(l, err)
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
// Output: ok
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user