metrics/collector.v

58 lines
1.1 KiB
Coq
Raw Normal View History

2022-12-26 13:31:50 +01:00
module metrics
import sync.stdatomic
struct CounterEntry {
metric Metric
index int
}
[heap]
struct DefaultMetricsCollector {
mut:
counters shared []u64
counter_indexes shared map[string]CounterEntry
}
pub fn new_default_metrics_collector() &DefaultMetricsCollector {
return &DefaultMetricsCollector{
counters: []u64{}
counter_indexes: map[string]CounterEntry{}
}
}
pub fn (mut c DefaultMetricsCollector) counter_register(value u64, metric Metric) {
new_index := lock c.counters {
c.counters << value
c.counters.len - 1
}
lock c.counter_indexes {
c.counter_indexes[metric.str()] = CounterEntry{
metric: metric
index: new_index
}
}
}
pub fn (mut c DefaultMetricsCollector) counter_increment(metric Metric) {
entry := rlock c.counter_indexes {
c.counter_indexes[metric.str()]
}
rlock c.counters {
stdatomic.add_u64(&c.counters[entry.index], 1)
}
}
pub fn (mut c DefaultMetricsCollector) counter_decrement(metric Metric) {
entry := rlock c.counter_indexes {
c.counter_indexes[metric.str()]
}
rlock c.counters {
stdatomic.sub_u64(&c.counters[entry.index], 1)
}
}