From 50be02f4a2d57f98064302b208d42fd93546cb7f Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Mon, 26 Dec 2022 14:18:31 +0100 Subject: [PATCH] feat: add histograms; fix possible bugs --- collector.v | 61 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/collector.v b/collector.v index 4c5df63..174603a 100644 --- a/collector.v +++ b/collector.v @@ -7,51 +7,82 @@ struct CounterEntry { index int } +struct HistogramEntry { + metric Metric +pub mut: + data shared []f64 +} + [heap] struct DefaultMetricsCollector { mut: + // The mutex for counters also applies to counter_indexes. Both data + // structuress are only ever updated together. Note that only registering a + // new metric actually changes these; all operations on already existing + // metrics use atomic operations on the elements of the counters array. counters shared []u64 - counter_indexes shared map[string]CounterEntry + counter_indexes map[string]CounterEntry + histograms shared map[string]HistogramEntry } pub fn new_default_metrics_collector() &DefaultMetricsCollector { return &DefaultMetricsCollector{ counters: []u64{} counter_indexes: map[string]CounterEntry{} + histograms: map[string]HistogramEntry{} } } pub fn (mut c DefaultMetricsCollector) counter_register(value u64, metric Metric) { - new_index := lock c.counters { + 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 + index: c.counters.len - 1 } } } pub fn (mut c DefaultMetricsCollector) counter_increment(metric Metric) { - entry := rlock c.counter_indexes { - c.counter_indexes[metric.str()] - } - rlock c.counters { + entry := c.counter_indexes[metric.str()] + 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 { + entry := c.counter_indexes[metric.str()] + stdatomic.sub_u64(&c.counters[entry.index], 1) } } + +pub fn (mut c DefaultMetricsCollector) counter_get(metric Metric) ?u64 { + return rlock c.counters { + entry := c.counter_indexes[metric.str()] or { return none } + + stdatomic.load_u64(&c.counters[entry.index]) + } +} + +pub fn (mut c DefaultMetricsCollector) histogram_register(metric Metric) { + lock c.histograms { + c.histograms[metric.str()] = HistogramEntry{ + metric: metric + data: []f64{} + } + } +} + +pub fn (mut c DefaultMetricsCollector) histogram_add(value f64, metric Metric) { + entry := rlock c.histograms { + c.histograms[metric.str()] + } + + lock entry.data { + entry.data << value + } +}