arturictus / sidekiq_alive

Liveness probe for Sidekiq in Kubernetes deployments
MIT License
189 stars 57 forks source link

Broken with Sidekiq 7 #73

Closed n-rodriguez closed 1 year ago

n-rodriguez commented 1 year ago

Since version 7, sidekiq use redis-client in replacement of redis (https://github.com/mperham/sidekiq/blob/main/docs/7.0-Upgrade.md#redis-client). The Redis client API is no longer the same and so it breaks sidekiq_alive.

[2022-12-08T18:26:05.011835 #316492 #]  WARN [] - concerto.sidekiq_fifo: {"context":"Exception during Sidekiq lifecycle event.","event":"startup","_config":"#<Sidekiq::Config:0x00007fc3841d16f0>"}
[2022-12-08T18:26:05.011947 #316492 #]  WARN [] - concerto.sidekiq_fifo: TypeError: no implicit conversion of nil into Array
[2022-12-08T18:26:05.012054 #316492 #]  WARN [] - concerto.sidekiq_fifo: /home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:61:in `+'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:61:in `block in deep_scan'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:59:in `loop'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:59:in `deep_scan'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:55:in `registered_instances'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:152:in `successful_startup_text'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:23:in `block (3 levels) in start'
<internal:kernel>:90:in `tap'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:15:in `block (2 levels) in start'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq-7.0.2/lib/sidekiq/component.rb:58:in `block in fire_event'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq-7.0.2/lib/sidekiq/component.rb:57:in `each'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq-7.0.2/lib/sidekiq/component.rb:57:in `fire_event'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq-7.0.2/lib/sidekiq/cli.rb:105:in `run'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq-7.0.2/bin/sidekiq:31:in `<top (required)>'
bin/sidekiq:27:in `load'
bin/sidekiq:27:in `<main>'
no implicit conversion of nil into Array
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:61:in `+'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:61:in `block in deep_scan'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:59:in `loop'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:59:in `deep_scan'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:55:in `registered_instances'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:152:in `successful_startup_text'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:23:in `block (3 levels) in start'
<internal:kernel>:90:in `tap'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq_alive-2.1.6/lib/sidekiq_alive.rb:15:in `block (2 levels) in start'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq-7.0.2/lib/sidekiq/component.rb:58:in `block in fire_event'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq-7.0.2/lib/sidekiq/component.rb:57:in `each'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq-7.0.2/lib/sidekiq/component.rb:57:in `fire_event'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq-7.0.2/lib/sidekiq/cli.rb:105:in `run'
/home/nicolas/.asdf/installs/ruby/3.1.3/lib/ruby/gems/3.1.0/gems/sidekiq-7.0.2/bin/sidekiq:31:in `<top (required)>'
bin/sidekiq:27:in `load'
bin/sidekiq:27:in `<main>'
n-rodriguez commented 1 year ago

If you change a bit the code from: https://github.com/arturictus/sidekiq_alive/blob/0dddd80bc6e1f594018f02cb4e4eb4fc30701935/lib/sidekiq_alive.rb#L58-L65

to:

  def self.deep_scan(keyword, keys = [], cursor = 0)
    loop do
      cursor, found_keys = SidekiqAlive.redis.scan(cursor, match: keyword, count: 1000)
      keys += found_keys if found_keys
      break if cursor.to_i == 0
    end
    keys
  end

you get :

undefined method `to_i' for #<Enumerator: #<RedisClient redis://127.0.0.1:6379/2>:scan(0, match: SIDEKIQ_REGISTERED_INSTANCE::*, count: 1000)>

      break if cursor.to_i == 0
                     ^^^^^
Did you mean?  to_s
               to_a
               to_h
n-rodriguez commented 1 year ago

https://github.com/arturictus/sidekiq_alive/pull/72

flooose commented 1 year ago

I'm sorry, but is it possible that the error described here hasn't been addressed in the fix in https://github.com/arturictus/sidekiq_alive/pull/74?

Specifically, we're getting this error

undefined method `to_i' for #<Enumerator: #<RedisClient redis://127.0.0.1:6379/2>:scan(0, match: SIDEKIQ_REGISTERED_INSTANCE::*, count: 1000)>

      break if cursor.to_i == 0
                     ^^^^^