logger: slog improve #267
@@ -190,7 +190,7 @@ func (w *microWorkflow) Execute(ctx context.Context, req *Message, opts ...optio
 | 
				
			|||||||
	steps, err := w.getSteps(options.Start, options.Reverse)
 | 
						steps, err := w.getSteps(options.Start, options.Reverse)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusPending.String())}); werr != nil {
 | 
							if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusPending.String())}); werr != nil {
 | 
				
			||||||
			w.opts.Logger.Errorf(w.opts.Context, "store error: %v", werr)
 | 
								w.opts.Logger.Error(w.opts.Context, "store write error", "error", werr.Error())
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return "", err
 | 
							return "", err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -214,7 +214,7 @@ func (w *microWorkflow) Execute(ctx context.Context, req *Message, opts ...optio
 | 
				
			|||||||
	done := make(chan struct{})
 | 
						done := make(chan struct{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusRunning.String())}); werr != nil {
 | 
						if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusRunning.String())}); werr != nil {
 | 
				
			||||||
		w.opts.Logger.Errorf(w.opts.Context, "store error: %v", werr)
 | 
							w.opts.Logger.Error(w.opts.Context, "store write error", "error", werr.Error())
 | 
				
			||||||
		return eid, werr
 | 
							return eid, werr
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for idx := range steps {
 | 
						for idx := range steps {
 | 
				
			||||||
@@ -239,7 +239,7 @@ func (w *microWorkflow) Execute(ctx context.Context, req *Message, opts ...optio
 | 
				
			|||||||
					return
 | 
										return
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if w.opts.Logger.V(logger.TraceLevel) {
 | 
									if w.opts.Logger.V(logger.TraceLevel) {
 | 
				
			||||||
					w.opts.Logger.Tracef(nctx, "will be executed %v", steps[idx][nidx])
 | 
										w.opts.Logger.Trace(nctx, fmt.Sprintf("step will be executed %v", steps[idx][nidx]))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				cstep := steps[idx][nidx]
 | 
									cstep := steps[idx][nidx]
 | 
				
			||||||
				// nolint: nestif
 | 
									// nolint: nestif
 | 
				
			||||||
@@ -259,21 +259,21 @@ func (w *microWorkflow) Execute(ctx context.Context, req *Message, opts ...optio
 | 
				
			|||||||
						if serr != nil {
 | 
											if serr != nil {
 | 
				
			||||||
							step.SetStatus(StatusFailure)
 | 
												step.SetStatus(StatusFailure)
 | 
				
			||||||
							if werr := stepStore.Write(ctx, step.ID()+w.opts.Store.Options().Separator+"rsp", serr); werr != nil && w.opts.Logger.V(logger.ErrorLevel) {
 | 
												if werr := stepStore.Write(ctx, step.ID()+w.opts.Store.Options().Separator+"rsp", serr); werr != nil && w.opts.Logger.V(logger.ErrorLevel) {
 | 
				
			||||||
								w.opts.Logger.Errorf(ctx, "store write error: %v", werr)
 | 
													w.opts.Logger.Error(ctx, "store write error", "error", werr.Error())
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
							if werr := stepStore.Write(ctx, step.ID()+w.opts.Store.Options().Separator+"status", &codec.Frame{Data: []byte(StatusFailure.String())}); werr != nil && w.opts.Logger.V(logger.ErrorLevel) {
 | 
												if werr := stepStore.Write(ctx, step.ID()+w.opts.Store.Options().Separator+"status", &codec.Frame{Data: []byte(StatusFailure.String())}); werr != nil && w.opts.Logger.V(logger.ErrorLevel) {
 | 
				
			||||||
								w.opts.Logger.Errorf(ctx, "store write error: %v", werr)
 | 
													w.opts.Logger.Error(ctx, "store write error", "error", werr.Error())
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
							cherr <- serr
 | 
												cherr <- serr
 | 
				
			||||||
							return
 | 
												return
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						if werr := stepStore.Write(ctx, step.ID()+w.opts.Store.Options().Separator+"rsp", rsp); werr != nil {
 | 
											if werr := stepStore.Write(ctx, step.ID()+w.opts.Store.Options().Separator+"rsp", rsp); werr != nil {
 | 
				
			||||||
							w.opts.Logger.Errorf(ctx, "store write error: %v", werr)
 | 
												w.opts.Logger.Error(ctx, "store write error", "error", werr.Error())
 | 
				
			||||||
							cherr <- werr
 | 
												cherr <- werr
 | 
				
			||||||
							return
 | 
												return
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						if werr := stepStore.Write(ctx, step.ID()+w.opts.Store.Options().Separator+"status", &codec.Frame{Data: []byte(StatusSuccess.String())}); werr != nil {
 | 
											if werr := stepStore.Write(ctx, step.ID()+w.opts.Store.Options().Separator+"status", &codec.Frame{Data: []byte(StatusSuccess.String())}); werr != nil {
 | 
				
			||||||
							w.opts.Logger.Errorf(ctx, "store write error: %v", werr)
 | 
												w.opts.Logger.Error(ctx, "store write error", "error", werr.Error())
 | 
				
			||||||
							cherr <- werr
 | 
												cherr <- werr
 | 
				
			||||||
							return
 | 
												return
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
@@ -292,16 +292,16 @@ func (w *microWorkflow) Execute(ctx context.Context, req *Message, opts ...optio
 | 
				
			|||||||
					if serr != nil {
 | 
										if serr != nil {
 | 
				
			||||||
						cstep.SetStatus(StatusFailure)
 | 
											cstep.SetStatus(StatusFailure)
 | 
				
			||||||
						if werr := stepStore.Write(ctx, cstep.ID()+w.opts.Store.Options().Separator+"rsp", serr); werr != nil && w.opts.Logger.V(logger.ErrorLevel) {
 | 
											if werr := stepStore.Write(ctx, cstep.ID()+w.opts.Store.Options().Separator+"rsp", serr); werr != nil && w.opts.Logger.V(logger.ErrorLevel) {
 | 
				
			||||||
							w.opts.Logger.Errorf(ctx, "store write error: %v", werr)
 | 
												w.opts.Logger.Error(ctx, "store write error", "error", werr.Error())
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						if werr := stepStore.Write(ctx, cstep.ID()+w.opts.Store.Options().Separator+"status", &codec.Frame{Data: []byte(StatusFailure.String())}); werr != nil && w.opts.Logger.V(logger.ErrorLevel) {
 | 
											if werr := stepStore.Write(ctx, cstep.ID()+w.opts.Store.Options().Separator+"status", &codec.Frame{Data: []byte(StatusFailure.String())}); werr != nil && w.opts.Logger.V(logger.ErrorLevel) {
 | 
				
			||||||
							w.opts.Logger.Errorf(ctx, "store write error: %v", werr)
 | 
												w.opts.Logger.Error(ctx, "store write error", "error", werr.Error())
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						cherr <- serr
 | 
											cherr <- serr
 | 
				
			||||||
						return
 | 
											return
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					if werr := stepStore.Write(ctx, cstep.ID()+w.opts.Store.Options().Separator+"rsp", rsp); werr != nil {
 | 
										if werr := stepStore.Write(ctx, cstep.ID()+w.opts.Store.Options().Separator+"rsp", rsp); werr != nil {
 | 
				
			||||||
						w.opts.Logger.Errorf(ctx, "store write error: %v", werr)
 | 
											w.opts.Logger.Error(ctx, "store write error", "error", werr.Error())
 | 
				
			||||||
						cherr <- werr
 | 
											cherr <- werr
 | 
				
			||||||
						return
 | 
											return
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
@@ -319,7 +319,7 @@ func (w *microWorkflow) Execute(ctx context.Context, req *Message, opts ...optio
 | 
				
			|||||||
		return eid, nil
 | 
							return eid, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logger.Tracef(ctx, "wait for finish or error")
 | 
						w.opts.Logger.Trace(ctx, "wait for finish or error")
 | 
				
			||||||
	select {
 | 
						select {
 | 
				
			||||||
	case <-nctx.Done():
 | 
						case <-nctx.Done():
 | 
				
			||||||
		err = nctx.Err()
 | 
							err = nctx.Err()
 | 
				
			||||||
@@ -335,15 +335,15 @@ func (w *microWorkflow) Execute(ctx context.Context, req *Message, opts ...optio
 | 
				
			|||||||
	switch {
 | 
						switch {
 | 
				
			||||||
	case nctx.Err() != nil:
 | 
						case nctx.Err() != nil:
 | 
				
			||||||
		if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusAborted.String())}); werr != nil {
 | 
							if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusAborted.String())}); werr != nil {
 | 
				
			||||||
			w.opts.Logger.Errorf(w.opts.Context, "store error: %v", werr)
 | 
								w.opts.Logger.Error(w.opts.Context, "store write error", "error", werr.Error())
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	case err == nil:
 | 
						case err == nil:
 | 
				
			||||||
		if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusSuccess.String())}); werr != nil {
 | 
							if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusSuccess.String())}); werr != nil {
 | 
				
			||||||
			w.opts.Logger.Errorf(w.opts.Context, "store error: %v", werr)
 | 
								w.opts.Logger.Error(w.opts.Context, "store write error", "error", werr.Error())
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	case err != nil:
 | 
						case err != nil:
 | 
				
			||||||
		if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusFailure.String())}); werr != nil {
 | 
							if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusFailure.String())}); werr != nil {
 | 
				
			||||||
			w.opts.Logger.Errorf(w.opts.Context, "store error: %v", werr)
 | 
								w.opts.Logger.Error(w.opts.Context, "store write error", "error", werr.Error())
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							@@ -8,7 +8,6 @@ require (
 | 
				
			|||||||
	github.com/google/uuid v1.3.1
 | 
						github.com/google/uuid v1.3.1
 | 
				
			||||||
	github.com/patrickmn/go-cache v2.1.0+incompatible
 | 
						github.com/patrickmn/go-cache v2.1.0+incompatible
 | 
				
			||||||
	github.com/silas/dag v0.0.0-20220518035006-a7e85ada93c5
 | 
						github.com/silas/dag v0.0.0-20220518035006-a7e85ada93c5
 | 
				
			||||||
	golang.org/x/exp v0.0.0-20230905200255-921286631fa9
 | 
					 | 
				
			||||||
	golang.org/x/sync v0.3.0
 | 
						golang.org/x/sync v0.3.0
 | 
				
			||||||
	golang.org/x/sys v0.12.0
 | 
						golang.org/x/sys v0.12.0
 | 
				
			||||||
	google.golang.org/grpc v1.58.2
 | 
						google.golang.org/grpc v1.58.2
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							@@ -13,8 +13,6 @@ github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaR
 | 
				
			|||||||
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
 | 
					github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
 | 
				
			||||||
github.com/silas/dag v0.0.0-20220518035006-a7e85ada93c5 h1:G/FZtUu7a6NTWl3KUHMV9jkLAh/Rvtf03NWMHaEDl+E=
 | 
					github.com/silas/dag v0.0.0-20220518035006-a7e85ada93c5 h1:G/FZtUu7a6NTWl3KUHMV9jkLAh/Rvtf03NWMHaEDl+E=
 | 
				
			||||||
github.com/silas/dag v0.0.0-20220518035006-a7e85ada93c5/go.mod h1:7RTUFBdIRC9nZ7/3RyRNH1bdqIShrDejd1YbLwgPS+I=
 | 
					github.com/silas/dag v0.0.0-20220518035006-a7e85ada93c5/go.mod h1:7RTUFBdIRC9nZ7/3RyRNH1bdqIShrDejd1YbLwgPS+I=
 | 
				
			||||||
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
 | 
					 | 
				
			||||||
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
 | 
					 | 
				
			||||||
golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
 | 
					golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
 | 
				
			||||||
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
 | 
					golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
 | 
				
			||||||
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
 | 
					golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,298 +0,0 @@
 | 
				
			|||||||
// Package wrapper provides wrapper for Logger
 | 
					 | 
				
			||||||
package wrapper
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"context"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"go.unistack.org/micro/v4/client"
 | 
					 | 
				
			||||||
	"go.unistack.org/micro/v4/logger"
 | 
					 | 
				
			||||||
	"go.unistack.org/micro/v4/options"
 | 
					 | 
				
			||||||
	"go.unistack.org/micro/v4/server"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	// DefaultClientCallObserver called by wrapper in client Call
 | 
					 | 
				
			||||||
	DefaultClientCallObserver = func(ctx context.Context, req client.Request, rsp interface{}, opts []options.Option, err error) []string {
 | 
					 | 
				
			||||||
		labels := []string{"service", req.Service(), "endpoint", req.Endpoint()}
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			labels = append(labels, "error", err.Error())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return labels
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// DefaultClientStreamObserver called by wrapper in client Stream
 | 
					 | 
				
			||||||
	DefaultClientStreamObserver = func(ctx context.Context, req client.Request, opts []options.Option, stream client.Stream, err error) []string {
 | 
					 | 
				
			||||||
		labels := []string{"service", req.Service(), "endpoint", req.Endpoint()}
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			labels = append(labels, "error", err.Error())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return labels
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// DefaultServerHandlerObserver called by wrapper in server Handler
 | 
					 | 
				
			||||||
	DefaultServerHandlerObserver = func(ctx context.Context, req server.Request, rsp interface{}, err error) []string {
 | 
					 | 
				
			||||||
		labels := []string{"service", req.Service(), "endpoint", req.Endpoint()}
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			labels = append(labels, "error", err.Error())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return labels
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// DefaultClientCallFuncObserver called by wrapper in client CallFunc
 | 
					 | 
				
			||||||
	DefaultClientCallFuncObserver = func(ctx context.Context, addr string, req client.Request, rsp interface{}, opts client.CallOptions, err error) []string {
 | 
					 | 
				
			||||||
		labels := []string{"service", req.Service(), "endpoint", req.Endpoint()}
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			labels = append(labels, "error", err.Error())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return labels
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// DefaultSkipEndpoints wrapper not called for this endpoints
 | 
					 | 
				
			||||||
	DefaultSkipEndpoints = []string{"Meter.Metrics", "Health.Live", "Health.Ready", "Health.Version"}
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type lWrapper struct {
 | 
					 | 
				
			||||||
	client.Client
 | 
					 | 
				
			||||||
	serverHandler  server.HandlerFunc
 | 
					 | 
				
			||||||
	clientCallFunc client.CallFunc
 | 
					 | 
				
			||||||
	opts           Options
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type (
 | 
					 | 
				
			||||||
	// ClientCallObserver func signature
 | 
					 | 
				
			||||||
	ClientCallObserver func(context.Context, client.Request, interface{}, []options.Option, error) []string
 | 
					 | 
				
			||||||
	// ClientStreamObserver func signature
 | 
					 | 
				
			||||||
	ClientStreamObserver func(context.Context, client.Request, []options.Option, client.Stream, error) []string
 | 
					 | 
				
			||||||
	// ClientCallFuncObserver func signature
 | 
					 | 
				
			||||||
	ClientCallFuncObserver func(context.Context, string, client.Request, interface{}, client.CallOptions, error) []string
 | 
					 | 
				
			||||||
	// ServerHandlerObserver func signature
 | 
					 | 
				
			||||||
	ServerHandlerObserver func(context.Context, server.Request, interface{}, error) []string
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Options struct for wrapper
 | 
					 | 
				
			||||||
type Options struct {
 | 
					 | 
				
			||||||
	// Logger that used for log
 | 
					 | 
				
			||||||
	Logger logger.Logger
 | 
					 | 
				
			||||||
	// ServerHandlerObservers funcs
 | 
					 | 
				
			||||||
	ServerHandlerObservers []ServerHandlerObserver
 | 
					 | 
				
			||||||
	// ClientCallObservers funcs
 | 
					 | 
				
			||||||
	ClientCallObservers []ClientCallObserver
 | 
					 | 
				
			||||||
	// ClientStreamObservers funcs
 | 
					 | 
				
			||||||
	ClientStreamObservers []ClientStreamObserver
 | 
					 | 
				
			||||||
	// ClientCallFuncObservers funcs
 | 
					 | 
				
			||||||
	ClientCallFuncObservers []ClientCallFuncObserver
 | 
					 | 
				
			||||||
	// SkipEndpoints
 | 
					 | 
				
			||||||
	SkipEndpoints []string
 | 
					 | 
				
			||||||
	// Level for logger
 | 
					 | 
				
			||||||
	Level logger.Level
 | 
					 | 
				
			||||||
	// Enabled flag
 | 
					 | 
				
			||||||
	Enabled bool
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Option func signature
 | 
					 | 
				
			||||||
type Option func(*Options)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewOptions creates Options from Option slice
 | 
					 | 
				
			||||||
func NewOptions(opts ...Option) Options {
 | 
					 | 
				
			||||||
	options := Options{
 | 
					 | 
				
			||||||
		Logger:                  logger.DefaultLogger,
 | 
					 | 
				
			||||||
		Level:                   logger.TraceLevel,
 | 
					 | 
				
			||||||
		ClientCallObservers:     []ClientCallObserver{DefaultClientCallObserver},
 | 
					 | 
				
			||||||
		ClientStreamObservers:   []ClientStreamObserver{DefaultClientStreamObserver},
 | 
					 | 
				
			||||||
		ClientCallFuncObservers: []ClientCallFuncObserver{DefaultClientCallFuncObserver},
 | 
					 | 
				
			||||||
		ServerHandlerObservers:  []ServerHandlerObserver{DefaultServerHandlerObserver},
 | 
					 | 
				
			||||||
		SkipEndpoints:           DefaultSkipEndpoints,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for _, o := range opts {
 | 
					 | 
				
			||||||
		o(&options)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return options
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// WithEnabled enable/diable flag
 | 
					 | 
				
			||||||
func WithEnabled(b bool) Option {
 | 
					 | 
				
			||||||
	return func(o *Options) {
 | 
					 | 
				
			||||||
		o.Enabled = b
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// WithLevel log level
 | 
					 | 
				
			||||||
func WithLevel(l logger.Level) Option {
 | 
					 | 
				
			||||||
	return func(o *Options) {
 | 
					 | 
				
			||||||
		o.Level = l
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// WithLogger logger
 | 
					 | 
				
			||||||
func WithLogger(l logger.Logger) Option {
 | 
					 | 
				
			||||||
	return func(o *Options) {
 | 
					 | 
				
			||||||
		o.Logger = l
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// WithClientCallObservers funcs
 | 
					 | 
				
			||||||
func WithClientCallObservers(ob ...ClientCallObserver) Option {
 | 
					 | 
				
			||||||
	return func(o *Options) {
 | 
					 | 
				
			||||||
		o.ClientCallObservers = ob
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// WithClientStreamObservers funcs
 | 
					 | 
				
			||||||
func WithClientStreamObservers(ob ...ClientStreamObserver) Option {
 | 
					 | 
				
			||||||
	return func(o *Options) {
 | 
					 | 
				
			||||||
		o.ClientStreamObservers = ob
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// WithClientCallFuncObservers funcs
 | 
					 | 
				
			||||||
func WithClientCallFuncObservers(ob ...ClientCallFuncObserver) Option {
 | 
					 | 
				
			||||||
	return func(o *Options) {
 | 
					 | 
				
			||||||
		o.ClientCallFuncObservers = ob
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// WithServerHandlerObservers funcs
 | 
					 | 
				
			||||||
func WithServerHandlerObservers(ob ...ServerHandlerObserver) Option {
 | 
					 | 
				
			||||||
	return func(o *Options) {
 | 
					 | 
				
			||||||
		o.ServerHandlerObservers = ob
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SkipEndpoins
 | 
					 | 
				
			||||||
func SkipEndpoints(eps ...string) Option {
 | 
					 | 
				
			||||||
	return func(o *Options) {
 | 
					 | 
				
			||||||
		o.SkipEndpoints = append(o.SkipEndpoints, eps...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *lWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...options.Option) error {
 | 
					 | 
				
			||||||
	err := l.Client.Call(ctx, req, rsp, opts...)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	endpoint := fmt.Sprintf("%s.%s", req.Service(), req.Endpoint())
 | 
					 | 
				
			||||||
	for _, ep := range l.opts.SkipEndpoints {
 | 
					 | 
				
			||||||
		if ep == endpoint {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if !l.opts.Enabled {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var labels []string
 | 
					 | 
				
			||||||
	for _, o := range l.opts.ClientCallObservers {
 | 
					 | 
				
			||||||
		labels = append(labels, o(ctx, req, rsp, opts, err)...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	l.opts.Logger.Fields(labels).Log(ctx, l.opts.Level)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *lWrapper) Stream(ctx context.Context, req client.Request, opts ...options.Option) (client.Stream, error) {
 | 
					 | 
				
			||||||
	stream, err := l.Client.Stream(ctx, req, opts...)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	endpoint := fmt.Sprintf("%s.%s", req.Service(), req.Endpoint())
 | 
					 | 
				
			||||||
	for _, ep := range l.opts.SkipEndpoints {
 | 
					 | 
				
			||||||
		if ep == endpoint {
 | 
					 | 
				
			||||||
			return stream, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if !l.opts.Enabled {
 | 
					 | 
				
			||||||
		return stream, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var labels []string
 | 
					 | 
				
			||||||
	for _, o := range l.opts.ClientStreamObservers {
 | 
					 | 
				
			||||||
		labels = append(labels, o(ctx, req, opts, stream, err)...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	l.opts.Logger.Fields(labels).Log(ctx, l.opts.Level)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return stream, err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *lWrapper) ServerHandler(ctx context.Context, req server.Request, rsp interface{}) error {
 | 
					 | 
				
			||||||
	err := l.serverHandler(ctx, req, rsp)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	endpoint := req.Endpoint()
 | 
					 | 
				
			||||||
	for _, ep := range l.opts.SkipEndpoints {
 | 
					 | 
				
			||||||
		if ep == endpoint {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if !l.opts.Enabled {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var labels []string
 | 
					 | 
				
			||||||
	for _, o := range l.opts.ServerHandlerObservers {
 | 
					 | 
				
			||||||
		labels = append(labels, o(ctx, req, rsp, err)...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	l.opts.Logger.Fields(labels).Log(ctx, l.opts.Level)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewClientWrapper accepts an open options and returns a Client Wrapper
 | 
					 | 
				
			||||||
func NewClientWrapper(opts ...Option) client.Wrapper {
 | 
					 | 
				
			||||||
	return func(c client.Client) client.Client {
 | 
					 | 
				
			||||||
		options := NewOptions()
 | 
					 | 
				
			||||||
		for _, o := range opts {
 | 
					 | 
				
			||||||
			o(&options)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return &lWrapper{opts: options, Client: c}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewClientCallWrapper accepts an options and returns a Call Wrapper
 | 
					 | 
				
			||||||
func NewClientCallWrapper(opts ...Option) client.CallWrapper {
 | 
					 | 
				
			||||||
	return func(h client.CallFunc) client.CallFunc {
 | 
					 | 
				
			||||||
		options := NewOptions()
 | 
					 | 
				
			||||||
		for _, o := range opts {
 | 
					 | 
				
			||||||
			o(&options)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		l := &lWrapper{opts: options, clientCallFunc: h}
 | 
					 | 
				
			||||||
		return l.ClientCallFunc
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *lWrapper) ClientCallFunc(ctx context.Context, addr string, req client.Request, rsp interface{}, opts client.CallOptions) error {
 | 
					 | 
				
			||||||
	err := l.clientCallFunc(ctx, addr, req, rsp, opts)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	endpoint := fmt.Sprintf("%s.%s", req.Service(), req.Endpoint())
 | 
					 | 
				
			||||||
	for _, ep := range l.opts.SkipEndpoints {
 | 
					 | 
				
			||||||
		if ep == endpoint {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if !l.opts.Enabled {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var labels []string
 | 
					 | 
				
			||||||
	for _, o := range l.opts.ClientCallFuncObservers {
 | 
					 | 
				
			||||||
		labels = append(labels, o(ctx, addr, req, rsp, opts, err)...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	l.opts.Logger.Fields(labels).Log(ctx, l.opts.Level)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewServerHandlerWrapper accepts an options and returns a Handler Wrapper
 | 
					 | 
				
			||||||
func NewServerHandlerWrapper(opts ...Option) server.HandlerWrapper {
 | 
					 | 
				
			||||||
	return func(h server.HandlerFunc) server.HandlerFunc {
 | 
					 | 
				
			||||||
		options := NewOptions()
 | 
					 | 
				
			||||||
		for _, o := range opts {
 | 
					 | 
				
			||||||
			o(&options)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		l := &lWrapper{opts: options, serverHandler: h}
 | 
					 | 
				
			||||||
		return l.ServerHandler
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user