process_handler 1.0.0 → 1.1.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:
|
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: []
|