aboutsummaryrefslogtreecommitdiff
path: root/lib/longboat/collector.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/longboat/collector.rb')
-rw-r--r--lib/longboat/collector.rb46
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