feat: add histograms; fix possible bugs
parent
d20e5c4553
commit
50be02f4a2
61
collector.v
61
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
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue