Documentation
¶
Index ¶
- Variables
- func CheckGRPCServerHealth(ctx context.Context, grpcCfg *commoncfg.GRPCClient) error
- func NewHandler(checker Checker, options ...HandlerOption) http.HandlerFunc
- type AvailabilityStatus
- type Check
- type CheckResult
- type CheckState
- type Checker
- type GRPCHealthClientService
- type GRPCServer
- func (s *GRPCServer) Check(_ context.Context, _ *healthpb.HealthCheckRequest) (*healthpb.HealthCheckResponse, error)
- func (s *GRPCServer) List(context.Context, *healthpb.HealthListRequest) (*healthpb.HealthListResponse, error)
- func (s *GRPCServer) Watch(_ *healthpb.HealthCheckRequest, _ healthpb.Health_WatchServer) error
- type HandlerConfig
- type HandlerOption
- type Interceptor
- type InterceptorFunc
- type JSONResultWriter
- type Middleware
- type MiddlewareFunc
- type Option
- func WithCacheDuration(duration time.Duration) Option
- func WithCheck(check Check) Option
- func WithChecks(checks ...Check) Option
- func WithDatabaseChecker(driverName, dataSourceName string) Option
- func WithDisabledAutostart() Option
- func WithDisabledCache() Option
- func WithDisabledDetails() Option
- func WithGRPCServerChecker(grpcCfg commoncfg.GRPCClient) Option
- func WithInfo(values map[string]interface{}) Option
- func WithInfoFunc(infoFuncs ...func(info map[string]interface{})) Option
- func WithInterceptors(interceptors ...Interceptor) Option
- func WithPeriodicCheck(refreshPeriod time.Duration, initialDelay time.Duration, check Check) Option
- func WithStatusListener(listener func(ctx context.Context, state State)) Option
- func WithTimeout(timeout time.Duration) Option
- type Result
- type ResultWriter
- type State
Constants ¶
This section is empty.
Variables ¶
var (
ErrCheckTimeout = errors.New("check timed out")
)
var (
ErrIsNotGrpcPool = errors.New("result is not of type grpc Pool")
)
Functions ¶
func CheckGRPCServerHealth ¶
func CheckGRPCServerHealth(ctx context.Context, grpcCfg *commoncfg.GRPCClient) error
CheckGRPCServerHealth does call the grpc server health check API
func NewHandler ¶
func NewHandler(checker Checker, options ...HandlerOption) http.HandlerFunc
NewHandler creates a new health check http.Handler.
Types ¶
type AvailabilityStatus ¶
type AvailabilityStatus string
AvailabilityStatus expresses the availability of either a component or the whole system.
const ( // StatusUnknown holds the information that the availability // status is not known, because not all checks were executed yet. StatusUnknown AvailabilityStatus = "unknown" // StatusUp holds the information that the system or a component // is up and running. StatusUp AvailabilityStatus = "up" // StatusDown holds the information that the system or a component // down and not available. StatusDown AvailabilityStatus = "down" )
type Check ¶
type Check struct {
// The Name must be unique among all checks. Name is a required attribute.
Name string // Required
// Check is the check function that will be executed to check availability.
// This function must return an error if the checked service is considered
// not available. Check is a required attribute.
Check func(ctx context.Context) error // Required
// Timeout will override the global timeout value, if it is smaller than
// the global timeout (see WithTimeout).
Timeout time.Duration // Optional
// MaxTimeInError will set a duration for how long a service must be
// in an error state until it is considered down/unavailable.
MaxTimeInError time.Duration // Optional
// MaxContiguousFails will set a maximum number of contiguous
// check fails until the service is considered down/unavailable.
MaxContiguousFails uint // Optional
// StatusListener allows to set a listener that will be called
// whenever the AvailabilityStatus (e.g. from "up" to "down").
StatusListener func(ctx context.Context, name string, state CheckState) // Optional
// Interceptors holds a list of Interceptor instances that will be executed one after another in the
// order as they appear in the list.
Interceptors []Interceptor
// DisablePanicRecovery disables automatic recovery from panics. If left in its default value (false),
// panics will be automatically converted into errors instead.
DisablePanicRecovery bool
// PanicHandler allows to set a panic handler.
PanicHandler func(ctx context.Context, err error) // Optional
// contains filtered or unexported fields
}
Check allows to configure health checks.
type CheckResult ¶
type CheckResult struct {
// Status is the availability status of a component.
Status AvailabilityStatus `json:"status"`
// Timestamp holds the time when the check was executed.
Timestamp time.Time `json:"timestamp,omitempty"`
// Error contains the check error message, if the check failed.
Error error `json:"error,omitempty"`
}
CheckResult holds a components health information. Attention: This type is converted from/to JSON using a custom marshalling/unmarshalling function (see type jsonCheckResult). This is required because some fields are not converted automatically by the standard json.Marshal/json.Unmarshal functions (such as the error interface). The JSON tags you see here, are just there for the readers' convenience.
func (CheckResult) MarshalJSON ¶
func (cr CheckResult) MarshalJSON() ([]byte, error)
MarshalJSON provides a custom marshaller for the CheckResult type.
func (*CheckResult) UnmarshalJSON ¶
func (cr *CheckResult) UnmarshalJSON(data []byte) error
type CheckState ¶
type CheckState struct {
// LastCheckedAt holds the time of when the check was last executed.
LastCheckedAt time.Time
// LastCheckedAt holds the last time of when the check did not return an error.
LastSuccessAt time.Time
// LastFailureAt holds the last time of when the check did return an error.
LastFailureAt time.Time
// FirstCheckStartedAt holds the time of when the first check was started.
FirstCheckStartedAt time.Time
// ContiguousFails holds the number of how often the check failed in a row.
ContiguousFails uint
// Result holds the error of the last check (nil if successful).
Result error
// The current availability status of the check.
Status AvailabilityStatus
}
CheckState represents the current state of a component check.
type Checker ¶
type Checker interface {
// Start will start all necessary background workers and prepare
// the checker for further usage.
Start()
// Stop will stop the checker.
Stop()
// Check runs all synchronous (i.e., non-periodic) check functions.
// It returns the aggregated health status (combined from the results
// of this executions synchronous checks and the previously reported
// results of asynchronous/periodic checks. This function expects a
// context, that may contain deadlines to which will be adhered to.
// The context will be passed to all downstream calls
// (such as listeners, component check functions, and interceptors).
Check(ctx context.Context) Result
// GetRunningPeriodicCheckCount returns the number of currently
// running periodic checks.
GetRunningPeriodicCheckCount() int
// IsStarted returns true, if the Checker was started (see Checker.Start)
// and is currently still running. Returns false otherwise.
IsStarted() bool
}
Checker is the main checker interface. It provides all health checking logic.
func NewChecker ¶
NewChecker creates a new Checker. The provided options will be used to modify its configuration. If the Checker was not yet started (see Checker.IsStarted), it will be started automatically (see Checker.Start). You can disable this autostart by adding the WithDisabledAutostart configuration option.
type GRPCHealthClientService ¶
type GRPCHealthClientService interface {
healthgrpc.HealthClient
}
func NewGRPCHealthClient ¶
func NewGRPCHealthClient(grpcClientCfg *commoncfg.GRPCClient, dialOptions ...grpc.DialOption) (GRPCHealthClientService, error)
NewGRPCHealthClient create a grpc client connect to health check server
type GRPCServer ¶
type GRPCServer struct{}
func (*GRPCServer) Check ¶
func (s *GRPCServer) Check(_ context.Context, _ *healthpb.HealthCheckRequest) (*healthpb.HealthCheckResponse, error)
func (*GRPCServer) List ¶
func (s *GRPCServer) List(context.Context, *healthpb.HealthListRequest) (*healthpb.HealthListResponse, error)
func (*GRPCServer) Watch ¶
func (s *GRPCServer) Watch(_ *healthpb.HealthCheckRequest, _ healthpb.Health_WatchServer) error
type HandlerConfig ¶
type HandlerConfig struct {
// contains filtered or unexported fields
}
type HandlerOption ¶
type HandlerOption func(*HandlerConfig)
HandlerOption is a configuration option for a Handler (see NewHandler).
func WithMiddleware ¶
func WithMiddleware(middleware ...Middleware) HandlerOption
WithMiddleware configures a middleware that will be used by the handler to pro- and post-process HTTP requests and health checks. Refer to the documentation of type Middleware for more information.
func WithResultWriter ¶
func WithResultWriter(writer ResultWriter) HandlerOption
WithResultWriter is responsible for writing a health check result (see Result) into an HTTP response. By default, JSONResultWriter will be used.
func WithStatusCodeDown ¶
func WithStatusCodeDown(httpStatus int) HandlerOption
WithStatusCodeDown sets an HTTP status code that will be used for responses where the system is considered to be unavailable ("down"). Default is HTTP status code 503 (Service Unavailable).
func WithStatusCodeUp ¶
func WithStatusCodeUp(httpStatus int) HandlerOption
WithStatusCodeUp sets an HTTP status code that will be used for responses where the system is considered to be available ("up"). Default is HTTP status code 200 (OK).
type Interceptor ¶
type Interceptor func(next InterceptorFunc) InterceptorFunc
Interceptor is factory function that allows creating new instances of a InterceptorFunc. The concept behind Interceptor is similar to the middleware pattern. A InterceptorFunc that is created by calling a Interceptor is expected to forward the function call to the next InterceptorFunc (passed to the Interceptor in parameter 'next'). This way, a chain of interceptors is constructed that will eventually invoke of the components health check function. Each interceptor must therefore invoke the 'next' interceptor. If the 'next' InterceptorFunc is not called, the components check health function will never be executed.
type InterceptorFunc ¶
type InterceptorFunc func(ctx context.Context, checkName string, state CheckState) CheckState
InterceptorFunc is an interceptor function that intercepts any call to a components health check function.
type JSONResultWriter ¶
type JSONResultWriter struct{}
JSONResultWriter writes a Result in JSON format into an http.ResponseWriter. This ResultWriter is set by default.
func NewJSONResultWriter ¶
func NewJSONResultWriter() *JSONResultWriter
NewJSONResultWriter creates a new instance of a JSONResultWriter.
func (*JSONResultWriter) Write ¶
func (rw *JSONResultWriter) Write(result *Result, statusCode int, w http.ResponseWriter, r *http.Request) error
Write implements ResultWriter.Write.
type Middleware ¶
type Middleware func(next MiddlewareFunc) MiddlewareFunc
Middleware is factory function that allows creating new instances of a MiddlewareFunc. A MiddlewareFunc is expected to forward the function call to the next MiddlewareFunc (passed in parameter 'next'). This way, a chain of interceptors is constructed that will eventually invoke of the Checker.Check function. Each interceptor must therefore invoke the 'next' interceptor. If the 'next' MiddlewareFunc is not called, Checker.Check will never be executed.
type MiddlewareFunc ¶
MiddlewareFunc is a middleware for a health Handler (see NewHandler). It is invoked each time an HTTP request is processed.
type Option ¶
type Option func(config *checkerConfig)
Option is a configuration option for a Checker.
func WithCacheDuration ¶
WithCacheDuration sets the duration for how long the aggregated health check result will be cached. By default, the cache TTL (i.e, the duration for how long responses will be cached) is set to 1 second. Caching will prevent that each incoming HTTP request triggers a new health check. A duration of 0 will effectively disable the cache and has the same effect as WithDisabledCache.
func WithCheck ¶
WithCheck adds a new health check that contributes to the overall service availability status. This check will be triggered each time Checker.Check is called (i.e., for each HTTP request). If health checks are expensive, or you expect a higher amount of requests on the health endpoint, consider using WithPeriodicCheck instead.
func WithChecks ¶
WithChecks adds a list of health checks that contribute to the overall service availability status. These checks will be triggered each time Checker.Check is called (i.e., for each HTTP request). If health checks are expensive, or you expect a higher amount of requests on the health endpoint, consider using WithPeriodicCheck instead.
func WithDatabaseChecker ¶
WithDatabaseChecker creates a health check for a database connection.
func WithDisabledAutostart ¶
func WithDisabledAutostart() Option
WithDisabledAutostart disables automatic startup of a Checker instance.
func WithDisabledCache ¶
func WithDisabledCache() Option
WithDisabledCache disabled the check cache. This is not recommended in most cases. This will effectively lead to a health endpoint that initiates a new health check for each incoming HTTP request. This may have an impact on the systems that are being checked (especially if health checks are expensive). Caching also mitigates "denial of service" attacks. Caching is enabled by default.
func WithDisabledDetails ¶
func WithDisabledDetails() Option
WithDisabledDetails disables all data in the JSON response body. The AvailabilityStatus will be the only content. Example: { "status":"down" }. Enabled by default.
func WithGRPCServerChecker ¶
func WithGRPCServerChecker(grpcCfg commoncfg.GRPCClient) Option
WithGRPCServerChecker creates a health check for a gRPC server.
func WithInfo ¶
WithInfo sets values that will be available in every health check result. For example, you can use this option if you want to set information about your system that will be returned in every health check result, such as version number, Git SHA, build date, etc. These values will be available in Result.Info. If you use the default HTTP handler of this library (see NewHandler) or convert the Result to JSON on your own, these values will be available in the "info" field.
func WithInfoFunc ¶
WithInfoFunc sets functions that compute values to be added to every health check result. It works similarly to WithInfo, but allows dynamic computation of values at the time of the health check. Each function receives the `info` map, but any values set by WithInfo will override those computed by WithInfoFunc. In other words, if both WithInfo and WithInfoFunc set the same key, the static values from WithInfo will take precedence over those dynamically computed by WithInfoFunc. Values added by these functions will still be available in Result.Info and reflected in the "info" field if you are using the default HTTP handler (see NewHandler) or converting Result to JSON. The functions will be executed in order.
func WithInterceptors ¶
func WithInterceptors(interceptors ...Interceptor) Option
WithInterceptors adds a list of interceptors that will be applied to every check function. Interceptors may intercept the function call and do some pre- and post-processing, having the check state and check function result at hand. The interceptors will be executed in the order they are passed to this function.
func WithPeriodicCheck ¶
WithPeriodicCheck adds a new health check that contributes to the overall service availability status. The health check will be performed on a fixed schedule and will not be executed for each HTTP request (as in contrast to WithCheck). This allows to process a much higher number of HTTP requests without actually calling the checked services too often or to execute long-running checks. This way Checker.Check (and the health endpoint) always returns the last result of the periodic check.
func WithStatusListener ¶
WithStatusListener registers a listener function that will be called whenever the overall/aggregated system health status changes (e.g. from "up" to "down"). Attention: Because this listener is also executed for synchronous (i.e, request-based) health checks, it should not block processing.
func WithTimeout ¶
WithTimeout defines a timeout duration for all checks. You can override this timeout by using the timeout value in the Check configuration. Default value is 10 seconds.
type Result ¶
type Result struct {
// Info contains additional information about this health result.
Info map[string]interface{} `json:"info,omitempty"`
// Status is the aggregated system availability status.
Status AvailabilityStatus `json:"status"`
// Details contains health information for all checked components.
Details map[string]CheckResult `json:"details,omitempty"`
}
Result holds the aggregated system availability status and detailed information about the individual checks.
type ResultWriter ¶
type ResultWriter interface {
// Write writes a Result into a http.ResponseWriter in a format
// that the ResultWriter supports (such as XML, JSON, etc.).
// A ResultWriter is expected to write at least the following information into the http.ResponseWriter:
// (1) A MIME type header (e.g., "Content-Type" : "application/json"),
// (2) the HTTP status code that is passed in parameter statusCode (this is necessary due to ordering constraints
// when writing into a http.ResponseWriter, and
// (3) the response body in the format that the ResultWriter supports.
Write(result *Result, statusCode int, w http.ResponseWriter, r *http.Request) error
}
ResultWriter enabled a Handler (see NewHandler) to write the Result to an http.ResponseWriter in a specific format. For example, the JSONResultWriter writes the result in JSON format into the response body).
type State ¶
type State struct {
// Status is the aggregated system health status.
Status AvailabilityStatus
// CheckState contains the state of all checks.
CheckState map[string]CheckState
}
State represents the current state of the Checker.