diff options
Diffstat (limited to 'lib/longboat/collector.rb')
-rw-r--r-- | lib/longboat/collector.rb | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/lib/longboat/collector.rb b/lib/longboat/collector.rb index 10e2f84..01bb7f0 100644 --- a/lib/longboat/collector.rb +++ b/lib/longboat/collector.rb @@ -1,27 +1,47 @@ module Longboat + class CollectorTransactionError < Exception; end + class Collector def initialize(config) @metrics = {} @config = config + @transaction = nil end def report!(name, value, help: nil, type: nil, labels: {}, timestamp: Time.now) + raise CollectorTransactionError if @tranaction.nil? + name = prefix(name) - @metrics[name] ||= {help: help, type: type} - @metrics[name][labels] = {value: value, timestamp: timestamp} + @transaction[name] ||= {help: help, type: type} + @transaction[name][labels] = {value: value, timestamp: timestamp} end def redact!(name, labels: nil) + raise CollectorTransactionError if @tranaction.nil? + name = prefix(name) if labels.nil? - @metrics.delete(name) + @transaction.delete(name) else - @metrics[name].delete(labels) + @transaction[name].delete(labels) end end + def begin! + @transaction = clone_metrics + end + + def abort! + @transaction = nil + end + + def commit! + @metrics = @transaction + @transaction = nil + end + def prometheus_metrics res = "" @metrics.each do |name, metric| @@ -50,5 +70,23 @@ module Longboat def prefix(name) "#{@config[:metric_prefix]}#{name}" end + + def clone_metrics + clone = {} + + @metrics.each do |metric, attributes| + clone[metric] = {} + clone[metric][:help] = attributes[:help] + clone[metric][:type] = attributes[:type] + + attributes.each do |labels, value| + next if [:help, :type].include?(labels) + + clone[metric][labels.clone] = value.clone + end + end + + clone + end end end |