Class: PrometheusExporter::Metric::Summary
- Defined in:
- lib/prometheus_exporter/metric/summary.rb
Constant Summary collapse
- QUANTILES =
[0.99, 0.9, 0.5, 0.1, 0.01]
- ROTATE_AGE =
120
Instance Attribute Summary collapse
-
#count ⇒ Object
readonly
Returns the value of attribute count.
-
#estimators ⇒ Object
readonly
Returns the value of attribute estimators.
-
#total ⇒ Object
readonly
Returns the value of attribute total.
Attributes inherited from Base
Instance Method Summary collapse
- #calculate_all_quantiles ⇒ Object
- #calculate_quantiles(raw_data) ⇒ Object
-
#ensure_summary(labels) ⇒ Object
makes sure we have storage.
-
#initialize(name, help) ⇒ Summary
constructor
A new instance of Summary.
- #metric_text ⇒ Object
- #observe(value, labels = {}) ⇒ Object
- #rotate_if_needed ⇒ Object
- #type ⇒ Object
Methods inherited from Base
default_prefix, default_prefix=, #from_json, #labels_text, #prefix, #to_prometheus_text
Constructor Details
#initialize(name, help) ⇒ Summary
Returns a new instance of Summary.
11 12 13 14 15 16 17 18 |
# File 'lib/prometheus_exporter/metric/summary.rb', line 11 def initialize(name, help) super @buffers = [{}, {}] @last_rotated = Process.clock_gettime(Process::CLOCK_MONOTONIC) @current_buffer = 0 @counts = {} @sums = {} end |
Instance Attribute Details
#count ⇒ Object (readonly)
Returns the value of attribute count.
9 10 11 |
# File 'lib/prometheus_exporter/metric/summary.rb', line 9 def count @count end |
#estimators ⇒ Object (readonly)
Returns the value of attribute estimators.
9 10 11 |
# File 'lib/prometheus_exporter/metric/summary.rb', line 9 def estimators @estimators end |
#total ⇒ Object (readonly)
Returns the value of attribute total.
9 10 11 |
# File 'lib/prometheus_exporter/metric/summary.rb', line 9 def total @total end |
Instance Method Details
#calculate_all_quantiles ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/prometheus_exporter/metric/summary.rb', line 38 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) ⇒ Object
24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/prometheus_exporter/metric/summary.rb', line 24 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) ⇒ Object
makes sure we have storage
67 68 69 70 71 72 73 |
# File 'lib/prometheus_exporter/metric/summary.rb', line 67 def ensure_summary(labels) @buffers[0][labels] ||= [] @buffers[1][labels] ||= [] @sums[labels] ||= 0.0 @counts[labels] ||= 0 nil end |
#metric_text ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/prometheus_exporter/metric/summary.rb', line 50 def metric_text text = String.new 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 = {}) ⇒ Object
86 87 88 89 90 91 92 93 94 95 |
# File 'lib/prometheus_exporter/metric/summary.rb', line 86 def observe(value, 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 |
#rotate_if_needed ⇒ Object
75 76 77 78 79 80 81 82 83 84 |
# File 'lib/prometheus_exporter/metric/summary.rb', line 75 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 |
#type ⇒ Object
20 21 22 |
# File 'lib/prometheus_exporter/metric/summary.rb', line 20 def type "summary" end |