sidekiq-cronitor 1.0.0.alpha2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d7a312993ccafb8425bb94bfff6deec07241ff5e
4
- data.tar.gz: 96bba8e59b67eafaf8dda5e42a2b5c4804e41344
2
+ SHA256:
3
+ metadata.gz: 77c9e01c256be04515fbd21f7e467fb28e632a37f94d639847c6af8ad6e9823b
4
+ data.tar.gz: 2c78645ae3fb16b98b52777b3b3124aaa76e6860fc606bee2bc2ab8696275663
5
5
  SHA512:
6
- metadata.gz: 65f500c417e836ee253b45c156dcf4fe39ab6e9103d892378e7a0bce8c74f5d1811d0b9359d3a1d953dc8ee32204ae0902a93c2f101c671f690d34e678379253
7
- data.tar.gz: 59b58af7800b9a659b0b59f57c3972b50cfcd64459c2975c75728aa745b405a69fbf6f5fe92f1b02041752b1eaf6cc3010b0a5ec8b1f7d6880139404c4aa8b89
6
+ metadata.gz: 70c63ea8977ac11afe3991a1290950ed1deaa95c0147e8434fc3d0cf0fd4ed965d6d31354b150ae74e505497d7a5499023ea93f41a7eeca14fdddefc2a38a2c7
7
+ data.tar.gz: 6474a1e11df5373147b252fe327373e084f34abb60b6708f99c81df6b1c6d37643642228f1651fca7ddc4d9c0b988abec2f6a045f949f3e0a8e07dd5cc953b30
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2017 Samuel Cochran
3
+ Copyright (c) 2020 Cronitor.io
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
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 "sidekiq"
11
- gem "sidekiq-cronitor"
10
+ gem 'sidekiq'
11
+ gem 'sidekiq-cronitor'
12
12
  ```
13
13
 
14
14
  And then bundle:
15
15
 
16
- $ bundle
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 `$CRONITOR_TOKEN` before starting Sidekiq:
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 CRONITOR_TOKEN="abcdef1234567890abcdef1234567890"
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
- You can also just supply a Cronitor instance to use directly:
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: Cronitor.new(...)
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/sj26/sidekiq-cronitor. 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.
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
 
@@ -1,25 +1,20 @@
1
- require "sidekiq"
2
- require "cronitor"
1
+ require 'sidekiq'
2
+ require 'cronitor'
3
3
 
4
- require "sidekiq/cronitor/version"
4
+ require 'sidekiq/cronitor/version'
5
5
 
6
6
  module Sidekiq::Cronitor
7
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"
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? Sidekiq::Cronitor::Middleware
22
- config.server_middleware.add Sidekiq::Cronitor::Middleware
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? @cronitor
28
+ return @cronitor if defined?(@cronitor)
34
29
 
35
- # Sidekiq always stores options as string keys, shallowly at least
36
- opts = sidekiq_options.fetch("cronitor", {})
30
+ opts = sidekiq_options.fetch('cronitor', {})
31
+ key = opts.symbolize_keys.fetch(:key, name)
37
32
 
38
- if opts.is_a? Cronitor
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(**kwargs)
36
+ @cronitor = Cronitor::Monitor.new(key)
68
37
  rescue Cronitor::Error => e
69
- Sidekiq.logger.warn "Couldn't initialize Cronitor: #{e.to_s}"
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
- begin
104
- ping worker, "run"
47
+ ping(worker: worker, state: 'run')
105
48
 
106
- yield
107
- rescue => e
108
- ping worker, "failed", e.to_s
49
+ yield
50
+ rescue => e
51
+ ping(worker: worker, state: 'fail', message: e.to_s)
109
52
 
110
- raise
111
- else
112
- ping worker, "complete"
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, type, msg=nil)
119
- if cronitor? worker
120
- Sidekiq.logger.debug "Cronitor ping: #{type}"
121
- worker.cronitor.ping(type)
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
- def cronitor? worker
128
- worker.is_a?(Sidekiq::Cronitor) && worker.cronitor
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
- module Utils
133
- def self.deep_symbolize_keys(hash) #+nodoc+
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
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module Cronitor
3
- VERSION = "1.0.0.alpha2"
3
+ VERSION = '2.0.0'
4
4
  end
5
5
  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: 1.0.0.alpha2
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: '5.0'
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: '5.0'
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: '2.0'
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: '2.0'
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.16'
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.16'
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: '10.0'
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: '10.0'
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
- description: Integrates sidekiq with cronitor so that workers call run/complete/failed
104
- around their perform methods
105
- email: sj26@sj26.com
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/sj26/sidekiq-cronitor
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: 1.3.1
128
+ version: '0'
132
129
  requirements: []
133
- rubyforge_project:
134
- rubygems_version: 2.6.14
135
- signing_key:
130
+ rubygems_version: 3.1.4
131
+ signing_key:
136
132
  specification_version: 4
137
- summary: Monitor your sidekiq jobs with Cronitor
133
+ summary: Monitor your Sidekiq jobs with Cronitor
138
134
  test_files: []
checksums.yaml.gz.sig DELETED
Binary file
data.tar.gz.sig DELETED
@@ -1,2 +0,0 @@
1
- ���h`�=��^�!1W�d? Bx�B0n���c5���=�{=3�C�5.ΟwP��C�-O��o�K��!�p��f ��o����[����Պ���������� `��
2
- ��L���}��ܪ{*�xn7�O%Pl�c��h��� ��cm� ���sx� ��`���X���b�;��VS2��&�+���7\q"ةt ���c�]:��'za�[��`��B�0۽�:�?�龭KJbX��h��Is�
metadata.gz.sig DELETED
Binary file