Compare commits
	
		
			9 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 7a325e2c9e | |||
| 7daa927e70 | |||
| 
						 | 
					54bb7f7acb | ||
| 9eaab95519 | |||
| 
						 | 
					9219dc6b2a | ||
| 52607b38f1 | |||
| 
						 | 
					886f046409 | ||
| 4d6d469d40 | |||
| 
						 | 
					4a944274f4 | 
@@ -1,5 +1,5 @@
 | 
				
			|||||||
# Micro
 | 
					# Micro
 | 
				
			||||||

 | 
					
 | 
				
			||||||
[](https://opensource.org/licenses/Apache-2.0)
 | 
					[](https://opensource.org/licenses/Apache-2.0)
 | 
				
			||||||
[](https://pkg.go.dev/go.unistack.org/micro/v4?tab=overview)
 | 
					[](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)
 | 
					[](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"
 | 
						"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 {
 | 
					type noopClient struct {
 | 
				
			||||||
	funcCall   FuncCall
 | 
						funcCall   FuncCall
 | 
				
			||||||
	funcStream FuncStream
 | 
						funcStream FuncStream
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -161,7 +161,7 @@ func NewOptions(opts ...Option) Options {
 | 
				
			|||||||
	options := Options{
 | 
						options := Options{
 | 
				
			||||||
		Context:     context.Background(),
 | 
							Context:     context.Background(),
 | 
				
			||||||
		ContentType: DefaultContentType,
 | 
							ContentType: DefaultContentType,
 | 
				
			||||||
		Codecs:      DefaultCodecs,
 | 
							Codecs:      make(map[string]codec.Codec),
 | 
				
			||||||
		CallOptions: CallOptions{
 | 
							CallOptions: CallOptions{
 | 
				
			||||||
			Context:        context.Background(),
 | 
								Context:        context.Background(),
 | 
				
			||||||
			Backoff:        DefaultBackoff,
 | 
								Backoff:        DefaultBackoff,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,6 +52,12 @@ type Options struct {
 | 
				
			|||||||
	AddStacktrace bool
 | 
						AddStacktrace bool
 | 
				
			||||||
	// DedupKeys deduplicate keys in log output
 | 
						// DedupKeys deduplicate keys in log output
 | 
				
			||||||
	DedupKeys bool
 | 
						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
 | 
					// NewOptions creates new options struct
 | 
				
			||||||
@@ -65,6 +71,7 @@ func NewOptions(opts ...Option) Options {
 | 
				
			|||||||
		AddSource:        true,
 | 
							AddSource:        true,
 | 
				
			||||||
		TimeFunc:         time.Now,
 | 
							TimeFunc:         time.Now,
 | 
				
			||||||
		Meter:            meter.DefaultMeter,
 | 
							Meter:            meter.DefaultMeter,
 | 
				
			||||||
 | 
							FatalFinalizers:  []func(context.Context){DefaultFatalFinalizer},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	WithMicroKeys()(&options)
 | 
						WithMicroKeys()(&options)
 | 
				
			||||||
@@ -76,6 +83,13 @@ func NewOptions(opts ...Option) Options {
 | 
				
			|||||||
	return 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
 | 
					// WithContextAttrFuncs appends default funcs for the context attrs filler
 | 
				
			||||||
func WithContextAttrFuncs(fncs ...ContextAttrFunc) Option {
 | 
					func WithContextAttrFuncs(fncs ...ContextAttrFunc) Option {
 | 
				
			||||||
	return func(o *Options) {
 | 
						return func(o *Options) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,14 +4,12 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"log/slog"
 | 
						"log/slog"
 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"reflect"
 | 
						"reflect"
 | 
				
			||||||
	"regexp"
 | 
						"regexp"
 | 
				
			||||||
	"runtime"
 | 
						"runtime"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"sync/atomic"
 | 
						"sync/atomic"
 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.unistack.org/micro/v4/logger"
 | 
						"go.unistack.org/micro/v4/logger"
 | 
				
			||||||
	"go.unistack.org/micro/v4/semconv"
 | 
						"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{}) {
 | 
					func (s *slogLogger) Fatal(ctx context.Context, msg string, attrs ...interface{}) {
 | 
				
			||||||
	s.printLog(ctx, logger.FatalLevel, msg, attrs...)
 | 
						s.printLog(ctx, logger.FatalLevel, msg, attrs...)
 | 
				
			||||||
 | 
						for _, fn := range s.opts.FatalFinalizers {
 | 
				
			||||||
 | 
							fn(ctx)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if closer, ok := s.opts.Out.(io.Closer); ok {
 | 
						if closer, ok := s.opts.Out.(io.Closer); ok {
 | 
				
			||||||
		closer.Close()
 | 
							closer.Close()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	time.Sleep(1 * time.Second)
 | 
					 | 
				
			||||||
	os.Exit(1)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *slogLogger) Warn(ctx context.Context, msg string, attrs ...interface{}) {
 | 
					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())
 | 
						// 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
 | 
						Set(opts ...Option) Meter
 | 
				
			||||||
	// Histogram get or create histogram
 | 
						// Histogram get or create histogram
 | 
				
			||||||
	Histogram(name string, labels ...string) 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 get or create summary
 | 
				
			||||||
	Summary(name string, labels ...string) 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
 | 
						SummaryExt(name string, window time.Duration, quantiles []float64, labels ...string) Summary
 | 
				
			||||||
	// Write writes metrics to io.Writer
 | 
						// Write writes metrics to io.Writer
 | 
				
			||||||
	Write(w io.Writer, opts ...Option) error
 | 
						Write(w io.Writer, opts ...Option) error
 | 
				
			||||||
@@ -82,7 +84,11 @@ type FloatCounter interface {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Gauge is a float64 gauge
 | 
					// Gauge is a float64 gauge
 | 
				
			||||||
type Gauge interface {
 | 
					type Gauge interface {
 | 
				
			||||||
 | 
						Add(float64)
 | 
				
			||||||
	Get() float64
 | 
						Get() float64
 | 
				
			||||||
 | 
						Set(float64)
 | 
				
			||||||
 | 
						Dec()
 | 
				
			||||||
 | 
						Inc()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Histogram is a histogram for non-negative values with automatically created buckets
 | 
					// 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}
 | 
						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
 | 
					// Set implements the Meter interface
 | 
				
			||||||
func (r *noopMeter) Set(opts ...Option) Meter {
 | 
					func (r *noopMeter) Set(opts ...Option) Meter {
 | 
				
			||||||
	m := &noopMeter{opts: r.opts}
 | 
						m := &noopMeter{opts: r.opts}
 | 
				
			||||||
@@ -136,6 +141,18 @@ type noopGauge struct {
 | 
				
			|||||||
	labels []string
 | 
						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 {
 | 
					func (r *noopGauge) Get() float64 {
 | 
				
			||||||
	return 0
 | 
						return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,8 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var DefaultQuantiles = []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Option powers the configuration for metrics implementations:
 | 
					// Option powers the configuration for metrics implementations:
 | 
				
			||||||
type Option func(*Options)
 | 
					type Option func(*Options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,6 +25,8 @@ type Options struct {
 | 
				
			|||||||
	WriteProcessMetrics bool
 | 
						WriteProcessMetrics bool
 | 
				
			||||||
	// WriteFDMetrics flag to write fd metrics
 | 
						// WriteFDMetrics flag to write fd metrics
 | 
				
			||||||
	WriteFDMetrics bool
 | 
						WriteFDMetrics bool
 | 
				
			||||||
 | 
						// Quantiles specifies buckets for histogram
 | 
				
			||||||
 | 
						Quantiles []float64
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewOptions prepares a set of options:
 | 
					// NewOptions prepares a set of options:
 | 
				
			||||||
@@ -61,14 +65,12 @@ func Address(value string) Option {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					// Quantiles defines the desired spread of statistics for histogram metrics:
 | 
				
			||||||
// TimingObjectives defines the desired spread of statistics for histogram / timing metrics:
 | 
					func Quantiles(quantiles []float64) Option {
 | 
				
			||||||
func TimingObjectives(value map[float64]float64) Option {
 | 
					 | 
				
			||||||
	return func(o *Options) {
 | 
						return func(o *Options) {
 | 
				
			||||||
		o.TimingObjectives = value
 | 
							o.Quantiles = quantiles
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Labels add the meter labels
 | 
					// Labels add the meter labels
 | 
				
			||||||
func Labels(ls ...string) Option {
 | 
					func Labels(ls ...string) Option {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.unistack.org/micro/v4/codec"
 | 
					 | 
				
			||||||
	"go.unistack.org/micro/v4/logger"
 | 
						"go.unistack.org/micro/v4/logger"
 | 
				
			||||||
	"go.unistack.org/micro/v4/register"
 | 
						"go.unistack.org/micro/v4/register"
 | 
				
			||||||
	maddr "go.unistack.org/micro/v4/util/addr"
 | 
						maddr "go.unistack.org/micro/v4/util/addr"
 | 
				
			||||||
@@ -14,11 +13,6 @@ import (
 | 
				
			|||||||
	"go.unistack.org/micro/v4/util/rand"
 | 
						"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 {
 | 
					type rpcHandler struct {
 | 
				
			||||||
	opts    HandlerOptions
 | 
						opts    HandlerOptions
 | 
				
			||||||
	handler interface{}
 | 
						handler interface{}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user