sidekiq-influxdb 0.4.0 → 1.4.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.
@@ -1,2 +1,4 @@
1
1
  require "sidekiq/influxdb/version"
2
- require "sidekiq/influxdb/server_middleware"
2
+ require "sidekiq/middleware/server/influxdb"
3
+ require "sidekiq/metrics/queues"
4
+ require "sidekiq/metrics/stats"
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module InfluxDB
3
- VERSION = "0.4.0"
3
+ VERSION = "1.4.0"
4
4
  end
5
5
  end
@@ -0,0 +1,41 @@
1
+ require 'sidekiq/api'
2
+
3
+ module Sidekiq
4
+ module Metrics
5
+ class Queues
6
+
7
+ def initialize(
8
+ influxdb_client:,
9
+ series_name: 'sidekiq_queues',
10
+ retention_policy: nil,
11
+ tags: {}
12
+ )
13
+ @influxdb = influxdb_client
14
+ @series = series_name
15
+ @retention = retention_policy
16
+ @tags = tags
17
+ end
18
+
19
+ def publish
20
+ queues = Sidekiq::Stats::Queues.new.lengths
21
+
22
+ queues.each do |queue, size|
23
+ save(
24
+ tags: {queue: queue}.merge(@tags),
25
+ values: {size: size}
26
+ )
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def save(data)
33
+ @influxdb.write_point(@series, data, precision, @retention)
34
+ end
35
+
36
+ def precision
37
+ @influxdb.config.time_precision
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,42 @@
1
+ require 'sidekiq/api'
2
+
3
+ module Sidekiq
4
+ module Metrics
5
+ class Stats
6
+
7
+ def initialize(
8
+ influxdb_client:,
9
+ series_name: 'sidekiq_stats',
10
+ retention_policy: nil,
11
+ tags: {}
12
+ )
13
+ @influxdb = influxdb_client
14
+ @series = series_name
15
+ @retention = retention_policy
16
+ @tags = tags
17
+ end
18
+
19
+ def publish
20
+ stats = Sidekiq::Stats.new.instance_variable_get(:@stats)
21
+ stats.delete(:default_queue_latency)
22
+
23
+ stats.each do |stat, size|
24
+ save(
25
+ tags: {stat: stat}.merge(@tags),
26
+ values: {size: size}
27
+ )
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def save(data)
34
+ @influxdb.write_point(@series, data, precision, @retention)
35
+ end
36
+
37
+ def precision
38
+ @influxdb.config.time_precision
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,103 @@
1
+ require 'set'
2
+
3
+ module Sidekiq
4
+ module Middleware
5
+ module Server
6
+ class InfluxDB
7
+
8
+ def initialize(
9
+ influxdb_client:,
10
+ series_name: 'sidekiq_jobs',
11
+ retention_policy: nil,
12
+ start_events: true,
13
+ tags: {},
14
+ except: [],
15
+ clock: -> { Time.now.to_f }
16
+ )
17
+ @influxdb = influxdb_client
18
+ @series = series_name
19
+ @retention = retention_policy
20
+ @start_events = start_events
21
+ @tags = tags
22
+ @secret_agents = class_names(except)
23
+ @clock = clock
24
+ end
25
+
26
+ def call(_worker, msg, _queue)
27
+ if @secret_agents.include?(job_class_name(msg))
28
+ yield
29
+ return
30
+ end
31
+
32
+ started_at = @clock.call
33
+ waited = started_at - msg['created_at']
34
+ record(started_at, msg, {event: 'start'}, {waited: waited}) if @start_events
35
+
36
+ begin
37
+ yield
38
+ tags = {event: 'finish'}
39
+ rescue => e
40
+ tags = {event: 'error', error: e.class.name}
41
+ end
42
+
43
+ finished_at = @clock.call
44
+ worked = finished_at - started_at
45
+ record(finished_at, msg, tags, {waited: waited, worked: worked, total: waited + worked})
46
+
47
+ raise e if e
48
+ end
49
+
50
+ private
51
+
52
+ def class_names(except)
53
+ Set.new([except].flatten.map{|e| class_name(e) })
54
+ end
55
+
56
+ def class_name(class_or_name)
57
+ class_or_name.name
58
+ rescue NoMethodError
59
+ class_or_name
60
+ end
61
+
62
+ def job_class_name(msg)
63
+ msg['wrapped'] || msg['class']
64
+ end
65
+
66
+ def record(t, msg, tags, values = {})
67
+ save(
68
+ tags: {
69
+ class: job_class_name(msg),
70
+ queue: msg['queue']
71
+ }.merge(tags).merge(@tags),
72
+ values: {
73
+ jid: msg['jid'],
74
+ creation_time: msg['created_at']
75
+ }.merge(values),
76
+ timestamp: in_correct_precision(t)
77
+ )
78
+ end
79
+
80
+ def save(data)
81
+ @influxdb.write_point(@series, data, precision, @retention)
82
+ end
83
+
84
+ def precision
85
+ @influxdb.config.time_precision
86
+ end
87
+
88
+ def in_correct_precision(t)
89
+ case precision
90
+ # In order of probability in real-world setups
91
+ when 'ms' then (t * 1_000).to_i
92
+ when 's' then t.to_i
93
+ when 'u' then (t * 1_000_000).to_i
94
+ when 'ns' then (t * 1_000_000_000).to_i
95
+ when 'm' then (t / 60).to_i * 60
96
+ when 'h' then (t / 60 / 60).to_i * 60 * 60
97
+ end
98
+ end
99
+
100
+ end
101
+ end
102
+ end
103
+ end
@@ -21,6 +21,6 @@ Gem::Specification.new do |spec|
21
21
  spec.add_runtime_dependency "influxdb"
22
22
  spec.add_runtime_dependency "sidekiq"
23
23
 
24
- spec.add_development_dependency "bundler", "~> 1.16"
25
- spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "rspec"
25
+ spec.add_development_dependency "coveralls"
26
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-influxdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilya Vassilevsky
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-06-27 00:00:00.000000000 Z
11
+ date: 2021-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: influxdb
@@ -39,55 +39,64 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
42
+ name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '1.16'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '1.16'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rake
56
+ name: coveralls
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '10.0'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '10.0'
69
- description:
68
+ version: '0'
69
+ description:
70
70
  email:
71
71
  - vassilevsky@gmail.com
72
72
  executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
+ - ".coveralls.yml"
76
77
  - ".gitignore"
78
+ - ".rspec"
77
79
  - ".ruby-version"
80
+ - ".travis.yml"
81
+ - CHANGELOG.md
78
82
  - CODE_OF_CONDUCT.md
83
+ - CONTRIBUTING.md
79
84
  - Gemfile
85
+ - LICENSE
80
86
  - Makefile
81
87
  - README.md
82
88
  - Rakefile
89
+ - grafana_dashboard.json
83
90
  - lib/sidekiq/influxdb.rb
84
- - lib/sidekiq/influxdb/server_middleware.rb
85
91
  - lib/sidekiq/influxdb/version.rb
92
+ - lib/sidekiq/metrics/queues.rb
93
+ - lib/sidekiq/metrics/stats.rb
94
+ - lib/sidekiq/middleware/server/influxdb.rb
86
95
  - sidekiq-influxdb.gemspec
87
96
  homepage: https://github.com/vassilevsky/sidekiq-influxdb
88
97
  licenses: []
89
98
  metadata: {}
90
- post_install_message:
99
+ post_install_message:
91
100
  rdoc_options: []
92
101
  require_paths:
93
102
  - lib
@@ -102,9 +111,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
111
  - !ruby/object:Gem::Version
103
112
  version: '0'
104
113
  requirements: []
105
- rubyforge_project:
106
- rubygems_version: 2.6.13
107
- signing_key:
114
+ rubygems_version: 3.2.3
115
+ signing_key:
108
116
  specification_version: 4
109
117
  summary: Writes Sidekiq job metrics to InfluxDB
110
118
  test_files: []
@@ -1,78 +0,0 @@
1
- require 'set'
2
- require 'influxdb'
3
-
4
- module Sidekiq
5
- module InfluxDB
6
- class ServerMiddleware
7
- def initialize(
8
- influxdb_client:,
9
- series_name: 'sidekiq_jobs',
10
- retention_policy: nil,
11
- start_events: true,
12
- tags: {},
13
- except: []
14
- )
15
- @influxdb = influxdb_client
16
- @series = series_name
17
- @retention = retention_policy
18
- @start_events = start_events
19
- @tags = tags
20
- @secret_agents = Set.new(except)
21
- end
22
-
23
- def call(worker, msg, queue)
24
- if @secret_agents.include?(worker.class)
25
- yield
26
- return
27
- end
28
- t = Time.now.to_f
29
- data = {
30
- tags: {
31
- class: worker.class.name,
32
- queue: queue,
33
- event: 'start',
34
- }.merge(@tags),
35
- values: {
36
- jid: msg['jid'],
37
- creation_time: msg['created_at'],
38
- waited: t - msg['created_at'],
39
- },
40
- timestamp: in_correct_precision(t)
41
- }
42
- save(data) if @start_events
43
- begin
44
- yield
45
- data[:tags][:event] = 'finish'
46
- rescue => e
47
- data[:tags][:event] = 'error'
48
- data[:tags][:error] = e.class.name
49
- end
50
- tt = Time.now.to_f
51
- data[:values][:worked] = tt - t
52
- data[:values][:total] = tt - msg['created_at']
53
- data[:timestamp] = in_correct_precision(tt)
54
- save(data)
55
- raise e if e
56
- end
57
-
58
- private
59
-
60
- def save(data)
61
- @influxdb.write_point(@series, data, precision, @retention)
62
- end
63
-
64
- def precision
65
- @influxdb.config.time_precision
66
- end
67
-
68
- def in_correct_precision(t)
69
- case precision
70
- # In order of probability in real-world setups
71
- when 'ms' then (t * 1000).to_i
72
- when 's' then t.to_i
73
- when 'u' then (t * 1000000).to_i
74
- end
75
- end
76
- end
77
- end
78
- end