freddy 1.3.3 → 1.4.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
  SHA1:
3
- metadata.gz: 6809d8dfe197985c19b6532983f40188859b6bd6
4
- data.tar.gz: c1d04587a9098019a7a7ccb832c520cabfa6031d
3
+ metadata.gz: 98d55ddef79dc7231d80d81a8c777a20ffa09685
4
+ data.tar.gz: c3f6ab7881cc7c22bcee599db7c60318522fe8a2
5
5
  SHA512:
6
- metadata.gz: d3d3963b6684b4666459e31f5985da07243ef7296cd19c60d63a54f1abde9a1f6e960a60d49eabc3922b9a92a15a01b9a96fdfc759f5f96aa24098793723313e
7
- data.tar.gz: 9b9e3e1dd2d0660163f7bbad86ecced0e710a1ec6c34ccc9c0c5af1f77f492f9cb7ae4975813e82a2f620d4cae1a376e27d21cadeb9d57f7483900e0d5468436
6
+ metadata.gz: fb2fb6945b67811ed7b211d360ffba3f0b63a2ba4a8dcc7bf5f94f3f8c46ca0fb9092a0ab982b69804bf4d054152df1ac4a8bf01df98058bb095890820f86482
7
+ data.tar.gz: c56d8aaffbe32d22c5e5e761f4a13d0c9075ca398ca5865c4808d9d9b38e3c550b64326bb747d8de4141eaeddeb582614ad8aafd9f0e772349a30948850b8f27
data/Gemfile CHANGED
@@ -4,6 +4,6 @@ gem 'rspec'
4
4
  gem 'pry'
5
5
  gem 'codeclimate-test-reporter'
6
6
  gem 'hamster', '~> 3.0'
7
- gem 'logasm-tracer', '0.3.0'
7
+ gem 'opentracing_test_tracer', '~> 0.1'
8
8
 
9
9
  gemspec
data/README.md CHANGED
@@ -142,34 +142,9 @@ Freddy supports [OpenTracing API|https://github.com/opentracing/opentracing-ruby
142
142
  OpenTracing.global_tracing = MyTracerImplementation.new(...)
143
143
  ```
144
144
 
145
- For example you can use [Logasm::Tracer](https://github.com/salemove/logasm-tracer) which will log all incoming and outgoing requests with trace ID, parent ID and span ID.
145
+ Current trace can be accessed through a thread-local variable `OpenTracing.active_span`. Calling `deliver` or `deliver_with_response` will pass trace context to down-stream services.
146
146
 
147
- Current trace can be accessed through a thread-local variable `Freddy.trace`. Calling `deliver` or `deliver_with_response` will pass trace context to down-stream services.
148
-
149
- Accessing trace information when using Logasm::Tracer implementation:
150
-
151
- ```ruby
152
- freddy1 = Freddy.build
153
- freddy1.respond_do('service1') do |payload, msg_handler|
154
- puts "Trace id: #{Freddy.trace.context.trace_id}"
155
- puts "Span id: #{Freddy.trace.context.span_id}"
156
-
157
- freddy1.deliver('service2', {})
158
- end
159
-
160
- freddy2 = Freddy.build
161
- freddy2.tap_into('service2') do |payload|
162
- puts "Has same trace_id as the request in service1: #{Freddy.trace.context.trace_id}"
163
- puts "Has service1 request span id as parent id: #{Freddy.trace.context.parent_id}"
164
- puts "Has its own generated span id: #{Freddy.trace.context.span_id}"
165
- end
166
- ```
167
-
168
- In case you already have an ongoing OpenTracing span (e.g. provided by REST API) then you can pass the trace information to Freddy by doing:
169
- ```ruby
170
- Freddy.trace = trace_span
171
- ```
172
- The `trace_span` must implement OpenTracing::Span interface.
147
+ See [opentracing-ruby](https://github.com/opentracing/opentracing-ruby) for more information.
173
148
 
174
149
  ## Notes about concurrency
175
150
 
data/freddy.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  else
9
9
  spec.name = "freddy"
10
10
  end
11
- spec.version = '1.3.3'
11
+ spec.version = '1.4.0'
12
12
  spec.authors = ["Salemove TechMovers"]
13
13
  spec.email = ["techmovers@salemove.com"]
14
14
  spec.description = %q{Messaging API}
@@ -34,14 +34,14 @@ class Freddy
34
34
  def process_message(delivery, &block)
35
35
  @consume_thread_pool.process do
36
36
  begin
37
- Freddy.trace = delivery.build_trace("freddy:respond:#{@destination}",
37
+ scope = delivery.build_trace("freddy:respond:#{@destination}",
38
38
  tags: {
39
39
  'peer.address': "#{@destination}:#{delivery.payload[:type]}",
40
40
  'component': 'freddy',
41
41
  'span.kind': 'server' # RPC
42
42
  }
43
43
  )
44
- Freddy.trace.log_kv(
44
+ scope.span.log_kv(
45
45
  event: 'Received message through respond_to',
46
46
  queue: @destination,
47
47
  payload: delivery.payload,
@@ -51,8 +51,7 @@ class Freddy
51
51
  block.call(delivery)
52
52
  ensure
53
53
  @channel.acknowledge(delivery.tag, false)
54
- Freddy.trace.finish
55
- Freddy.trace = nil
54
+ scope.close
56
55
  end
57
56
  end
58
57
  end
@@ -42,7 +42,7 @@ class Freddy
42
42
  def process_message(queue, delivery, &block)
43
43
  @consume_thread_pool.process do
44
44
  begin
45
- Freddy.trace = delivery.build_trace("freddy:observe:#{@pattern}",
45
+ scope = delivery.build_trace("freddy:observe:#{@pattern}",
46
46
  tags: {
47
47
  'message_bus.destination': @pattern,
48
48
  'component': 'freddy',
@@ -50,7 +50,7 @@ class Freddy
50
50
  },
51
51
  force_follows_from: true
52
52
  )
53
- Freddy.trace.log_kv(
53
+ scope.span.log_kv(
54
54
  event: 'Received message through tap_into',
55
55
  payload: delivery.payload,
56
56
  correlation_id: delivery.correlation_id
@@ -59,8 +59,7 @@ class Freddy
59
59
  block.call delivery.payload, delivery.routing_key
60
60
  ensure
61
61
  @channel.acknowledge(delivery.tag, false)
62
- Freddy.trace.finish
63
- Freddy.trace = nil
62
+ scope.close
64
63
  end
65
64
  end
66
65
  end
@@ -23,23 +23,18 @@ class Freddy
23
23
 
24
24
  def build_trace(operation_name, tags: {}, force_follows_from: false)
25
25
  carrier = TraceCarrier.new(@metadata)
26
- parent =
27
- if expecting_response? && !force_follows_from
28
- OpenTracing.global_tracer.extract(OpenTracing::FORMAT_TEXT_MAP, carrier)
26
+ parent = OpenTracing.global_tracer.extract(OpenTracing::FORMAT_TEXT_MAP, carrier)
27
+
28
+ references =
29
+ if !parent
30
+ []
31
+ elsif force_follows_from
32
+ [OpenTracing::Reference.follows_from(parent)]
29
33
  else
30
- nil
34
+ [OpenTracing::Reference.child_of(parent)]
31
35
  end
32
36
 
33
- # Creating a child span when the message sender is expecting a response.
34
- # Otherwise creating a new trace because the OpenTracing client does not
35
- # support FollowsFrom yet.
36
- OpenTracing.start_span(operation_name, child_of: parent, tags: tags)
37
- end
38
-
39
- private
40
-
41
- def expecting_response?
42
- type == 'request'
37
+ OpenTracing.start_active_span(operation_name, references: references, tags: tags)
43
38
  end
44
39
  end
45
40
  end
@@ -9,7 +9,11 @@ class Freddy
9
9
  end
10
10
 
11
11
  def produce(destination, payload, properties)
12
- Freddy.trace.log_kv event: 'Sending response', queue: destination, payload: payload
12
+ OpenTracing.active_span.log_kv(
13
+ event: 'Sending response',
14
+ queue: destination,
15
+ payload: payload
16
+ )
13
17
 
14
18
  properties = properties.merge(
15
19
  routing_key: destination,
@@ -11,7 +11,6 @@ class Freddy
11
11
 
12
12
  def produce(destination, payload, properties)
13
13
  span = OpenTracing.start_span("freddy:notify:#{destination}",
14
- child_of: Freddy.trace,
15
14
  tags: {
16
15
  'message_bus.destination': destination,
17
16
  'component': 'freddy',
@@ -24,11 +24,10 @@ class Freddy
24
24
 
25
25
  def produce(destination, payload, timeout_in_seconds:, delete_on_timeout:, **properties)
26
26
  span = OpenTracing.start_span("freddy:request:#{destination}",
27
- child_of: Freddy.trace,
28
27
  tags: {
29
28
  'component': 'freddy',
30
29
  'span.kind': 'client', # RPC
31
- 'payload.type': payload[:type]
30
+ 'payload.type': payload[:type] || 'unknown'
32
31
  }
33
32
  )
34
33
 
data/lib/freddy.rb CHANGED
@@ -32,12 +32,16 @@ class Freddy
32
32
  new(connection, logger, max_concurrency)
33
33
  end
34
34
 
35
+ # @deprecated Use {OpenTracing.active_span} instead
35
36
  def self.trace
36
- Thread.current[:freddy_trace]
37
+ OpenTracing.active_span
37
38
  end
38
39
 
40
+ # @deprecated Use OpenTracing ScopeManager instead
39
41
  def self.trace=(trace)
40
- Thread.current[:freddy_trace] = trace
42
+ if OpenTracing.active_span != trace
43
+ OpenTracing.scope_manager.activate(trace)
44
+ end
41
45
  end
42
46
 
43
47
  def initialize(connection, logger, max_concurrency)
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
- require 'logasm/tracer'
2
+ require 'opentracing_test_tracer'
3
3
 
4
4
  describe 'Tracing' do
5
- let(:tracer) { Logasm::Tracer.new(logger) }
5
+ let(:tracer) { OpenTracingTestTracer.build(logger: logger) }
6
6
  let(:logger) { spy }
7
7
 
8
8
  before { OpenTracing.global_tracer = tracer }
@@ -19,9 +19,9 @@ describe 'Tracing' do
19
19
  freddy.respond_to(destination) do |payload, msg_handler|
20
20
  msg_handler.success({
21
21
  trace_initiator: {
22
- trace_id: Freddy.trace.context.trace_id,
23
- parent_id: Freddy.trace.context.parent_id,
24
- span_id: Freddy.trace.context.span_id
22
+ trace_id: active_span.context.trace_id,
23
+ parent_id: active_span.context.parent_id,
24
+ span_id: active_span.context.span_id
25
25
  },
26
26
  current_receiver: freddy.deliver_with_response(destination2, {})
27
27
  })
@@ -29,9 +29,9 @@ describe 'Tracing' do
29
29
 
30
30
  freddy2.respond_to(destination2) do |payload, msg_handler|
31
31
  msg_handler.success({
32
- trace_id: Freddy.trace.context.trace_id,
33
- parent_id: Freddy.trace.context.parent_id,
34
- span_id: Freddy.trace.context.span_id
32
+ trace_id: active_span.context.trace_id,
33
+ parent_id: active_span.context.parent_id,
34
+ span_id: active_span.context.span_id
35
35
  })
36
36
  end
37
37
  end
@@ -76,9 +76,9 @@ describe 'Tracing' do
76
76
  freddy.respond_to(destination) do |payload, msg_handler|
77
77
  msg_handler.success({
78
78
  trace_initiator: {
79
- trace_id: Freddy.trace.context.trace_id,
80
- parent_id: Freddy.trace.context.parent_id,
81
- span_id: Freddy.trace.context.span_id
79
+ trace_id: active_span.context.trace_id,
80
+ parent_id: active_span.context.parent_id,
81
+ span_id: active_span.context.span_id
82
82
  }
83
83
  }.merge(freddy.deliver_with_response(destination2, {})))
84
84
  end
@@ -86,9 +86,9 @@ describe 'Tracing' do
86
86
  freddy2.respond_to(destination2) do |payload, msg_handler|
87
87
  msg_handler.success({
88
88
  previous_receiver: {
89
- trace_id: Freddy.trace.context.trace_id,
90
- parent_id: Freddy.trace.context.parent_id,
91
- span_id: Freddy.trace.context.span_id
89
+ trace_id: active_span.context.trace_id,
90
+ parent_id: active_span.context.parent_id,
91
+ span_id: active_span.context.span_id
92
92
  },
93
93
  current_receiver: freddy2.deliver_with_response(destination3, {})
94
94
  })
@@ -96,9 +96,9 @@ describe 'Tracing' do
96
96
 
97
97
  freddy3.respond_to(destination3) do |payload, msg_handler|
98
98
  msg_handler.success({
99
- trace_id: Freddy.trace.context.trace_id,
100
- parent_id: Freddy.trace.context.parent_id,
101
- span_id: Freddy.trace.context.span_id
99
+ trace_id: active_span.context.trace_id,
100
+ parent_id: active_span.context.parent_id,
101
+ span_id: active_span.context.span_id
102
102
  })
103
103
  end
104
104
  end
@@ -130,4 +130,8 @@ describe 'Tracing' do
130
130
  expect(current_receiver.fetch(:span_id)).to_not eq(previous_receiver.fetch(:span_id))
131
131
  end
132
132
  end
133
+
134
+ def active_span
135
+ OpenTracing.active_span
136
+ end
133
137
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: freddy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.3
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Salemove TechMovers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-09 00:00:00.000000000 Z
11
+ date: 2018-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -144,7 +144,6 @@ files:
144
144
  - spec/freddy/sync_response_container_spec.rb
145
145
  - spec/freddy/trace_carrier_spec.rb
146
146
  - spec/integration/concurrency_spec.rb
147
- - spec/integration/logging_spec.rb
148
147
  - spec/integration/reply_spec.rb
149
148
  - spec/integration/tap_into_with_group_spec.rb
150
149
  - spec/integration/tracing_spec.rb
@@ -183,7 +182,6 @@ test_files:
183
182
  - spec/freddy/sync_response_container_spec.rb
184
183
  - spec/freddy/trace_carrier_spec.rb
185
184
  - spec/integration/concurrency_spec.rb
186
- - spec/integration/logging_spec.rb
187
185
  - spec/integration/reply_spec.rb
188
186
  - spec/integration/tap_into_with_group_spec.rb
189
187
  - spec/integration/tracing_spec.rb
@@ -1,101 +0,0 @@
1
- require 'spec_helper'
2
- require 'logasm/tracer'
3
-
4
- describe 'Logging with Logasm::Tracer' do
5
- let(:logger) { ArrayLogger.new }
6
- let(:tracer) { Logasm::Tracer.new(logger) }
7
-
8
- before { OpenTracing.global_tracer = tracer }
9
- after { OpenTracing.global_tracer = nil }
10
-
11
- context 'when receiving an untraced request' do
12
- let(:freddy) { Freddy.build(spy, config) }
13
- let(:destination) { random_destination }
14
-
15
- before do
16
- freddy.respond_to(destination) do |payload, msg_handler|
17
- sleep 0.1 # emulate some processing
18
- msg_handler.success({})
19
- end
20
- end
21
-
22
- after { freddy.close }
23
-
24
- it 'generates a trace' do
25
- freddy.deliver_with_response(destination, {})
26
-
27
- expect(logger.calls.map(&:first)).to eq([
28
- # Initiator
29
- "Span [freddy:request:#{destination}] started",
30
- "Span [freddy:request:#{destination}] Publishing request",
31
-
32
- # Service
33
- "Span [freddy:respond:#{destination}] started",
34
- "Span [freddy:respond:#{destination}] Received message through respond_to",
35
- "Span [freddy:respond:#{destination}] Sending response",
36
- "Span [freddy:respond:#{destination}] finished",
37
-
38
- # Initiator
39
- "Span [freddy:request:#{destination}] finished"
40
- ])
41
- end
42
- end
43
-
44
- context 'when receiving a traced request' do
45
- let(:freddy) { Freddy.build(spy, config) }
46
- let(:freddy2) { Freddy.build(spy, config) }
47
-
48
- let(:destination) { random_destination }
49
- let(:destination2) { random_destination }
50
-
51
- before do
52
- freddy.respond_to(destination) do |payload, msg_handler|
53
- sleep 0.1 # emulate some processing
54
- msg_handler.success({
55
- trace_initiator: {},
56
- current_receiver: freddy.deliver_with_response(destination2, {})
57
- })
58
- end
59
-
60
- freddy2.respond_to(destination2) do |payload, msg_handler|
61
- sleep 0.1 # emulate some processing
62
- msg_handler.success({})
63
- end
64
- end
65
-
66
- after do
67
- freddy.close
68
- freddy2.close
69
- end
70
-
71
- it 'generates a trace' do
72
- freddy.deliver_with_response(destination, {})
73
-
74
- expect(logger.calls.map(&:first)).to eq([
75
- # Initiator
76
- "Span [freddy:request:#{destination}] started",
77
- "Span [freddy:request:#{destination}] Publishing request",
78
-
79
- # Service 1
80
- "Span [freddy:respond:#{destination}] started",
81
- "Span [freddy:respond:#{destination}] Received message through respond_to",
82
- "Span [freddy:request:#{destination2}] started",
83
- "Span [freddy:request:#{destination2}] Publishing request",
84
-
85
- # Service 2
86
- "Span [freddy:respond:#{destination2}] started",
87
- "Span [freddy:respond:#{destination2}] Received message through respond_to",
88
- "Span [freddy:respond:#{destination2}] Sending response",
89
- "Span [freddy:respond:#{destination2}] finished",
90
-
91
- # Service 1
92
- "Span [freddy:request:#{destination2}] finished",
93
- "Span [freddy:respond:#{destination}] Sending response",
94
- "Span [freddy:respond:#{destination}] finished",
95
-
96
- # Initiator
97
- "Span [freddy:request:#{destination}] finished"
98
- ])
99
- end
100
- end
101
- end