58 lines
1.1 KiB
Coq
58 lines
1.1 KiB
Coq
|
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)
|
||
|
}
|
||
|
}
|