193 lines
4.3 KiB
Markdown
193 lines
4.3 KiB
Markdown
|
# health-go
|
||
|
[![Go Report Card](https://goreportcard.com/badge/github.com/hellofresh/health-go)](https://goreportcard.com/report/github.com/hellofresh/health-go)
|
||
|
[![Go Doc](https://godoc.org/github.com/hellofresh/health-go?status.svg)](https://godoc.org/github.com/hellofresh/health-go)
|
||
|
|
||
|
* Exposes an HTTP handler that retrieves health status of the application
|
||
|
* Implements some generic checkers for the following services:
|
||
|
* RabbitMQ
|
||
|
* PostgreSQL
|
||
|
* Redis
|
||
|
* HTTP
|
||
|
* MongoDB
|
||
|
* MySQL
|
||
|
* gRPC
|
||
|
* Memcached
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
The library exports `Handler` and `HandlerFunc` functions which are fully compatible with `net/http`.
|
||
|
|
||
|
Additionally, library exports `Measure` function that returns summary status for all the registered health checks,
|
||
|
so it can be used in non-HTTP environments.
|
||
|
|
||
|
### Handler
|
||
|
|
||
|
```go
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"net/http"
|
||
|
"time"
|
||
|
|
||
|
"github.com/hellofresh/health-go/v4"
|
||
|
healthMysql "github.com/hellofresh/health-go/v4/checks/mysql"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
// add some checks on instance creation
|
||
|
h, _ := health.New(health.WithChecks(health.Config{
|
||
|
Name: "rabbitmq",
|
||
|
Timeout: time.Second * 5,
|
||
|
SkipOnErr: true,
|
||
|
Check: func(ctx context.Context) error {
|
||
|
// rabbitmq health check implementation goes here
|
||
|
return nil
|
||
|
}}, health.Config{
|
||
|
Name: "mongodb",
|
||
|
Check: func(ctx context.Context) error {
|
||
|
// mongo_db health check implementation goes here
|
||
|
return nil
|
||
|
},
|
||
|
},
|
||
|
))
|
||
|
|
||
|
// and then add some more if needed
|
||
|
h.Register(health.Config{
|
||
|
Name: "mysql",
|
||
|
Timeout: time.Second * 2,
|
||
|
SkipOnErr: false,
|
||
|
Check: healthMysql.New(healthMysql.Config{
|
||
|
DSN: "test:test@tcp(0.0.0.0:31726)/test?charset=utf8",
|
||
|
}),
|
||
|
})
|
||
|
|
||
|
http.Handle("/status", h.Handler())
|
||
|
http.ListenAndServe(":3000", nil)
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### HandlerFunc
|
||
|
```go
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"net/http"
|
||
|
"time"
|
||
|
|
||
|
"github.com/go-chi/chi"
|
||
|
"github.com/hellofresh/health-go/v4"
|
||
|
healthMysql "github.com/hellofresh/health-go/v4/checks/mysql"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
// add some checks on instance creation
|
||
|
h, _ := health.New(health.WithChecks(health.Config{
|
||
|
Name: "rabbitmq",
|
||
|
Timeout: time.Second * 5,
|
||
|
SkipOnErr: true,
|
||
|
Check: func(ctx context.Context) error {
|
||
|
// rabbitmq health check implementation goes here
|
||
|
return nil
|
||
|
}}, health.Config{
|
||
|
Name: "mongodb",
|
||
|
Check: func(ctx context.Context) error {
|
||
|
// mongo_db health check implementation goes here
|
||
|
return nil
|
||
|
},
|
||
|
},
|
||
|
))
|
||
|
|
||
|
// and then add some more if needed
|
||
|
h.Register(health.Config{
|
||
|
Name: "mysql",
|
||
|
Timeout: time.Second * 2,
|
||
|
SkipOnErr: false,
|
||
|
Check: healthMysql.New(healthMysql.Config{
|
||
|
DSN: "test:test@tcp(0.0.0.0:31726)/test?charset=utf8",
|
||
|
}),
|
||
|
})
|
||
|
|
||
|
r := chi.NewRouter()
|
||
|
r.Get("/status", h.HandlerFunc)
|
||
|
http.ListenAndServe(":3000", nil)
|
||
|
}
|
||
|
```
|
||
|
|
||
|
For more examples please check [here](https://github.com/hellofresh/health-go/blob/master/_examples/server.go)
|
||
|
## API Documentation
|
||
|
|
||
|
### `GET /status`
|
||
|
|
||
|
Get the health of the application.
|
||
|
- Method: `GET`
|
||
|
- Endpoint: `/status`
|
||
|
- Request:
|
||
|
```
|
||
|
curl localhost:3000/status
|
||
|
```
|
||
|
- Response:
|
||
|
|
||
|
HTTP/1.1 200 OK
|
||
|
```json
|
||
|
{
|
||
|
"status": "OK",
|
||
|
"timestamp": "2017-01-01T00:00:00.413567856+033:00",
|
||
|
"system": {
|
||
|
"version": "go1.8",
|
||
|
"goroutines_count": 4,
|
||
|
"total_alloc_bytes": 21321,
|
||
|
"heap_objects_count": 21323,
|
||
|
"alloc_bytes": 234523
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
HTTP/1.1 200 OK
|
||
|
```json
|
||
|
{
|
||
|
"status": "Partially Available",
|
||
|
"timestamp": "2017-01-01T00:00:00.413567856+033:00",
|
||
|
"failures": {
|
||
|
"rabbitmq": "Failed during rabbitmq health check"
|
||
|
},
|
||
|
"system": {
|
||
|
"version": "go1.8",
|
||
|
"goroutines_count": 4,
|
||
|
"total_alloc_bytes": 21321,
|
||
|
"heap_objects_count": 21323,
|
||
|
"alloc_bytes": 234523
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
HTTP/1.1 503 Service Unavailable
|
||
|
```json
|
||
|
{
|
||
|
"status": "Unavailable",
|
||
|
"timestamp": "2017-01-01T00:00:00.413567856+033:00",
|
||
|
"failures": {
|
||
|
"mongodb": "Failed during mongodb health check"
|
||
|
},
|
||
|
"system": {
|
||
|
"version": "go1.8",
|
||
|
"goroutines_count": 4,
|
||
|
"total_alloc_bytes": 21321,
|
||
|
"heap_objects_count": 21323,
|
||
|
"alloc_bytes": 234523
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Contributing
|
||
|
- Fork it
|
||
|
- Create your feature branch (`git checkout -b my-new-feature`)
|
||
|
- Commit your changes (`git commit -am 'Add some feature'`)
|
||
|
- Push to the branch (`git push origin my-new-feature`)
|
||
|
- Create new Pull Request
|
||
|
|
||
|
---
|
||
|
> GitHub [@hellofresh](https://github.com/hellofresh) ·
|
||
|
> Medium [@engineering.hellofresh](https://engineering.hellofresh.com)
|