Packages
step_flow
1.8.1
1.9.0-rc2
1.9.0-rc1
1.9.0-rc0
1.8.2
1.8.1
1.8.1-rc8
1.8.1-rc7
1.8.1-rc6
1.8.1-rc5
1.8.1-rc4
1.8.1-rc3
1.8.1-rc2
1.8.1-rc1
1.8.1-rc0
1.8.0
1.8.0-rc3
1.8.0-rc2
1.8.0-rc1
1.8.0-rc0
1.7.3
1.7.3-rc4
1.7.3-rc3
1.7.3-rc2
1.7.3-rc1
1.7.3-rc0
1.7.2
1.7.2-rc4
1.7.2-rc3
1.7.2-rc2
1.7.2-rc1
1.7.2-rc0
1.7.1
1.7.0
1.7.0-rc1
1.7.0-rc0
1.6.1
1.6.1-rc1
1.6.1-rc0
1.6.0
1.6.0-rc9
1.6.0-rc8
1.6.0-rc7
1.6.0-rc6
1.6.0-rc5
1.6.0-rc4
1.6.0-rc3
1.6.0-rc20
1.6.0-rc2
1.6.0-rc19
1.6.0-rc18
1.6.0-rc17
1.6.0-rc16
1.6.0-rc15
1.6.0-rc14
1.6.0-rc13
1.6.0-rc12
1.6.0-rc11
1.6.0-rc10
1.6.0-rc1
1.5.0
1.5.0-rc1
1.4.2-rc2
1.4.2-rc1
1.4.1
1.4.1-rc1
1.4.0
1.4.0-rc4
1.4.0-rc3
1.4.0-rc2
1.4.0-rc1
1.3.1
1.3.0
1.3.0-rc
1.2.0
1.1.0
1.0.0
1.0.0-rc9
1.0.0-rc8
1.0.0-rc7
1.0.0-rc6
1.0.0-rc5
1.0.0-rc1
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.4
0.0.3
0.0.2
0.0.1
Step flow manager for Elixir applications
Current section
Files
Jump to
Current section
Files
lib/step_flow/repo/supervision_tree.ex
defmodule StepFlow.Repo.SupervisionTree do
@moduledoc """
Dump the application supervision tree into the application logs.
Useful for debugging purpose.
"""
use GenServer
require Logger
@interval 10_000
def child_spec(_) do
%{
id: StepFlow.Repo.SupervisionTree,
start: {StepFlow.Repo.SupervisionTree, :start_link, []},
type: :worker
}
end
def start_link do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
@impl true
def init(_) do
Logger.info("[#{__MODULE__}] Start printing supervision tree!")
tree =
"\n" <>
print_supervision_tree(StepFlow.Repo) <>
print_supervision_tree(StepFlow.ProcessManager) <>
print_supervision_tree(StepFlow.Amqp.Supervisor)
Logger.info("[#{__MODULE__}] Supervision tree:\n#{tree}")
Process.send_after(self(), :print, @interval)
{:ok, %{}}
end
@impl true
def handle_info(:print, _) do
tree =
"\n" <>
print_supervision_tree(StepFlow.Repo) <>
print_supervision_tree(StepFlow.ProcessManager) <>
print_supervision_tree(StepFlow.Amqp.Supervisor)
Logger.info("[#{__MODULE__}] Supervision tree:\n#{tree}")
Process.send_after(self(), :print, @interval)
{:noreply, %{}}
end
defp print_supervision_tree(supervisor) do
case Process.whereis(supervisor) do
nil ->
"\t==== Supervision tree from #{inspect(supervisor)}: not running ====\n\n"
process_manager_pid ->
"\t==== Supervision tree from: #{inspect(supervisor)} (#{inspect(process_manager_pid)}) ====\n" <>
if Process.alive?(process_manager_pid) do
subtree =
Supervisor.which_children(supervisor)
|> print_children()
|> Enum.join("\n")
subtree <> "\n\n"
else
"\t#{inspect(supervisor)}: is dead (#{inspect(process_manager_pid)})\n\n"
end
end
end
defp print_children(_children, _tab \\ 1, _result \\ [])
defp print_children([], _tab, result), do: result
defp print_children([child | children], tab, result) do
{name, pid, type, _} = child
pid_str =
case pid do
:restarting ->
":restarting"
:undefined ->
":undefined"
pid ->
status =
if Process.alive?(pid) do
"alive"
else
"dead"
end
"#{inspect(pid)} (#{status})"
end
result =
result ++
[
String.duplicate("\t", tab) <>
" |- #{String.pad_trailing("#{name}", 50, " ")}\t #{pid_str}\t #{inspect(type)}"
]
result =
result ++
if type == :supervisor and pid != :restarting and pid != :undefined and
Process.alive?(pid) do
Supervisor.which_children(name)
|> print_children(tab + 1)
else
[]
end
print_children(children, tab, result)
end
end