qs 0.3.0 → 0.4.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.
- data/bench/config.qs +4 -27
- data/bench/dispatcher.qs +24 -0
- data/bench/report.rb +80 -10
- data/bench/report.txt +10 -3
- data/bench/setup.rb +55 -0
- data/lib/qs.rb +75 -15
- data/lib/qs/client.rb +73 -22
- data/lib/qs/daemon.rb +21 -21
- data/lib/qs/daemon_data.rb +4 -4
- data/lib/qs/dispatch_job.rb +36 -0
- data/lib/qs/dispatch_job_handler.rb +79 -0
- data/lib/qs/dispatcher_queue.rb +19 -0
- data/lib/qs/error_handler.rb +12 -12
- data/lib/qs/event.rb +82 -0
- data/lib/qs/event_handler.rb +34 -0
- data/lib/qs/event_handler_test_helpers.rb +17 -0
- data/lib/qs/job.rb +19 -31
- data/lib/qs/job_handler.rb +6 -63
- data/lib/qs/{test_helpers.rb → job_handler_test_helpers.rb} +2 -2
- data/lib/qs/message.rb +29 -0
- data/lib/qs/message_handler.rb +84 -0
- data/lib/qs/payload.rb +98 -0
- data/lib/qs/payload_handler.rb +106 -54
- data/lib/qs/queue.rb +39 -6
- data/lib/qs/queue_item.rb +33 -0
- data/lib/qs/route.rb +7 -7
- data/lib/qs/runner.rb +6 -5
- data/lib/qs/test_runner.rb +41 -13
- data/lib/qs/version.rb +1 -1
- data/qs.gemspec +1 -1
- data/test/helper.rb +1 -1
- data/test/support/app_daemon.rb +77 -11
- data/test/support/factory.rb +34 -0
- data/test/system/daemon_tests.rb +146 -77
- data/test/system/queue_tests.rb +87 -0
- data/test/unit/client_tests.rb +184 -45
- data/test/unit/daemon_data_tests.rb +4 -4
- data/test/unit/daemon_tests.rb +32 -32
- data/test/unit/dispatch_job_handler_tests.rb +163 -0
- data/test/unit/dispatch_job_tests.rb +75 -0
- data/test/unit/dispatcher_queue_tests.rb +42 -0
- data/test/unit/error_handler_tests.rb +9 -9
- data/test/unit/event_handler_test_helpers_tests.rb +55 -0
- data/test/unit/event_handler_tests.rb +63 -0
- data/test/unit/event_tests.rb +162 -0
- data/test/unit/{test_helper_tests.rb → job_handler_test_helper_tests.rb} +13 -19
- data/test/unit/job_handler_tests.rb +17 -210
- data/test/unit/job_tests.rb +49 -79
- data/test/unit/message_handler_tests.rb +235 -0
- data/test/unit/message_tests.rb +64 -0
- data/test/unit/payload_handler_tests.rb +285 -86
- data/test/unit/payload_tests.rb +139 -0
- data/test/unit/qs_runner_tests.rb +6 -6
- data/test/unit/qs_tests.rb +167 -28
- data/test/unit/queue_item_tests.rb +51 -0
- data/test/unit/queue_tests.rb +126 -18
- data/test/unit/route_tests.rb +12 -13
- data/test/unit/runner_tests.rb +10 -10
- data/test/unit/test_runner_tests.rb +117 -24
- metadata +51 -21
- data/bench/queue.rb +0 -8
- data/lib/qs/redis_item.rb +0 -33
- data/test/unit/redis_item_tests.rb +0 -49
data/lib/qs/job_handler.rb
CHANGED
@@ -1,39 +1,18 @@
|
|
1
|
+
require 'qs/message_handler'
|
2
|
+
|
1
3
|
module Qs
|
2
4
|
|
3
5
|
module JobHandler
|
4
6
|
|
5
7
|
def self.included(klass)
|
6
8
|
klass.class_eval do
|
7
|
-
|
9
|
+
include Qs::MessageHandler
|
8
10
|
include InstanceMethods
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
12
14
|
module InstanceMethods
|
13
15
|
|
14
|
-
def initialize(runner)
|
15
|
-
@qs_runner = runner
|
16
|
-
end
|
17
|
-
|
18
|
-
def init
|
19
|
-
run_callback 'before_init'
|
20
|
-
self.init!
|
21
|
-
run_callback 'after_init'
|
22
|
-
end
|
23
|
-
|
24
|
-
def init!
|
25
|
-
end
|
26
|
-
|
27
|
-
def run
|
28
|
-
run_callback 'before_run'
|
29
|
-
self.run!
|
30
|
-
run_callback 'after_run'
|
31
|
-
end
|
32
|
-
|
33
|
-
def run!
|
34
|
-
raise NotImplementedError
|
35
|
-
end
|
36
|
-
|
37
16
|
def inspect
|
38
17
|
reference = '0x0%x' % (self.object_id << 1)
|
39
18
|
"#<#{self.class}:#{reference} @job=#{job.inspect}>"
|
@@ -43,45 +22,9 @@ module Qs
|
|
43
22
|
|
44
23
|
# Helpers
|
45
24
|
|
46
|
-
def job;
|
47
|
-
def
|
48
|
-
def
|
49
|
-
|
50
|
-
def run_callback(callback)
|
51
|
-
(self.class.send("#{callback}_callbacks") || []).each do |callback|
|
52
|
-
self.instance_eval(&callback)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
module ClassMethods
|
59
|
-
|
60
|
-
def timeout(value = nil)
|
61
|
-
@timeout = value.to_f if value
|
62
|
-
@timeout
|
63
|
-
end
|
64
|
-
|
65
|
-
def before_callbacks; @before_callbacks ||= []; end
|
66
|
-
def after_callbacks; @after_callbacks ||= []; end
|
67
|
-
def before_init_callbacks; @before_init_callbacks ||= []; end
|
68
|
-
def after_init_callbacks; @after_init_callbacks ||= []; end
|
69
|
-
def before_run_callbacks; @before_run_callbacks ||= []; end
|
70
|
-
def after_run_callbacks; @after_run_callbacks ||= []; end
|
71
|
-
|
72
|
-
def before(&block); self.before_callbacks << block; end
|
73
|
-
def after(&block); self.after_callbacks << block; end
|
74
|
-
def before_init(&block); self.before_init_callbacks << block; end
|
75
|
-
def after_init(&block); self.after_init_callbacks << block; end
|
76
|
-
def before_run(&block); self.before_run_callbacks << block; end
|
77
|
-
def after_run(&block); self.after_run_callbacks << block; end
|
78
|
-
|
79
|
-
def prepend_before(&block); self.before_callbacks.unshift(block); end
|
80
|
-
def prepend_after(&block); self.after_callbacks.unshift(block); end
|
81
|
-
def prepend_before_init(&block); self.before_init_callbacks.unshift(block); end
|
82
|
-
def prepend_after_init(&block); self.after_init_callbacks.unshift(block); end
|
83
|
-
def prepend_before_run(&block); self.before_run_callbacks.unshift(block); end
|
84
|
-
def prepend_after_run(&block); self.after_run_callbacks.unshift(block); end
|
25
|
+
def job; @qs_runner.message; end
|
26
|
+
def job_name; job.name; end
|
27
|
+
def job_created_at; job.created_at; end
|
85
28
|
|
86
29
|
end
|
87
30
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'qs/test_runner'
|
2
2
|
|
3
|
-
module Qs
|
3
|
+
module Qs::JobHandler
|
4
4
|
|
5
5
|
module TestHelpers
|
6
6
|
|
7
7
|
def test_runner(handler_class, args = nil)
|
8
|
-
|
8
|
+
Qs::JobTestRunner.new(handler_class, args)
|
9
9
|
end
|
10
10
|
|
11
11
|
def test_handler(handler_class, args = nil)
|
data/lib/qs/message.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module Qs
|
2
|
+
|
3
|
+
class Message
|
4
|
+
|
5
|
+
attr_reader :payload_type, :params
|
6
|
+
|
7
|
+
def initialize(payload_type, options = nil)
|
8
|
+
options ||= {}
|
9
|
+
@payload_type = payload_type.to_s
|
10
|
+
@params = options[:params] || {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def route_id
|
14
|
+
@route_id ||= RouteId.new(self.payload_type, self.route_name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def route_name
|
18
|
+
raise NotImplementedError
|
19
|
+
end
|
20
|
+
|
21
|
+
module RouteId
|
22
|
+
def self.new(payload_type, route_name)
|
23
|
+
"#{payload_type}|#{route_name}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Qs
|
2
|
+
|
3
|
+
module MessageHandler
|
4
|
+
|
5
|
+
def self.included(klass)
|
6
|
+
klass.class_eval do
|
7
|
+
extend ClassMethods
|
8
|
+
include InstanceMethods
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module InstanceMethods
|
13
|
+
|
14
|
+
def initialize(runner)
|
15
|
+
@qs_runner = runner
|
16
|
+
end
|
17
|
+
|
18
|
+
def init
|
19
|
+
run_callback 'before_init'
|
20
|
+
self.init!
|
21
|
+
run_callback 'after_init'
|
22
|
+
end
|
23
|
+
|
24
|
+
def init!
|
25
|
+
end
|
26
|
+
|
27
|
+
def run
|
28
|
+
run_callback 'before_run'
|
29
|
+
self.run!
|
30
|
+
run_callback 'after_run'
|
31
|
+
end
|
32
|
+
|
33
|
+
def run!
|
34
|
+
raise NotImplementedError
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
# Helpers
|
40
|
+
|
41
|
+
def params; @qs_runner.params; end
|
42
|
+
def logger; @qs_runner.logger; end
|
43
|
+
|
44
|
+
def run_callback(callback)
|
45
|
+
(self.class.send("#{callback}_callbacks") || []).each do |callback|
|
46
|
+
self.instance_eval(&callback)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
module ClassMethods
|
53
|
+
|
54
|
+
def timeout(value = nil)
|
55
|
+
@timeout = value.to_f if value
|
56
|
+
@timeout
|
57
|
+
end
|
58
|
+
|
59
|
+
def before_callbacks; @before_callbacks ||= []; end
|
60
|
+
def after_callbacks; @after_callbacks ||= []; end
|
61
|
+
def before_init_callbacks; @before_init_callbacks ||= []; end
|
62
|
+
def after_init_callbacks; @after_init_callbacks ||= []; end
|
63
|
+
def before_run_callbacks; @before_run_callbacks ||= []; end
|
64
|
+
def after_run_callbacks; @after_run_callbacks ||= []; end
|
65
|
+
|
66
|
+
def before(&block); self.before_callbacks << block; end
|
67
|
+
def after(&block); self.after_callbacks << block; end
|
68
|
+
def before_init(&block); self.before_init_callbacks << block; end
|
69
|
+
def after_init(&block); self.after_init_callbacks << block; end
|
70
|
+
def before_run(&block); self.before_run_callbacks << block; end
|
71
|
+
def after_run(&block); self.after_run_callbacks << block; end
|
72
|
+
|
73
|
+
def prepend_before(&block); self.before_callbacks.unshift(block); end
|
74
|
+
def prepend_after(&block); self.after_callbacks.unshift(block); end
|
75
|
+
def prepend_before_init(&block); self.before_init_callbacks.unshift(block); end
|
76
|
+
def prepend_after_init(&block); self.after_init_callbacks.unshift(block); end
|
77
|
+
def prepend_before_run(&block); self.before_run_callbacks.unshift(block); end
|
78
|
+
def prepend_after_run(&block); self.after_run_callbacks.unshift(block); end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
data/lib/qs/payload.rb
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'qs'
|
2
|
+
require 'qs/event'
|
3
|
+
require 'qs/job'
|
4
|
+
|
5
|
+
module Qs
|
6
|
+
|
7
|
+
module Payload
|
8
|
+
|
9
|
+
METHOD_NAMES = Hash.new{ |h, t| raise(InvalidError.new(t)) }.tap do |h|
|
10
|
+
h[Job::PAYLOAD_TYPE] = 'job'
|
11
|
+
h[Event::PAYLOAD_TYPE] = 'event'
|
12
|
+
end.freeze
|
13
|
+
|
14
|
+
def self.type_method_name(payload_type)
|
15
|
+
METHOD_NAMES[payload_type]
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.deserialize(encoded_payload)
|
19
|
+
payload_hash = Qs.decode(encoded_payload)
|
20
|
+
self.send(self.type_method_name(payload_hash['type']), payload_hash)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.serialize(message)
|
24
|
+
Qs.encode(self.send("#{self.type_method_name(message.payload_type)}_hash", message))
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.job(payload_hash)
|
28
|
+
Qs::Job.new(payload_hash['name'], {
|
29
|
+
:params => payload_hash['params'],
|
30
|
+
:created_at => Timestamp.to_time(payload_hash['created_at'])
|
31
|
+
})
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.job_hash(job)
|
35
|
+
self.message_hash(job, {
|
36
|
+
'name' => job.name.to_s,
|
37
|
+
'created_at' => Timestamp.new(job.created_at)
|
38
|
+
})
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.event(payload_hash)
|
42
|
+
Qs::Event.new(payload_hash['channel'], payload_hash['name'], {
|
43
|
+
:params => payload_hash['params'],
|
44
|
+
:publisher => payload_hash['publisher'],
|
45
|
+
:published_at => Timestamp.to_time(payload_hash['published_at'])
|
46
|
+
})
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.event_hash(event)
|
50
|
+
self.message_hash(event, {
|
51
|
+
'channel' => event.channel.to_s,
|
52
|
+
'name' => event.name.to_s,
|
53
|
+
'publisher' => event.publisher.to_s,
|
54
|
+
'published_at' => Timestamp.new(event.published_at)
|
55
|
+
})
|
56
|
+
end
|
57
|
+
|
58
|
+
# private
|
59
|
+
|
60
|
+
def self.message_hash(message, hash)
|
61
|
+
hash.tap do |h|
|
62
|
+
h['type'] = message.payload_type.to_s
|
63
|
+
h['params'] = StringifyParams.new(message.params)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
module StringifyParams
|
68
|
+
def self.new(object)
|
69
|
+
case(object)
|
70
|
+
when Hash
|
71
|
+
object.inject({}){ |h, (k, v)| h.merge(k.to_s => self.new(v)) }
|
72
|
+
when Array
|
73
|
+
object.map{ |item| self.new(item) }
|
74
|
+
else
|
75
|
+
object
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
module Timestamp
|
81
|
+
def self.to_time(integer)
|
82
|
+
Time.at(integer)
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.new(time)
|
86
|
+
time.to_i
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
class InvalidError < ArgumentError
|
91
|
+
def initialize(payload_type)
|
92
|
+
super "unknown payload type #{payload_type.inspect}"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
data/lib/qs/payload_handler.rb
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
require 'benchmark'
|
2
2
|
require 'dat-worker-pool'
|
3
|
-
require 'qs'
|
4
3
|
require 'qs/error_handler'
|
4
|
+
require 'qs/event'
|
5
5
|
require 'qs/job'
|
6
6
|
require 'qs/logger'
|
7
|
+
require 'qs/payload'
|
7
8
|
|
8
9
|
module Qs
|
9
10
|
|
10
11
|
class PayloadHandler
|
11
12
|
|
12
|
-
attr_reader :daemon_data, :
|
13
|
+
attr_reader :daemon_data, :queue_item, :logger
|
13
14
|
|
14
|
-
def initialize(daemon_data,
|
15
|
+
def initialize(daemon_data, queue_item)
|
15
16
|
@daemon_data = daemon_data
|
16
|
-
@
|
17
|
+
@queue_item = queue_item
|
17
18
|
@logger = Qs::Logger.new(
|
18
19
|
@daemon_data.logger,
|
19
20
|
@daemon_data.verbose_logging
|
@@ -22,49 +23,48 @@ module Qs
|
|
22
23
|
|
23
24
|
def run
|
24
25
|
log_received
|
25
|
-
benchmark = Benchmark.measure{ run!(@daemon_data, @
|
26
|
-
@
|
27
|
-
log_complete(@
|
28
|
-
raise_if_debugging!(@
|
26
|
+
benchmark = Benchmark.measure{ run!(@daemon_data, @queue_item) }
|
27
|
+
@queue_item.time_taken = RoundedTime.new(benchmark.real)
|
28
|
+
log_complete(@queue_item)
|
29
|
+
raise_if_debugging!(@queue_item.exception)
|
29
30
|
end
|
30
31
|
|
31
32
|
private
|
32
33
|
|
33
|
-
def run!(daemon_data,
|
34
|
-
|
34
|
+
def run!(daemon_data, queue_item)
|
35
|
+
queue_item.started = true
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
redis_item.job = job
|
37
|
+
message = Qs::Payload.deserialize(queue_item.encoded_payload)
|
38
|
+
log_message(message)
|
39
|
+
queue_item.message = message
|
40
40
|
|
41
|
-
route = daemon_data.route_for(
|
41
|
+
route = daemon_data.route_for(message.route_id)
|
42
42
|
log_handler_class(route.handler_class)
|
43
|
-
|
43
|
+
queue_item.handler_class = route.handler_class
|
44
44
|
|
45
|
-
route.run(
|
46
|
-
|
45
|
+
route.run(message, daemon_data)
|
46
|
+
queue_item.finished = true
|
47
47
|
rescue DatWorkerPool::ShutdownError => exception
|
48
|
-
if
|
48
|
+
if queue_item.started
|
49
49
|
error = ShutdownError.new(exception.message)
|
50
50
|
error.set_backtrace(exception.backtrace)
|
51
|
-
handle_exception(error, daemon_data,
|
51
|
+
handle_exception(error, daemon_data, queue_item)
|
52
52
|
end
|
53
53
|
raise exception
|
54
54
|
rescue StandardError => exception
|
55
|
-
handle_exception(exception, daemon_data,
|
55
|
+
handle_exception(exception, daemon_data, queue_item)
|
56
56
|
end
|
57
57
|
|
58
|
-
def handle_exception(exception, daemon_data,
|
58
|
+
def handle_exception(exception, daemon_data, queue_item)
|
59
59
|
error_handler = Qs::ErrorHandler.new(exception, {
|
60
|
-
:daemon_data
|
61
|
-
:queue_redis_key
|
62
|
-
:
|
63
|
-
:
|
64
|
-
:handler_class
|
60
|
+
:daemon_data => daemon_data,
|
61
|
+
:queue_redis_key => queue_item.queue_redis_key,
|
62
|
+
:encoded_payload => queue_item.encoded_payload,
|
63
|
+
:message => queue_item.message,
|
64
|
+
:handler_class => queue_item.handler_class
|
65
65
|
}).tap(&:run)
|
66
|
-
|
67
|
-
log_exception(
|
66
|
+
queue_item.exception = error_handler.exception
|
67
|
+
log_exception(queue_item.exception)
|
68
68
|
end
|
69
69
|
|
70
70
|
def raise_if_debugging!(exception)
|
@@ -72,32 +72,30 @@ module Qs
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def log_received
|
75
|
-
log_verbose "=====
|
75
|
+
log_verbose "===== Received message ====="
|
76
|
+
end
|
77
|
+
|
78
|
+
def log_message(message)
|
79
|
+
self.send("log_#{Qs::Payload.type_method_name(message.payload_type)}", message)
|
80
|
+
log_verbose " Params: #{message.params.inspect}"
|
76
81
|
end
|
77
82
|
|
78
83
|
def log_job(job)
|
79
|
-
log_verbose " Job:
|
80
|
-
|
84
|
+
log_verbose " Job: #{job.route_name.inspect}"
|
85
|
+
end
|
86
|
+
|
87
|
+
def log_event(event)
|
88
|
+
log_verbose " Event: #{event.route_name.inspect}"
|
89
|
+
log_verbose " Publisher: #{event.publisher.inspect}"
|
81
90
|
end
|
82
91
|
|
83
92
|
def log_handler_class(handler_class)
|
84
|
-
log_verbose " Handler:
|
93
|
+
log_verbose " Handler: #{handler_class}"
|
85
94
|
end
|
86
95
|
|
87
|
-
def log_complete(
|
88
|
-
log_verbose "===== Completed in #{
|
89
|
-
|
90
|
-
'time' => redis_item.time_taken,
|
91
|
-
'handler' => redis_item.handler_class
|
92
|
-
}
|
93
|
-
if (job = redis_item.job)
|
94
|
-
summary_line_args['job'] = job.name
|
95
|
-
summary_line_args['params'] = job.params
|
96
|
-
end
|
97
|
-
if (exception = redis_item.exception)
|
98
|
-
summary_line_args['error'] = "#{exception.inspect}"
|
99
|
-
end
|
100
|
-
log_summary SummaryLine.new(summary_line_args)
|
96
|
+
def log_complete(queue_item)
|
97
|
+
log_verbose "===== Completed in #{queue_item.time_taken}ms ====="
|
98
|
+
log_summary build_summary_line(queue_item)
|
101
99
|
end
|
102
100
|
|
103
101
|
def log_exception(exception)
|
@@ -114,18 +112,72 @@ module Qs
|
|
114
112
|
self.logger.summary.send(level, "[Qs] #{message}")
|
115
113
|
end
|
116
114
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
115
|
+
def build_summary_line(queue_item)
|
116
|
+
summary_line_args = {
|
117
|
+
'time' => queue_item.time_taken,
|
118
|
+
'handler' => queue_item.handler_class
|
119
|
+
}
|
120
|
+
if (exception = queue_item.exception)
|
121
|
+
summary_line_args['error'] = "#{exception.class}: #{exception.message}"
|
122
122
|
end
|
123
|
+
if (message = queue_item.message)
|
124
|
+
summary_line_args['params'] = message.params
|
125
|
+
self.send(
|
126
|
+
"#{Qs::Payload.type_method_name(message.payload_type)}_summary_line",
|
127
|
+
message,
|
128
|
+
summary_line_args
|
129
|
+
)
|
130
|
+
else
|
131
|
+
UnknownSummaryLine.new(summary_line_args)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def job_summary_line(job, summary_line_args)
|
136
|
+
JobSummaryLine.new(job, summary_line_args)
|
137
|
+
end
|
138
|
+
|
139
|
+
def event_summary_line(event, summary_line_args)
|
140
|
+
EventSummaryLine.new(event, summary_line_args)
|
123
141
|
end
|
124
142
|
|
125
143
|
module SummaryLine
|
144
|
+
def self.new(keys, line_attrs)
|
145
|
+
keys.map{ |k| "#{k}=#{line_attrs[k].inspect}" }.join(' ')
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
module UnknownSummaryLine
|
150
|
+
ORDERED_KEYS = %w(time handler error).freeze
|
151
|
+
|
126
152
|
def self.new(line_attrs)
|
127
|
-
|
128
|
-
|
153
|
+
SummaryLine.new(ORDERED_KEYS, line_attrs)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
module JobSummaryLine
|
158
|
+
ORDERED_KEYS = %w(time handler job params error).freeze
|
159
|
+
|
160
|
+
def self.new(job, line_attrs)
|
161
|
+
SummaryLine.new(ORDERED_KEYS, line_attrs.merge('job' => job.route_name))
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
module EventSummaryLine
|
166
|
+
ORDERED_KEYS = %w(time handler event publisher params error).freeze
|
167
|
+
|
168
|
+
def self.new(event, line_attrs)
|
169
|
+
SummaryLine.new(ORDERED_KEYS, line_attrs.merge({
|
170
|
+
'event' => event.route_name,
|
171
|
+
'publisher' => event.publisher
|
172
|
+
}))
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
module RoundedTime
|
177
|
+
ROUND_PRECISION = 2
|
178
|
+
ROUND_MODIFIER = 10 ** ROUND_PRECISION
|
179
|
+
def self.new(time_in_seconds)
|
180
|
+
(time_in_seconds * 1000 * ROUND_MODIFIER).to_i / ROUND_MODIFIER.to_f
|
129
181
|
end
|
130
182
|
end
|
131
183
|
|