|
13 | 13 |
|
14 | 14 | module Sidekiq::Cronitor |
15 | 15 | class ServerMiddleware |
16 | | - def call(worker, message, queue) |
17 | | - ping(worker: worker, state: 'run') |
| 16 | + # @param [Object] worker the instance of the job that was queued |
| 17 | + # @param [Hash] job_payload the full job payload |
| 18 | + # * @see https://github.com/sidekiq/sidekiq/wiki/Job-Format |
| 19 | + # @param [String] queue the name of the queue the job was pulled from |
| 20 | + # @yield the next middleware in the chain or worker `perform` method |
| 21 | + def call(worker, job_payload, queue) |
| 22 | + ping(job_payload: job_payload, state: 'run') |
18 | 23 |
|
19 | 24 | result = yield |
20 | 25 | rescue => e |
21 | | - ping(worker: worker, state: 'fail', message: e.to_s) |
| 26 | + ping(job_payload: job_payload, state: 'fail', message: e.to_s) |
22 | 27 |
|
23 | 28 | raise e |
24 | 29 | else |
25 | | - ping(worker: worker, state: 'complete') |
| 30 | + ping(job_payload: job_payload, state: 'complete') |
26 | 31 | result # to be consistent with client middleware, return results of yield |
27 | 32 | end |
28 | 33 |
|
29 | 34 | private |
30 | 35 |
|
31 | | - def cronitor(worker) |
32 | | - Cronitor::Monitor.new(job_key(worker)) |
| 36 | + def cronitor(job_payload) |
| 37 | + Cronitor::Monitor.new(job_key(job_payload)) |
33 | 38 | end |
34 | 39 |
|
35 | | - def cronitor_disabled?(worker) |
36 | | - if worker.class.sidekiq_options.has_key?("cronitor_enabled") |
37 | | - !worker.class.sidekiq_options.fetch("cronitor_enabled", Cronitor.auto_discover_sidekiq) |
| 40 | + def cronitor_disabled?(job_payload) |
| 41 | + if job_payload.has_key?("cronitor_enabled") |
| 42 | + !job_payload.fetch("cronitor_enabled", Cronitor.auto_discover_sidekiq) |
38 | 43 | else |
39 | | - worker.class.sidekiq_options.fetch("cronitor_disabled", options(worker).fetch(:disabled, !Cronitor.auto_discover_sidekiq)) |
| 44 | + job_payload.fetch("cronitor_disabled", options(job_payload).fetch("disabled", !Cronitor.auto_discover_sidekiq)) |
40 | 45 | end |
41 | 46 | end |
42 | 47 |
|
43 | | - def job_key(worker) |
44 | | - periodic_job_key(worker) || worker.class.sidekiq_options.fetch('cronitor_key', nil) || |
45 | | - options(worker).fetch(:key, worker.class.name) |
| 48 | + def job_key(job_payload) |
| 49 | + job_payload['cronitor_key'] || options(job_payload)['key'] || job_payload['class'] |
46 | 50 | end |
47 | 51 |
|
48 | | - def periodic_job_key(worker) |
49 | | - return unless defined?(Sidekiq::Periodic) |
50 | | - |
51 | | - periodic_job = Sidekiq::Periodic::LoopSet.new.find do |lop| |
52 | | - lop.history.find { |j| j[0] == worker.jid } |
53 | | - end |
54 | | - |
55 | | - periodic_job.present? && periodic_job.options.fetch('cronitor_key', nil) |
56 | | - end |
57 | | - |
58 | | - def options(worker) |
| 52 | + def options(job_payload) |
59 | 53 | # eventually we will delete this method of passing options |
60 | 54 | # ultimately we want all cronitor options to be top level keys |
61 | | - opts = worker.class.sidekiq_options.fetch("cronitor", {}) |
62 | | - # symbolize_keys is a rails helper, so only use it if it's defined |
63 | | - opts = opts.symbolize_keys if opts.respond_to?(:symbolize_keys) |
64 | | - opts |
| 55 | + job_payload.fetch("cronitor", {}) |
65 | 56 | end |
66 | 57 |
|
67 | | - def ping(worker:, state:, message: nil) |
68 | | - return unless should_ping?(worker) |
| 58 | + def ping(job_payload:, state:, message: nil) |
| 59 | + return unless should_ping?(job_payload) |
69 | 60 |
|
70 | | - Sidekiq.logger.debug("[cronitor] ping: worker=#{job_key(worker)} state=#{state} message=#{message}") |
| 61 | + Sidekiq.logger.debug("[cronitor] ping: worker=#{job_key(job_payload)} state=#{state} message=#{message}") |
71 | 62 |
|
72 | | - cronitor(worker).ping(state: state, message: message) |
| 63 | + cronitor(job_payload).ping(state: state, message: message) |
73 | 64 | rescue Cronitor::Error => e |
74 | | - Sidekiq.logger.error("[cronitor] error during ping: worker=#{job_key(worker)} error=#{e.message}") |
| 65 | + Sidekiq.logger.error("[cronitor] error during ping: worker=#{job_key(job_payload)} error=#{e.message}") |
75 | 66 | rescue => e |
76 | | - Sidekiq.logger.error("[cronitor] unexpected error: worker=#{job_key(worker)} error=#{e.message}") |
| 67 | + Sidekiq.logger.error("[cronitor] unexpected error: worker=#{job_key(job_payload)} error=#{e.message}") |
77 | 68 | Sidekiq.logger.error(e.backtrace.first) |
78 | 69 | end |
79 | 70 |
|
80 | | - def should_ping?(worker) |
81 | | - !cronitor(worker).api_key.nil? && !cronitor_disabled?(worker) |
| 71 | + def should_ping?(job_payload) |
| 72 | + !cronitor(job_payload).api_key.nil? && !cronitor_disabled?(job_payload) |
82 | 73 | end |
83 | 74 | end |
84 | 75 | end |
0 commit comments