mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2026-07-27 11:03:37 +03:00
Add `sum_sample_total` aggregation function to sums input delta values into a cumulative [counter](https://docs.victoriametrics.com/victoriametrics/keyconcepts/index.html#counter) and outputs the result at the given `interval`. `sum_samples_total` makes sense only for aggregating delta values from clients such as [StatsD counter](https://github.com/statsd/statsd/blob/master/docs/metric_types.md#counting). >Note: The aggregator will forget the cumulative counter if it has not seen input samples for `staleness_interval`(set to `interval` by default) per output result, so the output counter will start from `0` the next time it sees the input again. Increase the `staleness_interval` option if you want to extend the window to tolerate bigger gaps. Fixes: https://github.com/VictoriaMetrics/VictoriaMetrics/issues/11002 https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4843.
46 lines
970 B
Go
46 lines
970 B
Go
package streamaggr
|
|
|
|
import (
|
|
"math"
|
|
)
|
|
|
|
type sumSamplesAggrValue struct {
|
|
sum float64
|
|
}
|
|
|
|
func (av *sumSamplesAggrValue) pushSample(_ aggrConfig, sample *pushSample, _ string, _ int64) {
|
|
if math.Abs(av.sum) >= (1 << 53) {
|
|
// It is time to reset the entry, since it starts losing float64 precision
|
|
av.sum = 0
|
|
}
|
|
av.sum += sample.value
|
|
}
|
|
|
|
func (av *sumSamplesAggrValue) flush(c aggrConfig, ctx *flushCtx, key string, _ bool) {
|
|
ac := c.(*sumSamplesAggrConfig)
|
|
if ac.resetTotalOnFlush {
|
|
ctx.appendSeries(key, "sum_samples", av.sum)
|
|
av.sum = 0
|
|
return
|
|
}
|
|
ctx.appendSeries(key, "sum_samples_total", av.sum)
|
|
}
|
|
|
|
func (*sumSamplesAggrValue) state() any {
|
|
return nil
|
|
}
|
|
|
|
func newSumSamplesAggrConfig(resetTotalOnFlush bool) aggrConfig {
|
|
return &sumSamplesAggrConfig{
|
|
resetTotalOnFlush: resetTotalOnFlush,
|
|
}
|
|
}
|
|
|
|
type sumSamplesAggrConfig struct {
|
|
resetTotalOnFlush bool
|
|
}
|
|
|
|
func (*sumSamplesAggrConfig) getValue(_ any) aggrValue {
|
|
return &sumSamplesAggrValue{}
|
|
}
|