class Airbrake::Stat
Stat
is a data structure that allows accumulating performance data (route performance, SQL query performance and such). It's powered by TDigests.
Usually, one Stat
corresponds to one resource (route or query, etc.). Incrementing a stat means pushing new performance statistics.
@example
stat = Airbrake::Stat.new stat.increment_ms(2000) stat.to_h # Pack and serialize data so it can be transmitted.
@since v3.2.0
Attributes
Public Class Methods
@param [Float] sum The sum of duration in milliseconds @param [Float] sumsq The squared sum of duration in milliseconds @param [TDigest::TDigest] tdigest Packed durations. By default,
compression is 20
# File lib/airbrake-ruby/stat.rb, line 23 def initialize(sum: 0.0, sumsq: 0.0, tdigest: TDigest.new(0.05)) @sum = sum @sumsq = sumsq @tdigest = tdigest @mutex = Mutex.new end
Public Instance Methods
Increments tdigest timings and updates tdigest with given ms
value.
@param [Float] ms @return [void]
# File lib/airbrake-ruby/stat.rb, line 48 def increment_ms(ms) @mutex.synchronize do self.sum += ms self.sumsq += ms * ms tdigest.push(ms) end end
We define custom inspect so that we weed out uninformative TDigest
, which is also very slow to dump when we log Airbrake::Stat
.
@return [String]
# File lib/airbrake-ruby/stat.rb, line 61 def inspect "#<struct Airbrake::Stat count=#{tdigest.size}, sum=#{sum}, sumsq=#{sumsq}>" end
@return [Hash{String=>Object}] stats as a hash with compressed TDigest
(serialized as base64)
# File lib/airbrake-ruby/stat.rb, line 32 def to_h @mutex.synchronize do tdigest.compress! { 'count' => tdigest.size, 'sum' => sum, 'sumsq' => sumsq, 'tdigest' => Base64.strict_encode64(tdigest.as_small_bytes), } end end