aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma
diff options
context:
space:
mode:
authorkaniini <ariadne@dereferenced.org>2019-09-11 20:47:25 +0000
committerkaniini <ariadne@dereferenced.org>2019-09-11 20:47:25 +0000
commit50269e9cacdbb7834c31fc7ad9872b68977e9f10 (patch)
tree78d20dabd5ae2296336d3c81ec88f2ce4824ff6c /lib/pleroma
parent46ae62d159ca0a330d18a2e1f775a5ed9eaebc42 (diff)
parent56828abf6de81a52079b26cf899b91fdd822f2ce (diff)
downloadpleroma-50269e9cacdbb7834c31fc7ad9872b68977e9f10.tar.gz
Merge branch 'feature/jason-view-render' into 'develop'
Use Jason for rendering responses See merge request pleroma/pleroma!1655
Diffstat (limited to 'lib/pleroma')
-rw-r--r--lib/pleroma/healthcheck.ex65
1 files changed, 65 insertions, 0 deletions
diff --git a/lib/pleroma/healthcheck.ex b/lib/pleroma/healthcheck.ex
new file mode 100644
index 000000000..977b78c26
--- /dev/null
+++ b/lib/pleroma/healthcheck.ex
@@ -0,0 +1,65 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Healthcheck do
+ @moduledoc """
+ Module collects metrics about app and assign healthy status.
+ """
+ alias Pleroma.Healthcheck
+ alias Pleroma.Repo
+
+ @derive Jason.Encoder
+ 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 = Pleroma.Config.get([Repo, :database])
+
+ query =
+ "select state, count(pid) from pg_stat_activity where datname = '#{database}' group by state;"
+
+ result = Repo.query!(query)
+ pool_size = Pleroma.Config.get([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