module metrics [params] pub struct Metric { name string [required] labels [][2]string } [inline] fn join_two_array(arr [2]string) string { return arr[0] + '=' + arr[1] } pub fn (m &Metric) str() string { if m.labels.len == 0 { return m.name } return '$m.name{${m.labels.map(join_two_array(it)).join(',')}}' } pub interface MetricsCollector { counter_increment(metric Metric) counter_get(metric Metric) ?u64 counters() []Metric histogram_record(value f64, metric Metric) histogram_get(metric Metric) ?[]f64 gauge_add(value f64, metric Metric) gauge_sub(value f64, metric Metric) gauge_set(value f64, metric Metric) gauge_get(metric Metric) ?f64 mut: counter_register(value u64, metric Metric) histogram_register(metric Metric) gauge_register(value f64, metric Metric) }