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