Packages
Professional observability suite for Gleam: structured logging, metrics, and statistical benchmarking
Current section
Files
Jump to
Current section
Files
src/viva_telemetry@examples@metrics_example.erl
-module(viva_telemetry@examples@metrics_example).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/viva_telemetry/examples/metrics_example.gleam").
-export([main/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(
" Example: Using viva_telemetry/metrics\n"
"\n"
" Run: gleam run -m viva_telemetry/examples/metrics_example\n"
).
-file("src/viva_telemetry/examples/metrics_example.gleam", 87).
-spec format_bytes(integer()) -> binary().
format_bytes(Bytes) ->
case Bytes >= 1048576 of
true ->
<<(gleam_stdlib:float_to_string(erlang:float(Bytes) / 1048576.0))/binary,
" MB"/utf8>>;
false ->
case Bytes >= 1024 of
true ->
<<(gleam_stdlib:float_to_string(
erlang:float(Bytes) / 1024.0
))/binary,
" KB"/utf8>>;
false ->
<<(erlang:integer_to_binary(Bytes))/binary, " B"/utf8>>
end
end.
-file("src/viva_telemetry/examples/metrics_example.gleam", 11).
-spec main() -> nil.
main() ->
gleam_stdlib:println(<<"=== viva_telemetry/metrics Demo ===\n"/utf8>>),
gleam_stdlib:println(<<"--- Counter ---"/utf8>>),
Requests = viva_telemetry@metrics:counter(<<"http_requests_total"/utf8>>),
viva_telemetry@metrics:inc(Requests),
viva_telemetry@metrics:inc(Requests),
viva_telemetry@metrics:inc_by(Requests, 10),
gleam_stdlib:println(
<<"http_requests_total: "/utf8,
(erlang:integer_to_binary(
viva_telemetry@metrics:get_counter(Requests)
))/binary>>
),
Errors = viva_telemetry@metrics:counter_with_labels(
<<"http_errors_total"/utf8>>,
[{<<"method"/utf8>>, <<"GET"/utf8>>},
{<<"status"/utf8>>, <<"500"/utf8>>}]
),
viva_telemetry@metrics:inc(Errors),
viva_telemetry@metrics:inc(Errors),
gleam_stdlib:println(
<<"http_errors_total: "/utf8,
(erlang:integer_to_binary(
viva_telemetry@metrics:get_counter(Errors)
))/binary>>
),
gleam_stdlib:println(<<"\n--- Gauge ---"/utf8>>),
Connections = viva_telemetry@metrics:gauge(<<"active_connections"/utf8>>),
viva_telemetry@metrics:set(Connections, 10.0),
viva_telemetry@metrics:gauge_inc(Connections),
viva_telemetry@metrics:gauge_inc(Connections),
viva_telemetry@metrics:gauge_dec(Connections),
gleam_stdlib:println(
<<"active_connections: "/utf8,
(gleam_stdlib:float_to_string(
viva_telemetry@metrics:get_gauge(Connections)
))/binary>>
),
Temperature = viva_telemetry@metrics:gauge(<<"cpu_temperature"/utf8>>),
viva_telemetry@metrics:set(Temperature, 65.5),
gleam_stdlib:println(
<<"cpu_temperature: "/utf8,
(gleam_stdlib:float_to_string(
viva_telemetry@metrics:get_gauge(Temperature)
))/binary>>
),
gleam_stdlib:println(<<"\n--- Histogram ---"/utf8>>),
Latency = viva_telemetry@metrics:histogram(
<<"request_latency_ms"/utf8>>,
viva_telemetry@metrics:default_latency_buckets()
),
gleam@list:each(
[5.2, 12.5, 48.0, 150.0, 520.0, 23.0, 8.0, 95.0],
fun(V) -> viva_telemetry@metrics:observe(Latency, V) end
),
{Count, Sum} = viva_telemetry@metrics:get_histogram_stats(Latency),
gleam_stdlib:println(
<<"request_latency_ms count: "/utf8,
(erlang:integer_to_binary(Count))/binary>>
),
gleam_stdlib:println(
<<"request_latency_ms sum: "/utf8,
(gleam_stdlib:float_to_string(Sum))/binary>>
),
gleam_stdlib:println(
<<"request_latency_ms avg: "/utf8,
(gleam_stdlib:float_to_string(case erlang:float(Count) of
+0.0 -> +0.0;
-0.0 -> -0.0;
Gleam@denominator -> Sum / Gleam@denominator
end))/binary>>
),
gleam_stdlib:println(<<"\n--- BEAM Memory ---"/utf8>>),
Mem = viva_telemetry@metrics:beam_memory(),
gleam_stdlib:println(
<<"Total: "/utf8, (format_bytes(erlang:element(2, Mem)))/binary>>
),
gleam_stdlib:println(
<<"Processes: "/utf8, (format_bytes(erlang:element(3, Mem)))/binary>>
),
gleam_stdlib:println(
<<"System: "/utf8, (format_bytes(erlang:element(5, Mem)))/binary>>
),
gleam_stdlib:println(
<<"Binary: "/utf8, (format_bytes(erlang:element(8, Mem)))/binary>>
),
gleam_stdlib:println(
<<"ETS: "/utf8, (format_bytes(erlang:element(10, Mem)))/binary>>
),
gleam_stdlib:println(<<"\n--- Prometheus Export ---"/utf8>>),
Prom = viva_telemetry@metrics:to_prometheus(),
gleam_stdlib:println(Prom),
gleam_stdlib:println(<<"\n=== Demo completed! ==="/utf8>>).