2016-01-18 2 views
2

У меня мало работников, у которых нет ошибок в журнале. Но тот же код в производстве время от времени показывает ошибки. Это не критично, но я хочу понять, в чем разница и как поймать и исправить ошибки. Здесь часть журнала с ошибкой:Sidekiq. Как поймать ошибку в производстве?

2016-01-18T16:34:10.725Z 535 TID-otb5ze3fo TopUpdateWorker JID-73c584ed6fec322784d67796 INFO: start 
2016-01-18T16:34:10.725Z 535 TID-otb5ze3fo TopUpdateWorker JID-73c584ed6fec322784d67796 INFO: Things are happening. 
2016-01-18T16:34:10.824Z 535 TID-otb5ze3fo TopUpdateWorker JID-73c584ed6fec322784d67796 INFO: fail: 0.099 sec 
2016-01-18T16:34:10.824Z 535 TID-otb5ze3fo WARN: {"class"=>"TopUpdateWorker", "args"=>[], "retry"=>3, "queue"=>"default", "jid"=>"73c584ed6fec322784d67796", "created_at"=>1453134850.724368, "enqueued_at"=$ 
2016-01-18T16:34:10.824Z 535 TID-otb5ze3fo WARN: TypeError: no implicit conversion of nil into Array 
2016-01-18T16:34:10.824Z 535 TID-otb5ze3fo WARN: /var/www/vkgazer/code/lib/modules/common_mods.rb:27:in `+' 
/var/www/vkgazer/code/lib/modules/common_mods.rb:27:in `get_request' 
/var/www/vkgazer/code/app/models/post.rb:170:in `top_post_updater' 
/var/www/vkgazer/code/app/workers/top_update_worker.rb:9:in `perform' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:150:in `execute_job' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:132:in `block (2 levels) in process' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/chain.rb:127:in `block in invoke' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/server/active_record.rb:6:in `call' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/chain.rb:129:in `block in invoke' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/server/retry_jobs.rb:74:in `call' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/chain.rb:129:in `block in invoke' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/server/logging.rb:11:in `block in call' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/logging.rb:30:in `with_context' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/server/logging.rb:7:in `call' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/chain.rb:129:in `block in invoke' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/chain.rb:132:in `call' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/chain.rb:132:in `invoke' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:127:in `block in process' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:166:in `stats' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:126:in `process' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:79:in `process_one' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:67:in `run' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/util.rb:16:in `watchdog' 
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/util.rb:24:in `block in safe_thread' 

Ошибка всегда в этой строке. Вот код:

def get_request(code) # 
    i = 0 
    result = [] 
    while i < code.size # 
     part_code = code.slice(i, 25) 
     if part_code.size >1 
     str_code = part_code.join(',') 
     else 
     str_code = part_code[0] 
     end 
     url='https://api.x.com/method/execute' 
     uri = URI.parse(url) 
     parameters = {'access_token' => '00', 
        'code' => "return [#{str_code}];", 'v' => '2'} 
     response = Net::HTTP.post_form(uri, parameters) # 
     result = result + JSON.parse(response.body)['response'] #here is error 
     i += 25 
     sleep 0.35 
    end 
    result # 
    end 

Здесь я отправляю запросы API и суммирую все ответы в результате. И еще одна вещь в развитии у меня продолжительность работы менее 10 секунд, но в производстве она может составлять 160 сек. Мой компьютер лучше, чем сервер?

+2

Это вызвано 'JSON.parse (response.body) ['response']' be nil. Короче говоря, ответ является правильным JSON, но на нем нет поля ответа. Теперь исправление зависит от того, что вы хотите сделать в этом случае. – BroiSatse

+1

@BroiSatse Уверен, что вы правы, но почему это происходит только в производстве? – nobilik

+2

Существует тысячи возможных причин, начиная с ввода в черный список IP. Вам нужно самому зарегистрировать ответ, он должен содержать подсказку, почему это происходит (например, '{" error ":" Мне не нравится "}}. Все зависит от услуги, на которую вы отправляете запрос. – BroiSatse

ответ

0

Так в любое время, что ваш response.body содержит «пустой» ответ, как "{}" или если он просто отсутствует 'response' элемента, то JSON.parse(response.body)['response'] будет nil и поэтому ваш код пытается сделать:

result + nil 

. .. и вы получаете эту ошибку. Вероятно, наилучшим образом это может выглядеть примерно так:

result = result + (JSON.parse(response.body)['response'] || []) 
Смежные вопросы