Skip to content

Commit

Permalink
feat: Support extracting fields from CallMeta
Browse files Browse the repository at this point in the history
Extend options.WithFieldsFromContext via a new
options.WithFieldsFromContextAndCallMeta in a backward compatible
fashion such that it supports extracting fields not only from the
Context but also from the CallMeta.
  • Loading branch information
fsaintjacques committed Aug 29, 2023
1 parent 99b851f commit 80f44e5
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 13 deletions.
4 changes: 2 additions & 2 deletions interceptors/logging/interceptors.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,9 +148,9 @@ func reportable(logger Logger, opts *options) interceptors.CommonReportableFunc
fields = append(fields, "peer.address", peer.Addr.String())
}
}
if opts.fieldsFromCtxFn != nil {
if opts.fieldsFromCtxCallMetaFn != nil {
// fieldsFromCtxFn dups override the existing fields.
fields = opts.fieldsFromCtxFn(ctx).AppendUnique(fields)
fields = opts.fieldsFromCtxCallMetaFn(ctx, c).AppendUnique(fields)
}

singleUseFields := Fields{"grpc.start_time", time.Now().Format(opts.timestampFormat)}
Expand Down
3 changes: 1 addition & 2 deletions interceptors/logging/interceptors_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -173,8 +173,7 @@ type loggingClientServerSuite struct {
}

func customFields(_ context.Context) logging.Fields {
// Add custom fields, one new and one that should be ignored as it duplicates the standard field.
return logging.Fields{"custom-field", "yolo", logging.ServiceFieldKey, "something different"}
return logging.Fields{"custom-field", "yolo"}
}

func TestSuite(t *testing.T) {
Expand Down
31 changes: 22 additions & 9 deletions interceptors/logging/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"fmt"
"time"

"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
Expand Down Expand Up @@ -53,12 +54,12 @@ var (
)

type options struct {
levelFunc CodeToLevel
loggableEvents []LoggableEvent
codeFunc ErrorToCode
durationFieldFunc DurationToFields
timestampFormat string
fieldsFromCtxFn fieldsFromCtxFn
levelFunc CodeToLevel
loggableEvents []LoggableEvent
codeFunc ErrorToCode
durationFieldFunc DurationToFields
timestampFormat string
fieldsFromCtxCallMetaFn fieldsFromCtxCallMetaFn
}

type Option func(*options)
Expand Down Expand Up @@ -130,12 +131,24 @@ func DefaultClientCodeToLevel(code codes.Code) Level {
}
}

type fieldsFromCtxFn func(ctx context.Context) Fields
type (
fieldsFromCtxFn func(ctx context.Context) Fields
fieldsFromCtxCallMetaFn func(ctx context.Context, c interceptors.CallMeta) Fields
)

// WithFieldsFromContext allows overriding existing or adding extra fields to all log messages per given request.
// WithFieldsFromContext allows overriding existing or adding extra fields to all log messages per given context
func WithFieldsFromContext(f fieldsFromCtxFn) Option {
return func(o *options) {
o.fieldsFromCtxFn = f
o.fieldsFromCtxCallMetaFn = func(ctx context.Context, _ interceptors.CallMeta) Fields {
return f(ctx)
}
}
}

// WithFieldsFromContextAndCallMeta allows overriding existing or adding extra fields to all log messages per given context and interceptor.CallMeta
func WithFieldsFromContextAndCallMeta(f fieldsFromCtxCallMetaFn) Option {
return func(o *options) {
o.fieldsFromCtxCallMetaFn = f
}
}

Expand Down

0 comments on commit 80f44e5

Please sign in to comment.