From 8ad1884505e1b155b80c2613ecfdb5f93e70b80d Mon Sep 17 00:00:00 2001
From: Patricio Cano <suprnova32@gmail.com>
Date: Tue, 14 Jun 2016 18:38:54 -0500
Subject: [PATCH] Fixed Rubocop error

---
 lib/api/sidekiq_metrics.rb                | 90 +++++++++++++++++++++++
 spec/requests/api/sidekiq_metrics_spec.rb | 40 ++++++++++
 2 files changed, 130 insertions(+)
 create mode 100644 lib/api/sidekiq_metrics.rb
 create mode 100644 spec/requests/api/sidekiq_metrics_spec.rb

diff --git a/lib/api/sidekiq_metrics.rb b/lib/api/sidekiq_metrics.rb
new file mode 100644
index 00000000000..d3d6827dc54
--- /dev/null
+++ b/lib/api/sidekiq_metrics.rb
@@ -0,0 +1,90 @@
+require 'sidekiq/api'
+
+module API
+  class SidekiqMetrics < Grape::API
+    before { authenticated_as_admin! }
+
+    helpers do
+      def queue_metrics
+        Sidekiq::Queue.all.each_with_object({}) do |queue, hash|
+          hash[queue.name] = {
+            backlog: queue.size,
+            latency: queue.latency.to_i
+          }
+        end
+      end
+
+      def process_metrics
+        Sidekiq::ProcessSet.new.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
+        }
+      end
+    end
+
+    # Get Sidekiq Queue metrics
+    #
+    # Parameters:
+    #   None
+    #
+    # Example:
+    #   GET /sidekiq/queue_metrics
+    #
+    get 'sidekiq/queue_metrics' do
+      { queues: queue_metrics }
+    end
+
+    # Get Sidekiq Process metrics
+    #
+    # Parameters:
+    #   None
+    #
+    # Example:
+    #   GET /sidekiq/process_metrics
+    #
+    get 'sidekiq/process_metrics' do
+      { processes: process_metrics }
+    end
+
+    # Get Sidekiq Job statistics
+    #
+    # Parameters:
+    #   None
+    #
+    # Example:
+    #   GET /sidekiq/job_stats
+    #
+    get 'sidekiq/job_stats' do
+      { jobs: job_stats }
+    end
+
+    # Get Sidekiq Compound metrics. Includes all previous metrics
+    #
+    # Parameters:
+    #   None
+    #
+    # Example:
+    #   GET /sidekiq/compound_metrics
+    #
+    get 'sidekiq/compound_metrics' do
+      { queues: queue_metrics, processes: process_metrics, jobs: job_stats }
+    end
+  end
+end
diff --git a/spec/requests/api/sidekiq_metrics_spec.rb b/spec/requests/api/sidekiq_metrics_spec.rb
new file mode 100644
index 00000000000..41cbf0c6669
--- /dev/null
+++ b/spec/requests/api/sidekiq_metrics_spec.rb
@@ -0,0 +1,40 @@
+require 'spec_helper'
+
+describe API::SidekiqMetrics, api: true do
+  include ApiHelpers
+
+  let(:admin) { create(:user, :admin) }
+
+  describe 'GET sidekiq/*' do
+    it 'defines the `queue_metrics` endpoint' do
+      get api('/sidekiq/queue_metrics', admin)
+
+      expect(response.status).to eq(200)
+      expect(json_response).to be_a Hash
+    end
+
+    it 'defines the `process_metrics` endpoint' do
+      get api('/sidekiq/process_metrics', admin)
+
+      expect(response.status).to eq(200)
+      expect(json_response['processes']).to be_an Array
+    end
+
+    it 'defines the `job_stats` endpoint' do
+      get api('/sidekiq/job_stats', admin)
+
+      expect(response.status).to eq(200)
+      expect(json_response).to be_a Hash
+    end
+
+    it 'defines the `compound_metrics` endpoint' do
+      get api('/sidekiq/compound_metrics', admin)
+
+      expect(response.status).to eq(200)
+      expect(json_response).to be_a Hash
+      expect(json_response['queues']).to be_a Hash
+      expect(json_response['processes']).to be_an Array
+      expect(json_response['jobs']).to be_a Hash
+    end
+  end
+end
-- 
GitLab