diff options
Diffstat (limited to 'lib/longboat')
| -rw-r--r-- | lib/longboat/collector.rb | 46 | ||||
| -rw-r--r-- | lib/longboat/raiders.rb | 33 | 
2 files changed, 63 insertions, 16 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 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  | 
