README.md

# ExHealth ![ExHealth](./assets/logo.png)

[![Build Status](https://circleci.com/gh/Kartstig/ex_health/tree/master.svg?style=svg&circle-token=8ed28fee90111e2a034b0d71e0fcf8ae18bba641)](https://circleci.com/gh/Kartstig/ex_health/tree/master)
[![codecov](https://codecov.io/gh/Kartstig/ex_health/branch/master/graph/badge.svg)](https://codecov.io/gh/Kartstig/ex_health)
[![Module Version](https://img.shields.io/hexpm/v/ex_health.svg)](https://hex.pm/packages/ex_health)
[![Hex Docs](https://img.shields.io/badge/hex-docs-lightgreen.svg)](https://hexdocs.pm/ex_health/)
[![Total Download](https://img.shields.io/hexpm/dt/ex_health.svg)](https://hex.pm/packages/ex_health)
[![License](https://img.shields.io/hexpm/l/ex_health.svg)](https://github.com/Kartstig/ex_health/blob/master/LICENSE)
[![Last Updated](https://img.shields.io/github/last-commit/Kartstig/ex_health.svg)](https://github.com/Kartstig/ex_health/commits/master)

> A health check utility for any OTP application

ExHealth runs a supervised GenServer that performs routine health checks which
are configurable to your application. Check out [ExHealth.Plug](lib/ex_health/plug.ex)
for integrating the result into a web endpoint which yields a JSON response like:

```javascript
{
   last_check:"2018-09-18T06:43:53.773719Z",
   result:{
      check_results:[
         [
            "Database",
            "ok"
         ],
         [
            "PhoenixExampleWeb_Endpoint",
            "ok"
         ]
      ],
      msg:"healthy"
   }
}
```

## Installation

Add `:ex_health` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:ex_health, "~> 0.3.0"}
  ]
end
```

Ensure `:ex_health` is started alongside your application by adding this to
your `mix.exs`

```elixir
def application do
  [
    applications: [:ex_health]
  ]
end
```

## Getting Started

Configuration for ExHealth must be present the Application environment. This
can be done by updating the `:ex_health` values in your `config/config.exs`:

```elixir
config :ex_health,
  module: MyApplication.HealthChecks,
  interval_ms: 1000, # Interval between checks in milliseconds
  http_err_code: true # Enable http error code (503) on unhealthy status
```

Then you must define a module `MyApplication.HealthChecks` with some checks:

```elixir
defmodule MyApplication.HealthChecks do
  process_check(MyApplication.CacheServer)

  test "Redis" do
    MyRedis.ping() # This should return :ok | {:error, "Message"}
  end
end
```

## Integrating with Phoenix

To integrate with [Phoenix](https://hexdocs.pm/phoenix/Phoenix.html)
or any other web framework, you can take advantage of `ExHealth.Plug`
which handles serving a JSON response for you.

See `ExHealth.Plug` for instructions.

## Contributing

Pull requests are welcome. The best way to get started is to check out
[CONTRIBUTING](CONTRIBUTING.md).

Once you have the repo cloned, just run:

```bash
$ mix deps.get
```

and then you can start ExHealth with CLI:

```bash
$ iex -S mix
```

## Copyright and License

Copyright (c) 2018 Herman Singh.

This software is licensed under [the MIT license](./LICENSE).