69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  module Metrics
 | 
						|
    # Exclusive transaction-type metrics for background jobs (Sidekiq). One
 | 
						|
    # instance of this class is created for each job going through the Sidekiq
 | 
						|
    # metric middleware. Any metrics dispatched with this instance include
 | 
						|
    # metadata such as endpoint_id, queue, and feature category.
 | 
						|
    class BackgroundTransaction < Transaction
 | 
						|
      THREAD_KEY = :_gitlab_metrics_background_transaction
 | 
						|
      BASE_LABEL_KEYS = %i(queue endpoint_id feature_category).freeze
 | 
						|
 | 
						|
      class << self
 | 
						|
        def current
 | 
						|
          Thread.current[THREAD_KEY]
 | 
						|
        end
 | 
						|
 | 
						|
        def prometheus_metric(name, type, &block)
 | 
						|
          fetch_metric(type, name) do
 | 
						|
            # set default metric options
 | 
						|
            docstring "#{name.to_s.humanize} #{type}"
 | 
						|
 | 
						|
            evaluate(&block)
 | 
						|
            # always filter sensitive labels and merge with base ones
 | 
						|
            label_keys BASE_LABEL_KEYS | (label_keys - ::Gitlab::Metrics::Transaction::FILTERED_LABEL_KEYS)
 | 
						|
          end
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      def run
 | 
						|
        Thread.current[THREAD_KEY] = self
 | 
						|
 | 
						|
        yield
 | 
						|
      ensure
 | 
						|
        Thread.current[THREAD_KEY] = nil
 | 
						|
      end
 | 
						|
 | 
						|
      def labels
 | 
						|
        @labels ||= {
 | 
						|
          endpoint_id: endpoint_id,
 | 
						|
          feature_category: feature_category,
 | 
						|
          queue: queue
 | 
						|
        }
 | 
						|
      end
 | 
						|
 | 
						|
      private
 | 
						|
 | 
						|
      def current_context
 | 
						|
        Labkit::Context.current
 | 
						|
      end
 | 
						|
 | 
						|
      def feature_category
 | 
						|
        current_context&.get_attribute(:feature_category)
 | 
						|
      end
 | 
						|
 | 
						|
      def endpoint_id
 | 
						|
        current_context&.get_attribute(:caller_id)
 | 
						|
      end
 | 
						|
 | 
						|
      def queue
 | 
						|
        worker_class = endpoint_id.to_s.safe_constantize
 | 
						|
        return if worker_class.blank? || !worker_class.respond_to?(:queue)
 | 
						|
 | 
						|
        worker_class.queue.to_s
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |