Documentation ¶
Overview ¶
Package servenv contains functionality that is common for all Vitess server programs. It defines and initializes command line flags that control the runtime environment.
After a server program has called flag.Parse, it needs to call env.Init to make env use the command line variables to initialize the environment. It also needs to call env.Close before exiting.
Note: If you need to plug in any custom initialization/cleanup for a vitess distribution, register them using OnInit and onClose. A clean way of achieving that is adding to this package a file with an init() function that registers the hooks.
Index ¶
- Constants
- Variables
- func AddStatusFuncs(fmap template.FuncMap)
- func AddStatusPart(banner, fragment string, f func() any)
- func AddStatusSection(banner string, f func() string)
- func ClientCertSubstrings() string
- func Close()
- func FakeAuthStreamInterceptor(srv any, stream grpc.ServerStream, info *grpc.StreamServerInfo, ...) error
- func FakeAuthUnaryInterceptor(ctx context.Context, req any, info *grpc.UnaryServerInfo, ...) (any, error)
- func FireRunHooks()
- func GRPCAuth() string
- func GRPCCert() string
- func GRPCCertificateAuthority() string
- func GRPCCheckServiceMap(name string) bool
- func GRPCKey() string
- func GRPCPort() int
- func GetAuthenticator(name string) func() (Authenticator, error)
- func GetFlagSetFor(cmd string) *pflag.FlagSet
- func GetInitStartTime() time.Time
- func HandlePanic(component string, err *error)
- func Init()
- func InitServiceMap(protocol, name string)
- func MySQLServerVersion() string
- func OnClose(f func())
- func OnInit(f func())
- func OnParse(f func(fs *pflag.FlagSet))
- func OnParseFor(cmd string, f func(fs *pflag.FlagSet))
- func OnRun(f func())
- func OnTerm(f func())
- func OnTermSync(f func())
- func ParseFlags(cmd string)
- func ParseFlagsWithArgs(cmd string) []string
- func Port() int
- func RegisterAuthPlugin(name string, authPlugin func() (Authenticator, error))
- func RegisterDefaultFlags()
- func RegisterDefaultSocketFileFlags()
- func RegisterFlags()
- func RegisterFlagsForTopoBinaries(registerFlags func(fs *pflag.FlagSet))
- func RegisterGRPCServerAuthFlags()
- func RegisterGRPCServerFlags()
- func RegisterMySQLServerFlags(fs *pflag.FlagSet)
- func RegisterServiceMapFlag()
- func Run(port int)
- func RunDefault()
- func SetMySQLServerVersionForTest(version string)
- func StaticAuthUsernameFromContext(ctx context.Context) string
- func StatusURLPath() string
- type Authenticator
- type Exporter
- func (e *Exporter) AddStatusPart(banner, frag string, f func() any)
- func (e *Exporter) HandleFunc(url string, f func(w http.ResponseWriter, r *http.Request))
- func (e *Exporter) Name() string
- func (e *Exporter) NewCounter(name string, help string) *stats.Counter
- func (e *Exporter) NewCounterDurationFunc(name string, help string, f func() time.Duration) *stats.CounterDurationFunc
- func (e *Exporter) NewCounterFunc(name string, help string, f func() int64) *stats.CounterFunc
- func (e *Exporter) NewCountersFuncWithMultiLabels(name, help string, labels []string, f func() map[string]int64) *stats.CountersFuncWithMultiLabels
- func (e *Exporter) NewCountersWithMultiLabels(name, help string, labels []string) *stats.CountersWithMultiLabels
- func (e *Exporter) NewCountersWithSingleLabel(name, help string, label string, tags ...string) *stats.CountersWithSingleLabel
- func (e *Exporter) NewGauge(name string, help string) *stats.Gauge
- func (e *Exporter) NewGaugeDurationFunc(name string, help string, f func() time.Duration) *stats.GaugeDurationFunc
- func (e *Exporter) NewGaugeFloat64(name string, help string) *stats.GaugeFloat64
- func (e *Exporter) NewGaugeFunc(name string, help string, f func() int64) *stats.GaugeFunc
- func (e *Exporter) NewGaugesFuncWithMultiLabels(name, help string, labels []string, f func() map[string]int64) *stats.GaugesFuncWithMultiLabels
- func (e *Exporter) NewGaugesWithMultiLabels(name, help string, labels []string) *stats.GaugesWithMultiLabels
- func (e *Exporter) NewGaugesWithSingleLabel(name, help string, label string, tags ...string) *stats.GaugesWithSingleLabel
- func (e *Exporter) NewHistogram(name, help string, cutoffs []int64) *stats.Histogram
- func (e *Exporter) NewMultiTimings(name string, help string, labels []string) *MultiTimingsWrapper
- func (e *Exporter) NewRates(name string, singleCountVar multiCountVar, samples int, interval time.Duration) *stats.Rates
- func (e *Exporter) NewTimings(name string, help string, label string) *TimingsWrapper
- func (e *Exporter) Publish(name string, v expvar.Var)
- func (e *Exporter) URLPrefix() string
- type MtlsAuthPlugin
- type MultiTimingsWrapper
- type StaticAuthConfigEntry
- type StaticAuthPlugin
- type TimingsWrapper
- type WrappedServerStream
Constants ¶
const JQueryIncludes = `` /* 305-byte string literal not displayed */
JQueryIncludes is the include to use to be able to use jquery and jquery-ui
const Name = "proto"
Name is the name registered for the proto compressor.
Variables ¶
var AppVersion versionInfo
AppVersion is the struct to store build info.
var ( // ExitChan waits for a signal that tells the process to terminate ExitChan chan os.Signal )
var ( // GRPCServer is the global server to serve gRPC. GRPCServer *grpc.Server )
This file handles gRPC server, on its own port. Clients register servers, based on service map:
servenv.RegisterGRPCFlags()
servenv.OnRun(func() { if servenv.GRPCCheckServiceMap("XXX") { pb.RegisterXXX(servenv.GRPCServer, XXX) } }
Note servenv.GRPCServer can only be used in servenv.OnRun, and not before, as it is initialized right before calling OnRun.
var ( // ListeningURL is filled in when calling Run, contains the server URL. ListeningURL url.URL )
Functions ¶
func AddStatusFuncs ¶
AddStatusFuncs merges the provided functions into the set of functions used to render /debug/status. Call this before AddStatusPart if your template requires custom functions.
func AddStatusPart ¶
AddStatusPart adds a new section to status. fragment is used as a subtemplate of the template used to render /debug/status, and will be executed using the value of invoking f at the time of the /debug/status request. fragment is parsed and executed with the html/template package. Functions registered with AddStatusFuncs may be used in the template.
func AddStatusSection ¶
AddStatusSection registers a function that generates extra information for the global status page, it will be used as a header before the information. If more complex output than a simple string is required use AddStatusPart instead.
func ClientCertSubstrings ¶
func ClientCertSubstrings() string
ClientCertSubstrings returns the value of the `--grpc_auth_mtls_allowed_substrings` flag.
func FakeAuthStreamInterceptor ¶
func FakeAuthStreamInterceptor(srv any, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error
FakeAuthStreamInterceptor fake interceptor to test plugin
func FakeAuthUnaryInterceptor ¶
func FakeAuthUnaryInterceptor(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error)
FakeAuthUnaryInterceptor fake interceptor to test plugin
func FireRunHooks ¶
func FireRunHooks()
FireRunHooks fires the hooks registered by OnHook. Use this in a non-server to run the hooks registered by servenv.OnRun().
func GRPCCertificateAuthority ¶ added in v0.15.0
func GRPCCertificateAuthority() string
GRPCCertificateAuthority returns the value of the `--grpc_ca` flag.
func GRPCCheckServiceMap ¶
GRPCCheckServiceMap returns if we should register a gRPC service (and also logs how to enable / disable it)
func GetAuthenticator ¶
func GetAuthenticator(name string) func() (Authenticator, error)
GetAuthenticator returns an AuthPlugin by name, or log.Fatalf.
func GetFlagSetFor ¶ added in v0.15.0
GetFlagSetFor returns the flag set for a given command. This has to exported for the Vitess-operator to use
func GetInitStartTime ¶ added in v0.16.0
func HandlePanic ¶
HandlePanic should be called using 'defer' in the RPC code that executes the command.
func InitServiceMap ¶
func InitServiceMap(protocol, name string)
InitServiceMap will set the default value for a protocol/name to be served.
func MySQLServerVersion ¶ added in v0.10.0
func MySQLServerVersion() string
MySQLServerVersion returns the value of the `--mysql_server_version` flag.
func OnClose ¶
func OnClose(f func())
OnClose registers f to be run at the end of the app lifecycle. This happens after the lameduck period just before the program exits. All hooks are run in parallel.
func OnInit ¶
func OnInit(f func())
OnInit registers f to be run at the beginning of the app lifecycle. It should be called in an init() function.
func OnParse ¶ added in v0.15.0
OnParse registers a callback function to register flags on the flagset that are used by any caller of servenv.Parse or servenv.ParseWithArgs.
func OnParseFor ¶ added in v0.15.0
OnParseFor registers a callback function to register flags on the flagset used by servenv.Parse or servenv.ParseWithArgs. The provided callback will only be called if the `cmd` argument passed to either Parse or ParseWithArgs exactly matches the `cmd` argument passed to OnParseFor.
To register for flags for multiple commands, for example if a package's flags should be used for only vtgate and vttablet but no other binaries, call this multiple times with the same callback function. To register flags for all commands globally, use OnParse instead.
func OnRun ¶
func OnRun(f func())
OnRun registers f to be run right at the beginning of Run. All hooks are run in parallel.
func OnTerm ¶
func OnTerm(f func())
OnTerm registers a function to be run when the process receives a SIGTERM. This allows the program to change its behavior during the lameduck period.
All hooks are run in parallel, and there is no guarantee that the process will wait for them to finish before dying when the lameduck period expires.
See also: OnTermSync
func OnTermSync ¶
func OnTermSync(f func())
OnTermSync registers a function to be run when the process receives SIGTERM. This allows the program to change its behavior during the lameduck period.
All hooks are run in parallel, and the process will do its best to wait (up to -onterm_timeout) for all of them to finish before dying.
See also: OnTerm
func ParseFlags ¶
func ParseFlags(cmd string)
ParseFlags initializes flags and handles the common case when no positional arguments are expected.
func ParseFlagsWithArgs ¶
ParseFlagsWithArgs initializes flags and returns the positional arguments
func RegisterAuthPlugin ¶
func RegisterAuthPlugin(name string, authPlugin func() (Authenticator, error))
RegisterAuthPlugin registers an implementation of AuthServer.
func RegisterDefaultFlags ¶
func RegisterDefaultFlags()
RegisterDefaultFlags registers the default flags for listening to a given port for standard connections. If calling this, then call RunDefault()
func RegisterDefaultSocketFileFlags ¶
func RegisterDefaultSocketFileFlags()
RegisterDefaultSocketFileFlags registers the default flags for listening to a socket. This needs to be called before flags are parsed.
func RegisterFlags ¶ added in v0.15.0
func RegisterFlags()
RegisterFlags installs the flags used by Init, Run, and RunDefault.
This must be called before servenv.ParseFlags if using any of those functions.
func RegisterFlagsForTopoBinaries ¶ added in v0.15.0
func RegisterGRPCServerAuthFlags ¶ added in v0.15.0
func RegisterGRPCServerAuthFlags()
RegisterGRPCServerAuthFlags registers flags required to enable server-side authentication in vitess gRPC services.
`go/cmd/*` entrypoints should call this function before ParseFlags(WithArgs)? if they wish to expose Authenticator functionality.
func RegisterGRPCServerFlags ¶ added in v0.15.0
func RegisterGRPCServerFlags()
RegisterGRPCServerFlags registers flags required to run a gRPC server via Run or RunDefault.
`go/cmd/*` entrypoints should call this function before ParseFlags(WithArgs)? if they wish to run a gRPC server.
func RegisterMySQLServerFlags ¶ added in v0.15.0
RegisterMySQLServerFlags installs the flags needed to specify or expose a particular MySQL server version from Vitess.
func RegisterServiceMapFlag ¶ added in v0.15.0
func RegisterServiceMapFlag()
RegisterServiceMapFlag registers an OnParse hook to install the `--service_map` flag for a given cmd. It must be called before ParseFlags or ParseFlagsWithArgs.
func Run ¶
func Run(port int)
Run starts listening for RPC and HTTP requests, and blocks until it the process gets a signal.
func SetMySQLServerVersionForTest ¶ added in v0.15.0
func SetMySQLServerVersionForTest(version string)
SetMySQLServerVersionForTest sets the value of the `--mysql_server_version` flag. It is intended for use in tests that require a specific MySQL server version (for example, collations) that cannot specify that via the command line.
func StaticAuthUsernameFromContext ¶ added in v0.16.0
StaticAuthUsernameFromContext returns the username authenticated by the static auth plugin and stored in the Context, if any
Types ¶
type Authenticator ¶
type Authenticator interface {
Authenticate(ctx context.Context, fullMethod string) (context.Context, error)
}
Authenticator provides an interface to implement auth in Vitess in grpc server
type Exporter ¶
type Exporter struct {
// contains filtered or unexported fields
}
Exporter remaps http and stats end-points to distinct namespaces.
Unnamed exporters are treated as unscoped, and requests are passed through to the underlying functions.
For named exporters, http handle requests of the form /path will be remapped to /name/path. In the case of stats variables, a new dimension will be added. For example, a Counter of value 1 will be changed to a map {"name": 1}. A multi-counter like { "a.b": 1, "c.d": 2} will be mapped to {"name.a.b": 1, "name.c.d": 2}. Stats vars of the same name are merged onto a single map. For example, if exporters name1 and name2 independently create a stats Counter named foo and export values 1 and 2, the result is a merged stats var named foo with the following content: {"name1": 1, "name2": 2}.
The functions that create the stat vars don't always return the actual exported variable. Instead they return a variable that only affects the dimension that was assigned to the exporter. The exported variables are named evar, and the variables returned to the caller are named lvar (local var).
If there are duplicates, "Func" vars will be changed to invoke the latest callback function. Non-Func vars will be reused. For counters, the adds will continue to add on top of existing values. For gauges, this is less material because a new "Set" will overwrite the previous value. This behavior of reusing counters is necessary because we build derived variables like Rates, which need to continue referencing the original variable that was created.
func NewExporter ¶
NewExporter creates a new Exporter with name as namespace. label is the name of the additional dimension for the stats vars.
func (*Exporter) AddStatusPart ¶
AddStatusPart adds a status part to the status page. If Exporter has a name, the part is added to a url named /name/debug/status. Otherwise, it's /debug/status.
func (*Exporter) HandleFunc ¶
HandleFunc sets or overwrites the handler for url. If Exporter has a name, url remapped from /path to /name/path. If name is empty, the request is passed through to http.HandleFunc.
func (*Exporter) NewCounter ¶
NewCounter creates a name-spaced equivalent for stats.NewCounter.
func (*Exporter) NewCounterDurationFunc ¶
func (e *Exporter) NewCounterDurationFunc(name string, help string, f func() time.Duration) *stats.CounterDurationFunc
NewCounterDurationFunc creates a name-spaced equivalent for stats.NewCounterDurationFunc.
func (*Exporter) NewCounterFunc ¶
NewCounterFunc creates a name-spaced equivalent for stats.NewCounterFunc.
func (*Exporter) NewCountersFuncWithMultiLabels ¶
func (e *Exporter) NewCountersFuncWithMultiLabels(name, help string, labels []string, f func() map[string]int64) *stats.CountersFuncWithMultiLabels
NewCountersFuncWithMultiLabels creates a name-spaced equivalent for stats.NewCountersFuncWithMultiLabels.
func (*Exporter) NewCountersWithMultiLabels ¶
func (e *Exporter) NewCountersWithMultiLabels(name, help string, labels []string) *stats.CountersWithMultiLabels
NewCountersWithMultiLabels creates a name-spaced equivalent for stats.NewCountersWithMultiLabels.
func (*Exporter) NewCountersWithSingleLabel ¶
func (e *Exporter) NewCountersWithSingleLabel(name, help string, label string, tags ...string) *stats.CountersWithSingleLabel
NewCountersWithSingleLabel creates a name-spaced equivalent for stats.NewCountersWithSingleLabel. Tags are ignored if the exporter is named.
func (*Exporter) NewGaugeDurationFunc ¶
func (e *Exporter) NewGaugeDurationFunc(name string, help string, f func() time.Duration) *stats.GaugeDurationFunc
NewGaugeDurationFunc creates a name-spaced equivalent for stats.NewGaugeDurationFunc.
func (*Exporter) NewGaugeFloat64 ¶ added in v0.15.0
func (e *Exporter) NewGaugeFloat64(name string, help string) *stats.GaugeFloat64
NewGaugeFloat64 exporter assumes all counters/gauges are int64 based; I haven't found a good solution for exporting a float64 gauge yet. (Shlomi)
func (*Exporter) NewGaugeFunc ¶
NewGaugeFunc creates a name-spaced equivalent for stats.NewGaugeFunc.
func (*Exporter) NewGaugesFuncWithMultiLabels ¶
func (e *Exporter) NewGaugesFuncWithMultiLabels(name, help string, labels []string, f func() map[string]int64) *stats.GaugesFuncWithMultiLabels
NewGaugesFuncWithMultiLabels creates a name-spaced equivalent for stats.NewGaugesFuncWithMultiLabels.
func (*Exporter) NewGaugesWithMultiLabels ¶
func (e *Exporter) NewGaugesWithMultiLabels(name, help string, labels []string) *stats.GaugesWithMultiLabels
NewGaugesWithMultiLabels creates a name-spaced equivalent for stats.NewGaugesWithMultiLabels.
func (*Exporter) NewGaugesWithSingleLabel ¶
func (e *Exporter) NewGaugesWithSingleLabel(name, help string, label string, tags ...string) *stats.GaugesWithSingleLabel
NewGaugesWithSingleLabel creates a name-spaced equivalent for stats.NewGaugesWithSingleLabel. Tags are ignored if the exporter is named.
func (*Exporter) NewHistogram ¶
NewHistogram creates a name-spaced equivalent for stats.NewHistogram. The function currently just returns an unexported variable.
func (*Exporter) NewMultiTimings ¶
func (e *Exporter) NewMultiTimings(name string, help string, labels []string) *MultiTimingsWrapper
NewMultiTimings creates a name-spaced equivalent for stats.NewMultiTimings. The function currently just returns an unexported variable.
func (*Exporter) NewRates ¶
func (e *Exporter) NewRates(name string, singleCountVar multiCountVar, samples int, interval time.Duration) *stats.Rates
NewRates creates a name-spaced equivalent for stats.NewRates. The function currently just returns an unexported variable.
func (*Exporter) NewTimings ¶
func (e *Exporter) NewTimings(name string, help string, label string) *TimingsWrapper
NewTimings creates a name-spaced equivalent for stats.NewTimings. The function currently just returns an unexported variable.
type MtlsAuthPlugin ¶
type MtlsAuthPlugin struct {
// contains filtered or unexported fields
}
MtlsAuthPlugin implements static username/password authentication for grpc. It contains an array of username/passwords that will be authorized to connect to the grpc server.
func (*MtlsAuthPlugin) Authenticate ¶
func (ma *MtlsAuthPlugin) Authenticate(ctx context.Context, fullMethod string) (context.Context, error)
Authenticate implements Authenticator interface. This method will be used inside a middleware in grpc_server to authenticate incoming requests.
type MultiTimingsWrapper ¶
type MultiTimingsWrapper struct {
// contains filtered or unexported fields
}
MultiTimingsWrapper provides a namespaced version of stats.MultiTimings.
func (*MultiTimingsWrapper) Add ¶
func (tw *MultiTimingsWrapper) Add(names []string, elapsed time.Duration)
Add behaves like MultiTimings.Add.
func (*MultiTimingsWrapper) Counts ¶
func (tw *MultiTimingsWrapper) Counts() map[string]int64
Counts behaves lie MultiTimings.Counts.
func (*MultiTimingsWrapper) Record ¶
func (tw *MultiTimingsWrapper) Record(names []string, startTime time.Time)
Record behaves like MultiTimings.Record.
func (*MultiTimingsWrapper) Reset ¶ added in v0.8.0
func (tw *MultiTimingsWrapper) Reset()
Reset will clear histograms: used during testing
type StaticAuthConfigEntry ¶
StaticAuthConfigEntry is the container for server side credentials. Current implementation matches the the one from the client but this will change in the future as we hooked this pluging into ACL features.
type StaticAuthPlugin ¶
type StaticAuthPlugin struct {
// contains filtered or unexported fields
}
StaticAuthPlugin implements static username/password authentication for grpc. It contains an array of username/passwords that will be authorized to connect to the grpc server.
func (*StaticAuthPlugin) Authenticate ¶
func (sa *StaticAuthPlugin) Authenticate(ctx context.Context, fullMethod string) (context.Context, error)
Authenticate implements AuthPlugin interface. This method will be used inside a middleware in grpc_server to authenticate incoming requests.
type TimingsWrapper ¶
type TimingsWrapper struct {
// contains filtered or unexported fields
}
TimingsWrapper provides a namespaced version of stats.Timings.
func (*TimingsWrapper) Add ¶
func (tw *TimingsWrapper) Add(name string, elapsed time.Duration)
Add behaves like Timings.Add.
func (*TimingsWrapper) Counts ¶
func (tw *TimingsWrapper) Counts() map[string]int64
Counts behaves like Timings.Counts.
func (*TimingsWrapper) Record ¶
func (tw *TimingsWrapper) Record(name string, startTime time.Time)
Record behaves like Timings.Record.
func (*TimingsWrapper) Reset ¶ added in v0.8.0
func (tw *TimingsWrapper) Reset()
Reset will clear histograms: used during testing
type WrappedServerStream ¶
type WrappedServerStream struct { grpc.ServerStream WrappedContext context.Context }
WrappedServerStream is based on the service stream wrapper from: https://github.com/grpc-ecosystem/go-grpc-middleware
func WrapServerStream ¶
func WrapServerStream(stream grpc.ServerStream) *WrappedServerStream
WrapServerStream returns a ServerStream that has the ability to overwrite context.
func (*WrappedServerStream) Context ¶
func (w *WrappedServerStream) Context() context.Context
Context returns the wrapper's WrappedContext, overwriting the nested grpc.ServerStream.Context()