class PrometheusExporter::Metric::Summary

Constants

DEFAULT_QUANTILES
ROTATE_AGE

Attributes

count[R]
estimators[R]
total[R]

Public Class Methods

new(name, help, opts = {}) click to toggle source
Calls superclass method PrometheusExporter::Metric::Base::new
# File lib/prometheus_exporter/metric/summary.rb, line 11
def initialize(name, help, opts = {})
  super(name, help)
  reset!
  @quantiles = opts[:quantiles] || DEFAULT_QUANTILES
end

Public Instance Methods

calculate_all_quantiles() click to toggle source
# File lib/prometheus_exporter/metric/summary.rb, line 60
def calculate_all_quantiles
  buffer = @buffers[@current_buffer]

  result = {}
  buffer.each do |labels, raw_data|
    result[labels] = calculate_quantiles(raw_data)
  end

  result

end
calculate_quantiles(raw_data) click to toggle source
# File lib/prometheus_exporter/metric/summary.rb, line 46
def calculate_quantiles(raw_data)
  sorted = raw_data.sort
  length = sorted.length
  result = {}

  if length > 0
    @quantiles.each do |quantile|
      result[quantile] = sorted[(length * quantile).ceil - 1]
    end
  end

  result
end
ensure_summary(labels) click to toggle source

makes sure we have storage

# File lib/prometheus_exporter/metric/summary.rb, line 89
def ensure_summary(labels)
  @buffers[0][labels] ||=  []
  @buffers[1][labels] ||=  []
  @sums[labels] ||= 0.0
  @counts[labels] ||= 0
  nil
end
metric_text() click to toggle source
# File lib/prometheus_exporter/metric/summary.rb, line 72
def metric_text
  text = +""
  first = true
  calculate_all_quantiles.each do |labels, quantiles|
    text << "\n" unless first
    first = false
    quantiles.each do |quantile, value|
      with_quantile = labels.merge(quantile: quantile)
      text << "#{prefix(@name)}#{labels_text(with_quantile)} #{value.to_f}\n"
    end
    text << "#{prefix(@name)}_sum#{labels_text(labels)} #{@sums[labels]}\n"
    text << "#{prefix(@name)}_count#{labels_text(labels)} #{@counts[labels]}"
  end
  text
end
observe(value, labels = nil) click to toggle source
# File lib/prometheus_exporter/metric/summary.rb, line 108
def observe(value, labels = nil)
  labels ||= {}
  ensure_summary(labels)
  rotate_if_needed

  value = value.to_f
  @buffers[0][labels] << value
  @buffers[1][labels] << value
  @sums[labels] += value
  @counts[labels] += 1
end
remove(labels) click to toggle source
# File lib/prometheus_exporter/metric/summary.rb, line 35
def remove(labels)
  @counts.delete(labels)
  @sums.delete(labels)
  @buffers[0].delete(labels)
  @buffers[1].delete(labels)
end
reset!() click to toggle source
# File lib/prometheus_exporter/metric/summary.rb, line 17
def reset!
  @buffers = [{}, {}]
  @last_rotated = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  @current_buffer = 0
  @counts = {}
  @sums = {}
end
rotate_if_needed() click to toggle source
# File lib/prometheus_exporter/metric/summary.rb, line 97
def rotate_if_needed
  if (now = Process.clock_gettime(Process::CLOCK_MONOTONIC)) > (@last_rotated + ROTATE_AGE)
    @last_rotated = now
    @buffers[@current_buffer].each do |labels, raw|
      raw.clear
    end
    @current_buffer = @current_buffer == 0 ? 1 : 0
  end
  nil
end
to_h() click to toggle source
# File lib/prometheus_exporter/metric/summary.rb, line 25
def to_h
  data = {}
  calculate_all_quantiles.each do |labels, quantiles|
    count = @counts[labels]
    sum = @sums[labels]
    data[labels] = { "count" => count, "sum" => sum }
  end
  data
end
type() click to toggle source
# File lib/prometheus_exporter/metric/summary.rb, line 42
def type
  "summary"
end