Class: Drone::Metrics::Histogram

Inherits:
Drone::Metric show all
Defined in:
lib/drone/metrics/histogram.rb

Overview

An Histogram store a list of values (1028) and can compute on demand statistics on those values:

  • min/max

  • mean

  • stddev

  • percentiles

Constant Summary collapse

MIN =
(-(2**63)).freeze
MAX =
((2**64) - 1).freeze

Instance Attribute Summary

Attributes inherited from Drone::Metric

#name

Instance Method Summary collapse

Constructor Details

#initialize(name, sample_or_type = :uniform) ⇒ Histogram

Returns a new instance of Histogram.



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/drone/metrics/histogram.rb', line 19

def initialize(name, sample_or_type = :uniform)
  super(name)

  if sample_or_type.is_a?(Symbol)
    case sample_or_type
    when :uniform   then  @sample = UniformSample.new("#{name}:sample", 1028)
    when :biased    then  @sample = ExponentiallyDecayingSample.new("#{name}:sample", 1028, 0.015)
    else
      raise ArgumentError, "unknown type: #{sample_or_type}"
    end
  else
    @sample = sample_or_type
  end

  @count = Drone::request_number("#{name}:count", 0)
  @_min = Drone::request_number("#{name}:min", MAX)
  @_max = Drone::request_number("#{name}:max", MIN)
  @_sum = Drone::request_number("#{name}:max", 0)
  @varianceM = Drone::request_number("#{name}:varianceM", -1)
  @varianceS = Drone::request_number("#{name}:varianceS", 0)

end

Instance Method Details

#clearObject



42
43
44
45
46
47
48
49
50
51
# File 'lib/drone/metrics/histogram.rb', line 42

def clear
  @sample.clear()
      
  @count = Drone::request_number("#{name}:count", 0)
  @_min = Drone::request_number("#{name}:min", MAX)
  @_max = Drone::request_number("#{name}:max", MIN)
  @_sum = Drone::request_number("#{name}:max", 0)
  @varianceM = Drone::request_number("#{name}:varianceM", -1)
  @varianceS = Drone::request_number("#{name}:varianceS", 0)
end

#countObject



62
63
64
# File 'lib/drone/metrics/histogram.rb', line 62

def count
  @count.get
end

#maxObject



66
67
68
# File 'lib/drone/metrics/histogram.rb', line 66

def max
  (@count.get > 0) ? @_max.get : 0.0
end

#meanObject



74
75
76
# File 'lib/drone/metrics/histogram.rb', line 74

def mean
  (@count.get > 0) ? @_sum.get.to_f / @count.get : 0.0
end

#medianObject



82
83
84
# File 'lib/drone/metrics/histogram.rb', line 82

def median
  percentiles(0.5)[0]
end

#minObject



70
71
72
# File 'lib/drone/metrics/histogram.rb', line 70

def min
  (@count.get > 0) ? @_min.get : 0.0
end

#percentiles(*percentiles) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/drone/metrics/histogram.rb', line 86

def percentiles(*percentiles)
  scores = Array.new(percentiles.size, 0)
  if @count.get > 0
    values = @sample.values.sort
    percentiles.each.with_index do |p, i|
      pos = p * (values.size + 1)
      if pos < 1
        scores[i] = values[0]
      elsif pos >= values.size
        scores[i] = values[-1]
      else
        lower = values[pos - 1]
        upper = values[pos]
        scores[i] = lower + (pos - pos.floor) * (upper - lower)
      end
    end
  end

  scores
end

#stdDevObject



78
79
80
# File 'lib/drone/metrics/histogram.rb', line 78

def stdDev
  (@count.get > 0) ? Math.sqrt( variance() ) : 0.0
end

#update(val) ⇒ Object



53
54
55
56
57
58
59
60
# File 'lib/drone/metrics/histogram.rb', line 53

def update(val)
  @count.inc
  @sample.update(val)
  set_max(val);
  set_min(val);
  @_sum.inc(val)
  update_variance(val)
end

#valuesObject



107
108
109
# File 'lib/drone/metrics/histogram.rb', line 107

def values
  @sample.values
end