I have created a class where I send Redis url as parameter and operate on it using Sidekiq inbuiltg methods, when I run code manually using rake command it works properly but when I try to do same using whenever scheduler it is throwing below error:-
Redis::CannotConnectError: Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)
/iot/app/services/sidekiq_metric.rb:48:in `map'
/iot/app/services/sidekiq_metric.rb:48:in `long_product_jobs'
/iot/lib/tasks/monitor_custom_jobs.rake:32:in `block (3 levels) in <main>'
/iot/lib/tasks/monitor_custom_jobs.rake:29:in `each'
/iot/lib/tasks/monitor_custom_jobs.rake:29:in `block (2 levels) in <main>'
/usr/local/rvm/rubies/ruby-3.1.2/bin/bundle:25:in `load'
/usr/local/rvm/rubies/ruby-3.1.2/bin/bundle:25:in `<main>'
Caused by:
Errno::ECONNREFUSED: Connection refused - connect(2) for 127.0.0.1:6379
/iot/app/services/sidekiq_metric.rb:48:in `map'
/iot/app/services/sidekiq_metric.rb:48:in `long_product_jobs'
/iot/lib/tasks/monitor_custom_jobs.rake:32:in `block (3 levels) in <main>'
/iot/lib/tasks/monitor_custom_jobs.rake:29:in `each'
/iot/lib/tasks/monitor_custom_jobs.rake:29:in `block (2 levels) in <main>'
/usr/local/rvm/rubies/ruby-3.1.2/bin/bundle:25:in `load'
/usr/local/rvm/rubies/ruby-3.1.2/bin/bundle:25:in `<main>'
Caused by:
IO::EINPROGRESSWaitWritable: Operation now in progress - connect(2) would block
/iot/app/services/sidekiq_metric.rb:48:in `map'
/iot/app/services/sidekiq_metric.rb:48:in `long_product_jobs'
/iot/lib/tasks/monitor_custom_jobs.rake:32:in `block (3 levels) in <main>'
/iot/lib/tasks/monitor_custom_jobs.rake:29:in `each'
/iot/lib/tasks/monitor_custom_jobs.rake:29:in `block (2 levels) in <main>'
/usr/local/rvm/rubies/ruby-3.1.2/bin/bundle:25:in `load'
/usr/local/rvm/rubies/ruby-3.1.2/bin/bundle:25:in `<main>'
Tasks: TOP => monitor_custom_jobs:long_running_jobs
(See full trace by running task with --trace)
code snippet:-
sidekiq_metric.rb:-
require 'sidekiq/api'
require 'date'
class SidekiqMetric
# Connect to your Sidekiq instance
def initialize(url, app_name)
@url = url
@app = name
configure_sidekiq
end
def configure_sidekiq
Sidekiq.configure_client do |config|
config.redis = { url: @url }
end
end
def failed_count
latest_count = Sidekiq::Stats.new.failed
end
end
rake task file:-
namespace :monitor_custom_jobs do
desc 'failed sidekiq jobs'
task failed_count: :environment do
report = []
URLS.each do |url|
redis_url = ENV.fetch("REDIS_#{url}")
sidekiq_service = SidekiqMetric.new(redis_url, "app_name_#{rand(0..3)}")
puts sidekiq_service.failed_count
end
end
end
end
schedule.rb:-
every 1.minutes do
rake 'monitor_custom_jobs:failed_count'
end