この記事は、Elixir Advent Calendar 2023 シリーズ14 の6日目です
piacere です、ご覧いただいてありがとございます
Elixirは、言語機能を支えるサービスがプロセスで構成されており、それらプロセスに名前が付いているので、プロセス名を調べ、プロセス情報を拾うことができます
プロセス名の調べ方(シングルクラスタ)
Elixirの名前付きプロセスのプロセス名は、シングルクラスタ内に閉じた名前と、マルチクラスタで共有している名前の2種類ありますが、シングルクラスタは下記で調べられます
iex> Process.registered
[:kernel_safe_sup, :global_group_check, :user, :elixir_sup,
:logger_handler_watcher, :standard_error_sup, :init, :user_drv, :observer,
:appmon_info, :rex, :inet_db, :elixir_code_server, :erts_code_purger,
:standard_error, :socket_registry, IEx.Config, :user_drv_writer,
:erl_signal_server, IEx.Pry, :kernel_sup, :timer_server, Logger.Supervisor,
:code_server, :logger_std_h_default, :logger_sup, :erl_prim_loader,
:user_drv_reader, :global_name_server, :logger, IEx.Broker, :file_server_2,
:elixir_config, :global_group, :application_controller, :kernel_refc,
IEx.Supervisor, :wxe_master, :logger_proxy]
下記で調べることもできます(プロセスIDのリンクをクリックすると、親プロセスやリンクプロセスにも飛べます)
iex> :observer.start
Phoenixだと、http://localhost:4000/dev/dashboard
で調べることができます
プロセス情報の調べ方
特定したプロセス名を使って、プロセスIDを取得し、プロセス情報を得ることができます
たとえば、:global_group
プロセスはGenServerで、2つのプロセスにリンクしていることが分かります
iex> Process.whereis(:global_group) |> Process.info
[
registered_name: :global_group,
current_function: {:gen_server, :loop, 7},
initial_call: {:proc_lib, :init_p, 5},
status: :waiting,
message_queue_len: 0,
links: [#PID<0.49.0>, #PID<0.62.0>],
dictionary: [
"$ancestors": [:kernel_sup, #PID<0.47.0>],
whereis_name: [:undefined],
registered_names: [:undefined],
send: [:undefined],
global_group_check: #PID<0.62.0>,
"$initial_call": {:global_group, :init, 1}
],
trap_exit: true,
error_handler: :error_handler,
priority: :max,
group_leader: #PID<0.46.0>,
total_heap_size: 376,
heap_size: 376,
stack_size: 11,
reductions: 549,
garbage_collection: [
max_heap_size: %{
error_logger: true,
include_shared_binaries: false,
kill: true,
size: 0
},
min_bin_vheap_size: 46422,
min_heap_size: 233,
fullsweep_after: 65535,
minor_gcs: 0
],
suspending: []
]
observerだと、プロセスリストのプロセスをダブルクリックしたら見れます
Phoenixでも、プロセスリストのプロセスをクリックしたら見れます