sidekiq_publisher 1.6.3 → 1.7.1

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
2
  SHA256:
3
- metadata.gz: 9995be94eaf8bfefa408b212d26f713137516b0ffd7846a47e51d8511a41383c
4
- data.tar.gz: 8a23b6f5df56a8cc03569570f1943939b3ed54f9d916f8b4da0a3da51341aa65
3
+ metadata.gz: fad335b6e2f541d0b15fb3ba8ca2094700636bf9db012acd1e90f1a6f25dcb8c
4
+ data.tar.gz: 8a27ea4780c067005505aef5871cf0adeccfe1559df8ce40149f6427a693d6d9
5
5
  SHA512:
6
- metadata.gz: 181dfdf294e496b3f2182692b37d62bd3d51749eda4ef57f4eb3ce05d092c622bef3f43a0b89eb84e7086651743bdfa3790434e07b45d3084874c7b27229d060
7
- data.tar.gz: 878301b5e3f3f7d8b0f9bdd8078106aa71490ad887f351c5cd47e2ebca95f53d951d3ee71b0fcc89730ecd3e18cff1d15147f319709afaa446442e8978b1a426
6
+ metadata.gz: 529af1f68db640954806bb7afb5331d744aaf81b4e076029becb365eabaa6e9eae905ab4bf60fd77cba00d6cd84b4096fb4e8f8686a0ada8bb4ddc17908bfb47
7
+ data.tar.gz: f62d7210ffd44cdfc9a428e2213255b30446e54199aea45b11d959295ef46bcfb04c3b13afe786e184cdd3c456be0f540ef48efde09b08072c58b083ac81e4c0
@@ -0,0 +1 @@
1
+ * @ezcater/core-platform @tjwp
data/Appraisals CHANGED
@@ -29,6 +29,12 @@ appraise "rails-5.2-sidekiq-6.0" do
29
29
  gem "sidekiq", "~> 6.0.1"
30
30
  end
31
31
 
32
+ appraise "rails-5.2-sidekiq-6.1" do
33
+ gem "activejob", "~> 5.2.0"
34
+ gem "activesupport", "~> 5.2.0"
35
+ gem "sidekiq", "~> 6.1.0"
36
+ end
37
+
32
38
  appraise "rails-6.0-sidekiq-5.2" do
33
39
  gem "activejob", "~> 6.0.0"
34
40
  gem "activesupport", "~> 6.0.0"
@@ -40,3 +46,9 @@ appraise "rails-6.0-sidekiq-6.0" do
40
46
  gem "activesupport", "~> 6.0.0"
41
47
  gem "sidekiq", "~> 6.0.1"
42
48
  end
49
+
50
+ appraise "rails-6.0-sidekiq-6.1" do
51
+ gem "activejob", "~> 6.0.0"
52
+ gem "activesupport", "~> 6.0.0"
53
+ gem "sidekiq", "~> 6.1.0"
54
+ end
@@ -1,5 +1,17 @@
1
1
  # sidekiq_publisher
2
2
 
3
+ ## v1.7.1
4
+ - Gracefully handle database connection errors in ReportUnpublishedCount by attempting to reconnect.
5
+
6
+ ## v1.7.0
7
+ - Add instrumentation using `ActiveSupport::Notifications`.
8
+ - Reimplement `metrics_reporter` and `exception_reporter` support using
9
+ `ActiveSupport::Subscriber`.
10
+ - Add optional integration with Datadog APM.
11
+
12
+ ## v1.6.4
13
+ - Expand sidekiq support to v5.0.x-v6.x.x.
14
+
3
15
  ## v1.6.3
4
16
  - Handle client middleware that returns false.
5
17
 
data/README.md CHANGED
@@ -72,6 +72,34 @@ SidekiqPublisher::ReportUnpublishedCount.call
72
72
  It is recommended to call this method periodically using something like
73
73
  cron or [clockwork](https://github.com/Rykian/clockwork).
74
74
 
75
+ ## Instrumentation
76
+
77
+ Instrumentation of this library is implemented using
78
+ [ActiveSupport::Notifications](https://api.rubyonrails.org/classes/ActiveSupport/Notifications.html).
79
+
80
+ The support for the configurable [metrics_reporter](lib/sidekiq_publisher/metrics_reporter.rb) and
81
+ [exception_reporter](lib/sidekiq_publisher/exception_reporter.rb) options is implemented using
82
+ [ActiveSupport::Subscriber](https://api.rubyonrails.org/classes/ActiveSupport/Subscriber.html).
83
+
84
+ If an alternate integration is required for metrics or error reporting then it can be implemented using outside this
85
+ library based on these examples.
86
+
87
+ ### Tracing
88
+
89
+ The instrumentation in the library also supports integration with application tracing products, such as
90
+ [Datadog APM](https://www.datadoghq.com/product/apm/).
91
+
92
+ There is an optional integration with Datadog APM that can be required:
93
+
94
+ ```ruby
95
+ require "sidekiq_publisher/datadog_apm"
96
+ ```
97
+
98
+ This file must be required in addition including the `sidekiq_publisher` gem or requiring `sidekiq_publisher`.
99
+
100
+ This integration covers all of the sections of the library that are instrumented and serves an
101
+ [example](lib/sidekiq_publisher/datadog_apm) for implementing trace reporting for other products outside this library.
102
+
75
103
  ## Usage
76
104
 
77
105
  ### ActiveJob Adapter
@@ -25,10 +25,10 @@ x-service: &default-service
25
25
  services:
26
26
  sidekiq-publisher-redis:
27
27
  container_name: sidekiq-publisher-redis_1
28
- image: redis:5.0.3-alpine
28
+ image: redis:5.0.9-alpine
29
29
  sidekiq-publisher-postgres:
30
30
  container_name: sidekiq-publisher-postgres_1
31
- image: postgres:10.6
31
+ image: postgres:11.6
32
32
  environment:
33
33
  POSTGRES_USER: postgres
34
34
  POSTGRES_DB: sidekiq_publisher_test
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activejob", "~> 5.2.0"
6
+ gem "activesupport", "~> 5.2.0"
7
+ gem "sidekiq", "~> 6.1.0"
8
+
9
+ gemspec path: "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activejob", "~> 6.0.0"
6
+ gem "activesupport", "~> 6.0.0"
7
+ gem "sidekiq", "~> 6.1.0"
8
+
9
+ gemspec path: "../"
@@ -1,6 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_support"
3
4
  require "sidekiq_publisher/version"
5
+ require "sidekiq_publisher/instrumenter"
6
+ require "sidekiq_publisher/metrics_reporter"
7
+ require "sidekiq_publisher/exception_reporter"
4
8
  require "sidekiq_publisher/report_unpublished_count"
5
9
  require "sidekiq_publisher/job"
6
10
  require "sidekiq_publisher/worker"
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/subscriber"
4
+ require "ddtrace"
5
+
6
+ module SidekiqPublisher
7
+ module DatadogAPM
8
+ OPERATION = "sidekiq_publisher"
9
+
10
+ class << self
11
+ attr_writer :service
12
+
13
+ def service
14
+ @service || "sidekiq-publisher"
15
+ end
16
+ end
17
+
18
+ class Subscriber
19
+ def self.subscribe_to(pattern)
20
+ ActiveSupport::Notifications.subscribe(pattern, new)
21
+ end
22
+
23
+ def finish(_name, _id, payload)
24
+ finish_span(payload)
25
+ end
26
+
27
+ private
28
+
29
+ def start_span(operation, payload, resource = nil)
30
+ resource ||= operation
31
+ payload[:datadog_span] = Datadog.tracer.trace(operation, service: service, resource: resource)
32
+ end
33
+
34
+ def start_primary_span(resource, payload)
35
+ start_span(OPERATION, payload, resource)
36
+ end
37
+
38
+ def finish_span(payload)
39
+ payload[:datadog_span]&.set_error(payload[:exception_object]) if payload.key?(:exception_object)
40
+ payload[:datadog_span]&.finish
41
+ end
42
+
43
+ def service
44
+ SidekiqPublisher::DatadogAPM.service
45
+ end
46
+ end
47
+
48
+ class ListenerSubscriber < Subscriber
49
+ def start(_name, _id, payload)
50
+ start_primary_span("listener.timeout", payload)
51
+ end
52
+
53
+ subscribe_to "timeout.listener.sidekiq_publisher"
54
+ end
55
+
56
+ class RunnerSubscriber < Subscriber
57
+ def start(name, _id, payload)
58
+ op_name = name.split(".").first
59
+ start_primary_span("publisher.#{op_name}", payload)
60
+ end
61
+
62
+ subscribe_to "start.publisher.sidekiq_publisher"
63
+ subscribe_to "notify.publisher.sidekiq_publisher"
64
+ subscribe_to "timeout.publisher.sidekiq_publisher"
65
+ end
66
+
67
+ class PublisherSubscriber < Subscriber
68
+ def start(name, _id, payload)
69
+ op_name = name.split(".").first
70
+ start_span("publisher.#{op_name}", payload)
71
+ end
72
+
73
+ def finish(name, id, payload)
74
+ payload[:datadog_span]&.set_tag(:published_count, payload[:published_count]) if payload.key?(:published_count)
75
+ super
76
+ end
77
+
78
+ subscribe_to "publish_batch.publisher.sidekiq_publisher"
79
+ subscribe_to "enqueue_batch.publisher.sidekiq_publisher"
80
+ end
81
+
82
+ class JobSubscriber < Subscriber
83
+ def start(_name, _id, payload)
84
+ start_span("job.purge", payload)
85
+ end
86
+
87
+ def finish(_name, _id, payload)
88
+ payload[:datadog_span]&.set_tag(:purged_count, payload[:purged_count]) if payload.key?(:purged_count)
89
+
90
+ super
91
+ end
92
+
93
+ subscribe_to "purge.job.sidekiq_publisher"
94
+ end
95
+
96
+ # This subscriber is different from the classes above because it is an ActiveSupport::Subscriber
97
+ # and responds to the error(.publisher.sidekiq_publisher) event.
98
+ class PublisherErrorSubscriber < ActiveSupport::Subscriber
99
+ def error(event)
100
+ Datadog.tracer.active_span&.set_error(event.payload[:exception_object])
101
+ end
102
+
103
+ attach_to "publisher.sidekiq_publisher"
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/subscriber"
4
+
5
+ module SidekiqPublisher
6
+ module ExceptionReporter
7
+ class PublisherErrorSubscriber < ActiveSupport::Subscriber
8
+ def error(event)
9
+ SidekiqPublisher.exception_reporter&.call(event.payload[:exception_object])
10
+ end
11
+
12
+ attach_to "publisher.sidekiq_publisher"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/notifications"
4
+
5
+ module SidekiqPublisher
6
+ class Instrumenter
7
+ NAMESPACE = "sidekiq_publisher"
8
+
9
+ def instrument(event_name, payload = {}, &block)
10
+ ActiveSupport::Notifications.instrument("#{event_name}.#{NAMESPACE}", payload, &block)
11
+ end
12
+ end
13
+ end
@@ -39,11 +39,12 @@ module SidekiqPublisher
39
39
  where(id: ids).update_all(published_at: Time.now.utc)
40
40
  end
41
41
 
42
- def self.purge_expired_published!
42
+ def self.purge_expired_published!(instrumenter: Instrumenter.new)
43
43
  SidekiqPublisher.logger.info("#{name} purging expired published jobs.")
44
- count = purgeable.delete_all
44
+ count = instrumenter.instrument("purge.job") do |notification|
45
+ notification[:purged_count] = purgeable.delete_all
46
+ end
45
47
  SidekiqPublisher.logger.info("#{name} purged #{count} expired published jobs.")
46
- SidekiqPublisher.metrics_reporter.try(:count, "sidekiq_publisher.purged", count)
47
48
  end
48
49
 
49
50
  def self.unpublished_batches(batch_size: SidekiqPublisher.batch_size)
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/subscriber"
4
+
5
+ module SidekiqPublisher
6
+ module MetricsReporter
7
+ class Subscriber < ActiveSupport::Subscriber
8
+ private
9
+
10
+ def count(metric, value)
11
+ SidekiqPublisher.metrics_reporter&.try(:count, metric, value) unless value.nil?
12
+ end
13
+ end
14
+
15
+ class PublisherSubscriber < Subscriber
16
+ def enqueue_batch(event)
17
+ count("sidekiq_publisher.published", event.payload[:published_count])
18
+ end
19
+
20
+ attach_to "publisher.sidekiq_publisher"
21
+ end
22
+
23
+ class JobSubscriber < Subscriber
24
+ def purge(event)
25
+ count("sidekiq_publisher.purged", event.payload[:purged_count])
26
+ end
27
+
28
+ attach_to "job.sidekiq_publisher"
29
+ end
30
+
31
+ class UnpublishedSubscriber < Subscriber
32
+ def unpublished(event)
33
+ SidekiqPublisher.metrics_reporter&.
34
+ try(:gauge, "sidekiq_publisher.unpublished_count", event.payload[:unpublished_count])
35
+ end
36
+
37
+ attach_to "reporter.sidekiq_publisher"
38
+ end
39
+ end
40
+ end
@@ -5,26 +5,31 @@ require "active_support/core_ext/object/try"
5
5
 
6
6
  module SidekiqPublisher
7
7
  class Publisher
8
- def initialize
8
+ def initialize(instrumenter: Instrumenter.new)
9
+ @instrumenter = instrumenter
9
10
  @client = SidekiqPublisher::Client.new
10
11
  @job_class_cache = {}
11
12
  end
12
13
 
13
14
  def publish
14
15
  Job.unpublished_batches do |batch|
15
- items = batch.map do |job|
16
- {
17
- "jid" => job[:job_id],
18
- "class" => lookup_job_class(job[:job_class]),
19
- "args" => job[:args],
20
- "at" => job[:run_at],
21
- "queue" => job[:queue],
22
- "wrapped" => job[:wrapped],
23
- "created_at" => job[:created_at].to_f,
24
- }.tap(&:compact!)
25
- end
16
+ instrumenter.instrument("publish_batch.publisher") do
17
+ items = batch.map do |job|
18
+ {
19
+ "jid" => job[:job_id],
20
+ "class" => lookup_job_class(job[:job_class]),
21
+ "args" => job[:args],
22
+ "at" => job[:run_at],
23
+ "queue" => job[:queue],
24
+ "wrapped" => job[:wrapped],
25
+ "created_at" => job[:created_at].to_f,
26
+ }.tap(&:compact!)
27
+ end
26
28
 
27
- publish_batch(batch, items)
29
+ instrumenter.instrument("enqueue_batch.publisher") do |notification|
30
+ enqueue_batch(batch, items, notification)
31
+ end
32
+ end
28
33
  end
29
34
  purge_expired_published_jobs
30
35
  rescue StandardError => ex
@@ -33,16 +38,16 @@ module SidekiqPublisher
33
38
 
34
39
  private
35
40
 
36
- attr_reader :client, :job_class_cache
41
+ attr_reader :client, :job_class_cache, :instrumenter
37
42
 
38
- def publish_batch(batch, items)
43
+ def enqueue_batch(batch, items, notification)
39
44
  pushed_count = client.bulk_push(items)
40
45
  published_count = update_jobs_as_published!(batch)
41
46
  rescue StandardError => ex
42
47
  failure_warning(__method__, ex)
43
48
  ensure
44
49
  published_count = update_jobs_as_published!(batch) if pushed_count.present? && published_count.nil?
45
- metrics_reporter.try(:count, "sidekiq_publisher.published", published_count) if published_count.present?
50
+ notification[:published_count] = published_count if published_count.present?
46
51
  end
47
52
 
48
53
  def lookup_job_class(name)
@@ -56,7 +61,7 @@ module SidekiqPublisher
56
61
  end
57
62
 
58
63
  def purge_expired_published_jobs
59
- Job.purge_expired_published! if perform_purge?
64
+ Job.purge_expired_published!(instrumenter: instrumenter) if perform_purge?
60
65
  end
61
66
 
62
67
  def perform_purge?
@@ -64,17 +69,13 @@ module SidekiqPublisher
64
69
  end
65
70
 
66
71
  def failure_warning(method, ex)
67
- logger.warn("#{self.class.name}: msg=\"#{method} failed\" error=#{ex.class} error_msg=#{ex.message.inspect}\n"\
68
- "#{ex.backtrace.join("\n")}")
69
- SidekiqPublisher.exception_reporter&.call(ex)
72
+ logger.warn("#{self.class.name}: msg=\"#{method} failed\" error=#{ex.class} error_msg=#{ex.message.inspect}\n")
73
+ instrumenter.instrument("error.publisher",
74
+ exception_object: ex, exception: [ex.class.name, ex.message])
70
75
  end
71
76
 
72
77
  def logger
73
78
  SidekiqPublisher.logger
74
79
  end
75
-
76
- def metrics_reporter
77
- SidekiqPublisher.metrics_reporter
78
- end
79
80
  end
80
81
  end
@@ -1,11 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_record"
4
+ require "pg"
5
+
3
6
  module SidekiqPublisher
4
7
  module ReportUnpublishedCount
5
- def self.call
6
- SidekiqPublisher.metrics_reporter.
7
- gauge("sidekiq_publisher.unpublished_count",
8
- SidekiqPublisher::Job.unpublished.count)
8
+ def self.call(instrumenter: Instrumenter.new)
9
+ instrumenter.instrument("unpublished.reporter",
10
+ unpublished_count: SidekiqPublisher::Job.unpublished.count)
11
+ rescue ActiveRecord::StatementInvalid, PG::UnableToSend, PG::ConnectionBad => e
12
+ ActiveRecord::Base.clear_active_connections! if db_connection_error?(e)
13
+ raise
14
+ end
15
+
16
+ def self.db_connection_error?(error)
17
+ cause = error.is_a?(ActiveRecord::StatementInvalid) ? error.cause : error
18
+ cause.is_a?(PG::UnableToSend) || cause.is_a?(PG::ConnectionBad)
9
19
  end
20
+ private_class_method :db_connection_error?
10
21
  end
11
22
  end
@@ -7,12 +7,13 @@ module SidekiqPublisher
7
7
  LISTENER_TIMEOUT_SECONDS = 60
8
8
  CHANNEL_NAME = "sidekiq_publisher_job"
9
9
 
10
- def self.run
11
- new.run
10
+ def self.run(instrumenter = Instrumenter.new)
11
+ new(instrumenter).run
12
12
  end
13
13
 
14
- def initialize
15
- @publisher = Publisher.new
14
+ def initialize(instrumenter = Instrumenter.new)
15
+ @instrumenter = instrumenter
16
+ @publisher = Publisher.new(instrumenter: @instrumenter)
16
17
  end
17
18
 
18
19
  def run
@@ -20,24 +21,32 @@ module SidekiqPublisher
20
21
  CHANNEL_NAME,
21
22
  listen_timeout: LISTENER_TIMEOUT_SECONDS
22
23
  ) do |listener|
23
- listener.on_start { publisher.publish }
24
- listener.on_notify { publisher.publish }
24
+ listener.on_start { call_publish("start") }
25
+ listener.on_notify { call_publish("notify") }
25
26
  listener.on_timeout { listener_timeout }
26
27
  end
27
28
  end
28
29
 
29
30
  private
30
31
 
31
- attr_reader :publisher
32
+ attr_reader :publisher, :instrumenter
32
33
 
33
- def listener_timeout
34
- if Job.unpublished.exists?
35
- SidekiqPublisher.logger&.warn(
36
- "#{self.class.name}: msg='publishing pending jobs at timeout'"
37
- )
34
+ def call_publish(event)
35
+ instrumenter.instrument("#{event}.publisher") do
38
36
  publisher.publish
39
- else
40
- Job.purge_expired_published!
37
+ end
38
+ end
39
+
40
+ def listener_timeout
41
+ instrumenter.instrument("timeout.listener") do
42
+ if Job.unpublished.exists?
43
+ SidekiqPublisher.logger&.warn(
44
+ "#{self.class.name}: msg='publishing pending jobs at timeout'"
45
+ )
46
+ call_publish("timeout")
47
+ else
48
+ Job.purge_expired_published!(instrumenter: instrumenter)
49
+ end
41
50
  end
42
51
  end
43
52
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SidekiqPublisher
4
- VERSION = "1.6.3"
4
+ VERSION = "1.7.1"
5
5
  end
@@ -45,6 +45,7 @@ Gem::Specification.new do |spec|
45
45
  spec.add_development_dependency "appraisal"
46
46
  spec.add_development_dependency "bundler", "~> 1.12"
47
47
  spec.add_development_dependency "database_cleaner"
48
+ spec.add_development_dependency "ddtrace", ">= 0.39.0"
48
49
  spec.add_development_dependency "ezcater_matchers"
49
50
  spec.add_development_dependency "ezcater_rubocop", "1.0.2"
50
51
  spec.add_development_dependency "factory_bot"
@@ -58,5 +59,5 @@ Gem::Specification.new do |spec|
58
59
 
59
60
  spec.add_runtime_dependency "activerecord-postgres_pub_sub", ">= 0.4.0"
60
61
  spec.add_runtime_dependency "activesupport", ">= 5.1", "< 6.1"
61
- spec.add_runtime_dependency "sidekiq", ">= 5.0.4", "< 6.1"
62
+ spec.add_runtime_dependency "sidekiq", ">= 5.0.4", "< 7.0"
62
63
  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: 1.6.3
4
+ version: 1.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - ezCater, Inc
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-22 00:00:00.000000000 Z
11
+ date: 2020-10-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activejob
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: ddtrace
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 0.39.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 0.39.0
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: ezcater_matchers
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -249,7 +263,7 @@ dependencies:
249
263
  version: 5.0.4
250
264
  - - "<"
251
265
  - !ruby/object:Gem::Version
252
- version: '6.1'
266
+ version: '7.0'
253
267
  type: :runtime
254
268
  prerelease: false
255
269
  version_requirements: !ruby/object:Gem::Requirement
@@ -259,7 +273,7 @@ dependencies:
259
273
  version: 5.0.4
260
274
  - - "<"
261
275
  - !ruby/object:Gem::Version
262
- version: '6.1'
276
+ version: '7.0'
263
277
  description: Publisher for enqueuing jobs to Sidekiq
264
278
  email:
265
279
  - engineering@ezcater.com
@@ -268,7 +282,7 @@ extensions: []
268
282
  extra_rdoc_files: []
269
283
  files:
270
284
  - ".codeclimate.yml"
271
- - ".tool-versions"
285
+ - ".github/CODEOWNERS"
272
286
  - Appraisals
273
287
  - CHANGELOG.md
274
288
  - Dockerfile
@@ -282,14 +296,20 @@ files:
282
296
  - gemfiles/rails_5.2_sidekiq_5.1.gemfile
283
297
  - gemfiles/rails_5.2_sidekiq_5.2.gemfile
284
298
  - gemfiles/rails_5.2_sidekiq_6.0.gemfile
299
+ - gemfiles/rails_5.2_sidekiq_6.1.gemfile
285
300
  - gemfiles/rails_6.0_sidekiq_5.2.gemfile
286
301
  - gemfiles/rails_6.0_sidekiq_6.0.gemfile
302
+ - gemfiles/rails_6.0_sidekiq_6.1.gemfile
287
303
  - lib/active_job/queue_adapters/sidekiq_publisher_adapter.rb
288
304
  - lib/generators/sidekiq_publisher/install_generator.rb
289
305
  - lib/generators/sidekiq_publisher/templates/create_sidekiq_publisher_jobs.rb
290
306
  - lib/sidekiq_publisher.rb
291
307
  - lib/sidekiq_publisher/client.rb
308
+ - lib/sidekiq_publisher/datadog_apm.rb
309
+ - lib/sidekiq_publisher/exception_reporter.rb
310
+ - lib/sidekiq_publisher/instrumenter.rb
292
311
  - lib/sidekiq_publisher/job.rb
312
+ - lib/sidekiq_publisher/metrics_reporter.rb
293
313
  - lib/sidekiq_publisher/publisher.rb
294
314
  - lib/sidekiq_publisher/railtie.rb
295
315
  - lib/sidekiq_publisher/report_unpublished_count.rb
@@ -305,7 +325,7 @@ licenses:
305
325
  - MIT
306
326
  metadata:
307
327
  allowed_push_host: https://rubygems.org
308
- post_install_message:
328
+ post_install_message:
309
329
  rdoc_options: []
310
330
  require_paths:
311
331
  - lib
@@ -320,8 +340,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
320
340
  - !ruby/object:Gem::Version
321
341
  version: '0'
322
342
  requirements: []
323
- rubygems_version: 3.0.3
324
- signing_key:
343
+ rubyforge_project:
344
+ rubygems_version: 2.7.6.2
345
+ signing_key:
325
346
  specification_version: 4
326
347
  summary: Publisher for enqueuing jobs to Sidekiq
327
348
  test_files: []
@@ -1 +0,0 @@
1
- ruby 2.5.5