69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
require 'sidekiq/api'
 | 
						|
 | 
						|
module API
 | 
						|
  class SidekiqMetrics < ::API::Base
 | 
						|
    before { authenticated_as_admin! }
 | 
						|
 | 
						|
    feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
 | 
						|
 | 
						|
    helpers do
 | 
						|
      def queue_metrics
 | 
						|
        ::Gitlab::SidekiqConfig.routing_queues.each_with_object({}) do |queue_name, hash|
 | 
						|
          queue = Sidekiq::Queue.new(queue_name)
 | 
						|
          hash[queue.name] = {
 | 
						|
            backlog: queue.size,
 | 
						|
            latency: queue.latency.to_i
 | 
						|
          }
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      def process_metrics
 | 
						|
        Sidekiq::ProcessSet.new(false).map do |process|
 | 
						|
          {
 | 
						|
            hostname: process['hostname'],
 | 
						|
            pid: process['pid'],
 | 
						|
            tag: process['tag'],
 | 
						|
            started_at: Time.at(process['started_at']),
 | 
						|
            queues: process['queues'],
 | 
						|
            labels: process['labels'],
 | 
						|
            concurrency: process['concurrency'],
 | 
						|
            busy: process['busy']
 | 
						|
          }
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      def job_stats
 | 
						|
        stats = Sidekiq::Stats.new
 | 
						|
        {
 | 
						|
          processed: stats.processed,
 | 
						|
          failed: stats.failed,
 | 
						|
          enqueued: stats.enqueued,
 | 
						|
          dead: stats.dead_size
 | 
						|
        }
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    desc 'Get the Sidekiq queue metrics'
 | 
						|
    get 'sidekiq/queue_metrics' do
 | 
						|
      { queues: queue_metrics }
 | 
						|
    end
 | 
						|
 | 
						|
    desc 'Get the Sidekiq process metrics'
 | 
						|
    get 'sidekiq/process_metrics' do
 | 
						|
      { processes: process_metrics }
 | 
						|
    end
 | 
						|
 | 
						|
    desc 'Get the Sidekiq job statistics'
 | 
						|
    get 'sidekiq/job_stats' do
 | 
						|
      { jobs: job_stats }
 | 
						|
    end
 | 
						|
 | 
						|
    desc 'Get the Sidekiq Compound metrics. Includes queue, process, and job statistics'
 | 
						|
    get 'sidekiq/compound_metrics' do
 | 
						|
      { queues: queue_metrics, processes: process_metrics, jobs: job_stats }
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |