Compare commits
	
		
			9 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 7a325e2c9e | |||
| 7daa927e70 | |||
|  | 54bb7f7acb | ||
| 9eaab95519 | |||
|  | 9219dc6b2a | ||
| 52607b38f1 | |||
|  | 886f046409 | ||
| 4d6d469d40 | |||
|  | 4a944274f4 | 
| @@ -1,5 +1,5 @@ | ||||
| # Micro | ||||
|  | ||||
|  | ||||
| [](https://opensource.org/licenses/Apache-2.0) | ||||
| [](https://pkg.go.dev/go.unistack.org/micro/v4?tab=overview) | ||||
| [](https://git.unistack.org/unistack-org/micro/actions?query=workflow%3Abuild+branch%3Av4+event%3Apush) | ||||
|   | ||||
| @@ -15,11 +15,6 @@ import ( | ||||
| 	"go.unistack.org/micro/v4/tracer" | ||||
| ) | ||||
|  | ||||
| // DefaultCodecs will be used to encode/decode data | ||||
| var DefaultCodecs = map[string]codec.Codec{ | ||||
| 	"application/octet-stream": codec.NewCodec(), | ||||
| } | ||||
|  | ||||
| type noopClient struct { | ||||
| 	funcCall   FuncCall | ||||
| 	funcStream FuncStream | ||||
|   | ||||
| @@ -161,7 +161,7 @@ func NewOptions(opts ...Option) Options { | ||||
| 	options := Options{ | ||||
| 		Context:     context.Background(), | ||||
| 		ContentType: DefaultContentType, | ||||
| 		Codecs:      DefaultCodecs, | ||||
| 		Codecs:      make(map[string]codec.Codec), | ||||
| 		CallOptions: CallOptions{ | ||||
| 			Context:        context.Background(), | ||||
| 			Backoff:        DefaultBackoff, | ||||
|   | ||||
| @@ -52,6 +52,12 @@ type Options struct { | ||||
| 	AddStacktrace bool | ||||
| 	// DedupKeys deduplicate keys in log output | ||||
| 	DedupKeys bool | ||||
| 	// FatalFinalizers runs in order in [logger.Fatal] method | ||||
| 	FatalFinalizers []func(context.Context) | ||||
| } | ||||
|  | ||||
| var DefaultFatalFinalizer = func(ctx context.Context) { | ||||
| 	os.Exit(1) | ||||
| } | ||||
|  | ||||
| // NewOptions creates new options struct | ||||
| @@ -65,6 +71,7 @@ func NewOptions(opts ...Option) Options { | ||||
| 		AddSource:        true, | ||||
| 		TimeFunc:         time.Now, | ||||
| 		Meter:            meter.DefaultMeter, | ||||
| 		FatalFinalizers:  []func(context.Context){DefaultFatalFinalizer}, | ||||
| 	} | ||||
|  | ||||
| 	WithMicroKeys()(&options) | ||||
| @@ -76,6 +83,13 @@ func NewOptions(opts ...Option) Options { | ||||
| 	return options | ||||
| } | ||||
|  | ||||
| // WithFatalFinalizers set logger.Fatal finalizers | ||||
| func WithFatalFinalizers(fncs ...func(context.Context)) Option { | ||||
| 	return func(o *Options) { | ||||
| 		o.FatalFinalizers = fncs | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // WithContextAttrFuncs appends default funcs for the context attrs filler | ||||
| func WithContextAttrFuncs(fncs ...ContextAttrFunc) Option { | ||||
| 	return func(o *Options) { | ||||
|   | ||||
| @@ -4,14 +4,12 @@ import ( | ||||
| 	"context" | ||||
| 	"io" | ||||
| 	"log/slog" | ||||
| 	"os" | ||||
| 	"reflect" | ||||
| 	"regexp" | ||||
| 	"runtime" | ||||
| 	"strconv" | ||||
| 	"sync" | ||||
| 	"sync/atomic" | ||||
| 	"time" | ||||
|  | ||||
| 	"go.unistack.org/micro/v4/logger" | ||||
| 	"go.unistack.org/micro/v4/semconv" | ||||
| @@ -231,11 +229,12 @@ func (s *slogLogger) Error(ctx context.Context, msg string, attrs ...interface{} | ||||
|  | ||||
| func (s *slogLogger) Fatal(ctx context.Context, msg string, attrs ...interface{}) { | ||||
| 	s.printLog(ctx, logger.FatalLevel, msg, attrs...) | ||||
| 	for _, fn := range s.opts.FatalFinalizers { | ||||
| 		fn(ctx) | ||||
| 	} | ||||
| 	if closer, ok := s.opts.Out.(io.Closer); ok { | ||||
| 		closer.Close() | ||||
| 	} | ||||
| 	time.Sleep(1 * time.Second) | ||||
| 	os.Exit(1) | ||||
| } | ||||
|  | ||||
| func (s *slogLogger) Warn(ctx context.Context, msg string, attrs ...interface{}) { | ||||
|   | ||||
| @@ -469,3 +469,25 @@ func Test_WithContextAttrFunc(t *testing.T) { | ||||
|  | ||||
| 	// t.Logf("xxx %s", buf.Bytes()) | ||||
| } | ||||
|  | ||||
| func TestFatalFinalizers(t *testing.T) { | ||||
| 	ctx := context.TODO() | ||||
| 	buf := bytes.NewBuffer(nil) | ||||
| 	l := NewLogger( | ||||
| 		logger.WithLevel(logger.TraceLevel), | ||||
| 		logger.WithOutput(buf), | ||||
| 	) | ||||
| 	if err := l.Init( | ||||
| 		logger.WithFatalFinalizers(func(ctx context.Context) { | ||||
| 			l.Info(ctx, "fatal finalizer") | ||||
| 		})); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	l.Fatal(ctx, "info_msg1") | ||||
| 	if !bytes.Contains(buf.Bytes(), []byte("fatal finalizer")) { | ||||
| 		t.Fatalf("logger dont have fatal message, buf %s", buf.Bytes()) | ||||
| 	} | ||||
| 	if !bytes.Contains(buf.Bytes(), []byte("info_msg1")) { | ||||
| 		t.Fatalf("logger dont have info_msg1 message, buf %s", buf.Bytes()) | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -49,9 +49,11 @@ type Meter interface { | ||||
| 	Set(opts ...Option) Meter | ||||
| 	// Histogram get or create histogram | ||||
| 	Histogram(name string, labels ...string) Histogram | ||||
| 	// HistogramExt get or create histogram with specified quantiles | ||||
| 	HistogramExt(name string, quantiles []float64, labels ...string) Histogram | ||||
| 	// Summary get or create summary | ||||
| 	Summary(name string, labels ...string) Summary | ||||
| 	// SummaryExt get or create summary with spcified quantiles and window time | ||||
| 	// SummaryExt get or create summary with specified quantiles and window time | ||||
| 	SummaryExt(name string, window time.Duration, quantiles []float64, labels ...string) Summary | ||||
| 	// Write writes metrics to io.Writer | ||||
| 	Write(w io.Writer, opts ...Option) error | ||||
| @@ -82,7 +84,11 @@ type FloatCounter interface { | ||||
|  | ||||
| // Gauge is a float64 gauge | ||||
| type Gauge interface { | ||||
| 	Add(float64) | ||||
| 	Get() float64 | ||||
| 	Set(float64) | ||||
| 	Dec() | ||||
| 	Inc() | ||||
| } | ||||
|  | ||||
| // Histogram is a histogram for non-negative values with automatically created buckets | ||||
|   | ||||
| @@ -70,6 +70,11 @@ func (r *noopMeter) Histogram(_ string, labels ...string) Histogram { | ||||
| 	return &noopHistogram{labels: labels} | ||||
| } | ||||
|  | ||||
| // HistogramExt implements the Meter interface | ||||
| func (r *noopMeter) HistogramExt(_ string, quantiles []float64, labels ...string) Histogram { | ||||
| 	return &noopHistogram{labels: labels} | ||||
| } | ||||
|  | ||||
| // Set implements the Meter interface | ||||
| func (r *noopMeter) Set(opts ...Option) Meter { | ||||
| 	m := &noopMeter{opts: r.opts} | ||||
| @@ -136,6 +141,18 @@ type noopGauge struct { | ||||
| 	labels []string | ||||
| } | ||||
|  | ||||
| func (r *noopGauge) Add(float64) { | ||||
| } | ||||
|  | ||||
| func (r *noopGauge) Set(float64) { | ||||
| } | ||||
|  | ||||
| func (r *noopGauge) Inc() { | ||||
| } | ||||
|  | ||||
| func (r *noopGauge) Dec() { | ||||
| } | ||||
|  | ||||
| func (r *noopGauge) Get() float64 { | ||||
| 	return 0 | ||||
| } | ||||
|   | ||||
| @@ -4,6 +4,8 @@ import ( | ||||
| 	"context" | ||||
| ) | ||||
|  | ||||
| var DefaultQuantiles = []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10} | ||||
|  | ||||
| // Option powers the configuration for metrics implementations: | ||||
| type Option func(*Options) | ||||
|  | ||||
| @@ -23,6 +25,8 @@ type Options struct { | ||||
| 	WriteProcessMetrics bool | ||||
| 	// WriteFDMetrics flag to write fd metrics | ||||
| 	WriteFDMetrics bool | ||||
| 	// Quantiles specifies buckets for histogram | ||||
| 	Quantiles []float64 | ||||
| } | ||||
|  | ||||
| // NewOptions prepares a set of options: | ||||
| @@ -61,14 +65,12 @@ func Address(value string) Option { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* | ||||
| // TimingObjectives defines the desired spread of statistics for histogram / timing metrics: | ||||
| func TimingObjectives(value map[float64]float64) Option { | ||||
| // Quantiles defines the desired spread of statistics for histogram metrics: | ||||
| func Quantiles(quantiles []float64) Option { | ||||
| 	return func(o *Options) { | ||||
| 		o.TimingObjectives = value | ||||
| 		o.Quantiles = quantiles | ||||
| 	} | ||||
| } | ||||
| */ | ||||
|  | ||||
| // Labels add the meter labels | ||||
| func Labels(ls ...string) Option { | ||||
|   | ||||
| @@ -6,7 +6,6 @@ import ( | ||||
| 	"sync" | ||||
| 	"time" | ||||
|  | ||||
| 	"go.unistack.org/micro/v4/codec" | ||||
| 	"go.unistack.org/micro/v4/logger" | ||||
| 	"go.unistack.org/micro/v4/register" | ||||
| 	maddr "go.unistack.org/micro/v4/util/addr" | ||||
| @@ -14,11 +13,6 @@ import ( | ||||
| 	"go.unistack.org/micro/v4/util/rand" | ||||
| ) | ||||
|  | ||||
| // DefaultCodecs will be used to encode/decode | ||||
| var DefaultCodecs = map[string]codec.Codec{ | ||||
| 	"application/octet-stream": codec.NewCodec(), | ||||
| } | ||||
|  | ||||
| type rpcHandler struct { | ||||
| 	opts    HandlerOptions | ||||
| 	handler interface{} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user