viva_telemetry/metrics
viva_telemetry/metrics - Metrics collection for Gleam
Inspired by: Prometheus, statsd, BEAM telemetry
Features
- Counters (monotonically increasing)
- Gauges (point-in-time values)
- Histograms (distribution of values)
- BEAM memory tracking
- Prometheus export format
Quick Start
import viva_telemetry/metrics
pub fn main() {
// Counter
let requests = metrics.counter("http_requests_total")
metrics.inc(requests)
// Gauge
let connections = metrics.gauge("active_connections")
metrics.set(connections, 42.0)
// Histogram
let latency = metrics.histogram("request_latency_ms", [10.0, 50.0, 100.0, 500.0])
metrics.observe(latency, 75.5)
// Export
let output = metrics.to_prometheus()
}
Types
BEAM memory info
pub type BeamMemory {
BeamMemory(
total: Int,
processes: Int,
processes_used: Int,
system: Int,
atom: Int,
atom_used: Int,
binary: Int,
code: Int,
ets: Int,
)
}
Constructors
-
BeamMemory( total: Int, processes: Int, processes_used: Int, system: Int, atom: Int, atom_used: Int, binary: Int, code: Int, ets: Int, )
Values
pub fn counter_with_labels(
name: String,
labels: List(#(String, String)),
) -> Counter
Create a counter with labels
pub fn default_latency_buckets() -> List(Float)
Default buckets for latency (ms)
pub fn gauge_with_labels(
name: String,
labels: List(#(String, String)),
) -> Gauge
Create a gauge with labels
pub fn get_histogram_stats(histogram: Histogram) -> #(Int, Float)
Get histogram stats
pub fn histogram(name: String, buckets: List(Float)) -> Histogram
Create a new histogram with buckets
pub fn histogram_with_labels(
name: String,
buckets: List(Float),
labels: List(#(String, String)),
) -> Histogram
Create a histogram with labels
pub fn observe(histogram: Histogram, value: Float) -> Nil
Observe a value in the histogram
pub fn time(histogram: Histogram, f: fn() -> a) -> a
Time a function and record duration in histogram (microseconds)
Example:
let latency = metrics.histogram("request_latency_us", metrics.default_latency_buckets())
let result = metrics.time(latency, fn() { do_work() })
pub fn time_ms(histogram: Histogram, f: fn() -> a) -> a
Time a function and record duration in histogram (milliseconds)