Files
dyndnsd/lib/metriks/meter.rb
T
cn 7fa9f499e1 gems: include vendored metrisk without hitime dependency
hitime is only needed for Metriks::Timer and requires native extensions.
Those do not compile with default settings under Ubuntu 26.04 or Alpine 3.24.
2026-11-13 17:35:46 +01:00

88 lines
1.7 KiB
Ruby

# Vendored from metriks 0.9.9.8 — https://github.com/eric/metriks
# Copyright (c) 2012 Eric Lindvall, MIT licensed.
# Trimmed to the subset dyndnsd uses (meters + registry + reporters).
require 'metriks/ewma'
module Metriks
class Meter
TICK_INTERVAL = 5.0
def initialize(averager_klass = Metriks::EWMA)
@count = Atomic.new(0)
@start_time = Time.now.to_f
@last_tick = Atomic.new(@start_time)
@m1_rate = averager_klass.new_m1
@m5_rate = averager_klass.new_m5
@m15_rate = averager_klass.new_m15
end
def clear
@count.value = 0
@start_time = Time.now.to_f
@last_tick.value = @start_time
@m1_rate.clear
@m5_rate.clear
@m15_rate.clear
end
def tick
@m1_rate.tick
@m5_rate.tick
@m15_rate.tick
end
def tick_if_nessesary
old_tick = @last_tick.value
new_tick = Time.new.to_f
age = new_tick - old_tick
if age > TICK_INTERVAL && @last_tick.compare_and_swap(old_tick, new_tick)
required_ticks = age / TICK_INTERVAL
required_ticks.to_i.times do
tick
end
end
end
def mark(val = 1)
tick_if_nessesary
@count.update { |v| v + val }
@m1_rate.update(val)
@m5_rate.update(val)
@m15_rate.update(val)
end
def count
@count.value
end
def one_minute_rate
tick_if_nessesary
@m1_rate.rate
end
def five_minute_rate
tick_if_nessesary
@m5_rate.rate
end
def fifteen_minute_rate
tick_if_nessesary
@m15_rate.rate
end
def mean_rate
if count == 0
return 0.0
else
elapsed = Time.now.to_f - @start_time
count / elapsed
end
end
def stop
end
end
end