Skip to content

Commit

Permalink
WIP exchangeable value types
Browse files Browse the repository at this point in the history
  • Loading branch information
juliusv committed Feb 3, 2017
1 parent 5e16541 commit 0ea6e4f
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 29 deletions.
30 changes: 30 additions & 0 deletions example.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
$LOAD_PATH.unshift("./lib")

require 'prometheus/client'
require 'prometheus/client/formats/text.rb'

prometheus = Prometheus::Client.registry

counter = Prometheus::Client::Counter.new(:counter, 'Example counter')
gauge = Prometheus::Client::Gauge.new(:gauge, 'Example gauge')
histogram = Prometheus::Client::Histogram.new(:histogram, 'Example histogram', {}, [0, 1, 2])
summary = Prometheus::Client::Histogram.new(:summary, 'Example summary', {})
prometheus.register(counter)
prometheus.register(gauge)
prometheus.register(histogram)
prometheus.register(summary)

counter.increment({'foo': 'bar'}, 2)
counter.increment({'foo': 'biz'}, 4)
gauge.set({'foo': 'bar'}, 3)
gauge.set({'foo': 'biz'}, 3)
histogram.observe({'foo': 'bar'}, 0.5)
histogram.observe({'foo': 'biz'}, 0.5)
histogram.observe({'foo': 'bar'}, 1.5)
histogram.observe({'foo': 'biz'}, 2)
summary.observe({'foo': 'bar'}, 0.5)
summary.observe({'foo': 'biz'}, 0.5)
summary.observe({'foo': 'bar'}, 1.5)
summary.observe({'foo': 'biz'}, 2)

puts Prometheus::Client::Formats::Text.marshal(prometheus)
7 changes: 4 additions & 3 deletions lib/prometheus/client/counter.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# encoding: UTF-8

require 'prometheus/client/metric'
require 'prometheus/client/valuetype'

module Prometheus
module Client
Expand All @@ -14,13 +15,13 @@ def increment(labels = {}, by = 1)
raise ArgumentError, 'increment must be a non-negative number' if by < 0

label_set = label_set_for(labels)
synchronize { @values[label_set] += by }
synchronize { @values[label_set].increment(by) }
end

private

def default
0
def default(labels)
Prometheus::Client::ValueType.new(type, @name, @name, labels)
end
end
end
Expand Down
16 changes: 8 additions & 8 deletions lib/prometheus/client/formats/text.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,29 +47,29 @@ def representation(metric, label_set, value, &block)
elsif metric.type == :histogram
histogram(metric.name, set, value, &block)
else
yield metric(metric.name, labels(set), value)
yield metric(metric.name, labels(set), value.get)
end
end

def summary(name, set, value)
value.each do |q, v|
yield metric(name, labels(set.merge(quantile: q)), v)
yield metric(name, labels(set.merge(quantile: q)), v.get)
end

l = labels(set)
yield metric("#{name}_sum", l, value.sum)
yield metric("#{name}_count", l, value.total)
yield metric("#{name}_sum", l, value.sum.get)
yield metric("#{name}_count", l, value.total.get)
end

def histogram(name, set, value)
value.each do |q, v|
yield metric(name, labels(set.merge(le: q)), v)
yield metric(name, labels(set.merge(le: q)), v.get)
end
yield metric(name, labels(set.merge(le: '+Inf')), value.total)
yield metric(name, labels(set.merge(le: '+Inf')), value.total.get)

l = labels(set)
yield metric("#{name}_sum", l, value.sum)
yield metric("#{name}_count", l, value.total)
yield metric("#{name}_sum", l, value.sum.get)
yield metric("#{name}_count", l, value.total.get)
end

def metric(name, labels, value)
Expand Down
2 changes: 1 addition & 1 deletion lib/prometheus/client/gauge.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def type

# Sets the value for the given label set
def set(labels, value)
@values[label_set_for(labels)] = value
@values[label_set_for(labels)].set(value)
end
end
end
Expand Down
20 changes: 11 additions & 9 deletions lib/prometheus/client/histogram.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,22 @@ class Histogram < Metric
class Value < Hash
attr_accessor :sum, :total

def initialize(buckets)
@sum = 0.0
@total = 0
def initialize(type, name, labels, buckets)
@sum = ValueType.new(type, name, name.to_s + '_sum', labels)
# TODO: get rid of total and use +Inf bucket instead.
@total = ValueType.new(type, name, name.to_s + '_count', labels)

buckets.each do |bucket|
self[bucket] = 0
self[bucket] = ValueType.new(type, name, name.to_s + '_count', labels)
end
end

def observe(value)
@sum += value
@total += 1
@sum.increment(value)
@total.increment()

each_key do |bucket|
self[bucket] += 1 if value <= bucket
self[bucket].increment() if value <= bucket
end
end
end
Expand Down Expand Up @@ -61,8 +62,9 @@ def observe(labels, value)

private

def default
Value.new(@buckets)
def default(labels)
# TODO: default function needs to know key of hash info (label names and values)
Value.new(type, @name, labels, @buckets)
end

def sorted?(bucket)
Expand Down
8 changes: 4 additions & 4 deletions lib/prometheus/client/metric.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Metric
def initialize(name, docstring, base_labels = {})
@mutex = Mutex.new
@validator = LabelSetValidator.new
@values = Hash.new { |hash, key| hash[key] = default }
@values = Hash.new { |hash, key| hash[key] = default(key) }

validate_name(name)
validate_docstring(docstring)
Expand All @@ -27,7 +27,7 @@ def initialize(name, docstring, base_labels = {})
def get(labels = {})
@validator.valid?(labels)

@values[labels]
@values[labels].get
end

# Returns all label sets with their values
Expand All @@ -41,8 +41,8 @@ def values

private

def default
nil
def default(labels)
ValueType.new(@name, @name, labels, nil)
end

def validate_name(name)
Expand Down
8 changes: 4 additions & 4 deletions lib/prometheus/client/summary.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ class Summary < Metric
class Value < Hash
attr_accessor :sum, :total

def initialize(estimator)
@sum = estimator.sum
@total = estimator.observations
def initialize(name, labels, estimator)
@sum = ValueType.new(name, name + '_sum', labels, estimator.sum)
@total = ValueType.new(name, name + '_count', labels, estimator.observations)

estimator.invariants.each do |invariant|
self[invariant.quantile] = estimator.query(invariant.quantile)
self[invariant.quantile] = ValueType.new(name, labels, estimator.query(invariant.quantile), nil)
end
end
end
Expand Down
25 changes: 25 additions & 0 deletions lib/prometheus/client/valuetype.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# encoding: UTF-8

module Prometheus
module Client
class SimpleValue
def initialize(type, metric_name, name, labels, value = 0)
@value = value
end

def set(value)
@value = value
end

def increment(by = 1)
@value += by
end

def get()
@value
end
end

ValueType = SimpleValue
end
end

0 comments on commit 0ea6e4f

Please sign in to comment.