func Tracer(t trace.Tracer) Option {
	return func(o *Options) {
		o.Tracer = t
	}
}
Tracer mechanism for distributed tracking
package server
import (
	"context"
	"crypto/tls"
	"sync"
	"time"
	"github.com/micro/micro/v3/service/auth"
	"github.com/micro/micro/v3/service/broker"
	"github.com/micro/micro/v3/service/broker/memory"
	"github.com/micro/micro/v3/service/debug/trace"
	"github.com/micro/micro/v3/service/network/transport"
	thttp "github.com/micro/micro/v3/service/network/transport/http"
	"github.com/micro/micro/v3/service/registry"
	memReg "github.com/micro/micro/v3/service/registry/memory"
	"github.com/micro/micro/v3/util/codec"
)
type Options struct {
	Codecs       map[string]codec.NewCodec
	Broker       broker.Broker
	Registry     registry.Registry
	Tracer       trace.Tracer
	Auth         auth.Auth
	Transport    transport.Transport
	Metadata     map[string]string
	Name         string
	Address      string
	Advertise    string
	Id           string
	Namespace    string
	Version      string
	HdlrWrappers []HandlerWrapper
	SubWrappers  []SubscriberWrapper
	RegisterCheck func(context.Context) error
	RegisterTTL time.Duration
	RegisterInterval time.Duration
	Router Router
	TLSConfig *tls.Config
	Context context.Context
}
func newOptions(opt ...Option) Options {
	opts := Options{
		Codecs:           make(map[string]codec.NewCodec),
		Metadata:         map[string]string{},
		RegisterInterval: DefaultRegisterInterval,
		RegisterTTL:      DefaultRegisterTTL,
	}
	for _, o := range opt {
		o(&opts)
	}
	if opts.Broker == nil {
		opts.Broker = memory.NewBroker()
	}
	if opts.Registry == nil {
		opts.Registry = memReg.NewRegistry()
	}
	if opts.Transport == nil {
		opts.Transport = thttp.NewTransport()
	}
	if opts.RegisterCheck == nil {
		opts.RegisterCheck = DefaultRegisterCheck
	}
	if len(opts.Address) == 0 {
		opts.Address = DefaultAddress
	}
	if len(opts.Name) == 0 {
		opts.Name = DefaultName
	}
	if len(opts.Id) == 0 {
		opts.Id = DefaultId
	}
	if len(opts.Version) == 0 {
		opts.Version = DefaultVersion
	}
	return opts
}
func Name(n string) Option {
	return func(o *Options) {
		o.Name = n
	}
}
func Namespace(n string) Option {
	return func(o *Options) {
		o.Namespace = n
	}
}
func Id(id string) Option {
	return func(o *Options) {
		o.Id = id
	}
}
func Version(v string) Option {
	return func(o *Options) {
		o.Version = v
	}
}
func Address(a string) Option {
	return func(o *Options) {
		o.Address = a
	}
}
func Advertise(a string) Option {
	return func(o *Options) {
		o.Advertise = a
	}
}
func Broker(b broker.Broker) Option {
	return func(o *Options) {
		o.Broker = b
	}
}
func Codec(contentType string, c codec.NewCodec) Option {
	return func(o *Options) {
		o.Codecs[contentType] = c
	}
}
func Context(ctx context.Context) Option {
	return func(o *Options) {
		o.Context = ctx
	}
}
func Registry(r registry.Registry) Option {
	return func(o *Options) {
		o.Registry = r
	}
}