sidekiq-cronitor 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 77c9e01c256be04515fbd21f7e467fb28e632a37f94d639847c6af8ad6e9823b
4
- data.tar.gz: 2c78645ae3fb16b98b52777b3b3124aaa76e6860fc606bee2bc2ab8696275663
3
+ metadata.gz: cab38f6cd486339c23ce89d495d8fd320536ad475385c77f2f28f08ddc78a47b
4
+ data.tar.gz: ecee9682b2caf0b6becfa83354a5be5275c192f57ab09e1c2da2368ce2aa85f1
5
5
  SHA512:
6
- metadata.gz: 70c63ea8977ac11afe3991a1290950ed1deaa95c0147e8434fc3d0cf0fd4ed965d6d31354b150ae74e505497d7a5499023ea93f41a7eeca14fdddefc2a38a2c7
7
- data.tar.gz: 6474a1e11df5373147b252fe327373e084f34abb60b6708f99c81df6b1c6d37643642228f1651fca7ddc4d9c0b988abec2f6a045f949f3e0a8e07dd5cc953b30
6
+ metadata.gz: fcbd75ca1e900e2a409d281c2fbad43e6fd76e6c03778c2b87df92cf50160573e96fd437a06f5db1b95e6c7e7c53ec9e3af9dfdce486bef9da517b7f08c07a25
7
+ data.tar.gz: 9b61ae50868b37b951c444090180ab4b8e0ce680185c61291f6eb16ae71a4138de89cf97d785a330c58948917cc287578526a9b2cb3c78a2b5a2fa779c4b6d8f
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Sidekiq Cronitor
2
2
 
3
- Call a [Cronitor](https://cronitor.io) around your [Sidekiq](https://sidekiq.org) jobs.
3
+ [Cronitor](https://cronitor.io/) provides dead simple monitoring for cron jobs, daemons, queue workers, websites, APIs, and anything else that can send or receive an HTTP request. The Cronitor Sidekiq library provides a drop in integration for monitoring any Sidekiq Job.
4
+
5
+
6
+ #### NOTE: Version 3.0.0 changes the integration method from 2.x.x. This is a breaking change. You now add the middleware in the Sidekiq initializer. You can opt of out telemetry for specific jobs with a sidekiq_options (see below)
4
7
 
5
8
  ## Installation
6
9
 
@@ -19,39 +22,62 @@ bundle
19
22
 
20
23
  ## Usage
21
24
 
22
- Make sure you've got a Cronitor [API Key](https://cronitor.io/docs/api-overview) from [your settings](https://cronitor.io/settings) in your ENV as `CRONITOR_API_KEY` before starting Sidekiq:
25
+ Configure `sidekiq-cronitor` with an [API Key](https://cronitor.io/docs/api-overview) from [your settings](https://cronitor.io/settings). You can use ENV variables to configure Cronitor:
23
26
 
24
27
  ```sh
25
- export CRONITOR_API_KEY='abcdef1234567890abcdef1234567890'
28
+ export CRONITOR_API_KEY='api_key_123'
29
+ export CRONITOR_ENVIRONMENT='development' #default: 'production'
30
+
26
31
  bundle exec sidekiq
27
32
  ```
28
33
 
29
- Any sidekiq worker you'd like to monitor just includes `Sidekiq::Cronitor` right after `Sidekiq::Worker`:
34
+ Or declare the API key directly on the Cronitor module from within your application (e.g. the Sidekiq initializer).
30
35
 
31
36
  ```ruby
32
- class MyWorker
33
- include Sidekiq::Worker
34
- include Sidekiq::Cronitor
37
+ require 'cronitor'
38
+ Cronitor.api_key = 'api_key_123'
39
+ Cronitor.environment = 'development' #default: 'production'
40
+ ```
35
41
 
36
- def perform
37
- # ...
42
+
43
+ To monitor jobs insert the server middleware (most people do this in the Sidekiq initializer)
44
+
45
+ ```ruby
46
+ Sidekiq.configure_server do |config|
47
+ config.server_middleware do |chain|
48
+ chain.add Sidekiq::Cronitor::ServerMiddleware
38
49
  end
39
50
  end
40
51
  ```
41
52
 
42
- By default this will look for an existing monitor named after your worker, `MyWorker` in the case above, and pings that. Otherwise it will try to create a new monitor with the worker's name, which you can configure rules for at a later time via your Cronitor dashboard.
43
53
 
44
- To use a monitor you've already created, you can configure the monitor's `key` directly:
54
+ When this job is invoked, Cronitor will send telemetry pings with a `key` matching the name of your job class (`MyJob` in the example below). If no monitor exists it will create one on the first event. You can configure rules at a later time via the Cronitor dashboard, API, or [YAML config](https://github.com/cronitorio/cronitor-ruby#configuring-monitors) file.
55
+
56
+ If you want to specify the Cronitor key directly (not required) you can do so using `sidekiq_options`:
45
57
 
46
58
  ```ruby
47
- class MyWorker
48
- include Sidekiq::Worker
49
- include Sidekiq::Cronitor
59
+ class MyJob
60
+ include Sidekiq::Job
50
61
 
62
+ # note that 'key' should be set with a symbol as the key in the hash
51
63
  sidekiq_options cronitor: { key: 'abc123' }
52
64
 
53
65
  def perform
54
- # ...
66
+ end
67
+ end
68
+ ```
69
+
70
+
71
+ To disable Cronitor for a specific job you can set the following option:
72
+
73
+ ```ruby
74
+ class MyJob
75
+ include Sidekiq::MyJob
76
+
77
+ # note that 'disabled' should be set with a symbol as the key in the hash
78
+ sidekiq_options cronitor: { disabled: true }
79
+
80
+ def perform
55
81
  end
56
82
  end
57
83
  ```
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module Cronitor
3
- VERSION = '2.0.0'
3
+ VERSION = '3.0.0'
4
4
  end
5
5
  end
@@ -4,74 +4,55 @@ require 'cronitor'
4
4
  require 'sidekiq/cronitor/version'
5
5
 
6
6
  module Sidekiq::Cronitor
7
- def self.included(base)
8
- unless base.ancestors.include?(Sidekiq::Worker)
9
- raise ArgumentError, 'Sidekiq::Cronitor can only be included in a Sidekiq::Worker'
10
- end
11
-
12
- base.extend(ClassMethods)
13
-
14
- # Automatically add sidekiq middleware when we're first included
15
- Sidekiq.configure_server do |config|
16
- unless config.server_middleware.exists?(Sidekiq::Cronitor::Middleware)
17
- config.server_middleware.add(Sidekiq::Cronitor::Middleware)
18
- end
19
- end
20
- end
21
-
22
- def cronitor
23
- self.class.cronitor
24
- end
25
-
26
- module ClassMethods
27
- def cronitor
28
- return @cronitor if defined?(@cronitor)
29
-
30
- opts = sidekiq_options.fetch('cronitor', {})
31
- key = opts.symbolize_keys.fetch(:key, name)
32
-
33
- Sidekiq.logger.debug("[cronitor] initializing monitor: worker=#{name} key=#{key}")
34
-
35
- begin
36
- @cronitor = Cronitor::Monitor.new(key)
37
- rescue Cronitor::Error => e
38
- Sidekiq.logger.error("[cronitor] failed to initialize monitor: worker=#{name} error=#{e.message}")
39
-
40
- @cronitor = nil
41
- end
42
- end
43
- end
44
-
45
- class Middleware
7
+ class ServerMiddleware
46
8
  def call(worker, message, queue)
47
9
  ping(worker: worker, state: 'run')
48
10
 
49
- yield
11
+ result = yield
50
12
  rescue => e
51
13
  ping(worker: worker, state: 'fail', message: e.to_s)
52
14
 
53
15
  raise e
54
16
  else
55
17
  ping(worker: worker, state: 'complete')
18
+ result # to be consistent with client middleware, return results of yield
56
19
  end
57
20
 
58
21
  private
22
+ def cronitor(worker)
23
+ Cronitor::Monitor.new(job_key(worker))
24
+ end
25
+
26
+ def cronitor_disabled?(worker)
27
+ options(worker).fetch(:disabled, false)
28
+ end
29
+
30
+ def job_key(worker)
31
+ options(worker).fetch(:key, worker.class.name)
32
+ end
33
+
34
+ def options(worker)
35
+ opts = worker.class.sidekiq_options.fetch('cronitor', {})
36
+ # symbolize_keys is a rails helper, so only use it if it's defined
37
+ opts = opts.symbolize_keys if opts.respond_to?(:symbolize_keys)
38
+ opts
39
+ end
59
40
 
60
41
  def ping(worker:, state:, message: nil)
61
- return unless has_cronitor?(worker)
42
+ return unless should_ping?(worker)
62
43
 
63
- Sidekiq.logger.debug("[cronitor] ping: worker=#{worker.class.name} state=#{state} message=#{message}")
44
+ Sidekiq.logger.debug("[cronitor] ping: worker=#{job_key(worker)} state=#{state} message=#{message}")
64
45
 
65
- worker.cronitor.ping(state: state)
46
+ cronitor(worker).ping(state: state)
66
47
  rescue Cronitor::Error => e
67
- Sidekiq.logger.error("[cronitor] error during ping: worker=#{worker.class.name} error=#{e.message}")
48
+ Sidekiq.logger.error("[cronitor] error during ping: worker=#{job_key(worker)} error=#{e.message}")
68
49
  rescue => e
69
- Sidekiq.logger.error("[cronitor] unexpected error: worker=#{worker.class.name} error=#{e.message}")
50
+ Sidekiq.logger.error("[cronitor] unexpected error: worker=#{job_key(worker)} error=#{e.message}")
70
51
  Sidekiq.logger.error(e.backtrace.first)
71
52
  end
72
53
 
73
- def has_cronitor?(worker)
74
- worker.is_a?(Sidekiq::Cronitor) && worker.respond_to?(:cronitor) && !worker.cronitor.api_key.nil?
54
+ def should_ping?(worker)
55
+ !cronitor(worker).api_key.nil? && !cronitor_disabled?(worker)
75
56
  end
76
57
  end
77
58
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-cronitor
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zeke Gabrielse
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-05-11 00:00:00.000000000 Z
12
+ date: 2022-03-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sidekiq