Class: Metriks::Snapshot

Inherits:
Object
  • Object
show all
Defined in:
lib/metriks/snapshot.rb

Constant Summary collapse

MEDIAN_Q =
0.5
P75_Q =
0.75
P95_Q =
0.95
P98_Q =
0.98
P99_Q =
0.99
P999_Q =
0.999

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(values) ⇒ Snapshot

Returns a new instance of Snapshot.



12
13
14
# File 'lib/metriks/snapshot.rb', line 12

def initialize(values)
  @values = values.sort
end

Instance Attribute Details

#valuesObject (readonly)

Returns the value of attribute values.



10
11
12
# File 'lib/metriks/snapshot.rb', line 10

def values
  @values
end

Instance Method Details

#get_75th_percentileObject



39
40
41
# File 'lib/metriks/snapshot.rb', line 39

def get_75th_percentile
  value(P75_Q)
end

#get_95th_percentileObject



43
44
45
# File 'lib/metriks/snapshot.rb', line 43

def get_95th_percentile
  value(P95_Q)
end

#get_98th_percentileObject



47
48
49
# File 'lib/metriks/snapshot.rb', line 47

def get_98th_percentile
  value(P98_Q)
end

#get_999th_percentileObject



55
56
57
# File 'lib/metriks/snapshot.rb', line 55

def get_999th_percentile
  value(P999_Q)
end

#get_99th_percentileObject



51
52
53
# File 'lib/metriks/snapshot.rb', line 51

def get_99th_percentile
  value(P99_Q)
end

#medianObject



35
36
37
# File 'lib/metriks/snapshot.rb', line 35

def median
  value(MEDIAN_Q)
end

#sizeObject



31
32
33
# File 'lib/metriks/snapshot.rb', line 31

def size
  @values.length
end

#value(quantile) ⇒ Object

Raises:

  • (ArgumentError)


16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/metriks/snapshot.rb', line 16

def value(quantile)
  raise ArgumentError, "quantile must be between 0.0 and 1.0" if quantile < 0.0 || quantile > 1.0

  return 0.0 if @values.empty?

  pos = quantile * (@values.length + 1)

  return @values.first if pos < 1
  return @values.last if pos >= @values.length

  lower = @values[pos.to_i - 1]
  upper = @values[pos.to_i]
  lower + (pos - pos.floor) * (upper - lower)
end