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