-module(pharos@statistic).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/pharos/statistic.gleam").
-export([default_interval_ms/1, poll/1, poll_every/2]).
-export_type([statistic_kind/0, statistic/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" What pharos can poll, and how often.\n"
"\n"
" A `Statistic` pairs a `StatisticKind` (the *what*) with a per-statistic\n"
" polling interval (the *how often*). Use `poll/1` to accept the kind's\n"
" default interval, or `poll_every/2` to override it.\n"
"\n"
" Statistics group into these families:\n"
"\n"
" - **BEAM VM internals** - `BeamMemory`, `BeamRunQueues`, `BeamSystemCounts`,\n"
" `BeamPersistentTerm`. Built into `telemetry_poller`. `BeamScheduler`\n"
" (scheduler utilisation) and `BeamReductions` are custom emitters.\n"
" - **Distributed Erlang topology** - `ClusterNodes`. Custom measurement\n"
" emitting `[pharos, cluster, nodes]`.\n"
" - **Per-process introspection** - `ProcessInfo`. Built into `telemetry_poller`.\n"
" - **Host (OS)** - `HostMemory` (`/proc/meminfo`, Linux), `HostDisk(path)`\n"
" and `HostCpu` (os_mon's `disksup`/`cpu_sup`), and `HostNetwork`\n"
" (`/proc/net/dev`). Host probes degrade to `status: unimplemented` when the\n"
" underlying source is unavailable.\n"
).
-type statistic_kind() :: beam_memory |
beam_run_queues |
beam_system_counts |
beam_persistent_term |
{process_info,
gleam@erlang@atom:atom_(),
list(gleam@erlang@atom:atom_()),
list(gleam@erlang@atom:atom_())} |
cluster_nodes |
host_memory |
{host_disk, binary()} |
host_cpu |
host_network |
beam_scheduler |
beam_reductions.
-type statistic() :: {statistic, statistic_kind(), integer()}.
-file("src/pharos/statistic.gleam", 78).
?DOC(
" Default polling cadence for each kind. Tuned to match the cost and\n"
" volatility of the underlying signal: cheap, fast-changing things\n"
" (run queues) poll often; expensive or slow-changing things (cluster\n"
" topology, disk) poll rarely.\n"
).
-spec default_interval_ms(statistic_kind()) -> integer().
default_interval_ms(Kind) ->
case Kind of
beam_memory ->
5000;
beam_run_queues ->
1000;
beam_system_counts ->
5000;
beam_persistent_term ->
10000;
{process_info, _, _, _} ->
5000;
cluster_nodes ->
30000;
host_memory ->
10000;
{host_disk, _} ->
30000;
host_cpu ->
5000;
host_network ->
5000;
beam_scheduler ->
5000;
beam_reductions ->
5000
end.
-file("src/pharos/statistic.gleam", 65).
?DOC(" Poll `kind` at its default cadence.\n").
-spec poll(statistic_kind()) -> statistic().
poll(Kind) ->
{statistic, Kind, default_interval_ms(Kind)}.
-file("src/pharos/statistic.gleam", 70).
?DOC(" Poll `kind` every `interval_ms` milliseconds.\n").
-spec poll_every(statistic_kind(), integer()) -> statistic().
poll_every(Kind, Interval_ms) ->
{statistic, Kind, Interval_ms}.