transaction.rb 1.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
module Gitlab
  module Metrics
    # Class for storing metrics information of a single transaction.
    class Transaction
      THREAD_KEY = :_gitlab_metrics_transaction

      attr_reader :uuid, :tags

      def self.current
        Thread.current[THREAD_KEY]
      end

      # name - The name of this transaction as a String.
14 15
      def initialize(series)
        @series  = series
16 17 18 19 20 21
        @metrics = []
        @uuid    = SecureRandom.uuid

        @started_at  = nil
        @finished_at = nil

22 23
        @values = Hash.new(0)
        @tags   = {}
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
      end

      def duration
        @finished_at ? (@finished_at - @started_at) * 1000.0 : 0.0
      end

      def run
        Thread.current[THREAD_KEY] = self

        @started_at = Time.now

        yield
      ensure
        @finished_at = Time.now

        Thread.current[THREAD_KEY] = nil
      end

      def add_metric(series, values, tags = {})
        tags = tags.merge(transaction_id: @uuid)

        @metrics << Metric.new(series, values, tags)
      end

48 49 50 51
      def increment(name, value)
        @values[name] += value
      end

52 53 54 55 56 57 58 59 60 61
      def add_tag(key, value)
        @tags[key] = value
      end

      def finish
        track_self
        submit
      end

      def track_self
62 63 64 65 66 67 68
        values = { duration: duration }

        @values.each do |name, value|
          values[name] = value
        end

        add_metric(@series, values, @tags)
69 70 71
      end

      def submit
72
        Metrics.submit_metrics(@metrics.map(&:to_hash))
73 74 75 76
      end
    end
  end
end