monitor

A rudimentary (but hopefully -- eventually -- simple & powerful) API for querying and monitoring the status of servers, server processes, Elixir nodes, and Elixir processes


License
Apache-2.0

Documentation

Monitor

Monitor provides a rudimentary (but hopefully -- eventually -- simple yet powerful) API for querying and monitoring the status of servers, server processes, Elixir nodes, and Elixir processes.

The Monitor runs as a supervised GenServer, so if it crashes, it should get automatically restarted and its new PID associated with its :global name, which looks something like {Monitor.Server, :"node@server"}.

Usage

To start up one or more Elixir nodes running Monitor:

iex --name "m1@127.0.0.1" -S mix

When the node starts up, it will start a Monitor.Server instance on the node and output a message like:

"Starting a Monitor.Server on node :\"m1@127.0.0.1\" with PID #PID<0.182.0> and name {:global, {Monitor.Server, :\"m1@127.0.0.1\"}}"

Finding the server's :global name & PID

To find the PID of the Monitor.Server on the local node:

{Monitor.Server, node()} |> :global.whereis_name()

or

Monitor.Server.monitor_pid()

To find the PID of the Monitor.Server on a named node:

{Monitor.Server, :"m2@127.0.0.1"} |> :global.whereis_name()

or

:"m2@127.0.0.1" |> Monitor.Server.monitor_pid()

Memory usage

To look up the current node's memory usage:

Monitor.Server.mem

To look up a specific node's memory usage:

node() |> Monitor.Server.monitor_pid |> Monitor.Server.mem

This should return output like:

%{
  allocated: 22520721408,
  pct_used: 67.07508261746172,
  total: 33575391232,
  worst_pid: {#PID<0.195.0>, 372624}
}

System memory usage

To look up the current node's system memory usage:

Monitor.Server.sys_mem

To look up a specific node's system memory usage:

node() |> Monitor.Server.monitor_pid |> Monitor.Server.sys_mem

This should return output like:

%{
  buffered_memory: 1577607168,
  cached_memory: 9958359040,
  free_memory: 11125661696,
  free_swap: 0,
  pct_free: 33.1363575754744,
  pct_used: 66.86364242452561,
  system_pct_free: 33.1363575754744,
  system_total_memory: 33575391232,
  total_memory: 33575391232,
  total_swap: 0
}

Disk usage

To look up the current node's disk usage:

Monitor.Server.disk

To look up a specific node's disk usage:

node() |> Monitor.Server.monitor_pid |> Monitor.Server.disk

This should return output like:

[
  %{disk_id: "/dev", pct_used: 0.0, total_kbytes: 16363208},
  %{disk_id: "/run", pct_used: 1.0, total_kbytes: 3278848},
  %{disk_id: "/", pct_used: 88.0, total_kbytes: 980675660},
  ...
]

CPU usage

To look up the current node's CPU usage:

Monitor.Server.cpu

To look up a specific node's CPU usage:

node() |> Monitor.Server.monitor_pid |> Monitor.Server.cpu

This should return output like:

%{
  cpu_rup_load_15_mins: 0.890625,
  cpu_rup_load_1_min: 1.0390625,
  cpu_rup_load_5_mins: 0.7890625,
  cpu_usage_pct: 27.03737166435444
}

Unix processes

To look up the current node's number of Unix processes:

Monitor.Server.unix_procs

To look up a specific node's number of Unix processes:

node() |> Monitor.Server.monitor_pid |> Monitor.Server.unix_procs

This should return output like:

%{num_unix_procs: 2399}

Installation

If available in Hex, the package can be installed by adding monitor to your list of dependencies in mix.exs:

def deps do
  [
    {:monitor, "~> 0.1.1"}
  ]
end

Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/monitor.