This module implements bandwidth counters based on (cumulative) exponential moving average. Each counter is identified by an integer. They are stored in an internal hash table.
See i.e. https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average for the algorithm.
val fresh_state : id:string -> refresh_interval:float -> state
fresh_state ~id ~refresh_interval initializes the state of a worker handling a family of counter. The worker wakes up every
id is a string identifier used for distinguishing distinct Moving_average workers..
create state ~init ~alpha is a counter with initial value
init and factor
alpha. The counter is added to the
state. It is not removed automatically: it must be removed manually.
val add : t -> int -> unit
add state t v adds
v to the counter
val on_update : state -> (unit -> unit) -> unit
on_update state f registers
f to be called on each update of the internal worker associated to
updated state is a condition variable that gets signaled on each update of the internal worker..