sidekiq-cronitor 1.0.0.alpha2 → 2.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 +5 -5
- data/LICENSE +1 -1
- data/README.md +12 -47
- data/lib/sidekiq/cronitor.rb +32 -94
- data/lib/sidekiq/cronitor/version.rb +1 -1
- metadata +39 -43
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 77c9e01c256be04515fbd21f7e467fb28e632a37f94d639847c6af8ad6e9823b
|
4
|
+
data.tar.gz: 2c78645ae3fb16b98b52777b3b3124aaa76e6860fc606bee2bc2ab8696275663
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70c63ea8977ac11afe3991a1290950ed1deaa95c0147e8434fc3d0cf0fd4ed965d6d31354b150ae74e505497d7a5499023ea93f41a7eeca14fdddefc2a38a2c7
|
7
|
+
data.tar.gz: 6474a1e11df5373147b252fe327373e084f34abb60b6708f99c81df6b1c6d37643642228f1651fca7ddc4d9c0b988abec2f6a045f949f3e0a8e07dd5cc953b30
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -7,21 +7,23 @@ Call a [Cronitor](https://cronitor.io) around your [Sidekiq](https://sidekiq.org
|
|
7
7
|
Add sidekiq-cronitor your application's Gemfile, near sidekiq:
|
8
8
|
|
9
9
|
```ruby
|
10
|
-
gem
|
11
|
-
gem
|
10
|
+
gem 'sidekiq'
|
11
|
+
gem 'sidekiq-cronitor'
|
12
12
|
```
|
13
13
|
|
14
14
|
And then bundle:
|
15
15
|
|
16
|
-
|
16
|
+
```
|
17
|
+
bundle
|
18
|
+
```
|
17
19
|
|
18
20
|
## Usage
|
19
21
|
|
20
|
-
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
|
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:
|
21
23
|
|
22
24
|
```sh
|
23
|
-
export
|
24
|
-
sidekiq
|
25
|
+
export CRONITOR_API_KEY='abcdef1234567890abcdef1234567890'
|
26
|
+
bundle exec sidekiq
|
25
27
|
```
|
26
28
|
|
27
29
|
Any sidekiq worker you'd like to monitor just includes `Sidekiq::Cronitor` right after `Sidekiq::Worker`:
|
@@ -37,53 +39,16 @@ class MyWorker
|
|
37
39
|
end
|
38
40
|
```
|
39
41
|
|
40
|
-
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 name.
|
41
|
-
|
42
|
-
To use a monitor you've already created you can also configure a code directly:
|
43
|
-
|
44
|
-
```ruby
|
45
|
-
class MyWorker
|
46
|
-
include Sidekiq::Worker
|
47
|
-
include Sidekiq::Cronitor
|
48
|
-
|
49
|
-
sidekiq_options cronitor: {code: "abc123"}
|
50
|
-
|
51
|
-
def perform
|
52
|
-
# ...
|
53
|
-
end
|
54
|
-
end
|
55
|
-
```
|
56
|
-
|
57
|
-
To use a different name or customise how a missing monitor will be created you can use a sidekiq option named `cronitor`:
|
58
|
-
|
59
|
-
```ruby
|
60
|
-
class MyWorker
|
61
|
-
include Sidekiq::Worker
|
62
|
-
include Sidekiq::Cronitor
|
63
|
-
|
64
|
-
sidekiq_options cronitor: {
|
65
|
-
name: "Some Monitor",
|
66
|
-
rules: [{rule_type: "ran_longer_than", value: 60, time_unit: "seconds"}]
|
67
|
-
}
|
68
|
-
|
69
|
-
def perform
|
70
|
-
# ...
|
71
|
-
end
|
72
|
-
end
|
73
|
-
```
|
74
|
-
|
75
|
-
For more information on what rules you can use take a look at the [Cronitor Monitors API docs](https://cronitor.io/docs/monitor-api).
|
76
|
-
|
77
|
-
If you're using [sidekiq-cron](https://github.com/ondrejbartas/sidekiq-cron) the missing monitor will have a default `not_on_schedule` rule based on the cron schedule matched by you worker class.
|
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.
|
78
43
|
|
79
|
-
|
44
|
+
To use a monitor you've already created, you can configure the monitor's `key` directly:
|
80
45
|
|
81
46
|
```ruby
|
82
47
|
class MyWorker
|
83
48
|
include Sidekiq::Worker
|
84
49
|
include Sidekiq::Cronitor
|
85
50
|
|
86
|
-
sidekiq_options cronitor:
|
51
|
+
sidekiq_options cronitor: { key: 'abc123' }
|
87
52
|
|
88
53
|
def perform
|
89
54
|
# ...
|
@@ -99,7 +64,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
99
64
|
|
100
65
|
## Contributing
|
101
66
|
|
102
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
67
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/cronitorio/cronitor-sidekiq/pulls. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
103
68
|
|
104
69
|
## License
|
105
70
|
|
data/lib/sidekiq/cronitor.rb
CHANGED
@@ -1,25 +1,20 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'sidekiq'
|
2
|
+
require 'cronitor'
|
3
3
|
|
4
|
-
require
|
4
|
+
require 'sidekiq/cronitor/version'
|
5
5
|
|
6
6
|
module Sidekiq::Cronitor
|
7
7
|
def self.included(base)
|
8
|
-
unless base.ancestors.include?
|
9
|
-
raise ArgumentError,
|
8
|
+
unless base.ancestors.include?(Sidekiq::Worker)
|
9
|
+
raise ArgumentError, 'Sidekiq::Cronitor can only be included in a Sidekiq::Worker'
|
10
10
|
end
|
11
11
|
|
12
12
|
base.extend(ClassMethods)
|
13
13
|
|
14
14
|
# Automatically add sidekiq middleware when we're first included
|
15
|
-
#
|
16
|
-
# This might only occur when the worker class is first loaded in a
|
17
|
-
# development rails environment, but that happens before the middleware
|
18
|
-
# chain is invoked so we're all good.
|
19
|
-
#
|
20
15
|
Sidekiq.configure_server do |config|
|
21
|
-
unless config.server_middleware.exists?
|
22
|
-
config.server_middleware.add
|
16
|
+
unless config.server_middleware.exists?(Sidekiq::Cronitor::Middleware)
|
17
|
+
config.server_middleware.add(Sidekiq::Cronitor::Middleware)
|
23
18
|
end
|
24
19
|
end
|
25
20
|
end
|
@@ -30,110 +25,53 @@ module Sidekiq::Cronitor
|
|
30
25
|
|
31
26
|
module ClassMethods
|
32
27
|
def cronitor
|
33
|
-
return @cronitor if defined?
|
28
|
+
return @cronitor if defined?(@cronitor)
|
34
29
|
|
35
|
-
|
36
|
-
|
30
|
+
opts = sidekiq_options.fetch('cronitor', {})
|
31
|
+
key = opts.symbolize_keys.fetch(:key, name)
|
37
32
|
|
38
|
-
|
39
|
-
return @cronitor = opts
|
40
|
-
end
|
41
|
-
|
42
|
-
# Cronitor (and our code below) expects deeply symbolized keys
|
43
|
-
opts = Utils.deep_symbolize_keys(opts)
|
44
|
-
|
45
|
-
# Extract token and code into top level kwargs
|
46
|
-
kwargs = opts.slice(:token, :code).merge(opts: opts)
|
47
|
-
|
48
|
-
# Default monitor name to sidekiq worker (class) name
|
49
|
-
kwargs[:opts][:name] ||= name
|
50
|
-
|
51
|
-
# Some hints about where this monitor came from
|
52
|
-
kwargs[:opts][:tags] ||= []
|
53
|
-
kwargs[:opts][:tags] << "sidekiq-cronitor"
|
54
|
-
if environment = ENV["RAILS_ENV"] || ENV["RACK_ENV"] || Sidekiq.options[:environment]
|
55
|
-
kwargs[:opts][:tags] << environment
|
56
|
-
end
|
57
|
-
kwargs[:opts][:note] ||= "Created by sidekiq-cronitor"
|
58
|
-
|
59
|
-
# If we can find a schedule for this worker then we can automatically add
|
60
|
-
# a not_on_schedule rule and tag it as a cron-job
|
61
|
-
if schedule = cronitor_schedule
|
62
|
-
kwargs[:opts][:rules] ||= [{rule_type: "not_on_schedule", value: schedule}]
|
63
|
-
kwargs[:opts][:tags] << "cron-job"
|
64
|
-
end
|
33
|
+
Sidekiq.logger.debug("[cronitor] initializing monitor: worker=#{name} key=#{key}")
|
65
34
|
|
66
35
|
begin
|
67
|
-
@cronitor = Cronitor.new(
|
36
|
+
@cronitor = Cronitor::Monitor.new(key)
|
68
37
|
rescue Cronitor::Error => e
|
69
|
-
Sidekiq.logger.
|
38
|
+
Sidekiq.logger.error("[cronitor] failed to initialize monitor: worker=#{name} error=#{e.message}")
|
70
39
|
|
71
40
|
@cronitor = nil
|
72
41
|
end
|
73
42
|
end
|
74
|
-
|
75
|
-
private def cronitor_schedule
|
76
|
-
name = self.name
|
77
|
-
|
78
|
-
if defined?(Sidekiq::Cron)
|
79
|
-
# If we can find a Sidekiq::Cron job with a matching worker class
|
80
|
-
# then presume its schedule.
|
81
|
-
Sidekiq::Cron::Job.all.each do |job|
|
82
|
-
if job.klass == name
|
83
|
-
return job.cron
|
84
|
-
end
|
85
|
-
end
|
86
|
-
elsif defined?(Sidekiq::Periodic)
|
87
|
-
# If we can find a Sidekiq Enterprise Periodic Loop with a matching
|
88
|
-
# worker class then presume its schedule.
|
89
|
-
Sidekiq::Periodic::LoopSet.new.each do |loop_|
|
90
|
-
if loop_.klass == name
|
91
|
-
return loop_.schedule
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
# ¯\_(ツ)_/¯
|
97
|
-
return nil
|
98
|
-
end
|
99
43
|
end
|
100
44
|
|
101
45
|
class Middleware
|
102
46
|
def call(worker, message, queue)
|
103
|
-
|
104
|
-
ping worker, "run"
|
47
|
+
ping(worker: worker, state: 'run')
|
105
48
|
|
106
|
-
|
107
|
-
|
108
|
-
|
49
|
+
yield
|
50
|
+
rescue => e
|
51
|
+
ping(worker: worker, state: 'fail', message: e.to_s)
|
109
52
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
end
|
53
|
+
raise e
|
54
|
+
else
|
55
|
+
ping(worker: worker, state: 'complete')
|
114
56
|
end
|
115
57
|
|
116
58
|
private
|
117
59
|
|
118
|
-
def ping(worker
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
end
|
123
|
-
rescue Cronitor::Error => e
|
124
|
-
Sidekiq.logger.warn "Couldn't ping Cronitor: #{e.to_s}"
|
125
|
-
end
|
60
|
+
def ping(worker:, state:, message: nil)
|
61
|
+
return unless has_cronitor?(worker)
|
62
|
+
|
63
|
+
Sidekiq.logger.debug("[cronitor] ping: worker=#{worker.class.name} state=#{state} message=#{message}")
|
126
64
|
|
127
|
-
|
128
|
-
|
65
|
+
worker.cronitor.ping(state: state)
|
66
|
+
rescue Cronitor::Error => e
|
67
|
+
Sidekiq.logger.error("[cronitor] error during ping: worker=#{worker.class.name} error=#{e.message}")
|
68
|
+
rescue => e
|
69
|
+
Sidekiq.logger.error("[cronitor] unexpected error: worker=#{worker.class.name} error=#{e.message}")
|
70
|
+
Sidekiq.logger.error(e.backtrace.first)
|
129
71
|
end
|
130
|
-
end
|
131
72
|
|
132
|
-
|
133
|
-
|
134
|
-
hash.each_with_object({}) do |(key, value), new_hash|
|
135
|
-
new_hash[key.to_sym] = value.is_a?(Hash) ? deep_symbolize_keys(value) : value
|
136
|
-
end
|
73
|
+
def has_cronitor?(worker)
|
74
|
+
worker.is_a?(Sidekiq::Cronitor) && worker.respond_to?(:cronitor) && !worker.cronitor.api_key.nil?
|
137
75
|
end
|
138
76
|
end
|
139
77
|
end
|
metadata
CHANGED
@@ -1,34 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-cronitor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
+
- Zeke Gabrielse
|
7
8
|
- Samuel Cochran
|
8
|
-
autorequire:
|
9
|
+
autorequire:
|
9
10
|
bindir: bin
|
10
|
-
cert_chain:
|
11
|
-
-
|
12
|
-
-----BEGIN CERTIFICATE-----
|
13
|
-
MIIDKDCCAhCgAwIBAgIBBTANBgkqhkiG9w0BAQUFADA6MQ0wCwYDVQQDDARzajI2
|
14
|
-
MRQwEgYKCZImiZPyLGQBGRYEc2oyNjETMBEGCgmSJomT8ixkARkWA2NvbTAeFw0x
|
15
|
-
NzA3MzEwNTQ3MDVaFw0xODA3MzEwNTQ3MDVaMDoxDTALBgNVBAMMBHNqMjYxFDAS
|
16
|
-
BgoJkiaJk/IsZAEZFgRzajI2MRMwEQYKCZImiZPyLGQBGRYDY29tMIIBIjANBgkq
|
17
|
-
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr60Eo/ttCk8GMTMFiPr3GoYMIMFvLak
|
18
|
-
xSmTk9YGCB6UiEePB4THSSA5w6IPyeaCF/nWkDp3/BAam0eZMWG1IzYQB23TqIM0
|
19
|
-
1xzcNRvFsn0aQoQ00k+sj+G83j3T5OOV5OZIlu8xAChMkQmiPd1NXc6uFv+Iacz7
|
20
|
-
kj+CMsI9YUFdNoU09QY0b+u+Rb6wDYdpyvN60YC30h0h1MeYbvYZJx/iZK4XY5zu
|
21
|
-
4O/FL2ChjL2CPCpLZW55ShYyrzphWJwLOJe+FJ/ZBl6YXwrzQM9HKnt4titSNvyU
|
22
|
-
KzE3L63A3PZvExzLrN9u09kuWLLJfXB2sGOlw3n9t72rJiuBr3/OQQIDAQABozkw
|
23
|
-
NzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU99dfRjEKFyczTeIz
|
24
|
-
m3ZsDWrNC80wDQYJKoZIhvcNAQEFBQADggEBADGiXpvK754s0zTFx3y31ZRDdvAI
|
25
|
-
lA209JIjUlDyr9ptCRadihyfF2l9/hb+hLemiPEYppzG6vEK1TIyzbAR36yOJ8CX
|
26
|
-
4vPkCXLuwHhs6UIRbwN+IEy41nsIlBxmjLYei8h3t/G2Vm2oOaLdbjDXS+Srl9U8
|
27
|
-
shsE8ft81PxSQfzEL7Mr9cC9XvWbHW+SyTpfGm8rAtaqZkNeke4U8a0di4oz2EfA
|
28
|
-
P4lSfmXxsd1C71ckIp0cyXkPhyTtpyS/5hq9HhuUNzEHkSDe36/Rd1xYKV5JxMC2
|
29
|
-
YAttWFUs06lor2q1wwncPaMtUtbWwW35+1IV6xhs2rFY6DD/I6ZkK3GnHdY=
|
30
|
-
-----END CERTIFICATE-----
|
31
|
-
date: 2017-12-10 00:00:00.000000000 Z
|
11
|
+
cert_chain: []
|
12
|
+
date: 2021-05-11 00:00:00.000000000 Z
|
32
13
|
dependencies:
|
33
14
|
- !ruby/object:Gem::Dependency
|
34
15
|
name: sidekiq
|
@@ -36,56 +17,56 @@ dependencies:
|
|
36
17
|
requirements:
|
37
18
|
- - "~>"
|
38
19
|
- !ruby/object:Gem::Version
|
39
|
-
version: '
|
20
|
+
version: '6.0'
|
40
21
|
type: :runtime
|
41
22
|
prerelease: false
|
42
23
|
version_requirements: !ruby/object:Gem::Requirement
|
43
24
|
requirements:
|
44
25
|
- - "~>"
|
45
26
|
- !ruby/object:Gem::Version
|
46
|
-
version: '
|
27
|
+
version: '6.0'
|
47
28
|
- !ruby/object:Gem::Dependency
|
48
29
|
name: cronitor
|
49
30
|
requirement: !ruby/object:Gem::Requirement
|
50
31
|
requirements:
|
51
32
|
- - "~>"
|
52
33
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
34
|
+
version: '4.0'
|
54
35
|
type: :runtime
|
55
36
|
prerelease: false
|
56
37
|
version_requirements: !ruby/object:Gem::Requirement
|
57
38
|
requirements:
|
58
39
|
- - "~>"
|
59
40
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
41
|
+
version: '4.0'
|
61
42
|
- !ruby/object:Gem::Dependency
|
62
43
|
name: bundler
|
63
44
|
requirement: !ruby/object:Gem::Requirement
|
64
45
|
requirements:
|
65
46
|
- - "~>"
|
66
47
|
- !ruby/object:Gem::Version
|
67
|
-
version: '1
|
48
|
+
version: '2.1'
|
68
49
|
type: :development
|
69
50
|
prerelease: false
|
70
51
|
version_requirements: !ruby/object:Gem::Requirement
|
71
52
|
requirements:
|
72
53
|
- - "~>"
|
73
54
|
- !ruby/object:Gem::Version
|
74
|
-
version: '1
|
55
|
+
version: '2.1'
|
75
56
|
- !ruby/object:Gem::Dependency
|
76
57
|
name: rake
|
77
58
|
requirement: !ruby/object:Gem::Requirement
|
78
59
|
requirements:
|
79
60
|
- - "~>"
|
80
61
|
- !ruby/object:Gem::Version
|
81
|
-
version: '
|
62
|
+
version: '13.0'
|
82
63
|
type: :development
|
83
64
|
prerelease: false
|
84
65
|
version_requirements: !ruby/object:Gem::Requirement
|
85
66
|
requirements:
|
86
67
|
- - "~>"
|
87
68
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
69
|
+
version: '13.0'
|
89
70
|
- !ruby/object:Gem::Dependency
|
90
71
|
name: rspec
|
91
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,9 +81,25 @@ dependencies:
|
|
100
81
|
- - "~>"
|
101
82
|
- !ruby/object:Gem::Version
|
102
83
|
version: '3.0'
|
103
|
-
|
104
|
-
|
105
|
-
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: bump
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0.1'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0.1'
|
98
|
+
description: Integrates Sidekiq with Cronitor so that workers send lifecycle events
|
99
|
+
- run/complete/fail - around their perform methods
|
100
|
+
email:
|
101
|
+
- zeke@keygen.sh
|
102
|
+
- sj26@sj26.com
|
106
103
|
executables: []
|
107
104
|
extensions: []
|
108
105
|
extra_rdoc_files: []
|
@@ -111,11 +108,11 @@ files:
|
|
111
108
|
- README.md
|
112
109
|
- lib/sidekiq/cronitor.rb
|
113
110
|
- lib/sidekiq/cronitor/version.rb
|
114
|
-
homepage: https://github.com/
|
111
|
+
homepage: https://github.com/cronitor/sidekiq-cronitor
|
115
112
|
licenses:
|
116
113
|
- MIT
|
117
114
|
metadata: {}
|
118
|
-
post_install_message:
|
115
|
+
post_install_message:
|
119
116
|
rdoc_options: []
|
120
117
|
require_paths:
|
121
118
|
- lib
|
@@ -126,13 +123,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
126
123
|
version: '0'
|
127
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
125
|
requirements:
|
129
|
-
- - "
|
126
|
+
- - ">="
|
130
127
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
128
|
+
version: '0'
|
132
129
|
requirements: []
|
133
|
-
|
134
|
-
|
135
|
-
signing_key:
|
130
|
+
rubygems_version: 3.1.4
|
131
|
+
signing_key:
|
136
132
|
specification_version: 4
|
137
|
-
summary: Monitor your
|
133
|
+
summary: Monitor your Sidekiq jobs with Cronitor
|
138
134
|
test_files: []
|
checksums.yaml.gz.sig
DELETED
Binary file
|
data.tar.gz.sig
DELETED
metadata.gz.sig
DELETED
Binary file
|