sidekiq-datadog 0.4.1 → 0.6.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: 587cd9c94eb2d0018ddc31e367990f2f0121c40061e8437e6ed0d1491f16a499
4
- data.tar.gz: b9e3cf7e254ecb3f26c1df1969f5d40cd20113fed85d69de13792001ec02be87
3
+ metadata.gz: ee5e44db186a926cdca3e3eae1a8c89c3665c67e067aa079b9a24bf8ae70fbd1
4
+ data.tar.gz: f0044e25b254c0e663e13a8f31e71f6f60a3d9048521e3592906377f787eba92
5
5
  SHA512:
6
- metadata.gz: 3abe152091c7c6cce17d943b830f37cf1954a0151c9662fd562d5d4f64fc5d7df87118bcdd8d4e211e1398a2fa9b9af24f0f9f7644c3f20135c93a7825778c54
7
- data.tar.gz: f0eb0e04d485c4d915d7c9a1198946725ed9e99be82b2130f4fb39fa19fb04a205a64576f5353f0a907f5ddc608f1baeb643dd21046554ce192e5ebe76b76936
6
+ metadata.gz: 35f1c25f0c901dc4bbf3fcd15c29c98d0bb6b2be7a39dc33ab61802bd3ee30fe4cb4c460a2858b76db75ce708b8f77130bb97df6fe82c1057d165a4de246726d
7
+ data.tar.gz: 7415541240b7aed33ae3a22af5661f58e48275733f048f041a69e538aeba5567f2d0066681d0c205ff069d360da5e3c1a8ba4ac7fa946f6a3229311f2cc289d3
@@ -0,0 +1,24 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ ruby:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ ruby-version: ["2.5", "2.6", "2.7", "3.0"]
15
+ gemfile: [ Gemfile, Gemfile_dogstats_v4 ]
16
+ env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
17
+ BUNDLE_GEMFILE: ${{ matrix.gemfile }}
18
+ steps:
19
+ - uses: actions/checkout@v2
20
+ - uses: ruby/setup-ruby@v1
21
+ with:
22
+ ruby-version: ${{ matrix.ruby-version }}
23
+ bundler-cache: true
24
+ - run: bundle exec rake
data/.gitignore CHANGED
@@ -4,3 +4,5 @@
4
4
  .config
5
5
  .yardoc
6
6
  pkg
7
+ .rubocop-*
8
+ .rake*
data/.rubocop.yml ADDED
@@ -0,0 +1,17 @@
1
+ inherit_gem:
2
+ rubocop-bsm:
3
+ - default.yml
4
+ inherit_mode:
5
+ merge:
6
+ - Exclude
7
+
8
+ AllCops:
9
+ TargetRubyVersion: "2.5"
10
+
11
+ Metrics/ParameterLists:
12
+ Max: 8
13
+ Naming/FileName:
14
+ Exclude:
15
+ - lib/sidekiq-datadog.rb
16
+ RSpec/MultipleMemoizedHelpers:
17
+ Enabled: false
data/Gemfile.lock CHANGED
@@ -1,38 +1,70 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sidekiq-datadog (0.4.1)
5
- dogstatsd-ruby (>= 3.3.0)
4
+ sidekiq-datadog (0.6.0)
5
+ dogstatsd-ruby (>= 4.2.0)
6
6
  sidekiq
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- connection_pool (2.2.2)
12
- diff-lcs (1.3)
13
- dogstatsd-ruby (4.0.0)
14
- rack (2.0.5)
15
- rack-protection (2.0.3)
16
- rack
17
- rake (12.3.1)
18
- redis (4.0.2)
19
- rspec (3.8.0)
20
- rspec-core (~> 3.8.0)
21
- rspec-expectations (~> 3.8.0)
22
- rspec-mocks (~> 3.8.0)
23
- rspec-core (3.8.0)
24
- rspec-support (~> 3.8.0)
25
- rspec-expectations (3.8.1)
11
+ ast (2.4.2)
12
+ connection_pool (2.2.5)
13
+ diff-lcs (1.4.4)
14
+ dogstatsd-ruby (5.1.0)
15
+ parallel (1.20.1)
16
+ parser (3.0.1.1)
17
+ ast (~> 2.4.1)
18
+ rack (2.2.3)
19
+ rainbow (3.0.0)
20
+ rake (13.0.3)
21
+ redis (4.3.1)
22
+ regexp_parser (2.1.1)
23
+ rexml (3.2.5)
24
+ rspec (3.10.0)
25
+ rspec-core (~> 3.10.0)
26
+ rspec-expectations (~> 3.10.0)
27
+ rspec-mocks (~> 3.10.0)
28
+ rspec-core (3.10.1)
29
+ rspec-support (~> 3.10.0)
30
+ rspec-expectations (3.10.1)
26
31
  diff-lcs (>= 1.2.0, < 2.0)
27
- rspec-support (~> 3.8.0)
28
- rspec-mocks (3.8.0)
32
+ rspec-support (~> 3.10.0)
33
+ rspec-mocks (3.10.2)
29
34
  diff-lcs (>= 1.2.0, < 2.0)
30
- rspec-support (~> 3.8.0)
31
- rspec-support (3.8.0)
32
- sidekiq (5.2.1)
33
- connection_pool (~> 2.2, >= 2.2.2)
34
- rack-protection (>= 1.5.0)
35
- redis (>= 3.3.5, < 5)
35
+ rspec-support (~> 3.10.0)
36
+ rspec-support (3.10.2)
37
+ rubocop (1.17.0)
38
+ parallel (~> 1.10)
39
+ parser (>= 3.0.0.0)
40
+ rainbow (>= 2.2.2, < 4.0)
41
+ regexp_parser (>= 1.8, < 3.0)
42
+ rexml
43
+ rubocop-ast (>= 1.7.0, < 2.0)
44
+ ruby-progressbar (~> 1.7)
45
+ unicode-display_width (>= 1.4.0, < 3.0)
46
+ rubocop-ast (1.7.0)
47
+ parser (>= 3.0.1.1)
48
+ rubocop-bsm (0.6.0)
49
+ rubocop (~> 1.0)
50
+ rubocop-performance
51
+ rubocop-rake
52
+ rubocop-rspec
53
+ rubocop-performance (1.11.3)
54
+ rubocop (>= 1.7.0, < 2.0)
55
+ rubocop-ast (>= 0.4.0)
56
+ rubocop-rake (0.5.1)
57
+ rubocop
58
+ rubocop-rspec (2.4.0)
59
+ rubocop (~> 1.0)
60
+ rubocop-ast (>= 1.1.0)
61
+ ruby-progressbar (1.11.0)
62
+ sidekiq (6.2.1)
63
+ connection_pool (>= 2.2.2)
64
+ rack (~> 2.0)
65
+ redis (>= 4.2.0)
66
+ timecop (0.9.4)
67
+ unicode-display_width (2.0.0)
36
68
 
37
69
  PLATFORMS
38
70
  ruby
@@ -40,8 +72,11 @@ PLATFORMS
40
72
  DEPENDENCIES
41
73
  bundler
42
74
  rake
43
- rspec (~> 3.0)
75
+ rspec
76
+ rubocop-bsm
77
+ rubocop-performance
44
78
  sidekiq-datadog!
79
+ timecop
45
80
 
46
81
  BUNDLED WITH
47
- 1.16.4
82
+ 2.2.19
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'dogstatsd-ruby', '~> 4.8' # A statsd wrapper for reporting DataDog custom metrics
@@ -0,0 +1,83 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ sidekiq-datadog (0.6.0)
5
+ dogstatsd-ruby (>= 4.2.0)
6
+ sidekiq
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ ast (2.4.2)
12
+ connection_pool (2.2.5)
13
+ diff-lcs (1.4.4)
14
+ dogstatsd-ruby (4.8.3)
15
+ parallel (1.20.1)
16
+ parser (3.0.1.1)
17
+ ast (~> 2.4.1)
18
+ rack (2.2.3)
19
+ rainbow (3.0.0)
20
+ rake (13.0.3)
21
+ redis (4.3.1)
22
+ regexp_parser (2.1.1)
23
+ rexml (3.2.5)
24
+ rspec (3.10.0)
25
+ rspec-core (~> 3.10.0)
26
+ rspec-expectations (~> 3.10.0)
27
+ rspec-mocks (~> 3.10.0)
28
+ rspec-core (3.10.1)
29
+ rspec-support (~> 3.10.0)
30
+ rspec-expectations (3.10.1)
31
+ diff-lcs (>= 1.2.0, < 2.0)
32
+ rspec-support (~> 3.10.0)
33
+ rspec-mocks (3.10.2)
34
+ diff-lcs (>= 1.2.0, < 2.0)
35
+ rspec-support (~> 3.10.0)
36
+ rspec-support (3.10.2)
37
+ rubocop (1.17.0)
38
+ parallel (~> 1.10)
39
+ parser (>= 3.0.0.0)
40
+ rainbow (>= 2.2.2, < 4.0)
41
+ regexp_parser (>= 1.8, < 3.0)
42
+ rexml
43
+ rubocop-ast (>= 1.7.0, < 2.0)
44
+ ruby-progressbar (~> 1.7)
45
+ unicode-display_width (>= 1.4.0, < 3.0)
46
+ rubocop-ast (1.7.0)
47
+ parser (>= 3.0.1.1)
48
+ rubocop-bsm (0.6.0)
49
+ rubocop (~> 1.0)
50
+ rubocop-performance
51
+ rubocop-rake
52
+ rubocop-rspec
53
+ rubocop-performance (1.11.3)
54
+ rubocop (>= 1.7.0, < 2.0)
55
+ rubocop-ast (>= 0.4.0)
56
+ rubocop-rake (0.5.1)
57
+ rubocop
58
+ rubocop-rspec (2.4.0)
59
+ rubocop (~> 1.0)
60
+ rubocop-ast (>= 1.1.0)
61
+ ruby-progressbar (1.11.0)
62
+ sidekiq (6.2.1)
63
+ connection_pool (>= 2.2.2)
64
+ rack (~> 2.0)
65
+ redis (>= 4.2.0)
66
+ timecop (0.9.4)
67
+ unicode-display_width (2.0.0)
68
+
69
+ PLATFORMS
70
+ ruby
71
+
72
+ DEPENDENCIES
73
+ bundler
74
+ dogstatsd-ruby (~> 4.8)
75
+ rake
76
+ rspec
77
+ rubocop-bsm
78
+ rubocop-performance
79
+ sidekiq-datadog!
80
+ timecop
81
+
82
+ BUNDLED WITH
83
+ 2.2.19
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  sidekiq-datadog
2
2
  =============
3
3
 
4
- Datadog intrumentation for [Sidekiq](https://github.com/mperham/sidekiq), integrated via server middleware.
4
+ Datadog instrumentation for [Sidekiq](https://github.com/mperham/sidekiq), integrated via server middleware.
5
5
 
6
6
  ## Installation
7
7
 
@@ -15,7 +15,17 @@ Or install:
15
15
 
16
16
  Configure it in an initializer:
17
17
 
18
+ Sidekiq.configure_client do |config|
19
+ config.client_middleware do |chain|
20
+ chain.add Sidekiq::Middleware::Client::Datadog
21
+ end
22
+ end
23
+
18
24
  Sidekiq.configure_server do |config|
25
+ config.client_middleware do |chain|
26
+ chain.add Sidekiq::Middleware::Client::Datadog
27
+ end
28
+
19
29
  config.server_middleware do |chain|
20
30
  chain.add Sidekiq::Middleware::Server::Datadog
21
31
  end
@@ -45,22 +55,62 @@ executed at runtime when the job is processed
45
55
 
46
56
  Sidekiq.configure_server do |config|
47
57
  config.server_middleware do |chain|
48
- chain.add(Sidekiq::Middleware::Server::Datadog, tags: [->(worker, job, queue, error){
58
+ chain.add(Sidekiq::Middleware::Server::Datadog, tags: [->(worker_or_worker_class, job, queue, error){
49
59
  "source:#{job['source']}"
50
60
  }])
51
61
  end
52
62
  end
53
63
 
64
+ # NOTE: Your lambda will either receive a `Worker` object for the Server middleware,
65
+ # or a String with the `worker_class` for the Client middleware.
66
+ # If you are using that argument, your lambda should be able to handle both cases.
67
+
68
+ You can supress some of the default tags from being emitted by passing in `skip_tags`.
69
+ This is also useful if you would like to change one of the default tags, you can define
70
+ a custom lambda **and** define it as `skip_tags`
71
+
72
+
73
+ Sidekiq.configure_server do |config|
74
+ config.server_middleware do |chain|
75
+ chain.add(Sidekiq::Middleware::Server::Datadog,
76
+ skip_tags: ["name"],
77
+ tags: [->(worker_or_worker_class, job, queue, error){
78
+ "name:#{ my_logic_for_name }"
79
+ }])
80
+ end
81
+ end
82
+
83
+
54
84
  #### supported options
85
+
86
+ Both Client and Server middlewares support the same options:
87
+
55
88
  - *hostname* - the hostname used for instrumentation, defaults to system hostname. Can also be set with the `INSTRUMENTATION_HOSTNAME` env var.
56
89
  - *metric_name* - the metric name (prefix) to use, defaults to "sidekiq.job".
57
- - *tags* - array of custom tags. These can be plain strings or lambda blocks
90
+ - *tags* - array of custom tags. These can be plain strings or lambda blocks.
91
+ - *skip_tags* - array of tag names that shouldn't be emitted.
58
92
  - *statsd_host* - the statsD host, defaults to "localhost". Can also be set with the `STATSD_HOST` env var
59
93
  - *statsd_port* - the statsD port, defaults to 8125. Can also be set with the `STATSD_PORT` env var
60
94
  - *statsd* - custom statsd instance
61
95
 
62
96
  For more detailed configuration options, please see the [Documentation](http://www.rubydoc.info/gems/sidekiq-datadog).
63
97
 
98
+ ## Metrics exposed
99
+
100
+ The client middleware will expose:
101
+ - `sidekiq.job_enqueued` counter, with tags: `host`, `env`, `name` (the job name) and `queue`
102
+
103
+ The server middleware will expose:
104
+ - `sidekiq.job` counter, with tags: `host`, `env`, `name` (the job name), `queue`,
105
+ and `status` (`ok` or `error`). If `status` is `error`, there will be an additional
106
+ `error` tag with the exception class.
107
+ - `sidekiq.job.time` timing (`ms`) metric with the same tags, specifying the job runtime.
108
+ - `sidekiq.job.queued_time` timing (`ms`) metric with the same tags, specifying how long
109
+ the job was waiting in the queue before starting.
110
+
111
+ The base metric names `sidekiq.job` and `sidekiq.job_enqueued` can be overriden using the
112
+ `metric_name` option.
113
+
64
114
  ## Contributing
65
115
 
66
116
  1. Fork it
@@ -69,3 +119,18 @@ For more detailed configuration options, please see the [Documentation](http://w
69
119
  4. Push to the branch (`git push origin my-new-feature`)
70
120
  5. Make a pull request
71
121
 
122
+
123
+ **`dogstatsd-ruby` Version note:** `dogstatsd-ruby` has major backwards incompatibilities
124
+ between v4.8.3 and 5.0.0. This gem is compatible with both, and CI tests both versions.
125
+
126
+ In order to test through both, we have 2 Gemfiles (and their respective `.lock` files):
127
+ - `Gemfile`
128
+ - `Gemfile_dogstats_v4`
129
+
130
+ By default, everything runs against `dogstatsd-ruby` >= 5.0.
131
+
132
+ To update `Gemfile_dogstats_v4.lock`, or run tests with c4.8:
133
+
134
+ `BUNDLE_GEMFILE=Gemfile_dogstats_v4 bundle update`
135
+
136
+ `BUNDLE_GEMFILE=Gemfile_dogstats_v4 bundle exec rspec`
data/Rakefile CHANGED
@@ -1,7 +1,23 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
2
+
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ warn e.message
7
+ warn 'Run `bundle install` to install missing gems'
8
+ exit e.status_code
9
+ end
10
+
2
11
  require 'rake'
12
+
3
13
  require 'rspec/core'
4
14
  require 'rspec/core/rake_task'
5
15
 
6
- RSpec::Core::RakeTask.new(:spec)
7
- task :default => :spec
16
+ RSpec::Core::RakeTask.new(:spec) do |spec|
17
+ spec.pattern = FileList['spec/**/*_spec.rb']
18
+ end
19
+
20
+ require 'rubocop/rake_task'
21
+ RuboCop::RakeTask.new(:rubocop)
22
+
23
+ task default: %i[rubocop spec]
@@ -1 +1 @@
1
- require "sidekiq/middleware/server/datadog"
1
+ require 'sidekiq/datadog'
@@ -0,0 +1,3 @@
1
+ require 'sidekiq/datadog/version'
2
+ require 'sidekiq/middleware/client/datadog'
3
+ require 'sidekiq/middleware/server/datadog'
@@ -0,0 +1,75 @@
1
+ module Sidekiq
2
+ module Datadog
3
+ class TagBuilder
4
+ def initialize(custom_tags = [], skip_tags = [], custom_hostname = nil)
5
+ @tags = Array(custom_tags)
6
+ @skip_tags = Array(skip_tags).map(&:to_s)
7
+
8
+ env = Sidekiq.options[:environment] || ENV['RACK_ENV']
9
+ host = custom_hostname || ENV['INSTRUMENTATION_HOSTNAME'] || Socket.gethostname
10
+ setup_defaults(host: host, env: env)
11
+ end
12
+
13
+ def build_tags(worker_or_worker_class, job, queue = nil, error = nil)
14
+ tags = @tags.flat_map do |tag|
15
+ case tag
16
+ when String then tag
17
+ when Proc then tag.call(worker_or_worker_class, job, queue, error)
18
+ end
19
+ end
20
+ tags.compact!
21
+
22
+ tags.push "name:#{job_name(worker_or_worker_class, job)}" if include_tag?('name')
23
+ tags.push "queue:#{queue}" if queue && include_tag?('queue')
24
+
25
+ if error.nil?
26
+ tags.push 'status:ok' if include_tag?('status')
27
+ else
28
+ kind = underscore(error.class.name.sub(/Error$/, ''))
29
+ tags.push 'status:error' if include_tag?('status')
30
+ tags.push "error:#{kind}" if include_tag?('error')
31
+ end
32
+
33
+ tags
34
+ end
35
+
36
+ private
37
+
38
+ def job_name(worker_or_worker_class, job)
39
+ # Client middleware sends a `worker_class` String,
40
+ # whereas Server middleware send a Worker object
41
+ worker_class = if worker_or_worker_class.is_a?(String)
42
+ worker_or_worker_class
43
+ else
44
+ worker_or_worker_class.class.to_s
45
+ end
46
+
47
+ underscore(job['wrapped'] || worker_class)
48
+ end
49
+
50
+ def setup_defaults(hash)
51
+ hash.each do |key, val|
52
+ key = key.to_s
53
+ next unless val && include_tag?(key)
54
+
55
+ prefix = "#{key}:"
56
+ next if @tags.any? {|t| t.is_a?(String) && t.start_with?(prefix) }
57
+
58
+ @tags.push [key, val].join(':')
59
+ end
60
+ end
61
+
62
+ def include_tag?(tag)
63
+ !@skip_tags.include?(tag)
64
+ end
65
+
66
+ def underscore(word)
67
+ word = word.to_s.gsub(/::/, '/')
68
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
69
+ word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
70
+ word.tr!('-', '_')
71
+ word.downcase
72
+ end
73
+ end
74
+ end
75
+ end
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module Datadog
3
- VERSION = "0.4.1"
3
+ VERSION = '0.6.0'.freeze
4
4
  end
5
5
  end
@@ -0,0 +1,67 @@
1
+ require 'sidekiq'
2
+ require 'sidekiq/datadog/version'
3
+ require 'sidekiq/datadog/tag_builder'
4
+ require 'datadog/statsd'
5
+ require 'socket'
6
+
7
+ module Sidekiq
8
+ module Middleware
9
+ module Client
10
+ class Datadog
11
+ # Configure and install datadog instrumentation. Example:
12
+ #
13
+ # Sidekiq.configure_client do |config|
14
+ # config.client_middleware do |chain|
15
+ # chain.add Sidekiq::Middleware::Client::Datadog
16
+ # end
17
+ # end
18
+ #
19
+ # You might want to also call `client_middleware` in your `configure_server` call,
20
+ # since enqueued jobs can enqueue other jobs.
21
+ #
22
+ # If you have other client middleware that can stop jobs from getting pushed,
23
+ # you might want to ensure this middleware is added last, to avoid reporting
24
+ # enqueues that later get stopped.
25
+ #
26
+ # Options:
27
+ # * <tt>:hostname</tt> - the hostname used for instrumentation, defaults to system hostname, respects +INSTRUMENTATION_HOSTNAME+ env variable
28
+ # * <tt>:metric_name</tt> - the metric name (prefix) to use, defaults to "sidekiq.job_enqueued"
29
+ # * <tt>:tags</tt> - array of custom tags, these can be plain strings or lambda blocks accepting a rack env instance
30
+ # * <tt>:skip_tags</tt> - array of tag names that shouldn't be emitted
31
+ # * <tt>:statsd_host</tt> - the statsD host, defaults to "localhost", respects +STATSD_HOST+ env variable
32
+ # * <tt>:statsd_port</tt> - the statsD port, defaults to 8125, respects +STATSD_PORT+ env variable
33
+ # * <tt>:statsd</tt> - custom statsd instance
34
+ def initialize(opts = {})
35
+ statsd_host = opts[:statsd_host] || ENV['STATSD_HOST'] || 'localhost'
36
+ statsd_port = (opts[:statsd_port] || ENV['STATSD_PORT'] || 8125).to_i
37
+
38
+ @metric_name = opts[:metric_name] || 'sidekiq.job_enqueued'
39
+ @statsd = opts[:statsd] || ::Datadog::Statsd.new(statsd_host, statsd_port)
40
+
41
+ # `status` is meaningless when enqueueing
42
+ skip_tags = Array(opts[:skip_tags]) + ['status']
43
+
44
+ @tag_builder = Sidekiq::Datadog::TagBuilder.new(
45
+ opts[:tags],
46
+ skip_tags,
47
+ opts[:hostname],
48
+ )
49
+ end
50
+
51
+ def call(worker_class, job, queue, _redis_pool, *)
52
+ record(worker_class, job, queue)
53
+ yield
54
+ end
55
+
56
+ private
57
+
58
+ def record(worker_class, job, queue)
59
+ tags = @tag_builder.build_tags(worker_class, job, queue)
60
+ @statsd.increment @metric_name, tags: tags
61
+
62
+ @statsd.flush if @statsd.respond_to?(:flush) # dogstatsd-ruby >= 5.0.0
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -1,5 +1,6 @@
1
1
  require 'sidekiq'
2
2
  require 'sidekiq/datadog/version'
3
+ require 'sidekiq/datadog/tag_builder'
3
4
  require 'datadog/statsd'
4
5
  require 'socket'
5
6
 
@@ -7,7 +8,6 @@ module Sidekiq
7
8
  module Middleware
8
9
  module Server
9
10
  class Datadog
10
-
11
11
  # Configure and install datadog instrumentation. Example:
12
12
  #
13
13
  # Sidekiq.configure_server do |config|
@@ -20,76 +20,52 @@ module Sidekiq
20
20
  # * <tt>:hostname</tt> - the hostname used for instrumentation, defaults to system hostname, respects +INSTRUMENTATION_HOSTNAME+ env variable
21
21
  # * <tt>:metric_name</tt> - the metric name (prefix) to use, defaults to "sidekiq.job"
22
22
  # * <tt>:tags</tt> - array of custom tags, these can be plain strings or lambda blocks accepting a rack env instance
23
+ # * <tt>:skip_tags</tt> - array of tag names that shouldn't be emitted
23
24
  # * <tt>:statsd_host</tt> - the statsD host, defaults to "localhost", respects +STATSD_HOST+ env variable
24
25
  # * <tt>:statsd_port</tt> - the statsD port, defaults to 8125, respects +STATSD_PORT+ env variable
25
26
  # * <tt>:statsd</tt> - custom statsd instance
26
27
  def initialize(opts = {})
27
- hostname = opts[:hostname] || ENV['INSTRUMENTATION_HOSTNAME'] || Socket.gethostname
28
- statsd_host = opts[:statsd_host] || ENV['STATSD_HOST'] || "localhost"
29
- statsd_port = (opts[:statsd_port] || ENV['STATSD_PORT'] || 8125).to_i
28
+ statsd_host = opts[:statsd_host] || ENV['STATSD_HOST'] || 'localhost'
29
+ statsd_port = (opts[:statsd_port] || ENV['STATSD_PORT'] || 8125).to_i
30
30
 
31
- @metric_name = opts[:metric_name] || "sidekiq.job"
31
+ @metric_name = opts[:metric_name] || 'sidekiq.job'
32
32
  @statsd = opts[:statsd] || ::Datadog::Statsd.new(statsd_host, statsd_port)
33
- @tags = opts[:tags] || []
34
-
35
- if @tags.none? {|t| t =~ /^host\:/ }
36
- @tags.push("host:#{hostname}")
37
- end
38
-
39
- env = Sidekiq.options[:environment] || ENV['RACK_ENV']
40
- if env && @tags.none? {|t| t =~ /^env\:/ }
41
- @tags.push("env:#{ENV['RACK_ENV']}")
42
- end
33
+ @tag_builder = Sidekiq::Datadog::TagBuilder.new(
34
+ opts[:tags],
35
+ opts[:skip_tags],
36
+ opts[:hostname],
37
+ )
43
38
  end
44
39
 
45
40
  def call(worker, job, queue, *)
46
41
  start = Time.now
42
+ clock = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC, :millisecond)
43
+
47
44
  begin
48
45
  yield
49
- record(worker, job, queue, start)
50
- rescue => e
51
- record(worker, job, queue, start, e)
46
+ record(worker, job, queue, start, clock)
47
+ rescue StandardError => e
48
+ record(worker, job, queue, start, clock, e)
52
49
  raise
53
50
  end
54
51
  end
55
52
 
56
53
  private
57
54
 
58
- def record(worker, job, queue, start, error = nil)
59
- ms = ((Time.now - start) * 1000).round
60
- if job["enqueued_at"]
61
- queued_ms = ((start - Time.at(job["enqueued_at"])) * 1000).round
62
- end
63
- name = underscore(job['wrapped'] || worker.class.to_s)
64
- tags = @tags.flat_map do |tag|
65
- case tag when String then tag when Proc then tag.call(worker, job, queue, error) end
66
- end
55
+ def record(worker, job, queue, start, clock, error = nil)
56
+ msec = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC, :millisecond) - clock
57
+ tags = @tag_builder.build_tags(worker, job, queue, error)
67
58
 
68
- tags.push "name:#{name}"
69
- tags.push "queue:#{queue}" if queue
70
- if error
71
- kind = underscore(error.class.name.sub(/Error$/, ''))
72
- tags.push "status:error", "error:#{kind}"
73
- else
74
- tags.push "status:ok"
75
- end
76
- tags.compact!
59
+ @statsd.increment @metric_name, tags: tags
60
+ @statsd.timing "#{@metric_name}.time", msec, tags: tags
77
61
 
78
- @statsd.increment @metric_name, :tags => tags
79
- @statsd.timing "#{@metric_name}.time", ms, :tags => tags
80
- if queued_ms
81
- @statsd.timing "#{@metric_name}.queued_time", queued_ms, :tags => tags
82
- end
83
- end
62
+ return unless job['enqueued_at']
84
63
 
85
- def underscore(word)
86
- word = word.to_s.gsub(/::/, '/')
87
- word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
88
- word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
89
- word.tr!("-", "_")
90
- word.downcase
91
- end
64
+ queued_ms = ((start - Time.at(job['enqueued_at'])) * 1000).round
65
+ @statsd.timing "#{@metric_name}.queued_time", queued_ms, tags: tags
92
66
 
67
+ @statsd.flush if @statsd.respond_to?(:flush) # dogstatsd-ruby >= 5.0.0
68
+ end
93
69
  end
94
70
  end
95
71
  end
@@ -1,26 +1,29 @@
1
- # -*- encoding: utf-8 -*-
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'sidekiq/datadog/version'
5
4
 
6
5
  Gem::Specification.new do |s|
7
- s.name = "sidekiq-datadog"
6
+ s.name = 'sidekiq-datadog'
8
7
  s.version = Sidekiq::Datadog::VERSION.dup
9
- s.authors = ["Dimitrij Denissenko"]
10
- s.email = ["dimitrij@blacksquaremedia.com"]
11
- s.description = %q{Datadog metrics for sidekiq}
12
- s.summary = %q{Datadog metrics for sidekiq}
13
- s.homepage = "https://github.com/bsm/sidekiq-datadog"
8
+ s.authors = ['Dimitrij Denissenko']
9
+ s.email = ['dimitrij@blacksquaremedia.com']
10
+ s.description = 'Datadog metrics for sidekiq'
11
+ s.summary = 'Datadog metrics for sidekiq'
12
+ s.homepage = 'https://github.com/bsm/sidekiq-datadog'
14
13
 
15
- s.files = `git ls-files`.split($/)
16
- s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
14
+ s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
15
+ s.executables = s.files.grep(%r{^bin/}).map {|f| File.basename(f) }
17
16
  s.test_files = s.files.grep(%r{^(spec)/})
18
- s.require_paths = ["lib"]
17
+ s.require_paths = ['lib']
18
+ s.required_ruby_version = '>= 2.5'
19
19
 
20
- s.add_runtime_dependency(%q<sidekiq>)
21
- s.add_runtime_dependency(%q<dogstatsd-ruby>, ">= 3.3.0")
20
+ s.add_runtime_dependency('dogstatsd-ruby', '>= 4.2.0')
21
+ s.add_runtime_dependency('sidekiq')
22
22
 
23
- s.add_development_dependency(%q<rake>)
24
- s.add_development_dependency(%q<bundler>)
25
- s.add_development_dependency(%q<rspec>, "~> 3.0")
23
+ s.add_development_dependency('bundler')
24
+ s.add_development_dependency('rake')
25
+ s.add_development_dependency('rspec')
26
+ s.add_development_dependency('rubocop-bsm')
27
+ s.add_development_dependency('rubocop-performance')
28
+ s.add_development_dependency('timecop')
26
29
  end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sidekiq::Datadog::TagBuilder do
4
+ subject { described_class.new(custom_tags, skip_tags, custom_hostname) }
5
+
6
+ let(:custom_tags) { nil }
7
+ let(:worker) { Mock::Worker.new }
8
+ let(:job) { { 'enqueued_at' => 1461881794 } }
9
+ let(:queue) { 'queue_name' }
10
+ let(:error) { nil }
11
+ let(:skip_tags) { nil }
12
+ let(:custom_hostname) { nil }
13
+
14
+ it 'builds basic default tags without any parameters' do
15
+ result = subject.build_tags(worker, job, queue, error)
16
+
17
+ expect(result).to eql([
18
+ "host:#{Socket.gethostname}",
19
+ 'env:test',
20
+ 'name:mock/worker',
21
+ 'queue:queue_name',
22
+ 'status:ok',
23
+ ])
24
+ end
25
+
26
+ context 'with custom hostname' do
27
+ let(:custom_hostname) { 'myhostname' }
28
+
29
+ it 'reports the custom hostname' do
30
+ result = subject.build_tags(worker, job, queue, error)
31
+ expect(result).to include('host:myhostname')
32
+ end
33
+ end
34
+
35
+ context 'with custom tags' do
36
+ let(:custom_tags) { ['custom:tag', ->(w, *) { "worker:#{w.class.name[1..2]}" }] }
37
+
38
+ it 'reports the custom tags, fixed and Procs' do
39
+ result = subject.build_tags(worker, job, queue, error)
40
+ expect(result).to include('custom:tag')
41
+ expect(result).to include('worker:oc')
42
+ end
43
+ end
44
+
45
+ context 'with skipped tags' do
46
+ let(:skip_tags) { %w[name env] }
47
+
48
+ it "doesn't output the skipped tags" do
49
+ result = subject.build_tags(worker, job, queue, error)
50
+ result_keys = result.map {|t| t.split(':').first }
51
+
52
+ expect(result_keys).not_to include('name')
53
+ expect(result_keys).not_to include('env')
54
+ end
55
+ end
56
+
57
+ context 'with a wrapped job' do
58
+ let(:job) { { 'wrapped' => 'Module::WrappedJobName' } }
59
+
60
+ it 'reports the wrapped job name' do
61
+ result = subject.build_tags(worker, job, queue, error)
62
+ expect(result).to include('name:module/wrapped_job_name')
63
+ end
64
+ end
65
+
66
+ context 'with an error' do
67
+ let(:error) { ArgumentError.new }
68
+
69
+ it 'reports the error class, and status' do
70
+ result = subject.build_tags(worker, job, queue, error)
71
+ expect(result).to include('error:argument')
72
+ expect(result).to include('status:error')
73
+ end
74
+ end
75
+
76
+ context 'with a worker_class instead of a Worker object' do
77
+ let(:worker_class) { 'Module::Worker' }
78
+
79
+ it 'reports the error class, and status' do
80
+ result = subject.build_tags(worker_class, job, queue, error)
81
+ expect(result).to include('name:module/worker')
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sidekiq::Datadog do
4
+ it 'has a version' do
5
+ expect(described_class::VERSION).to be_instance_of(String)
6
+ end
7
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sidekiq::Middleware::Client::Datadog do
4
+ subject { described_class.new(hostname: 'test.host', statsd: statsd, tags: tags, **options) }
5
+
6
+ let(:statsd) { Mock::Statsd.new('localhost', 55555) }
7
+ let(:worker_class) { 'Mock::Worker' }
8
+ let(:tags) do
9
+ ['custom:tag', ->(worker_class, *) { "worker:#{worker_class[1..2]}" }]
10
+ end
11
+ let(:options) { {} }
12
+
13
+ before do
14
+ statsd.messages.clear
15
+ end
16
+
17
+ it 'sends an increment event for each job enqueued' do
18
+ subject.call(worker_class, {}, 'default', nil) { 'ok' }
19
+ expect(statsd.messages).to eq([
20
+ 'sidekiq.job_enqueued:1|c|#custom:tag,worker:oc,host:test.host,env:test,name:mock/worker,'\
21
+ 'queue:default',
22
+ ])
23
+ end
24
+
25
+ it 'supports wrappers' do
26
+ subject.call(worker_class, { 'wrapped' => 'wrap' }, nil, nil) { 'ok' }
27
+ expect(statsd.messages).to eq([
28
+ 'sidekiq.job_enqueued:1|c|#custom:tag,worker:oc,host:test.host,env:test,name:wrap',
29
+ ])
30
+ end
31
+
32
+ context 'with a dynamic tag list' do
33
+ let(:tags) do
34
+ ['custom:tag', ->(_w, j, *) { j['args'].map {|n| "arg:#{n}" } }]
35
+ end
36
+
37
+ it 'generates the correct tags' do
38
+ subject.call(worker_class, { 'args' => [1, 2] }, 'default', nil) { 'ok' }
39
+
40
+ expect(statsd.messages).to eq([
41
+ 'sidekiq.job_enqueued:1|c|#custom:tag,arg:1,arg:2,host:test.host,env:test,name:mock/worker,'\
42
+ 'queue:default',
43
+ ])
44
+ end
45
+ end
46
+
47
+ context 'with a list of skipped tags' do
48
+ let(:tags) { [] }
49
+ let(:options) { { skip_tags: %i[env host name] } }
50
+
51
+ it 'sends metrics without the skipped tags' do
52
+ subject.call(worker_class, {}, 'default', nil) { 'ok' }
53
+
54
+ expect(statsd.messages).to eq([
55
+ 'sidekiq.job_enqueued:1|c|#queue:default',
56
+ ])
57
+ end
58
+ end
59
+
60
+ context 'when sidekiq/api is required' do
61
+ before do
62
+ require 'sidekiq/api'
63
+ end
64
+
65
+ it 'does not raise any errors' do
66
+ expect do
67
+ subject.call(worker_class, {}, 'default', nil) { 'ok' }
68
+ end.not_to raise_error
69
+ end
70
+ end
71
+ end
@@ -1,59 +1,107 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Sidekiq::Middleware::Server::Datadog do
4
+ subject { described_class.new(hostname: 'test.host', statsd: statsd, tags: tags, **options) }
4
5
 
5
6
  let(:statsd) { Mock::Statsd.new('localhost', 55555) }
6
7
  let(:worker) { Mock::Worker.new }
7
- let(:tags) {
8
- ["custom:tag", lambda{|w, *| "worker:#{w.class.name[1..2]}" }]
9
- }
10
-
11
- before { statsd.written.clear }
12
- subject { described_class.new hostname: "test.host", statsd: statsd, tags: tags }
13
-
14
- it 'should send an increment and timing event for each job run' do
15
- subject.call(worker, { 'enqueued_at' => 1461881794.9312189 }, 'default') { "ok" }
16
- expect(statsd.written).to eq([
17
- "sidekiq.job:1|c|#custom:tag,worker:oc,host:test.host,env:test,name:mock/worker,queue:default,status:ok",
18
- "sidekiq.job.time:333|ms|#custom:tag,worker:oc,host:test.host,env:test,name:mock/worker,queue:default,status:ok",
19
- "sidekiq.job.queued_time:333|ms|#custom:tag,worker:oc,host:test.host,env:test,name:mock/worker,queue:default,status:ok",
8
+ let(:tags) do
9
+ ['custom:tag', ->(w, *) { "worker:#{w.class.name[1..2]}" }]
10
+ end
11
+ let(:options) { {} }
12
+ let(:enqueued_at) { 1461881794.9312189 }
13
+ let(:expected_queued_time_ms) { 444 }
14
+
15
+ before do
16
+ statsd.messages.clear
17
+
18
+ clock_gettime_call_count = 0
19
+ expect(Process).to receive(:clock_gettime).twice do
20
+ clock_gettime_call_count += 1
21
+ clock_gettime_call_count == 1 ? 0 : 333
22
+ end
23
+
24
+ Timecop.freeze(Time.at(enqueued_at + expected_queued_time_ms.to_f / 1000))
25
+ end
26
+
27
+ it 'sends an increment and timing event for each job run' do
28
+ subject.call(worker, { 'enqueued_at' => enqueued_at }, 'default') { 'ok' }
29
+ expect(statsd.messages).to eq([
30
+ 'sidekiq.job:1|c|#custom:tag,worker:oc,host:test.host,env:test,name:mock/worker,'\
31
+ 'queue:default,status:ok',
32
+ 'sidekiq.job.time:333|ms|#custom:tag,worker:oc,host:test.host,env:test,name:mock/worker,'\
33
+ 'queue:default,status:ok',
34
+ "sidekiq.job.queued_time:#{expected_queued_time_ms}|ms|#custom:tag,worker:oc,host:test.host,"\
35
+ 'env:test,name:mock/worker,queue:default,status:ok',
20
36
  ])
21
37
  end
22
38
 
23
- it 'should support wrappers' do
24
- subject.call(worker, { 'enqueued_at' => 1461881794.9312189, 'wrapped' => 'wrap'}, nil) { "ok" }
25
- expect(statsd.written).to eq([
26
- "sidekiq.job:1|c|#custom:tag,worker:oc,host:test.host,env:test,name:wrap,status:ok",
27
- "sidekiq.job.time:333|ms|#custom:tag,worker:oc,host:test.host,env:test,name:wrap,status:ok",
28
- "sidekiq.job.queued_time:333|ms|#custom:tag,worker:oc,host:test.host,env:test,name:wrap,status:ok",
39
+ it 'supports wrappers' do
40
+ subject.call(worker, { 'enqueued_at' => enqueued_at, 'wrapped' => 'wrap' }, nil) { 'ok' }
41
+ expect(statsd.messages).to eq([
42
+ 'sidekiq.job:1|c|#custom:tag,worker:oc,host:test.host,env:test,name:wrap,status:ok',
43
+ 'sidekiq.job.time:333|ms|#custom:tag,worker:oc,host:test.host,env:test,name:wrap,status:ok',
44
+ "sidekiq.job.queued_time:#{expected_queued_time_ms}|ms|#custom:tag,worker:oc,host:test.host,"\
45
+ 'env:test,name:wrap,status:ok',
29
46
  ])
30
47
  end
31
48
 
32
- it 'should handle errors' do
49
+ it 'handles errors' do
33
50
  expect(lambda {
34
- subject.call(worker, {}, nil) { raise RuntimeError, "doh!" }
35
- }).to raise_error("doh!")
51
+ subject.call(worker, {}, nil) { raise 'doh!' }
52
+ }).to raise_error('doh!')
36
53
 
37
- expect(statsd.written).to eq([
38
- "sidekiq.job:1|c|#custom:tag,worker:oc,host:test.host,env:test,name:mock/worker,status:error,error:runtime",
39
- "sidekiq.job.time:333|ms|#custom:tag,worker:oc,host:test.host,env:test,name:mock/worker,status:error,error:runtime",
54
+ expect(statsd.messages).to eq([
55
+ 'sidekiq.job:1|c|#custom:tag,worker:oc,host:test.host,env:test,name:mock/worker,'\
56
+ 'status:error,error:runtime',
57
+ 'sidekiq.job.time:333|ms|#custom:tag,worker:oc,host:test.host,env:test,name:mock/worker,'\
58
+ 'status:error,error:runtime',
40
59
  ])
41
60
  end
42
61
 
43
62
  context 'with a dynamic tag list' do
44
- let(:tags) {
45
- ["custom:tag", lambda {|w, j, *| j['args'].map { |n| "arg:#{n}"} }]
46
- }
63
+ let(:tags) do
64
+ ['custom:tag', ->(_w, j, *) { j['args'].map {|n| "arg:#{n}" } }]
65
+ end
66
+
67
+ it 'generates the correct tags' do
68
+ subject.call(worker, { 'enqueued_at' => enqueued_at, 'args' => [1, 2] }, 'default') { 'ok' }
47
69
 
48
- it 'should generate the correct tags' do
49
- subject.call(worker, { 'enqueued_at' => 1461881794.9312189, 'args' => [1, 2] }, 'default') { "ok" }
70
+ expect(statsd.messages).to eq([
71
+ 'sidekiq.job:1|c|#custom:tag,arg:1,arg:2,host:test.host,env:test,name:mock/worker,'\
72
+ 'queue:default,status:ok',
73
+ 'sidekiq.job.time:333|ms|#custom:tag,arg:1,arg:2,host:test.host,env:test,name:mock/worker,'\
74
+ 'queue:default,status:ok',
75
+ "sidekiq.job.queued_time:#{expected_queued_time_ms}|ms|#custom:tag,arg:1,arg:2,"\
76
+ 'host:test.host,env:test,name:mock/worker,queue:default,status:ok',
77
+ ])
78
+ end
79
+ end
80
+
81
+ context 'with a list of skipped tags' do
82
+ let(:tags) { [] }
83
+ let(:options) { { skip_tags: %i[env host name] } }
84
+
85
+ it 'sends metrics without the skipped tags' do
86
+ subject.call(worker, { 'enqueued_at' => 1461881794.9312189 }, 'default') { 'ok' }
50
87
 
51
- expect(statsd.written).to eq([
52
- "sidekiq.job:1|c|#custom:tag,arg:1,arg:2,host:test.host,env:test,name:mock/worker,queue:default,status:ok",
53
- "sidekiq.job.time:333|ms|#custom:tag,arg:1,arg:2,host:test.host,env:test,name:mock/worker,queue:default,status:ok",
54
- "sidekiq.job.queued_time:333|ms|#custom:tag,arg:1,arg:2,host:test.host,env:test,name:mock/worker,queue:default,status:ok"
88
+ expect(statsd.messages).to eq([
89
+ 'sidekiq.job:1|c|#queue:default,status:ok',
90
+ 'sidekiq.job.time:333|ms|#queue:default,status:ok',
91
+ "sidekiq.job.queued_time:#{expected_queued_time_ms}|ms|#queue:default,status:ok",
55
92
  ])
56
93
  end
57
94
  end
58
95
 
96
+ context 'when sidekiq/api is required' do
97
+ before do
98
+ require 'sidekiq/api'
99
+ end
100
+
101
+ it 'does not raise any errors' do
102
+ expect do
103
+ subject.call(worker, { 'enqueued_at' => enqueued_at }, 'default') { 'ok' }
104
+ end.not_to raise_error
105
+ end
106
+ end
59
107
  end
data/spec/spec_helper.rb CHANGED
@@ -1,17 +1,18 @@
1
1
  ENV['RACK_ENV'] ||= 'test'
2
-
3
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
- $LOAD_PATH.unshift(File.dirname(__FILE__))
5
-
6
2
  require 'sidekiq-datadog'
3
+ require 'timecop'
7
4
 
8
5
  module Mock
9
- class Worker
10
- end
6
+ class Worker; end # rubocop:disable Lint/EmptyClass
11
7
 
12
8
  class Statsd < ::Datadog::Statsd
13
- def timing(stat, ms, opts={}); super(stat, 333, opts); end
14
- def send_stat(message); written.push(message); end
15
- def written; @written ||= []; end
9
+ def send_stats(stat, delta, type, opts = EMPTY_OPTIONS)
10
+ full_stat = serializer.to_stat(stat, delta, type, tags: opts[:tags])
11
+ messages.push full_stat
12
+ end
13
+
14
+ def messages
15
+ @messages ||= []
16
+ end
16
17
  end
17
18
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-datadog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dimitrij Denissenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-28 00:00:00.000000000 Z
11
+ date: 2021-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dogstatsd-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 4.2.0
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: sidekiq
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -25,19 +39,19 @@ dependencies:
25
39
  - !ruby/object:Gem::Version
26
40
  version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
- name: dogstatsd-ruby
42
+ name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - ">="
32
46
  - !ruby/object:Gem::Version
33
- version: 3.3.0
34
- type: :runtime
47
+ version: '0'
48
+ type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - ">="
39
53
  - !ruby/object:Gem::Version
40
- version: 3.3.0
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -53,7 +67,7 @@ dependencies:
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
- name: bundler
70
+ name: rspec
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - ">="
@@ -67,19 +81,47 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: rspec
84
+ name: rubocop-bsm
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-performance
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: timecop
71
113
  requirement: !ruby/object:Gem::Requirement
72
114
  requirements:
73
- - - "~>"
115
+ - - ">="
74
116
  - !ruby/object:Gem::Version
75
- version: '3.0'
117
+ version: '0'
76
118
  type: :development
77
119
  prerelease: false
78
120
  version_requirements: !ruby/object:Gem::Requirement
79
121
  requirements:
80
- - - "~>"
122
+ - - ">="
81
123
  - !ruby/object:Gem::Version
82
- version: '3.0'
124
+ version: '0'
83
125
  description: Datadog metrics for sidekiq
84
126
  email:
85
127
  - dimitrij@blacksquaremedia.com
@@ -87,18 +129,26 @@ executables: []
87
129
  extensions: []
88
130
  extra_rdoc_files: []
89
131
  files:
132
+ - ".github/workflows/test.yml"
90
133
  - ".gitignore"
91
- - ".travis.yml"
134
+ - ".rubocop.yml"
92
135
  - Gemfile
93
136
  - Gemfile.lock
137
+ - Gemfile_dogstats_v4
138
+ - Gemfile_dogstats_v4.lock
94
139
  - LICENSE.txt
95
140
  - README.md
96
141
  - Rakefile
97
142
  - lib/sidekiq-datadog.rb
143
+ - lib/sidekiq/datadog.rb
144
+ - lib/sidekiq/datadog/tag_builder.rb
98
145
  - lib/sidekiq/datadog/version.rb
146
+ - lib/sidekiq/middleware/client/datadog.rb
99
147
  - lib/sidekiq/middleware/server/datadog.rb
100
148
  - sidekiq-datadog.gemspec
101
- - spec/sidekiq/datadog/version_spec.rb
149
+ - spec/sidekiq/datadog/tag_builder_spec.rb
150
+ - spec/sidekiq/datadog_spec.rb
151
+ - spec/sidekiq/middleware/client/datadog_spec.rb
102
152
  - spec/sidekiq/middleware/server/datadog_spec.rb
103
153
  - spec/spec_helper.rb
104
154
  homepage: https://github.com/bsm/sidekiq-datadog
@@ -112,19 +162,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
112
162
  requirements:
113
163
  - - ">="
114
164
  - !ruby/object:Gem::Version
115
- version: '0'
165
+ version: '2.5'
116
166
  required_rubygems_version: !ruby/object:Gem::Requirement
117
167
  requirements:
118
168
  - - ">="
119
169
  - !ruby/object:Gem::Version
120
170
  version: '0'
121
171
  requirements: []
122
- rubyforge_project:
123
- rubygems_version: 2.7.6
172
+ rubygems_version: 3.2.15
124
173
  signing_key:
125
174
  specification_version: 4
126
175
  summary: Datadog metrics for sidekiq
127
176
  test_files:
128
- - spec/sidekiq/datadog/version_spec.rb
177
+ - spec/sidekiq/datadog/tag_builder_spec.rb
178
+ - spec/sidekiq/datadog_spec.rb
179
+ - spec/sidekiq/middleware/client/datadog_spec.rb
129
180
  - spec/sidekiq/middleware/server/datadog_spec.rb
130
181
  - spec/spec_helper.rb
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- language: ruby
2
- cache: bundler
3
- rvm:
4
- - 2.5.1
5
- - 2.4.4
@@ -1,7 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Sidekiq::Datadog do
4
- it "has a version" do
5
- expect(Sidekiq::Datadog::VERSION).to be_instance_of(String)
6
- end
7
- end