process_handler 1.0.0 → 1.1.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
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec9bd732b3d29be5ca5a8ff8b9376be37edf5ea5
|
4
|
+
data.tar.gz: f37c3dc1f7f4b3b82bf029a274e7154bbdc268f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb2d95bee09bba68cb7c50a03aba26444098dc13db709077facd48cd10120a006c19822c961b3bc4782a297f98360a514c16a4d9fd07c013fd13a7aef88bb90e
|
7
|
+
data.tar.gz: 0ca27cf5ea6d3d574095ee36d38acb3a6dab71b018cabec691e9060ff8f4d0538e05778ec96375cc94d70a58b76f5973bdcf88feededac08ea404a23a1d231bd
|
@@ -20,13 +20,21 @@ module Salemove
|
|
20
20
|
@logger = logger
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
23
|
+
def self.trace_information
|
24
|
+
if defined?(Freddy) && Freddy.respond_to?(:trace)
|
25
|
+
{trace: Freddy.trace.to_h}
|
26
|
+
else
|
27
|
+
{}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(freddy,
|
24
32
|
notifier: nil,
|
25
33
|
notifier_factory: NotifierFactory,
|
26
34
|
process_monitor: ProcessMonitor.new,
|
27
35
|
process_name: 'Unknown process',
|
28
36
|
exit_enforcer: nil)
|
29
|
-
@
|
37
|
+
@freddy = freddy
|
30
38
|
@process_monitor = process_monitor
|
31
39
|
@exception_notifier = notifier_factory.get_notifier(process_name, notifier)
|
32
40
|
# Needed for forcing exit from jruby with exit(0)
|
@@ -42,7 +50,7 @@ module Salemove
|
|
42
50
|
|
43
51
|
def spawn_queue_threads(service)
|
44
52
|
if service.class.const_defined?(:QUEUE)
|
45
|
-
[ServiceSpawner.spawn(service, @
|
53
|
+
[ServiceSpawner.spawn(service, @freddy, @exception_notifier)]
|
46
54
|
else
|
47
55
|
[]
|
48
56
|
end
|
@@ -51,7 +59,7 @@ module Salemove
|
|
51
59
|
def spawn_tap_threads(service)
|
52
60
|
if service.class.const_defined?(:TAPPED_QUEUES)
|
53
61
|
service.class::TAPPED_QUEUES.map do |queue|
|
54
|
-
spawner = TapServiceSpawner.new(service, @
|
62
|
+
spawner = TapServiceSpawner.new(service, @freddy, @exception_notifier)
|
55
63
|
spawner.spawn(queue)
|
56
64
|
end
|
57
65
|
else
|
@@ -67,9 +75,9 @@ module Salemove
|
|
67
75
|
|
68
76
|
bm = Benchmark.measure { result = block.call }
|
69
77
|
if defined?(Logasm) && PivotProcess.logger.is_a?(Logasm)
|
70
|
-
PivotProcess.logger.info "Execution time",
|
71
|
-
|
72
|
-
|
78
|
+
PivotProcess.logger.info "Execution time", {
|
79
|
+
type: type, real: bm.real, user: bm.utime, system: bm.stime
|
80
|
+
}.merge(PivotProcess.trace_information)
|
73
81
|
end
|
74
82
|
result
|
75
83
|
end
|
@@ -82,28 +90,27 @@ module Salemove
|
|
82
90
|
end
|
83
91
|
|
84
92
|
class TapServiceSpawner
|
85
|
-
def initialize(service,
|
93
|
+
def initialize(service, freddy, exception_notifier)
|
86
94
|
@service = service
|
87
|
-
@
|
95
|
+
@freddy = freddy
|
88
96
|
@exception_notifier = exception_notifier
|
89
97
|
end
|
90
98
|
|
91
99
|
def spawn(queue)
|
92
|
-
@
|
93
|
-
|
94
|
-
delegate_to_service(input.merge(type: queue, request_id: request_id))
|
100
|
+
@freddy.tap_into(queue) do |input|
|
101
|
+
delegate_to_service(input.merge(type: queue))
|
95
102
|
end
|
96
103
|
end
|
97
104
|
|
98
105
|
def delegate_to_service(input)
|
99
|
-
PivotProcess.logger.info "Received request", input
|
106
|
+
PivotProcess.logger.info "Received request", PivotProcess.trace_information.merge(input)
|
100
107
|
PivotProcess.benchmark(input) { @service.call(input) }
|
101
108
|
rescue => exception
|
102
109
|
handle_exception(exception, input)
|
103
110
|
end
|
104
111
|
|
105
112
|
def handle_exception(e, input)
|
106
|
-
PivotProcess.logger.error(e.inspect + "\n" + e.backtrace.join("\n"),
|
113
|
+
PivotProcess.logger.error(e.inspect + "\n" + e.backtrace.join("\n"), PivotProcess.trace_information)
|
107
114
|
if @exception_notifier
|
108
115
|
@exception_notifier.notify_or_ignore(e, cgi_data: ENV.to_hash, parameters: input)
|
109
116
|
end
|
@@ -113,21 +120,19 @@ module Salemove
|
|
113
120
|
class ServiceSpawner
|
114
121
|
PROCESSED_REQUEST_LOG_KEYS = [:error, :success]
|
115
122
|
|
116
|
-
def self.spawn(service,
|
117
|
-
new(service,
|
123
|
+
def self.spawn(service, freddy, exception_notifier)
|
124
|
+
new(service, freddy, exception_notifier).spawn
|
118
125
|
end
|
119
126
|
|
120
|
-
def initialize(service,
|
127
|
+
def initialize(service, freddy, exception_notifier)
|
121
128
|
@service = service
|
122
|
-
@
|
129
|
+
@freddy = freddy
|
123
130
|
@exception_notifier = exception_notifier
|
124
131
|
end
|
125
132
|
|
126
133
|
def spawn
|
127
|
-
@
|
128
|
-
|
129
|
-
|
130
|
-
response = handle_request(input.merge(request_id: request_id))
|
134
|
+
@freddy.respond_to(@service.class::QUEUE) do |input, handler|
|
135
|
+
response = handle_request(input)
|
131
136
|
if response.respond_to?(:fulfilled?)
|
132
137
|
handle_fulfillable_response(input, handler, response)
|
133
138
|
else
|
@@ -161,7 +166,7 @@ module Salemove
|
|
161
166
|
end
|
162
167
|
|
163
168
|
def handle_request(input)
|
164
|
-
PivotProcess.logger.debug "Received request", input
|
169
|
+
PivotProcess.logger.debug "Received request", PivotProcess.trace_information.merge(input)
|
165
170
|
if input.has_key?(:ping)
|
166
171
|
{ success: true, pong: 'pong' }
|
167
172
|
else
|
@@ -183,13 +188,14 @@ module Salemove
|
|
183
188
|
def log_processed_request(input, result)
|
184
189
|
attributes = result
|
185
190
|
.select {|k, _| PROCESSED_REQUEST_LOG_KEYS.include?(k)}
|
186
|
-
.merge(
|
191
|
+
.merge(type: input[:type])
|
192
|
+
.merge(PivotProcess.trace_information)
|
187
193
|
|
188
194
|
PivotProcess.logger.info "Processed request", attributes
|
189
195
|
end
|
190
196
|
|
191
197
|
def handle_exception(e, input)
|
192
|
-
PivotProcess.logger.error(e.inspect + "\n" + e.backtrace.join("\n"),
|
198
|
+
PivotProcess.logger.error(e.inspect + "\n" + e.backtrace.join("\n"), PivotProcess.trace_information)
|
193
199
|
if @exception_notifier
|
194
200
|
@exception_notifier.notify_or_ignore(e, cgi_data: ENV.to_hash, parameters: input)
|
195
201
|
end
|
data/process_handler.gemspec
CHANGED
@@ -6,8 +6,8 @@ require 'salemove/process_handler/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = 'process_handler'
|
8
8
|
spec.version = Salemove::ProcessHandler::VERSION
|
9
|
-
spec.authors = ['
|
10
|
-
spec.email = ['
|
9
|
+
spec.authors = ['SaleMove TechMovers']
|
10
|
+
spec.email = ['techmovers@salemove.com']
|
11
11
|
spec.description = %q{This gem helps to monitor and manage processes}
|
12
12
|
spec.summary = %q{}
|
13
13
|
spec.homepage = ''
|
@@ -3,11 +3,11 @@ require 'spec_helper'
|
|
3
3
|
require 'salemove/process_handler/pivot_process'
|
4
4
|
|
5
5
|
describe ProcessHandler::PivotProcess do
|
6
|
-
let(:monitor)
|
7
|
-
let(:
|
8
|
-
let(:handler)
|
9
|
-
let(:thread)
|
10
|
-
let(:process) { ProcessHandler::PivotProcess.new(
|
6
|
+
let(:monitor) { double('Monitor') }
|
7
|
+
let(:freddy) { double('Freddy') }
|
8
|
+
let(:handler) { double('Handler') }
|
9
|
+
let(:thread) { double('Thread') }
|
10
|
+
let(:process) { ProcessHandler::PivotProcess.new(freddy, process_params) }
|
11
11
|
let(:process_params) {{ process_monitor: monitor , notifier_factory: notifier_factory}}
|
12
12
|
let(:notifier_factory) { double('NotifierFactory') }
|
13
13
|
let(:responder) { double(shutdown: true) }
|
@@ -43,7 +43,7 @@ describe ProcessHandler::PivotProcess do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def expect_message
|
46
|
-
expect(
|
46
|
+
expect(freddy).to receive(:respond_to) {|destination, &callback|
|
47
47
|
callback.call(input, handler)
|
48
48
|
}.and_return(responder)
|
49
49
|
end
|
@@ -51,14 +51,14 @@ describe ProcessHandler::PivotProcess do
|
|
51
51
|
before do
|
52
52
|
expect_message
|
53
53
|
expect_handler_thread_to_behave
|
54
|
-
allow(service).to receive(:call).with(input
|
54
|
+
allow(service).to receive(:call).with(input) { result }
|
55
55
|
end
|
56
56
|
|
57
57
|
describe 'when service responds correctly' do
|
58
58
|
|
59
59
|
it 'can be executed with logger' do
|
60
60
|
expect(handler).to receive(:success).with(result)
|
61
|
-
expect(service).to receive(:call).with(input
|
61
|
+
expect(service).to receive(:call).with(input)
|
62
62
|
subject()
|
63
63
|
end
|
64
64
|
|
@@ -68,7 +68,7 @@ describe ProcessHandler::PivotProcess do
|
|
68
68
|
let(:result) { { success: false, error: 'hey' } }
|
69
69
|
|
70
70
|
before do
|
71
|
-
expect(service).to receive(:call).with(input
|
71
|
+
expect(service).to receive(:call).with(input) { result }
|
72
72
|
end
|
73
73
|
|
74
74
|
it 'acks the message properly' do
|
@@ -106,7 +106,7 @@ describe ProcessHandler::PivotProcess do
|
|
106
106
|
let(:exception) { "what an unexpected exception!" }
|
107
107
|
|
108
108
|
before do
|
109
|
-
expect(service).to receive(:call).with(input
|
109
|
+
expect(service).to receive(:call).with(input) { raise exception }
|
110
110
|
end
|
111
111
|
|
112
112
|
it 'acks the message properly' do
|
@@ -190,7 +190,7 @@ describe ProcessHandler::PivotProcess do
|
|
190
190
|
let(:input) {{}}
|
191
191
|
|
192
192
|
def expect_tap_into
|
193
|
-
expect(
|
193
|
+
expect(freddy).to receive(:tap_into) do |destination, &callback|
|
194
194
|
callback.call(input)
|
195
195
|
end
|
196
196
|
.exactly(tap_count).times
|
@@ -205,8 +205,8 @@ describe ProcessHandler::PivotProcess do
|
|
205
205
|
|
206
206
|
describe 'when service handles the input correctly' do
|
207
207
|
it 'can be executed' do
|
208
|
-
expect(service).to receive(:call).with(input.merge(type: 'one'
|
209
|
-
expect(service).to receive(:call).with(input.merge(type: 'two'
|
208
|
+
expect(service).to receive(:call).with(input.merge(type: 'one'))
|
209
|
+
expect(service).to receive(:call).with(input.merge(type: 'two'))
|
210
210
|
subject()
|
211
211
|
end
|
212
212
|
end
|
@@ -237,8 +237,8 @@ describe ProcessHandler::PivotProcess do
|
|
237
237
|
let(:exception) { "what an unexpected exception!" }
|
238
238
|
|
239
239
|
before do
|
240
|
-
expect(service).to receive(:call).with(input.merge(type: 'one'
|
241
|
-
expect(service).to receive(:call).with(input.merge(type: 'two'
|
240
|
+
expect(service).to receive(:call).with(input.merge(type: 'one')) {}
|
241
|
+
expect(service).to receive(:call).with(input.merge(type: 'two')) { raise exception }
|
242
242
|
end
|
243
243
|
|
244
244
|
it_behaves_like 'an error_handler'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: process_handler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.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: 2017-
|
11
|
+
date: 2017-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: airbrake
|
@@ -68,7 +68,7 @@ dependencies:
|
|
68
68
|
version: '0'
|
69
69
|
description: This gem helps to monitor and manage processes
|
70
70
|
email:
|
71
|
-
-
|
71
|
+
- techmovers@salemove.com
|
72
72
|
executables: []
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|