From 5020bfd6cabb588dd34ff4171acac42c9b0e1945 Mon Sep 17 00:00:00 2001 From: Nat Lasseter Date: Thu, 25 Jun 2020 13:16:56 +0100 Subject: Added transactions to the collector so we can support exception handling on the raiders --- lib/longboat/collector.rb | 46 ++++++++++++++++++++++++++++++++++++++++++---- lib/longboat/raiders.rb | 33 +++++++++++++++++++++------------ 2 files changed, 63 insertions(+), 16 deletions(-) (limited to 'lib') 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 diff --git a/lib/longboat/raiders.rb b/lib/longboat/raiders.rb index 3e6f246..2740570 100644 --- a/lib/longboat/raiders.rb +++ b/lib/longboat/raiders.rb @@ -21,19 +21,28 @@ module Longboat end def raid! + puts "RAID" @raiders.each do |name, raider| - start_time = Time.now - raider.raid - end_time = Time.now - time_taken = end_time - start_time - - @collector.report!( - "longboat_meta_raider_runtime", - (time_taken.to_f * 1000).to_i, - help: "Time taken by a raider whilst raiding in ms", - type: "guage", - labels: {raider: name} - ) + @collector.begin! + + begin + start_time = Time.now + raider.raid + end_time = Time.now + time_taken = end_time - start_time + + @collector.report!( + "longboat_meta_raider_runtime", + (time_taken.to_f * 1000).to_i, + help: "Time taken by a raider whilst raiding in ms", + type: "guage", + labels: {raider: name} + ) + + @collector.commit! + rescue Exception => e + @collector.abort! + end end end -- cgit v1.2.1