Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Monitorizar aplicaciones en producción

online.livemd

Monitorizar aplicaciones en producción

Mix.install([
  {:kino_db, "~> 0.2.3"},
  {:kino_vega_lite, "~> 0.1.10"},
  {:kino_maplibre, "~> 0.1.10"},
  {:kino_explorer, "~> 0.1.10"},
  {:httpoison, "~> 2.2"}
])

Monitorizar aplicaciones en producción

Donde tengamos desplegado el livebook podemos ver los procesos de la máquina, en este caso estamos con un livebook deesplegado en hugginfaces y podemos ver los procesos que tiene el servidor.

for pid <- Process.list() do
  Process.info(pid)
end

Los procesos nos los proporciona la maquina virtual de erlang. Y aqui podemos ver que si obtenemos el head de la lista de procesos obtenemos el proceso init, padre de todo (en linux).

processes = Process.list()
[head | _] = processes
info = Process.info(head, [:memory, :status, :registered_name])

Podemos crear un proceso y administrarlo.

defmodule MyThread do
  def start_link do
    Task.start_link(&amp;loop/0)
  end

  def ping(), do: "pong"

  defp loop do
    Process.flag(:trap_exit, true)

    receive do
      {:EXIT, _pid, :normal} ->
        IO.puts("Hilo terminado normalmente")

      other ->
        IO.puts("Hilo terminado con mensaje inesperado: #{inspect(other)}")
    end
  end
end

# Iniciar el hilo
{:ok, t_pid} = hilo = MyThread.start_link()

Este nuevo proceso podemos registrarlo en el sistema para darle un nombre.

Process.register(t_pid, :receiver)
data = [{:pid, t_pid} | Process.info(t_pid, [:memory, :status, :registered_name])]

Podemos mandar señales al hilo, lo que nos permite incluso mandar la señal para que el hilo muera.

Process.exit(t_pid, :normal)
Process.info(t_pid, [:memory, :status, :registered_name])

Aparte de poder comunicarnos con procesos, podemos realizar peticiones web e incluso llamadas rpc a procesos de elixir externos.

{:ok, %{body: img}} = HTTPoison.get("http://localhost:4000/identicon?word=ggggggg")
img

Para la llamada rpc tenemos que proporcionar el nombre del nodo al que queremos acceder. (La cookie configurada para ambos nodos es la misma)

node =
  Kino.Input.text("Node", [{:default, "app@RNTDELL000826"}])
  |> Kino.render()
  |> Kino.Input.read()
  |> String.to_atom()
:rpc.call(node, LiveIdenticon.Identicon.Generator, :generate, ["hla"])

Como vemos, el nombre del nodo de este livebook es diferente al de cualquier otro que tengamos en la máquina, pero si lo proporcionamos, podemos realizar llamas a código desarrollado en otro livebook.

node()
node =
  Kino.Input.text("Node")
  |> Kino.render()
  |> Kino.Input.read()
  |> String.to_atom()
:erpc.call(node, SomeCoolCode, :status, [])
:erpc.call(node, SomeCoolCode, :mem_usage, [])