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 metric (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

sum[RW]
sumsq[RW]
tdigest[RW]

Public Class Methods

new(sum: 0.0, sumsq: 0.0, tdigest: TDigest.new(0.05)) click to toggle source

@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

increment_ms(ms) click to toggle source

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
inspect() click to toggle source

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
Also aliased as: pretty_print
pretty_print()
Alias for: inspect
to_h() click to toggle source

@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