traceview 3.2.1-java → 3.3.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/CHANGELOG.md +26 -0
- data/README.md +4 -10
- data/Rakefile +6 -3
- data/gemfiles/libraries.gemfile +2 -1
- data/gemfiles/rails23.gemfile +5 -0
- data/gemfiles/rails30.gemfile +5 -0
- data/gemfiles/rails31.gemfile +5 -0
- data/gemfiles/rails32.gemfile +5 -0
- data/lib/joboe_metal.rb +79 -66
- data/lib/oboe_metal.rb +67 -54
- data/lib/traceview.rb +2 -0
- data/lib/traceview/api/layerinit.rb +7 -5
- data/lib/traceview/api/logging.rb +8 -1
- data/lib/traceview/config.rb +7 -2
- data/lib/traceview/inst/sidekiq-client.rb +54 -0
- data/lib/traceview/inst/sidekiq-worker.rb +61 -0
- data/lib/traceview/test.rb +20 -0
- data/lib/traceview/util.rb +1 -0
- data/lib/traceview/version.rb +2 -2
- data/test/instrumentation/curb_test.rb +1 -1
- data/test/instrumentation/sidekiq-client_test.rb +131 -0
- data/test/instrumentation/sidekiq-worker_test.rb +180 -0
- data/test/jobs/db_worker_job.rb +29 -0
- data/test/jobs/error_worker_job.rb +10 -0
- data/test/jobs/remote_call_worker_job.rb +20 -0
- data/test/minitest_helper.rb +4 -1
- data/test/reporter/reporter_test.rb +14 -0
- data/test/servers/sidekiq.rb +35 -0
- data/test/servers/sidekiq.yml +7 -0
- data/test/servers/sidekiq_initializer.rb +22 -0
- data/test/support/config_test.rb +5 -1
- data/test/support/liboboe_settings_test.rb +1 -0
- metadata +23 -3
data/lib/traceview.rb
CHANGED
@@ -57,6 +57,8 @@ begin
|
|
57
57
|
# it will load all of the Ruby instrumentation
|
58
58
|
require 'traceview/ruby'
|
59
59
|
require 'oboe/backward_compatibility'
|
60
|
+
|
61
|
+
require 'traceview/test' if ENV['TRACEVIEW_GEM_TEST']
|
60
62
|
rescue => e
|
61
63
|
$stderr.puts "[traceview/error] Problem loading: #{e.inspect}"
|
62
64
|
$stderr.puts e.backtrace
|
@@ -11,11 +11,13 @@ module TraceView
|
|
11
11
|
# layer.
|
12
12
|
#
|
13
13
|
def report_init(layer = 'rack')
|
14
|
-
# Don't send __Init in development or
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
# Don't send __Init in development, test or if the gem
|
15
|
+
# isn't fully loaded (e.g. missing c-extension)
|
16
|
+
if %w(development test).include? ENV['RACK_ENV'] ||
|
17
|
+
ENV.key?('TRACEVIEW_GEM_TEST') ||
|
18
|
+
!TraceView.loaded
|
19
|
+
return
|
20
|
+
end
|
19
21
|
|
20
22
|
platform_info = TraceView::Util.build_init_report
|
21
23
|
|
@@ -1,6 +1,13 @@
|
|
1
1
|
# Copyright (c) 2013 AppNeta, Inc.
|
2
2
|
# All rights reserved.
|
3
3
|
|
4
|
+
# Make sure Set is loaded if possible.
|
5
|
+
begin
|
6
|
+
require 'set'
|
7
|
+
rescue LoadError
|
8
|
+
class Set; end
|
9
|
+
end
|
10
|
+
|
4
11
|
module TraceView
|
5
12
|
module API
|
6
13
|
##
|
@@ -105,7 +112,7 @@ module TraceView
|
|
105
112
|
# sample rate and sample source
|
106
113
|
opts[:SampleRate] = TraceView.sample_rate
|
107
114
|
opts[:SampleSource] = TraceView.sample_source
|
108
|
-
opts[:TraceOrigin]
|
115
|
+
opts[:TraceOrigin] = :always_sampled
|
109
116
|
|
110
117
|
log_event(layer, 'entry', TraceView::Context.startTrace, opts)
|
111
118
|
end
|
data/lib/traceview/config.rb
CHANGED
@@ -14,8 +14,8 @@ module TraceView
|
|
14
14
|
@@instrumentation = [:action_controller, :action_view, :active_record,
|
15
15
|
:cassandra, :curb, :dalli, :em_http_request, :excon, :faraday,
|
16
16
|
:grape, :httpclient, :nethttp, :memcached, :memcache, :mongo,
|
17
|
-
:moped, :rack, :redis, :resque, :rest_client, :sequel,
|
18
|
-
:typhoeus]
|
17
|
+
:moped, :rack, :redis, :resque, :rest_client, :sequel, :sidekiqclient,
|
18
|
+
:sidekiqworker, :typhoeus]
|
19
19
|
|
20
20
|
# Subgrouping of instrumentation
|
21
21
|
@@http_clients = [:curb, :excon, :em_http_request, :faraday, :httpclient, :nethttp, :rest_client, :typhoeus]
|
@@ -60,6 +60,8 @@ module TraceView
|
|
60
60
|
TraceView::Config[:resque][:collect_backtraces] = true
|
61
61
|
TraceView::Config[:rest_client][:collect_backtraces] = false
|
62
62
|
TraceView::Config[:sequel][:collect_backtraces] = true
|
63
|
+
TraceView::Config[:sidekiqclient][:collect_backtraces] = false
|
64
|
+
TraceView::Config[:sidekiqworker][:collect_backtraces] = false
|
63
65
|
TraceView::Config[:typhoeus][:collect_backtraces] = false
|
64
66
|
|
65
67
|
# Special instrument specific flags
|
@@ -214,6 +216,9 @@ module TraceView
|
|
214
216
|
@@config[key.to_sym] = value.to_i
|
215
217
|
TraceView.set_sample_rate(value) if TraceView.loaded
|
216
218
|
|
219
|
+
elsif key == :action_blacklist
|
220
|
+
TraceView.logger.warn "[traceview/deprecation] :action_blacklist will be deprecated in a future version."
|
221
|
+
|
217
222
|
elsif key == :include_url_query_params
|
218
223
|
# Obey the global flag and update all of the per instrumentation
|
219
224
|
# <tt>:log_args</tt> values.
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module TraceView
|
2
|
+
class SidekiqClient
|
3
|
+
def collect_kvs(args)
|
4
|
+
begin
|
5
|
+
# Attempt to collect up pertinent info. If we hit something unexpected,
|
6
|
+
# keep calm and instrument on.
|
7
|
+
|
8
|
+
report_kvs = {}
|
9
|
+
worker_class, msg, queue, _ = args
|
10
|
+
|
11
|
+
report_kvs[:Spec] = :msgclient
|
12
|
+
report_kvs[:Flavor] = :sidekiq
|
13
|
+
report_kvs[:Queue] = queue
|
14
|
+
report_kvs[:Retry] = msg['retry']
|
15
|
+
report_kvs[:JobName] = worker_class
|
16
|
+
report_kvs[:MsgID] = msg['jid']
|
17
|
+
report_kvs[:Args] = msg['args'].to_s[0..1024] if TV::Config[:sidekiqclient][:log_args]
|
18
|
+
report_kvs[:Backtrace] = TV::API.backtrace if TV::Config[:sidekiqclient][:collect_backtraces]
|
19
|
+
rescue => e
|
20
|
+
TraceView.logger.warn "[traceview/sidekiq] Non-fatal error capturing KVs: #{e.message}"
|
21
|
+
end
|
22
|
+
report_kvs
|
23
|
+
end
|
24
|
+
|
25
|
+
def call(*args)
|
26
|
+
# args: 0: worker_class, 1: msg, 2: queue, 3: redis_pool
|
27
|
+
|
28
|
+
result = nil
|
29
|
+
report_kvs = collect_kvs(args)
|
30
|
+
|
31
|
+
TraceView::API.log_entry('sidekiq-client', report_kvs)
|
32
|
+
args[1]['X-Trace'] = TraceView::Context.toString if TraceView.tracing?
|
33
|
+
|
34
|
+
result = yield
|
35
|
+
|
36
|
+
report_kvs = { :JobID => result["jid"] }
|
37
|
+
result
|
38
|
+
rescue => e
|
39
|
+
TraceView::API.log_exception('sidekiq-client', e, report_kvs)
|
40
|
+
raise
|
41
|
+
ensure
|
42
|
+
TraceView::API.log_exit('sidekiq-client', report_kvs)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if defined?(::Sidekiq) && RUBY_VERSION >= '2.0' && TraceView::Config[:sidekiqclient][:enabled]
|
48
|
+
::Sidekiq.configure_client do |config|
|
49
|
+
config.client_middleware do |chain|
|
50
|
+
::TraceView.logger.info '[traceview/loading] Adding Sidekiq client middleware' if TraceView::Config[:verbose]
|
51
|
+
chain.add ::TraceView::SidekiqClient
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module TraceView
|
2
|
+
class SidekiqWorker
|
3
|
+
def collect_kvs(args)
|
4
|
+
begin
|
5
|
+
# Attempt to collect up pertinent info. If we hit something unexpected,
|
6
|
+
# keep calm and instrument on.
|
7
|
+
report_kvs = {}
|
8
|
+
worker, msg, queue = args
|
9
|
+
|
10
|
+
# Background Job Spec KVs
|
11
|
+
report_kvs[:Spec] = :job
|
12
|
+
report_kvs[:Flavor] = :sidekiq
|
13
|
+
report_kvs[:Queue] = queue
|
14
|
+
report_kvs[:Retry] = msg['retry']
|
15
|
+
report_kvs[:JobName] = worker.class.to_s
|
16
|
+
report_kvs[:MsgID] = msg['jid']
|
17
|
+
report_kvs[:Args] = msg['args'].to_s[0..1024] if TV::Config[:sidekiqworker][:log_args]
|
18
|
+
report_kvs['Backtrace'] = TV::API.backtrace if TV::Config[:sidekiqworker][:collect_backtraces]
|
19
|
+
|
20
|
+
# Webserver Spec KVs
|
21
|
+
report_kvs['HTTP-Host'] = Socket.gethostname
|
22
|
+
report_kvs[:Controller] = "Sidekiq_#{queue}"
|
23
|
+
report_kvs[:Action] = msg['class']
|
24
|
+
report_kvs[:URL] = "/sidekiq/#{queue}/#{msg['class'].to_s}"
|
25
|
+
rescue => e
|
26
|
+
TraceView.logger.warn "[traceview/sidekiq] Non-fatal error capturing KVs: #{e.message}"
|
27
|
+
end
|
28
|
+
report_kvs
|
29
|
+
end
|
30
|
+
|
31
|
+
def call(*args)
|
32
|
+
# args: 0: worker, 1: msg, 2: queue
|
33
|
+
result = nil
|
34
|
+
report_kvs = collect_kvs(args)
|
35
|
+
|
36
|
+
# Continue the trace from the enqueue side?
|
37
|
+
incoming_context = nil
|
38
|
+
if args[1].is_a?(Hash) && TraceView::XTrace.valid?(args[1]['X-Trace'])
|
39
|
+
incoming_context = args[1]['X-Trace']
|
40
|
+
report_kvs[:Async] = true
|
41
|
+
end
|
42
|
+
|
43
|
+
result = TraceView::API.start_trace('sidekiq-worker', incoming_context, report_kvs) do
|
44
|
+
yield
|
45
|
+
end
|
46
|
+
|
47
|
+
result[0]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
if defined?(::Sidekiq) && RUBY_VERSION >= '2.0' && TraceView::Config[:sidekiqworker][:enabled]
|
53
|
+
::TraceView.logger.info '[traceview/loading] Instrumenting sidekiq' if TraceView::Config[:verbose]
|
54
|
+
|
55
|
+
::Sidekiq.configure_server do |config|
|
56
|
+
config.server_middleware do |chain|
|
57
|
+
::TraceView.logger.info '[traceview/loading] Adding Sidekiq worker middleware' if TraceView::Config[:verbose]
|
58
|
+
chain.add ::TraceView::SidekiqWorker
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Copyright (c) 2015 AppNeta, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
|
4
|
+
module TraceView
|
5
|
+
module Test
|
6
|
+
class << self
|
7
|
+
def load_extras
|
8
|
+
# If we're using the libraries gemfile (with sidekiq and resque)
|
9
|
+
if File.basename(ENV['BUNDLE_GEMFILE']) =~ /libraries/
|
10
|
+
# Load all of the test workers
|
11
|
+
pattern = File.join(File.dirname(__FILE__), '../../test/jobs/', '*.rb')
|
12
|
+
Dir.glob(pattern) do |f|
|
13
|
+
TV.logger.debug "Loading test job file: #{f}"
|
14
|
+
require f
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/traceview/util.rb
CHANGED
@@ -215,6 +215,7 @@ module TraceView
|
|
215
215
|
platform_info['Ruby.Redis.Version'] = "Redis-#{::Redis::VERSION}" if defined?(::Redis::VERSION)
|
216
216
|
platform_info['Ruby.Resque.Version'] = "Resque-#{::Resque::VERSION}" if defined?(::Resque::VERSION)
|
217
217
|
platform_info['Ruby.RestClient.Version'] = "RestClient-#{::RestClient::VERSION}" if defined?(::RestClient::VERSION)
|
218
|
+
platform_info['Ruby.Sidekiq.Version'] = "Sidekiq-#{::Sidekiq::VERSION}" if defined?(::Sidekiq::VERSION)
|
218
219
|
platform_info['Ruby.Typhoeus.Version'] = "Typhoeus-#{::Typhoeus::VERSION}" if defined?(::Typhoeus::VERSION)
|
219
220
|
|
220
221
|
# Special case since the Mongo 1.x driver doesn't embed the version number in the gem directly
|
data/lib/traceview/version.rb
CHANGED
@@ -0,0 +1,131 @@
|
|
1
|
+
# Copyright (c) 2015 AppNeta, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
|
4
|
+
if RUBY_VERSION >= '2.0'
|
5
|
+
require 'minitest_helper'
|
6
|
+
require 'sidekiq'
|
7
|
+
require_relative "../jobs/remote_call_worker_job"
|
8
|
+
require_relative "../jobs/db_worker_job"
|
9
|
+
require_relative "../jobs/error_worker_job"
|
10
|
+
|
11
|
+
class SidekiqClientTest < Minitest::Test
|
12
|
+
def setup
|
13
|
+
clear_all_traces
|
14
|
+
@collect_backtraces = TraceView::Config[:sidekiqclient][:collect_backtraces]
|
15
|
+
@log_args = TraceView::Config[:sidekiqclient][:log_args]
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
TraceView::Config[:sidekiqclient][:collect_backtraces] = @collect_backtraces
|
20
|
+
TraceView::Config[:sidekiqclient][:log_args] = @log_args
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_enqueue
|
24
|
+
# Queue up a job to be run
|
25
|
+
jid, _ = ::TraceView::API.start_trace(:enqueue_test) do
|
26
|
+
Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Allow the job to be run
|
30
|
+
sleep 5
|
31
|
+
|
32
|
+
traces = get_all_traces
|
33
|
+
assert_equal 23, traces.count, "Trace count"
|
34
|
+
valid_edges?(traces)
|
35
|
+
|
36
|
+
assert_equal 'sidekiq-client', traces[1]['Layer']
|
37
|
+
assert_equal 'entry', traces[1]['Label']
|
38
|
+
|
39
|
+
assert_equal 'msgclient', traces[1]['Spec']
|
40
|
+
assert_equal 'sidekiq', traces[1]['Flavor']
|
41
|
+
assert_equal 'critical', traces[1]['Queue']
|
42
|
+
assert_equal jid, traces[1]['MsgID']
|
43
|
+
assert_equal '[1, 2, 3]', traces[1]['Args']
|
44
|
+
assert_equal "RemoteCallWorkerJob", traces[1]['JobName']
|
45
|
+
assert_equal 'false', traces[1]['Retry']
|
46
|
+
assert_equal false, traces[1].key?('Backtrace')
|
47
|
+
|
48
|
+
assert_equal 'sidekiq-client', traces[2]['Layer']
|
49
|
+
assert_equal 'exit', traces[2]['Label']
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_collect_backtraces_default_value
|
53
|
+
assert_equal TV::Config[:sidekiqclient][:collect_backtraces], false, "default backtrace collection"
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_log_args_default_value
|
57
|
+
assert_equal TV::Config[:sidekiqclient][:log_args], true, "log_args default "
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_obey_collect_backtraces_when_false
|
61
|
+
TraceView::Config[:sidekiqclient][:collect_backtraces] = false
|
62
|
+
|
63
|
+
# Queue up a job to be run
|
64
|
+
::TraceView::API.start_trace(:enqueue_test) do
|
65
|
+
Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Allow the job to be run
|
69
|
+
sleep 5
|
70
|
+
|
71
|
+
traces = get_all_traces
|
72
|
+
assert_equal 23, traces.count, "Trace count"
|
73
|
+
valid_edges?(traces)
|
74
|
+
assert_equal 'sidekiq-client', traces[1]['Layer']
|
75
|
+
assert_equal false, traces[1].key?('Backtrace')
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_obey_collect_backtraces_when_true
|
79
|
+
TraceView::Config[:sidekiqclient][:collect_backtraces] = true
|
80
|
+
|
81
|
+
# Queue up a job to be run
|
82
|
+
::TraceView::API.start_trace(:enqueue_test) do
|
83
|
+
Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Allow the job to be run
|
87
|
+
sleep 5
|
88
|
+
|
89
|
+
traces = get_all_traces
|
90
|
+
assert_equal 23, traces.count, "Trace count"
|
91
|
+
valid_edges?(traces)
|
92
|
+
assert_equal 'sidekiq-client', traces[1]['Layer']
|
93
|
+
assert_equal true, traces[1].key?('Backtrace')
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_obey_log_args_when_false
|
97
|
+
TraceView::Config[:sidekiqclient][:log_args] = false
|
98
|
+
|
99
|
+
# Queue up a job to be run
|
100
|
+
::TraceView::API.start_trace(:enqueue_test) do
|
101
|
+
Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Allow the job to be run
|
105
|
+
sleep 5
|
106
|
+
|
107
|
+
traces = get_all_traces
|
108
|
+
assert_equal 23, traces.count, "Trace count"
|
109
|
+
valid_edges?(traces)
|
110
|
+
assert_equal false, traces[1].key?('Args')
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_obey_log_args_when_true
|
114
|
+
TraceView::Config[:sidekiqclient][:log_args] = true
|
115
|
+
|
116
|
+
# Queue up a job to be run
|
117
|
+
::TraceView::API.start_trace(:enqueue_test) do
|
118
|
+
Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
|
119
|
+
end
|
120
|
+
|
121
|
+
# Allow the job to be run
|
122
|
+
sleep 5
|
123
|
+
|
124
|
+
traces = get_all_traces
|
125
|
+
assert_equal 23, traces.count, "Trace count"
|
126
|
+
valid_edges?(traces)
|
127
|
+
assert_equal true, traces[1].key?('Args')
|
128
|
+
assert_equal '[1, 2, 3]', traces[1]['Args']
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,180 @@
|
|
1
|
+
# Copyright (c) 2015 AppNeta, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
|
4
|
+
if RUBY_VERSION >= '2.0'
|
5
|
+
require 'minitest_helper'
|
6
|
+
require 'sidekiq'
|
7
|
+
require_relative "../jobs/remote_call_worker_job"
|
8
|
+
require_relative "../jobs/db_worker_job"
|
9
|
+
require_relative "../jobs/error_worker_job"
|
10
|
+
|
11
|
+
class SidekiqWorkerTest < Minitest::Test
|
12
|
+
def setup
|
13
|
+
clear_all_traces
|
14
|
+
@collect_backtraces = TraceView::Config[:sidekiqworker][:collect_backtraces]
|
15
|
+
@log_args = TraceView::Config[:sidekiqworker][:log_args]
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
TraceView::Config[:sidekiqworker][:collect_backtraces] = @collect_backtraces
|
20
|
+
TraceView::Config[:sidekiqworker][:log_args] = @log_args
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_reports_version_init
|
24
|
+
init_kvs = ::TraceView::Util.build_init_report
|
25
|
+
assert init_kvs.key?('Ruby.Sidekiq.Version')
|
26
|
+
assert_equal "Sidekiq-#{::Sidekiq::VERSION}", init_kvs['Ruby.Sidekiq.Version']
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_job_run
|
30
|
+
# Queue up a job to be run
|
31
|
+
jid = Sidekiq::Client.push('queue' => 'critical', 'class' => RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
|
32
|
+
|
33
|
+
# Allow the job to be run
|
34
|
+
sleep 5
|
35
|
+
|
36
|
+
traces = get_all_traces
|
37
|
+
assert_equal 17, traces.count, "Trace count"
|
38
|
+
validate_outer_layers(traces, "sidekiq-worker")
|
39
|
+
valid_edges?(traces)
|
40
|
+
|
41
|
+
# Validate entry layer KVs
|
42
|
+
assert_equal 'always_sampled', traces[0]['TraceOrigin'], "is always_sampled"
|
43
|
+
assert_equal true, traces[0].key?('SampleRate'), "has SampleRate KV"
|
44
|
+
assert_equal true, traces[0].key?('SampleSource'), "has SampleSource KV"
|
45
|
+
|
46
|
+
# Validate Webserver Spec KVs
|
47
|
+
assert_equal Socket.gethostname, traces[0]['HTTP-Host']
|
48
|
+
assert_equal "Sidekiq_critical", traces[0]['Controller']
|
49
|
+
assert_equal "RemoteCallWorkerJob", traces[0]['Action']
|
50
|
+
assert_equal "/sidekiq/critical/RemoteCallWorkerJob", traces[0]['URL']
|
51
|
+
|
52
|
+
# Validate Job Spec KVs
|
53
|
+
assert_equal "job", traces[0]['Spec']
|
54
|
+
assert_equal 'sidekiq', traces[0]['Flavor']
|
55
|
+
assert_equal "RemoteCallWorkerJob", traces[0]['JobName']
|
56
|
+
assert_equal jid, traces[0]['MsgID']
|
57
|
+
assert_equal "critical", traces[0]['Queue']
|
58
|
+
assert_equal "[1, 2, 3]", traces[0]['Args']
|
59
|
+
assert_equal "false", traces[0]['Retry']
|
60
|
+
|
61
|
+
assert_equal false, traces[0].key?('Backtrace')
|
62
|
+
assert_equal "net-http", traces[4]['Layer']
|
63
|
+
assert_equal "entry", traces[4]['Label']
|
64
|
+
assert_equal "memcache", traces[15]['Layer']
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_jobs_with_errors
|
68
|
+
# Queue up a job to be run
|
69
|
+
jid = Sidekiq::Client.push('queue' => 'critical', 'class' => ErrorWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
|
70
|
+
|
71
|
+
# Allow the job to be run
|
72
|
+
sleep 5
|
73
|
+
|
74
|
+
traces = get_all_traces
|
75
|
+
assert_equal 3, traces.count, "Trace count"
|
76
|
+
validate_outer_layers(traces, "sidekiq-worker")
|
77
|
+
valid_edges?(traces)
|
78
|
+
|
79
|
+
# Validate Webserver Spec KVs
|
80
|
+
assert_equal Socket.gethostname, traces[0]['HTTP-Host']
|
81
|
+
assert_equal "Sidekiq_critical", traces[0]['Controller']
|
82
|
+
assert_equal "ErrorWorkerJob", traces[0]['Action']
|
83
|
+
assert_equal "/sidekiq/critical/ErrorWorkerJob", traces[0]['URL']
|
84
|
+
|
85
|
+
# Validate Job Spec KVs
|
86
|
+
assert_equal "job", traces[0]['Spec']
|
87
|
+
assert_equal 'sidekiq', traces[0]['Flavor']
|
88
|
+
assert_equal "ErrorWorkerJob", traces[0]['JobName']
|
89
|
+
assert_equal jid, traces[0]['MsgID']
|
90
|
+
assert_equal "critical", traces[0]['Queue']
|
91
|
+
assert_equal "[1, 2, 3]", traces[0]['Args']
|
92
|
+
assert_equal "false", traces[0]['Retry']
|
93
|
+
|
94
|
+
assert_equal traces[1]['Layer'], 'sidekiq-worker'
|
95
|
+
assert_equal traces[1]['Label'], 'error'
|
96
|
+
assert_equal traces[1]['ErrorClass'], "RuntimeError"
|
97
|
+
assert traces[1].key?('ErrorMsg')
|
98
|
+
assert traces[1].key?('Backtrace')
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_collect_backtraces_default_value
|
102
|
+
assert_equal TV::Config[:sidekiqworker][:collect_backtraces], false, "default backtrace collection"
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_log_args_default_value
|
106
|
+
assert_equal TV::Config[:sidekiqworker][:log_args], true, "log_args default "
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_obey_collect_backtraces_when_false
|
110
|
+
TraceView::Config[:sidekiqworker][:collect_backtraces] = false
|
111
|
+
|
112
|
+
# Queue up a job to be run
|
113
|
+
Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
|
114
|
+
|
115
|
+
# Allow the job to be run
|
116
|
+
sleep 5
|
117
|
+
|
118
|
+
traces = get_all_traces
|
119
|
+
assert_equal 17, traces.count, "Trace count"
|
120
|
+
valid_edges?(traces)
|
121
|
+
assert_equal 'sidekiq-worker', traces[0]['Layer']
|
122
|
+
assert_equal false, traces[0].key?('Backtrace')
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_obey_collect_backtraces_when_true
|
126
|
+
# FIXME: This can't be tested with the current Sidekiq minitest integration (e.g. already booted
|
127
|
+
# sidekiq in a different process)
|
128
|
+
skip
|
129
|
+
|
130
|
+
TraceView::Config[:sidekiqworker][:collect_backtraces] = true
|
131
|
+
|
132
|
+
# Queue up a job to be run
|
133
|
+
Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
|
134
|
+
|
135
|
+
# Allow the job to be run
|
136
|
+
sleep 5
|
137
|
+
|
138
|
+
traces = get_all_traces
|
139
|
+
assert_equal 17, traces.count, "Trace count"
|
140
|
+
valid_edges?(traces)
|
141
|
+
assert_equal 'sidekiq-worker', traces[0]['Layer']
|
142
|
+
assert_equal true, traces[0].key?('Backtrace')
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_obey_log_args_when_false
|
146
|
+
# FIXME: This can't be tested with the current Sidekiq minitest integration (e.g. already booted
|
147
|
+
# sidekiq in a different process)
|
148
|
+
skip
|
149
|
+
|
150
|
+
TraceView::Config[:sidekiqworker][:log_args] = false
|
151
|
+
|
152
|
+
# Queue up a job to be run
|
153
|
+
Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
|
154
|
+
|
155
|
+
# Allow the job to be run
|
156
|
+
sleep 5
|
157
|
+
|
158
|
+
traces = get_all_traces
|
159
|
+
assert_equal 17, traces.count, "Trace count"
|
160
|
+
valid_edges?(traces)
|
161
|
+
assert_equal false, traces[0].key?('Args')
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_obey_log_args_when_true
|
165
|
+
TraceView::Config[:sidekiqworker][:log_args] = true
|
166
|
+
|
167
|
+
# Queue up a job to be run
|
168
|
+
Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
|
169
|
+
|
170
|
+
# Allow the job to be run
|
171
|
+
sleep 5
|
172
|
+
|
173
|
+
traces = get_all_traces
|
174
|
+
assert_equal 17, traces.count, "Trace count"
|
175
|
+
valid_edges?(traces)
|
176
|
+
assert_equal true, traces[0].key?('Args')
|
177
|
+
assert_equal '[1, 2, 3]', traces[0]['Args']
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|