HealthCheck
Simple health check library for Elixir applications with support for Ecto, Redix, Kaffe, MongoDB, and S3-compatible storage (Minio).
Dependencies are optional, so you only need to include what you use.
Installation
The package can be installed by adding elixir_health_check to your list of dependencies in mix.exs:
def deps do
[
{:elixir_health_check, "~> 0.1.0"}
]
endUsage
Configuration
Configure the checks in your config.exs. The configuration is a keyword list where keys are dependency names and values are their respective configurations.
config :my_app, :health_check_config,
postgres: [repos: [MyApp.Repo]],
redis: [redis_conn_selector: fn -> MyApp.Redis.get_conn() end],
kafka: [],
mongo: [topology: :my_mongo_topology],
endpoint: [endpoint: "http://minio:9000/minio/health/live"]The library provides default checkers for:
:postgres(requires:repos):redis(requires:redis_conn_selector):kafka(optional:endpoints):mongo(requires:topology):endpoint(requires:endpoint)
Postgres Check
Verifies connectivity to one or more Ecto repositories by executing SELECT 1.
Redis Check
Verifies connectivity to Redis by sending a PING command. You must provide a function that returns a connection (pid or atom).
Kafka Check
The Kafka check verifies that the kaffe application is running and attempts to list topics from the configured endpoints using :brod.
Endpoint Check
The Endpoint check uses HTTPoison to verify connectivity to a specified URL. It expects a status code less than 500.
Mongo Check
The Mongo check uses mongodb_driver to send a ping command to the specified topology.
In a Phoenix/Plug application
You can use HealthCheck.Router as a plug in your endpoint or forward to it in your router:
# In endpoint.ex
plug HealthCheck.Router, otp_app: :my_app
# Or in router.ex
forward "/health", HealthCheck.Router, otp_app: :my_appIn a non-web application
You can start a standalone health check server (using Bandit) in your application’s supervision tree:
def start(_type, _args) do
children = [
{HealthCheck.Server, otp_app: :my_app, port: 4000}
# ... other children
]
Supervisor.start_link(children, strategy: :one_for_one)
end