honeykiq 0.1.0 → 0.2.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
2
  SHA256:
3
- metadata.gz: 6fe3d4a4b5312e30b13477915e40534824d4c3822db65051b6e344007d513b04
4
- data.tar.gz: 32a1df92ef150b084871b05365699f08c4a40efe92854c72175d1cdd31e5b662
3
+ metadata.gz: 44fbbee328df450194663816c3f3cdb196970dfd8be5b9bcb547569255e44513
4
+ data.tar.gz: cb8fbe2e9ab677c6f2aa360729b23f26de1b0c37a417057c142307850e260da3
5
5
  SHA512:
6
- metadata.gz: c589ef0b5bb7dbcc8a93200fc9e06b3d6ab85bde7ef0bc0ea98c15741f9117fed3c000d876b2acebb0502c5d8f17bd60a40362521ae139bfe919a08efe0a1d74
7
- data.tar.gz: 645a9554dd0313970a8e78e80f5d207da4ac2300a280f6f3442df811e743d535a236c57928935012fcea6e9476cd4b960583066de0a1212b3eeff752cee466d5
6
+ metadata.gz: 0e85c6f494daadd232009dec33a5fe616d058a1a7e69f04bd7fd124b2c96f7cec240cb4fc6a5df0c7a435087de101f7de0adedc13032276d69e2def17d4378bd
7
+ data.tar.gz: 8d9bcfcdedd91ffa9d26b537e2fa38a44386053a172c67b44029742b795b6341f47568df28096035c6b24f9b12e517e3f88871502694559ba46805cc057a5780
@@ -0,0 +1,17 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.2.0]
10
+ ### Added
11
+ - `Honeykiq::ServerMiddleware` 🙌
12
+
13
+ ### Removed
14
+ - `Honeykiq.periodic_reporter`. (Use `Honeykiq::PeriodicReporter.new` instead.)
15
+
16
+ [Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.2.0...HEAD
17
+ [0.2.0]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.1.0...v0.2.0
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- honeykiq (0.1.0)
4
+ honeykiq (0.2.0)
5
5
  sidekiq
6
6
 
7
7
  GEM
@@ -13,6 +13,7 @@ GEM
13
13
  carwow_rubocop (2.1.1)
14
14
  rubocop (~> 0.58)
15
15
  rubocop-rspec (~> 1.28)
16
+ coderay (1.1.2)
16
17
  connection_pool (2.2.2)
17
18
  diff-lcs (1.3)
18
19
  domain_name (0.5.20180417)
@@ -30,10 +31,14 @@ GEM
30
31
  libhoney (1.11.0)
31
32
  addressable (~> 2.0)
32
33
  http (>= 2.0, < 4.0)
34
+ method_source (0.9.2)
33
35
  parallel (1.12.1)
34
36
  parser (2.5.3.0)
35
37
  ast (~> 2.4.0)
36
38
  powerpack (0.1.2)
39
+ pry (0.12.2)
40
+ coderay (~> 1.1.0)
41
+ method_source (~> 0.9.0)
37
42
  public_suffix (3.0.3)
38
43
  rack (2.0.6)
39
44
  rack-protection (2.0.4)
@@ -82,6 +87,7 @@ DEPENDENCIES
82
87
  carwow_rubocop
83
88
  honeykiq!
84
89
  libhoney
90
+ pry
85
91
  rake
86
92
  rspec
87
93
 
data/README.md CHANGED
@@ -14,15 +14,49 @@ gem 'honeykiq'
14
14
 
15
15
  ## Usage
16
16
 
17
- At the moment the library only provides a periodic reporter which should be
18
- scheduled to report every few seconds depending on your use case.
17
+ The library provides two use cases:
19
18
 
20
- ### Periodic Reporter
19
+ - [`Honeykiq::ServerMiddleware`]
20
+ - [`Honeykiq::PeriodicReporter`]
21
21
 
22
- The periodic reporter will send one event with information about the sidekiq
23
- instance, plus one event per sidekiq process, plus one event per sidekiq queue.
24
- Have a look at [periodic_reporter.rb] to see what kind of information we send
25
- for each type.
22
+ [`Honeykiq::ServerMiddleware`]: #HoneykiqServerMiddleware
23
+ [`Honeykiq::PeriodicReporter`]: #HoneykiqPeriodicReporter
24
+
25
+ ### Honeykiq::ServerMiddleware
26
+
27
+ Add it to Sidekiq server middleware chain and pass a `Libhoney::Client` as
28
+ shown below. It will send an event to Honeycomb once a job finishes or fails.
29
+ Have a look at [server_middleware.rb] to see what kind of information we send.
30
+
31
+ [server_middleware.rb]: https://github.com/carwow/honeykiq/blob/master/lib/honeykiq/server_middleware.rb
32
+
33
+ ```ruby
34
+ Sidekiq.configure_server do |config|
35
+ config.server_middleware do |chain|
36
+ chain.add Honeykiq::ServerMiddleware,
37
+ honey_client: Libhoney::Client.new(
38
+ writekey: ENV.fetch('HONEYCOMB_WRITE_KEY'),
39
+ dataset: ENV.fetch('HONEYCOMB_DATASET')
40
+ )
41
+ end
42
+ end
43
+ ```
44
+
45
+ **Note on long running jobs:** If you have long running jobs an event is only
46
+ sent to Honeycomb when it finishes so it may appear as no jobs are running.
47
+ Also if the process gets a SIGKILL then no event is sent about that job and the
48
+ job may keep retrying and not appear in Honeycomb. The `PeriodicReporter`
49
+ should help with this but we are thinking of a nicer approach.
50
+
51
+ ### Honeykiq::PeriodicReporter
52
+
53
+ The periodic reporter should be scheduled to report every few seconds depending
54
+ on your use case (e.g. 30 seconds). Every time the `#report` method is called
55
+ it will send a total of `1 + P + Q` events to Honeycomb where P and Q are the
56
+ number of processes and queues respectively.
57
+
58
+ It sends three types of events: instance, process, and queue. Have a look at
59
+ [periodic_reporter.rb] to see what kind of information we send for each type.
26
60
 
27
61
  [periodic_reporter.rb]: https://github.com/carwow/honeykiq/blob/master/lib/honeykiq/periodic_reporter.rb
28
62
 
@@ -45,7 +79,7 @@ module SidekiqHealth
45
79
  end
46
80
 
47
81
  def self.reporter
48
- @reporter ||= Honeykiq.periodic_reporter(honey_client: honey_client)
82
+ @reporter ||= Honeykiq::PeriodicReporter.new(honey_client: honey_client)
49
83
  end
50
84
 
51
85
  def self.honey_client
@@ -29,6 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.add_development_dependency 'bundler'
30
30
  spec.add_development_dependency 'carwow_rubocop'
31
31
  spec.add_development_dependency 'libhoney'
32
+ spec.add_development_dependency 'pry'
32
33
  spec.add_development_dependency 'rake'
33
34
  spec.add_development_dependency 'rspec'
34
35
  end
@@ -1,8 +1,5 @@
1
1
  module Honeykiq
2
2
  autoload :Version, 'honeykiq/version'
3
3
  autoload :PeriodicReporter, 'honeykiq/periodic_reporter'
4
-
5
- def self.periodic_reporter(honey_client:)
6
- @reporter = Honeykiq::PeriodicReporter.new(honey_client: honey_client)
7
- end
4
+ autoload :ServerMiddleware, 'honeykiq/server_middleware'
8
5
  end
@@ -4,7 +4,6 @@ module Honeykiq
4
4
  class PeriodicReporter
5
5
  def initialize(honey_client:)
6
6
  @honey_client = honey_client
7
- @extra = {}
8
7
  end
9
8
 
10
9
  def report(&extra)
@@ -0,0 +1,62 @@
1
+ require 'sidekiq/api'
2
+
3
+ module Honeykiq
4
+ class ServerMiddleware
5
+ def initialize(options = {})
6
+ @honey_client = options.fetch(:honey_client)
7
+ end
8
+
9
+ def call(_worker, msg, queue_name)
10
+ event = @honey_client.event.add(**all_fields(msg, queue_name))
11
+ duration_ms(event) { yield }
12
+ event.add_field(:'job.status', 'finished')
13
+ rescue StandardError => error
14
+ event&.add_field(:'job.status', 'failed')
15
+ event&.add(error_info(error))
16
+ raise
17
+ ensure
18
+ event&.send
19
+ end
20
+
21
+ private
22
+
23
+ def all_fields(msg, queue_name)
24
+ {
25
+ type: :job,
26
+ **job_fields(Sidekiq::Job.new(msg, queue_name)),
27
+ **queue_fields(Sidekiq::Queue.new(queue_name)),
28
+ 'meta.thread_id': Thread.current.object_id
29
+ }
30
+ end
31
+
32
+ def job_fields(job)
33
+ {
34
+ 'job.class': job.display_class,
35
+ 'job.attempt_number': (job['retry_count'].to_i.nonzero? || 0) + 1,
36
+ 'job.id': job.jid,
37
+ 'job.arguments_bytes': job.args.to_json.bytesize,
38
+ 'job.latency_sec': job.latency,
39
+ 'job.batch_id': job['bid']
40
+ }.compact
41
+ end
42
+
43
+ def queue_fields(queue)
44
+ {
45
+ 'queue.name': queue.name,
46
+ 'queue.size': queue.size
47
+ }
48
+ end
49
+
50
+ def duration_ms(event)
51
+ start_time = Time.now
52
+ yield
53
+ ensure
54
+ duration = Time.now - start_time
55
+ event.add_field(:duration_ms, duration * 1000)
56
+ end
57
+
58
+ def error_info(error)
59
+ { 'error.class': error.class.name, 'error.message': error.message }
60
+ end
61
+ end
62
+ end
@@ -1,3 +1,3 @@
1
1
  module Honeykiq
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: honeykiq
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
  - carwow Developers
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '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'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rake
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -105,6 +119,7 @@ files:
105
119
  - ".gitignore"
106
120
  - ".rspec"
107
121
  - ".rubocop.yml"
122
+ - CHANGELOG.md
108
123
  - Gemfile
109
124
  - Gemfile.lock
110
125
  - LICENSE.txt
@@ -113,6 +128,7 @@ files:
113
128
  - honeykiq.gemspec
114
129
  - lib/honeykiq.rb
115
130
  - lib/honeykiq/periodic_reporter.rb
131
+ - lib/honeykiq/server_middleware.rb
116
132
  - lib/honeykiq/version.rb
117
133
  homepage: https://github.com/carwow/honeykiq
118
134
  licenses: