Packages
electric
1.0.20
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.16
1.4.16-beta-1
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
retired
1.1.5
retired
1.1.4
retired
1.1.3
retired
1.1.2
1.1.1
1.1.0
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.15
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-beta.23
1.0.0-beta.22
1.0.0-beta.20
1.0.0-beta.19
1.0.0-beta.18
1.0.0-beta.17
1.0.0-beta.16
1.0.0-beta.15
1.0.0-beta.14
1.0.0-beta.13
1.0.0-beta.12
1.0.0-beta.11
1.0.0-beta.10
1.0.0-beta.9
1.0.0-beta.8
1.0.0-beta.7
1.0.0-beta.6
1.0.0-beta.5
1.0.0-beta.4
1.0.0-beta.3
1.0.0-beta.2
1.0.0-beta.1
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.5.2
0.4.4
Postgres sync engine. Sync little subsets of your Postgres data into local apps and services.
Current section
Files
Jump to
Current section
Files
lib/electric/debug/process.ex
defmodule Electric.Debug.Process do
@default_count 5
def type(pid), do: process_type(pid, info(pid))
def top_memory_by_type do
top_memory_by_type(Process.list(), @default_count)
end
def top_memory_by_type(count) when is_integer(count) do
top_memory_by_type(Process.list(), count)
end
def top_memory_by_type(process_list) when is_list(process_list) do
top_memory_by_type(process_list, @default_count)
end
def top_memory_by_type(process_list, count)
when is_list(process_list) and is_integer(count) and count > 0 do
process_list
|> Enum.map(&type_and_memory/1)
|> Enum.reject(&(&1.type == :dead))
|> Enum.group_by(& &1.type, & &1.memory)
|> Enum.map(fn {type, memory} -> %{type: type, memory: Enum.sum(memory)} end)
|> Enum.sort_by(&(-&1.memory))
|> Enum.take(count)
end
defp type_and_memory(pid) do
info = info(pid)
%{type: process_type(pid, info), memory: memory_from_info(info)}
end
defp info(pid) do
Process.info(pid, [:dictionary, :initial_call, :label, :memory])
end
defp process_type(pid, info) do
label_from_info(info) ||
initial_module_from_info(info) ||
if(Process.alive?(pid), do: :unknown, else: :dead)
end
defp label_from_info(info) do
case info[:label] do
:undefined -> nil
{name, _} -> name
{name, _, _} -> name
name when is_atom(name) -> name
name when is_binary(name) -> name
_ -> nil
end
end
defp initial_module_from_info(info) do
case get_in(info, [:dictionary, :"$initial_call"]) do
{module, _function, _arg_count} ->
module
_ ->
case info[:initial_call] do
{module, _function, _arg_count} -> module
nil -> nil
end
end
end
defp memory_from_info(info) do
case info[:memory] do
bytes when is_integer(bytes) -> bytes
_ -> 0
end
end
end