freddy 1.7.0 → 2.0.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 +4 -4
- data/.github/workflows/ci.yml +31 -0
- data/.rubocop.yml +9 -28
- data/.ruby-gemset +1 -1
- data/.ruby-version +1 -1
- data/Gemfile +3 -4
- data/README.md +5 -10
- data/freddy.gemspec +10 -17
- data/lib/freddy.rb +9 -14
- data/lib/freddy/adapters.rb +3 -28
- data/lib/freddy/adapters/bunny_adapter.rb +19 -2
- data/lib/freddy/consumers.rb +1 -1
- data/lib/freddy/consumers/respond_to_consumer.rb +3 -13
- data/lib/freddy/consumers/response_consumer.rb +2 -4
- data/lib/freddy/consumers/tap_into_consumer.rb +12 -24
- data/lib/freddy/delivery.rb +46 -13
- data/lib/freddy/payload.rb +2 -33
- data/lib/freddy/producers.rb +1 -1
- data/lib/freddy/producers/reply_producer.rb +12 -5
- data/lib/freddy/producers/send_and_forget_producer.rb +5 -11
- data/lib/freddy/producers/send_and_wait_response_producer.rb +19 -33
- data/lib/freddy/request_manager.rb +1 -9
- data/lib/freddy/tracing.rb +37 -0
- data/lib/freddy/version.rb +5 -0
- data/spec/.rubocop.yml +26 -0
- data/spec/freddy/error_response_spec.rb +6 -6
- data/spec/freddy/payload_spec.rb +25 -16
- data/spec/integration/concurrency_spec.rb +8 -12
- data/spec/integration/tracing_spec.rb +15 -32
- data/spec/spec_helper.rb +5 -13
- metadata +28 -15
- data/.npmignore +0 -8
- data/.travis.yml +0 -16
- data/lib/freddy/adapters/march_hare_adapter.rb +0 -64
- data/lib/freddy/trace_carrier.rb +0 -28
- data/spec/freddy/trace_carrier_spec.rb +0 -56
@@ -1,13 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'opentracing_test_tracer'
|
3
2
|
|
4
3
|
describe 'Tracing' do
|
5
|
-
let(:tracer) { OpenTracingTestTracer.build(logger: logger) }
|
6
4
|
let(:logger) { spy }
|
7
5
|
|
8
|
-
before { OpenTracing.global_tracer = tracer }
|
9
|
-
after { OpenTracing.global_tracer = nil }
|
10
|
-
|
11
6
|
context 'when receiving a traced request' do
|
12
7
|
let(:freddy) { Freddy.build(logger, config) }
|
13
8
|
let(:freddy2) { Freddy.build(logger, config) }
|
@@ -18,21 +13,13 @@ describe 'Tracing' do
|
|
18
13
|
before do
|
19
14
|
freddy.respond_to(destination) do |_payload, msg_handler|
|
20
15
|
msg_handler.success(
|
21
|
-
trace_initiator:
|
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
|
-
},
|
16
|
+
trace_initiator: current_span_attributes,
|
26
17
|
current_receiver: freddy.deliver_with_response(destination2, {})
|
27
18
|
)
|
28
19
|
end
|
29
20
|
|
30
21
|
freddy2.respond_to(destination2) do |_payload, msg_handler|
|
31
|
-
msg_handler.success(
|
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
|
-
)
|
22
|
+
msg_handler.success(current_span_attributes)
|
36
23
|
end
|
37
24
|
end
|
38
25
|
|
@@ -75,31 +62,19 @@ describe 'Tracing' do
|
|
75
62
|
before do
|
76
63
|
freddy.respond_to(destination) do |_payload, msg_handler|
|
77
64
|
msg_handler.success({
|
78
|
-
trace_initiator:
|
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
|
-
}
|
65
|
+
trace_initiator: current_span_attributes
|
83
66
|
}.merge(freddy.deliver_with_response(destination2, {})))
|
84
67
|
end
|
85
68
|
|
86
69
|
freddy2.respond_to(destination2) do |_payload, msg_handler|
|
87
70
|
msg_handler.success(
|
88
|
-
previous_receiver:
|
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
|
-
},
|
71
|
+
previous_receiver: current_span_attributes,
|
93
72
|
current_receiver: freddy2.deliver_with_response(destination3, {})
|
94
73
|
)
|
95
74
|
end
|
96
75
|
|
97
76
|
freddy3.respond_to(destination3) do |_payload, msg_handler|
|
98
|
-
msg_handler.success(
|
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
|
-
)
|
77
|
+
msg_handler.success(current_span_attributes)
|
103
78
|
end
|
104
79
|
end
|
105
80
|
|
@@ -131,7 +106,15 @@ describe 'Tracing' do
|
|
131
106
|
end
|
132
107
|
end
|
133
108
|
|
134
|
-
def
|
135
|
-
|
109
|
+
def current_span_attributes
|
110
|
+
{
|
111
|
+
trace_id: current_span.context.trace_id,
|
112
|
+
parent_id: current_span.parent_span_id,
|
113
|
+
span_id: current_span.context.span_id
|
114
|
+
}
|
115
|
+
end
|
116
|
+
|
117
|
+
def current_span
|
118
|
+
OpenTelemetry::Trace.current_span
|
136
119
|
end
|
137
120
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,14 +2,9 @@ require 'rubygems'
|
|
2
2
|
require 'bundler'
|
3
3
|
Bundler.setup
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
SimpleCov::Formatter::HTMLFormatter,
|
9
|
-
CodeClimate::TestReporter::Formatter
|
10
|
-
])
|
11
|
-
add_filter '/spec/'
|
12
|
-
end
|
5
|
+
ENV['OTEL_TRACES_EXPORTER'] = 'none'
|
6
|
+
require 'opentelemetry/sdk'
|
7
|
+
OpenTelemetry::SDK.configure
|
13
8
|
|
14
9
|
require 'pry'
|
15
10
|
require 'freddy'
|
@@ -22,10 +17,6 @@ RSpec.configure do |config|
|
|
22
17
|
config.run_all_when_everything_filtered = true
|
23
18
|
config.filter_run :focus
|
24
19
|
config.order = 'random'
|
25
|
-
|
26
|
-
config.before do
|
27
|
-
OpenTracing.global_tracer ||= OpenTracing::Tracer.new
|
28
|
-
end
|
29
20
|
end
|
30
21
|
|
31
22
|
def random_destination
|
@@ -43,6 +34,7 @@ end
|
|
43
34
|
def wait_for
|
44
35
|
100.times do
|
45
36
|
return if yield
|
37
|
+
|
46
38
|
sleep 0.005
|
47
39
|
end
|
48
40
|
end
|
@@ -53,7 +45,7 @@ def deliver(custom_destination = destination)
|
|
53
45
|
end
|
54
46
|
|
55
47
|
def logger
|
56
|
-
Logger.new(
|
48
|
+
Logger.new($stdout).tap { |l| l.level = Logger::ERROR }
|
57
49
|
end
|
58
50
|
|
59
51
|
def config
|
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:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Glia TechMovers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-08-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -67,19 +67,33 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.6'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: opentelemetry-api
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 1.0.0.rc3
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 1.0.0.rc3
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: opentelemetry-semantic_conventions
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: thread
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,13 +115,12 @@ executables: []
|
|
101
115
|
extensions: []
|
102
116
|
extra_rdoc_files: []
|
103
117
|
files:
|
118
|
+
- ".github/workflows/ci.yml"
|
104
119
|
- ".gitignore"
|
105
|
-
- ".npmignore"
|
106
120
|
- ".rspec"
|
107
121
|
- ".rubocop.yml"
|
108
122
|
- ".ruby-gemset"
|
109
123
|
- ".ruby-version"
|
110
|
-
- ".travis.yml"
|
111
124
|
- Gemfile
|
112
125
|
- LICENCE.txt
|
113
126
|
- README.md
|
@@ -116,7 +129,6 @@ files:
|
|
116
129
|
- lib/freddy.rb
|
117
130
|
- lib/freddy/adapters.rb
|
118
131
|
- lib/freddy/adapters/bunny_adapter.rb
|
119
|
-
- lib/freddy/adapters/march_hare_adapter.rb
|
120
132
|
- lib/freddy/consumers.rb
|
121
133
|
- lib/freddy/consumers/respond_to_consumer.rb
|
122
134
|
- lib/freddy/consumers/response_consumer.rb
|
@@ -135,7 +147,9 @@ files:
|
|
135
147
|
- lib/freddy/responder_handler.rb
|
136
148
|
- lib/freddy/sync_response_container.rb
|
137
149
|
- lib/freddy/timeout_error.rb
|
138
|
-
- lib/freddy/
|
150
|
+
- lib/freddy/tracing.rb
|
151
|
+
- lib/freddy/version.rb
|
152
|
+
- spec/.rubocop.yml
|
139
153
|
- spec/freddy/consumers/respond_to_consumer_spec.rb
|
140
154
|
- spec/freddy/error_response_spec.rb
|
141
155
|
- spec/freddy/freddy_spec.rb
|
@@ -143,15 +157,14 @@ files:
|
|
143
157
|
- spec/freddy/payload_spec.rb
|
144
158
|
- spec/freddy/responder_handler_spec.rb
|
145
159
|
- spec/freddy/sync_response_container_spec.rb
|
146
|
-
- spec/freddy/trace_carrier_spec.rb
|
147
160
|
- spec/integration/concurrency_spec.rb
|
148
161
|
- spec/integration/reply_spec.rb
|
149
162
|
- spec/integration/tap_into_with_group_spec.rb
|
150
163
|
- spec/integration/tracing_spec.rb
|
151
164
|
- spec/spec_helper.rb
|
152
|
-
homepage:
|
165
|
+
homepage: https://github.com/salemove/freddy
|
153
166
|
licenses:
|
154
|
-
-
|
167
|
+
- MIT
|
155
168
|
metadata: {}
|
156
169
|
post_install_message:
|
157
170
|
rdoc_options: []
|
@@ -161,18 +174,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
161
174
|
requirements:
|
162
175
|
- - ">="
|
163
176
|
- !ruby/object:Gem::Version
|
164
|
-
version: '
|
177
|
+
version: '2.7'
|
165
178
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
179
|
requirements:
|
167
180
|
- - ">="
|
168
181
|
- !ruby/object:Gem::Version
|
169
182
|
version: '0'
|
170
183
|
requirements: []
|
171
|
-
rubygems_version: 3.
|
184
|
+
rubygems_version: 3.1.4
|
172
185
|
signing_key:
|
173
186
|
specification_version: 4
|
174
187
|
summary: API for inter-application messaging supporting acknowledgements and request-response
|
175
188
|
test_files:
|
189
|
+
- spec/.rubocop.yml
|
176
190
|
- spec/freddy/consumers/respond_to_consumer_spec.rb
|
177
191
|
- spec/freddy/error_response_spec.rb
|
178
192
|
- spec/freddy/freddy_spec.rb
|
@@ -180,7 +194,6 @@ test_files:
|
|
180
194
|
- spec/freddy/payload_spec.rb
|
181
195
|
- spec/freddy/responder_handler_spec.rb
|
182
196
|
- spec/freddy/sync_response_container_spec.rb
|
183
|
-
- spec/freddy/trace_carrier_spec.rb
|
184
197
|
- spec/integration/concurrency_spec.rb
|
185
198
|
- spec/integration/reply_spec.rb
|
186
199
|
- spec/integration/tap_into_with_group_spec.rb
|
data/.npmignore
DELETED
data/.travis.yml
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
rvm:
|
3
|
-
- 2.5.6
|
4
|
-
- jruby-9.2.8.0
|
5
|
-
addons:
|
6
|
-
code_climate:
|
7
|
-
repo_token: 1f3842b985fdeff6a36168165d491ca5f444667e9381a85c899a61706a9dd285
|
8
|
-
apt:
|
9
|
-
packages:
|
10
|
-
- rabbitmq-server
|
11
|
-
services:
|
12
|
-
- rabbitmq
|
13
|
-
before_script:
|
14
|
-
- gem install bundler
|
15
|
-
- bundle install
|
16
|
-
script: bundle exec rake
|
@@ -1,64 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'march_hare'
|
4
|
-
|
5
|
-
class Freddy
|
6
|
-
module Adapters
|
7
|
-
class MarchHareAdapter
|
8
|
-
def self.connect(config)
|
9
|
-
hare = MarchHare.connect(config)
|
10
|
-
new(hare)
|
11
|
-
end
|
12
|
-
|
13
|
-
def initialize(hare)
|
14
|
-
@hare = hare
|
15
|
-
end
|
16
|
-
|
17
|
-
def create_channel(prefetch: nil)
|
18
|
-
hare_channel = @hare.create_channel
|
19
|
-
hare_channel.basic_qos(prefetch) if prefetch
|
20
|
-
Channel.new(hare_channel)
|
21
|
-
end
|
22
|
-
|
23
|
-
def close
|
24
|
-
@hare.close
|
25
|
-
end
|
26
|
-
|
27
|
-
class Channel
|
28
|
-
extend Forwardable
|
29
|
-
|
30
|
-
NO_ROUTE = 312
|
31
|
-
|
32
|
-
def initialize(channel)
|
33
|
-
@channel = channel
|
34
|
-
end
|
35
|
-
|
36
|
-
def_delegators :@channel, :topic, :default_exchange, :consumers, :acknowledge, :reject
|
37
|
-
|
38
|
-
def queue(*args)
|
39
|
-
Queue.new(@channel.queue(*args))
|
40
|
-
end
|
41
|
-
|
42
|
-
def on_no_route
|
43
|
-
@channel.on_return do |reply_code, _, exchange_name, _, properties|
|
44
|
-
if exchange_name != Freddy::FREDDY_TOPIC_EXCHANGE_NAME && reply_code == NO_ROUTE
|
45
|
-
yield(properties.correlation_id)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
class Queue < Shared::Queue
|
52
|
-
def subscribe(manual_ack: false)
|
53
|
-
@queue.subscribe(manual_ack: manual_ack) do |meta, payload|
|
54
|
-
parsed_payload = Payload.parse(payload)
|
55
|
-
delivery = Delivery.new(
|
56
|
-
parsed_payload, meta, meta.routing_key, meta.delivery_tag
|
57
|
-
)
|
58
|
-
yield(delivery)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
data/lib/freddy/trace_carrier.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Freddy
|
4
|
-
# Carrier for rabbitmq following OpenTracing API
|
5
|
-
# See https://github.com/opentracing/opentracing-ruby/blob/master/lib/opentracing/carrier.rb
|
6
|
-
class TraceCarrier
|
7
|
-
def initialize(properties)
|
8
|
-
@properties = properties
|
9
|
-
end
|
10
|
-
|
11
|
-
def [](key)
|
12
|
-
@properties.headers && @properties.headers["x-trace-#{key}"]
|
13
|
-
end
|
14
|
-
|
15
|
-
def []=(key, value)
|
16
|
-
@properties[:headers] ||= {}
|
17
|
-
@properties[:headers]["x-trace-#{key}"] = value
|
18
|
-
end
|
19
|
-
|
20
|
-
def each(&block)
|
21
|
-
Hash[
|
22
|
-
(@properties.headers || {})
|
23
|
-
.select { |key, _| key =~ /^x-trace/ }
|
24
|
-
.map { |key, value| [key.sub(/x-trace-/, ''), value] }
|
25
|
-
].each(&block)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Freddy::TraceCarrier do
|
4
|
-
subject(:carrier) { described_class.new(properties) }
|
5
|
-
|
6
|
-
context 'when adding trace information' do
|
7
|
-
let(:properties) { { x: 'y' } }
|
8
|
-
let(:key_name) { 'some-key' }
|
9
|
-
let(:key_value) { 'some-key' }
|
10
|
-
|
11
|
-
it 'adds a header with x-trace- prefix' do
|
12
|
-
carrier[key_name] = key_value
|
13
|
-
expect(properties[:headers]["x-trace-#{key_name}"]).to eq(key_value)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'when extracting trace information' do
|
18
|
-
let(:key_name) { 'some-key' }
|
19
|
-
let(:serialized_key_name) { "x-trace-#{key_name}" }
|
20
|
-
let(:key_value) { 'some-key' }
|
21
|
-
|
22
|
-
let(:properties) do
|
23
|
-
double(headers: { serialized_key_name => key_value })
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'extracts a header with x-trace- prefix' do
|
27
|
-
expect(carrier[key_name]).to eq(key_value)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
describe '#each' do
|
32
|
-
context 'when headers are present' do
|
33
|
-
let(:properties) do
|
34
|
-
double(
|
35
|
-
headers: {
|
36
|
-
'x-trace-key1' => 'value1',
|
37
|
-
'x-trace-key2' => 'value2',
|
38
|
-
'other-key' => 'value3'
|
39
|
-
}
|
40
|
-
)
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'iterates over keys starting with x-trace- prefix' do
|
44
|
-
expect(carrier.each.count).to eq(2)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'when no headers' do
|
49
|
-
let(:properties) { double(headers: nil) }
|
50
|
-
|
51
|
-
it 'iterates over an empty list' do
|
52
|
-
expect(carrier.each.count).to eq(0)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|