sidekiq_publisher 0.1.0 → 0.2.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: db0cc3968f944fe60726607aeb9d41d7b4ecbc850c8720c69997acbd32baf53d
4
- data.tar.gz: 22de3301c98a4c891d6e43afe03c60ec7705b6fe63c46160980a98f5076ba740
3
+ metadata.gz: 4a5c547481b5ced12b2104fae37180f6e69afb53e56e33c63aa3ab5341c17cde
4
+ data.tar.gz: 8726552f9f5e2713e10125763b67210515ca450be70450facbb0d2a0b5d969ee
5
5
  SHA512:
6
- metadata.gz: 488744676ef141fb303944c8b059863527b11c14c63776a92973136c629cca89febc08b8cff8a4cdf760878bd7cdab3a2f0e4e4e4176043f0ad0364bfb1878a1
7
- data.tar.gz: 84b761ecc88849906fd34093fd65d29d146df4e9010c5f601c53ff692c2fefce36fde127b7af2b9cf97f97630ca0e30359249928b883dabca22feea3d5f2740d
6
+ metadata.gz: 343cf4ef74e8e0a30be17386f8174976b328ccb842f75203f994af0f1d0a83112214c8f03e6dea00f4aacab50aeef695457203d561e2df596224b16ba9375eea
7
+ data.tar.gz: 29b3a7ffee99df51593c59786c712ea8af6468baf866879a40a3aaf2404435fcaaa5549cab8b7d2c5575a124d5c57f06c2aa9d7abefee06359b9c80abfaef815
@@ -1,4 +1,13 @@
1
1
  # sidekiq_publisher
2
2
 
3
+ ## v0.2.0
4
+ - Add caching for job class constant lookup.
5
+ - Add metrics for the number of jobs published and purged.
6
+ - Add ActiveSupport as a runtime dependency.
7
+
8
+ ## v0.1.1
9
+ - Publish Sidekiq jobs with the `created_at` value from when the job was inserted
10
+ into the table.
11
+
3
12
  ## v0.1.0
4
13
  - Initial version
data/README.md CHANGED
@@ -38,11 +38,26 @@ This gem uses the following configuration:
38
38
 
39
39
  * **logger**: the logger for this gem to use.
40
40
  * **exception_reporter**: a Proc that will be called with an exception
41
+ * **metrics_reporter**: an optional object to record metrics. See below.
41
42
  * **batch_size**: the maximum number of jobs that will be enqueued to Sidekiq
42
43
  together
43
44
  * **job_retention_period**: the duration that published jobs will be kept in
44
45
  Postgres after they have been enqueued to Sidekiq
45
46
 
47
+ ### Metrics Reporter
48
+
49
+ The metrics reporter that can be configured with an object that is expected to
50
+ respond to the following API:
51
+
52
+ ```ruby
53
+ count(metric_name, count)
54
+ ```
55
+
56
+ Metrics will be reported for:
57
+
58
+ - the number of jobs published in each batch
59
+ - the number of jobs purged
60
+
46
61
  ## Usage
47
62
 
48
63
  ### ActiveJob Adapter
@@ -13,9 +13,13 @@ module SidekiqPublisher
13
13
  DEFAULT_JOB_RETENTION_PERIOD = 1.day.freeze
14
14
 
15
15
  class << self
16
- attr_accessor :logger, :exception_reporter
16
+ attr_accessor :logger, :exception_reporter, :metrics_reporter
17
17
  attr_writer :batch_size, :job_retention_period
18
18
 
19
+ def configure
20
+ yield self
21
+ end
22
+
19
23
  def batch_size
20
24
  @batch_size || DEFAULT_BATCH_SIZE
21
25
  end
@@ -29,6 +33,7 @@ module SidekiqPublisher
29
33
  @batch_size = nil
30
34
  @job_retention_period = nil
31
35
  @exception_reporter = nil
36
+ @metrics_reporter = nil
32
37
  end
33
38
  end
34
39
  end
@@ -6,7 +6,7 @@ module SidekiqPublisher
6
6
  class Job < ActiveRecord::Base
7
7
  self.table_name = "sidekiq_publisher_jobs"
8
8
 
9
- BATCH_KEYS = %i(id job_id job_class args run_at queue wrapped).freeze
9
+ BATCH_KEYS = %i(id job_id job_class args run_at queue wrapped created_at).freeze
10
10
 
11
11
  before_create :ensure_job_id
12
12
  before_save :ensure_string_job_class
@@ -34,6 +34,7 @@ module SidekiqPublisher
34
34
  SidekiqPublisher.logger.info("#{name} purging expired published jobs.")
35
35
  count = purgeable.delete_all
36
36
  SidekiqPublisher.logger.info("#{name} purged #{count} expired published jobs.")
37
+ SidekiqPublisher.metrics_reporter.try(:count, "sidekiq_publisher:purged", count)
37
38
  end
38
39
 
39
40
  def self.unpublished_batches(batch_size: SidekiqPublisher.batch_size)
@@ -43,22 +44,6 @@ module SidekiqPublisher
43
44
  end
44
45
  end
45
46
 
46
- # TODO: this method was just for testing and may be removed
47
- def publish
48
- Sidekiq::Client.push(sidekiq_item)
49
- end
50
-
51
- def sidekiq_item
52
- {
53
- "jid" => job_id,
54
- "class" => job_class.constantize,
55
- "args" => args,
56
- "at" => run_at,
57
- "queue" => queue,
58
- "wrapped" => wrapped,
59
- }.tap(&:compact!)
60
- end
61
-
62
47
  private
63
48
 
64
49
  def ensure_job_id
@@ -1,15 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "sidekiq_publisher/client"
4
+ require "active_support/core_ext/object/try"
4
5
 
5
6
  module SidekiqPublisher
6
7
  class Publisher
7
8
  extend PrivateAttr
8
9
 
9
- private_attr_reader :client
10
+ private_attr_reader :client, :job_class_cache
10
11
 
11
12
  def initialize
12
13
  @client = SidekiqPublisher::Client.new
14
+ @job_class_cache = {}
13
15
  end
14
16
 
15
17
  def publish
@@ -17,11 +19,12 @@ module SidekiqPublisher
17
19
  items = batch.map do |job|
18
20
  {
19
21
  "jid" => job[:job_id],
20
- "class" => job[:job_class].constantize,
22
+ "class" => lookup_job_class(job[:job_class]),
21
23
  "args" => job[:args],
22
24
  "at" => job[:run_at],
23
25
  "queue" => job[:queue],
24
26
  "wrapped" => job[:wrapped],
27
+ "created_at" => job[:created_at].to_f,
25
28
  }.tap(&:compact!)
26
29
  end
27
30
 
@@ -40,7 +43,14 @@ module SidekiqPublisher
40
43
  rescue StandardError => ex
41
44
  failure_warning(__method__, ex)
42
45
  ensure
43
- update_jobs_as_published!(batch) if pushed_count.present? && published_count.nil?
46
+ published_count = update_jobs_as_published!(batch) if pushed_count.present? && published_count.nil?
47
+ metrics_reporter.try(:count, "sidekiq_publisher:published", published_count)
48
+ end
49
+
50
+ def lookup_job_class(name)
51
+ job_class_cache.fetch(name) do
52
+ job_class_cache[name] = name.constantize
53
+ end
44
54
  end
45
55
 
46
56
  def update_jobs_as_published!(jobs)
@@ -64,5 +74,9 @@ module SidekiqPublisher
64
74
  def logger
65
75
  SidekiqPublisher.logger
66
76
  end
77
+
78
+ def metrics_reporter
79
+ SidekiqPublisher.metrics_reporter
80
+ end
67
81
  end
68
82
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SidekiqPublisher
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
@@ -9,11 +9,9 @@ Gem::Specification.new do |spec|
9
9
  spec.version = SidekiqPublisher::VERSION
10
10
  spec.authors = ["ezCater, Inc"]
11
11
  spec.email = ["engineering@ezcater.com"]
12
-
13
12
  spec.summary = "Publisher for enqueuing jobs to Sidekiq"
14
13
  spec.description = spec.summary
15
14
  spec.homepage = "https://github.com/ezcater/sidekiq_publisher"
16
-
17
15
  spec.license = "MIT"
18
16
 
19
17
  # Set "allowed_push_post" to control where this gem can be published.
@@ -23,7 +21,6 @@ Gem::Specification.new do |spec|
23
21
  else
24
22
  raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
25
23
  end
26
- # rubocop:enable Style/GuardClause
27
24
 
28
25
  excluded_files = %w(.circleci/config.yml
29
26
  .github/PULL_REQUEST_TEMPLATE.md
@@ -59,6 +56,7 @@ Gem::Specification.new do |spec|
59
56
  spec.add_development_dependency "simplecov"
60
57
 
61
58
  spec.add_runtime_dependency "activerecord-postgres_pub_sub"
59
+ spec.add_runtime_dependency "activesupport", "~> 5.1.4"
62
60
  spec.add_runtime_dependency "private_attr"
63
61
  spec.add_runtime_dependency "sidekiq", "~> 5.0.4"
64
62
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq_publisher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ezCater, Inc
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-16 00:00:00.000000000 Z
11
+ date: 2018-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activejob
@@ -206,6 +206,20 @@ dependencies:
206
206
  - - ">="
207
207
  - !ruby/object:Gem::Version
208
208
  version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: activesupport
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: 5.1.4
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: 5.1.4
209
223
  - !ruby/object:Gem::Dependency
210
224
  name: private_attr
211
225
  requirement: !ruby/object:Gem::Requirement