diff options
author | Roman Chvanikov <chvanikoff@gmail.com> | 2019-04-30 20:17:52 +0700 |
---|---|---|
committer | Roman Chvanikov <chvanikoff@gmail.com> | 2019-04-30 20:17:52 +0700 |
commit | 0f0cc2703b7ffb99c58e72782925ea4dd61db41d (patch) | |
tree | f640d180d16797a6da98a7d1e1cb7c6fb6350392 /lib/healthcheck.ex | |
parent | b87ad13803df59d88feb736c3d0ff9cf514989d7 (diff) | |
parent | 32a4501d2d1cdfef68cbde236482e0c84cce3a7a (diff) | |
download | pleroma-0f0cc2703b7ffb99c58e72782925ea4dd61db41d.tar.gz pleroma-0f0cc2703b7ffb99c58e72782925ea4dd61db41d.zip |
Merge develop
Diffstat (limited to 'lib/healthcheck.ex')
-rw-r--r-- | lib/healthcheck.ex | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/healthcheck.ex b/lib/healthcheck.ex new file mode 100644 index 000000000..646fb3b9d --- /dev/null +++ b/lib/healthcheck.ex @@ -0,0 +1,60 @@ +defmodule Pleroma.Healthcheck do + @moduledoc """ + Module collects metrics about app and assign healthy status. + """ + alias Pleroma.Healthcheck + alias Pleroma.Repo + + defstruct pool_size: 0, + active: 0, + idle: 0, + memory_used: 0, + healthy: true + + @type t :: %__MODULE__{ + pool_size: non_neg_integer(), + active: non_neg_integer(), + idle: non_neg_integer(), + memory_used: number(), + healthy: boolean() + } + + @spec system_info() :: t() + def system_info do + %Healthcheck{ + memory_used: Float.round(:erlang.memory(:total) / 1024 / 1024, 2) + } + |> assign_db_info() + |> check_health() + end + + defp assign_db_info(healthcheck) do + database = Application.get_env(:pleroma, Repo)[:database] + + query = + "select state, count(pid) from pg_stat_activity where datname = '#{database}' group by state;" + + result = Repo.query!(query) + pool_size = Application.get_env(:pleroma, Repo)[:pool_size] + + db_info = + Enum.reduce(result.rows, %{active: 0, idle: 0}, fn [state, cnt], states -> + if state == "active" do + Map.put(states, :active, states.active + cnt) + else + Map.put(states, :idle, states.idle + cnt) + end + end) + |> Map.put(:pool_size, pool_size) + + Map.merge(healthcheck, db_info) + end + + @spec check_health(Healthcheck.t()) :: Healthcheck.t() + def check_health(%{pool_size: pool_size, active: active} = check) + when active >= pool_size do + %{check | healthy: false} + end + + def check_health(check), do: check +end |