update micro, add Health/Live/Ready checks
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
@@ -13,15 +13,30 @@ type Handler struct {
|
||||
opts Options
|
||||
}
|
||||
|
||||
type CheckFunc func(context.Context) error
|
||||
type (
|
||||
CheckFunc func(context.Context) error
|
||||
Option func(*Options)
|
||||
)
|
||||
|
||||
type Option func(*Options)
|
||||
type Stater interface {
|
||||
Live() bool
|
||||
Ready() bool
|
||||
Health() bool
|
||||
}
|
||||
|
||||
type Options struct {
|
||||
Version string
|
||||
Name string
|
||||
LiveChecks []CheckFunc
|
||||
ReadyChecks []CheckFunc
|
||||
Version string
|
||||
Name string
|
||||
Staters []Stater
|
||||
LiveChecks []CheckFunc
|
||||
ReadyChecks []CheckFunc
|
||||
HealthChecks []CheckFunc
|
||||
}
|
||||
|
||||
func Service(s ...Stater) Option {
|
||||
return func(o *Options) {
|
||||
o.Staters = append(o.Staters, s...)
|
||||
}
|
||||
}
|
||||
|
||||
func LiveChecks(fns ...CheckFunc) Option {
|
||||
@@ -36,6 +51,12 @@ func ReadyChecks(fns ...CheckFunc) Option {
|
||||
}
|
||||
}
|
||||
|
||||
func HealthChecks(fns ...CheckFunc) Option {
|
||||
return func(o *Options) {
|
||||
o.HealthChecks = append(o.HealthChecks, fns...)
|
||||
}
|
||||
}
|
||||
|
||||
func Name(name string) Option {
|
||||
return func(o *Options) {
|
||||
o.Name = name
|
||||
@@ -56,18 +77,51 @@ func NewHandler(opts ...Option) *Handler {
|
||||
return &Handler{opts: options}
|
||||
}
|
||||
|
||||
func (h *Handler) Healthy(ctx context.Context, req *codecpb.Frame, rsp *codecpb.Frame) error {
|
||||
var err error
|
||||
|
||||
for _, s := range h.opts.Staters {
|
||||
if !s.Health() {
|
||||
return errors.ServiceUnavailable(h.opts.Name, "%v", err)
|
||||
}
|
||||
}
|
||||
|
||||
for _, fn := range h.opts.HealthChecks {
|
||||
if err = fn(ctx); err != nil {
|
||||
return errors.ServiceUnavailable(h.opts.Name, "%v", err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *Handler) Live(ctx context.Context, req *codecpb.Frame, rsp *codecpb.Frame) error {
|
||||
var err error
|
||||
|
||||
for _, s := range h.opts.Staters {
|
||||
if !s.Live() {
|
||||
return errors.ServiceUnavailable(h.opts.Name, "%v", err)
|
||||
}
|
||||
}
|
||||
|
||||
for _, fn := range h.opts.LiveChecks {
|
||||
if err = fn(ctx); err != nil {
|
||||
return errors.ServiceUnavailable(h.opts.Name, "%v", err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *Handler) Ready(ctx context.Context, req *codecpb.Frame, rsp *codecpb.Frame) error {
|
||||
var err error
|
||||
|
||||
for _, s := range h.opts.Staters {
|
||||
if !s.Ready() {
|
||||
return errors.ServiceUnavailable(h.opts.Name, "%v", err)
|
||||
}
|
||||
}
|
||||
|
||||
for _, fn := range h.opts.ReadyChecks {
|
||||
if err = fn(ctx); err != nil {
|
||||
return errors.ServiceUnavailable(h.opts.Name, "%v", err)
|
||||
|
Reference in New Issue
Block a user