honeykiq 1.2.0 → 1.3.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: 0707fda7ab02e35cece97138ce692a99aa4e94b4fdbd29e146f2a12c0e15c2e0
4
- data.tar.gz: '0686f052a0cb97ea83f4621e079ea610a43ce3e9771f1155cdb36a962c9132e1'
3
+ metadata.gz: dd0cc1127fd3dfa658cb69820e243542bd84e614531405a8b95e4b9110e93bd7
4
+ data.tar.gz: 5e5d47b4301050821f7977e49da897e3dbd7f9d7312236cddd42dea0b3f29a7c
5
5
  SHA512:
6
- metadata.gz: 071fb39ceafad14abc0f3dd9200cef6c6f1459d4c3f0b389b534ed110bf3c81e89d9800774ad6f06899fe598c89011253d2efccaf385d025ceff4690c36e404d
7
- data.tar.gz: 001a4165c484889b3eba3755cf98d301c4bd6dc1a1a5274eb85ac05d5cfd49361080cb5ebb0c5723b77afb3d638dfef82d7c49cc940a9cf86c5f26a82016e3ff
6
+ metadata.gz: 4def9fb593162c5e7246527e50de7538561aad8153b31ecfa12b1182897445c09902b3a67f76cada6bffb4fdd542a10cfa08f8ae39cea73c201f51d86a4b0536
7
+ data.tar.gz: 03242d018493326a2314fe07c80a15fbaed72c048a300ae7226c9802057886920cccf86d93a6e43cc167fd9d3a2b8794c06863ca175025687b2c185cd3e84c95
@@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.3.0]
10
+ ### Added
11
+ - Allow beeline tracing to be configured (#11)
12
+
9
13
  ## [1.2.0]
10
14
  ### Added
11
15
  - Allow extra_fields to be invoked with job (#16)
@@ -38,6 +42,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
38
42
  - `Honeykiq.periodic_reporter`. (Use `Honeykiq::PeriodicReporter.new` instead.)
39
43
 
40
44
  [Unreleased]: https://github.com/carwow/honeykiq/compare/v1.2.0...HEAD
45
+ [1.3.0]: https://github.com/carwow/honeykiq/compare/v1.2.0...v1.3.0
41
46
  [1.2.0]: https://github.com/carwow/honeykiq/compare/v1.1.0...v1.2.0
42
47
  [1.1.0]: https://github.com/carwow/honeykiq/compare/v1.0.0...v1.1.0
43
48
  [1.0.0]: https://github.com/carwow/honeykiq/compare/v0.3.1...v1.0.0
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- honeykiq (1.2.0)
4
+ honeykiq (1.3.0)
5
5
  sidekiq
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -15,14 +15,53 @@ gem 'honeykiq'
15
15
 
16
16
  ## Usage
17
17
 
18
- The library provides two use cases:
18
+ The library provides three use cases:
19
19
 
20
+ - [`Honeykiq::ClientMiddleware`]
20
21
  - [`Honeykiq::ServerMiddleware`]
21
22
  - [`Honeykiq::PeriodicReporter`]
22
23
 
24
+ [`Honeykiq::ClientMiddleware`]: #HoneykiqClientMiddleware
23
25
  [`Honeykiq::ServerMiddleware`]: #HoneykiqServerMiddleware
24
26
  [`Honeykiq::PeriodicReporter`]: #HoneykiqPeriodicReporter
25
27
 
28
+ ### Honeykiq::ClientMiddleware
29
+
30
+ Add Honeykiq to your Sidekiq client middleware chain. It will propagate tracing
31
+ fields when used in combination with `Honeykiq::ServerMiddleware`.
32
+
33
+ This middleware is **only** configured to work with the `Honeycomb` beeline gem,
34
+ not with a custom `Libhoney` client.
35
+
36
+ ```ruby
37
+ # Configure Honeycomb beeline
38
+ Honeycomb.configure do |config|
39
+ config.writekey = ENV.fetch('HONEYCOMB_WRITE_KEY')
40
+ config.dataset = ENV.fetch('HONEYCOMB_DATASET')
41
+ end
42
+
43
+ # Add the middleware to Sidekiq chain
44
+ Sidekiq.configure_server do |config|
45
+ config.server_middleware do |chain|
46
+ # tracing_mode: options are :link or :child
47
+ # - :link will use link events https://docs.honeycomb.io/getting-data-in/tracing/send-trace-data/#links
48
+ # - :child will use add the job as a span to the enqueing trace
49
+ chain.add Honeykiq::ServerMiddleware, tracing_mode: :link
50
+ end
51
+
52
+ # Configure the servers client. Used when a worker enqueues a job itself.
53
+ config.client_middleware do |chain|
54
+ chain.add Honeykiq::ClientMiddleware
55
+ end
56
+ end
57
+
58
+ Sidekiq.configure_client do |config|
59
+ config.client_middleware do |chain|
60
+ chain.add Honeykiq::ClientMiddleware
61
+ end
62
+ end
63
+ ```
64
+
26
65
  ### Honeykiq::ServerMiddleware
27
66
 
28
67
  Add Honeykiq to your Sidekiq server middleware chain. It will send an event to
@@ -2,4 +2,7 @@ module Honeykiq
2
2
  autoload :Version, 'honeykiq/version'
3
3
  autoload :PeriodicReporter, 'honeykiq/periodic_reporter'
4
4
  autoload :ServerMiddleware, 'honeykiq/server_middleware'
5
+ autoload :ClientMiddleware, 'honeykiq/client_middleware'
6
+ autoload :BeelineSpan, 'honeykiq/beeline_span'
7
+ autoload :LibhoneySpan, 'honeykiq/libhoney_span'
5
8
  end
@@ -0,0 +1,54 @@
1
+ module Honeykiq
2
+ class BeelineSpan
3
+ def initialize(tracing_mode)
4
+ @tracing_mode = tracing_mode
5
+ end
6
+
7
+ def call(name:, serialized_trace:, &block)
8
+ case tracing_mode
9
+ when :link then link_span(name, serialized_trace, &block)
10
+ when :child then child_span(name, serialized_trace, &block)
11
+ else
12
+ Honeycomb.start_span(name: name, &block)
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ attr_reader :tracing_mode
19
+
20
+ def link_span(name, serialized_trace)
21
+ Honeycomb.start_span(name: name) do |event|
22
+ link_to_enqueuing_trace(event, serialized_trace)
23
+
24
+ yield event
25
+ end
26
+ end
27
+
28
+ def child_span(name, serialized_trace)
29
+ Honeycomb.start_span(name: name, serialized_trace: serialized_trace) do |event|
30
+ yield event
31
+ end
32
+ end
33
+
34
+ def link_to_enqueuing_trace(current, serialized_trace)
35
+ return unless serialized_trace
36
+
37
+ trace_id, parent_span_id, = TraceParser.parse(serialized_trace)
38
+
39
+ Honeycomb.libhoney.event.add(
40
+ 'trace.link.trace_id': trace_id,
41
+ 'trace.link.span_id': parent_span_id,
42
+ 'meta.span_type': 'link',
43
+ 'trace.parent_id': current.id,
44
+ 'trace.trace_id': current.trace.id
45
+ ).send
46
+ end
47
+
48
+ if defined?(Honeycomb)
49
+ class TraceParser
50
+ extend Honeycomb::PropagationParser
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,9 @@
1
+ module Honeykiq
2
+ class ClientMiddleware
3
+ def call(_, job, _, _)
4
+ job['serialized_trace'] = Honeycomb.current_span&.to_trace_header
5
+
6
+ yield
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,37 @@
1
+ module Honeykiq
2
+ class LibhoneySpan
3
+ def initialize(libhoney)
4
+ @libhoney = libhoney
5
+ end
6
+
7
+ def call(*)
8
+ libhoney.event.tap do |event|
9
+ duration_ms(event) { yield event }
10
+ ensure
11
+ event.send
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ attr_reader :libhoney
18
+
19
+ def duration_ms(event)
20
+ start_time = now
21
+ yield
22
+ ensure
23
+ duration = now - start_time
24
+ event.add_field(:duration_ms, duration * 1000)
25
+ end
26
+
27
+ if defined?(Process::CLOCK_MONOTONIC)
28
+ def now
29
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
30
+ end
31
+ else
32
+ def now
33
+ Time.now
34
+ end
35
+ end
36
+ end
37
+ end
@@ -2,15 +2,16 @@ require 'sidekiq/api'
2
2
 
3
3
  module Honeykiq
4
4
  class ServerMiddleware
5
- def initialize(libhoney: nil, honey_client: nil)
5
+ def initialize(libhoney: nil, honey_client: nil, tracing_mode: nil)
6
6
  @libhoney = libhoney || honey_client
7
+ @tracing_mode = tracing_mode
7
8
  end
8
9
 
9
10
  def call(_worker, msg, queue_name)
10
11
  job = Sidekiq::Job.new(msg, queue_name)
11
12
  queue = Sidekiq::Queue.new(queue_name)
12
13
 
13
- start_span(name: job.display_class) do |event|
14
+ span_builder.call(name: job.display_class, serialized_trace: msg['serialized_trace']) do |event|
14
15
  call_with_event(event, job, queue) { yield }
15
16
  end
16
17
  end
@@ -21,22 +22,14 @@ module Honeykiq
21
22
 
22
23
  private
23
24
 
24
- attr_reader :libhoney
25
+ attr_reader :libhoney, :tracing_mode
25
26
 
26
27
  def libhoney?
27
28
  !!libhoney
28
29
  end
29
30
 
30
- def start_span(name:)
31
- if libhoney?
32
- libhoney.event.tap do |event|
33
- duration_ms(event) { yield event }
34
- ensure
35
- event.send
36
- end
37
- else
38
- Honeycomb.start_span(name: name) { |event| yield event }
39
- end
31
+ def span_builder
32
+ @span_builder ||= libhoney? ? LibhoneySpan.new(libhoney) : BeelineSpan.new(tracing_mode)
40
33
  end
41
34
 
42
35
  def call_with_event(event, job, queue)
@@ -77,14 +70,6 @@ module Honeykiq
77
70
  }
78
71
  end
79
72
 
80
- def duration_ms(event)
81
- start_time = now
82
- yield
83
- ensure
84
- duration = now - start_time
85
- event.add_field(:duration_ms, duration * 1000)
86
- end
87
-
88
73
  def on_error(event, error)
89
74
  return unless event
90
75
 
@@ -103,15 +88,5 @@ module Honeykiq
103
88
  else extra_fields(job)
104
89
  end
105
90
  end
106
-
107
- if defined?(Process::CLOCK_MONOTONIC)
108
- def now
109
- Process.clock_gettime(Process::CLOCK_MONOTONIC)
110
- end
111
- else
112
- def now
113
- Time.now
114
- end
115
- end
116
91
  end
117
92
  end
@@ -1,3 +1,3 @@
1
1
  module Honeykiq
2
- VERSION = '1.2.0'.freeze
2
+ VERSION = '1.3.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: honeykiq
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - carwow Developers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-29 00:00:00.000000000 Z
11
+ date: 2020-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -128,6 +128,9 @@ files:
128
128
  - Rakefile
129
129
  - honeykiq.gemspec
130
130
  - lib/honeykiq.rb
131
+ - lib/honeykiq/beeline_span.rb
132
+ - lib/honeykiq/client_middleware.rb
133
+ - lib/honeykiq/libhoney_span.rb
131
134
  - lib/honeykiq/periodic_reporter.rb
132
135
  - lib/honeykiq/server_middleware.rb
133
136
  - lib/honeykiq/version.rb