Checks your application health.
Add :heartcheck to your list of dependencies in mix.exs:
def deps do
[
{:heartcheck, "~> 0.4"}
]
endAdd :jason to deps too if you do not have it already:
{:jason, "~> 1.0"},If you wish to use :poison or other compatible JSON library, add the dependency
in mix.exs and to your config.exs:
config :heartcheck, json_encoder: PoisonIf you are using elixir < 1.5, ensure heartcheck is started before your application:
def application do
[
applications: [:heartcheck]
]
endDefine your checks in module by using the HeartCheck macro module and invoking
the HeartCheck.add/2 macro:
defmodule MyApp.HeartCheck do
use HeartCheck
add :some_check do
# TODO: perform some actual check here
:ok
end
add :another_check do
# TODO: perform some actual check here
{:error, "something went wrong"}
end
endThe checks can return one of the following terms:
:ok{:error, term}:error
In the {error, term} case, a representation of term will be used as the
error message.
Then you can mount HeartCheck.Plug using the module defined above in your app
router (phoenix example below):
def MyApp.Router
use MyApp.Web, :router
# (...)
scope "/" do
pipe_through :browser
# (...)
forward "/monitoring", HeartCheck.Plug, heartcheck: MyApp.HeartCheck
end
endThen your checks will be available at the /monitoring endpoint.
You can define a another module using HeartCheck and use it as your functional
monitoring in the router:
forward "/monitoring", HeartCheck.Plug, heartcheck: MyApp.HeartCheck,
functional: MyApp.FunctionalHeartCheckThis will be available in the /monitoring/funcional endpoint.
Use firewall check inside your heartcheck file to ensure your application is able to connect to an external service. This will only open a TCP connection to the defined host/port in the url and assert it can connect.
Timeout argument is optional and default is 1000 (1 second).
defmodule MyApp.HeartCheck do
use HeartCheck
firewall(service: "http://service.acme.org:3200",
another_service: Application.get_env(:my_app, :service_url))
firewall(my_domain: Application.get_env(:my_app, :url), timeout: 2000)
endReturns a simple ok if the app is running. It does not execute any configured
checks:
/monitoring/health_checkReturns general of the environment. OS, dependencies names and versions, elixir version etc.
/monitoring/environmentTo easily start a docker container with the currently supported version of Elixir, you can use this command:
$ docker-compose run heartcheck bashTo install dependencies, execute:
$ mix deps.getTo run the tests, simply execute:
$ mix testTo run coverage metrics and generate a html report in cover/excoveralls.html:
$ mix coveralls.html