traceview 3.2.1 → 3.3.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/.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/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/lib/traceview.rb +2 -0
- 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 +40 -14
- checksums.yaml +0 -7
@@ -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
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
|
@@ -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
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Copyright (c) 2015 AppNeta, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
|
4
|
+
class DBWorkerJob
|
5
|
+
include Sidekiq::Worker
|
6
|
+
|
7
|
+
def perform(*args)
|
8
|
+
return unless defined?(::Sequel) && !defined?(JRUBY_VERSION)
|
9
|
+
|
10
|
+
if ENV.key?('TRAVIS_MYSQL_PASS')
|
11
|
+
@db = Sequel.connect("mysql2://root:#{ENV['TRAVIS_MYSQL_PASS']}@127.0.0.1:3306/travis_ci_test")
|
12
|
+
else
|
13
|
+
@db = Sequel.connect('mysql2://root@127.0.0.1:3306/travis_ci_test')
|
14
|
+
end
|
15
|
+
|
16
|
+
unless @db.table_exists?(:items)
|
17
|
+
@db.create_table :items do
|
18
|
+
primary_key :id
|
19
|
+
String :name
|
20
|
+
Float :price
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
@db.run('select 1')
|
25
|
+
|
26
|
+
items = @db[:items]
|
27
|
+
items.count
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Copyright (c) 2015 AppNeta, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
|
4
|
+
class RemoteCallWorkerJob
|
5
|
+
include Sidekiq::Worker
|
6
|
+
|
7
|
+
def perform(*args)
|
8
|
+
# Make some random Dalli (memcache) calls and top it
|
9
|
+
# off with an excon call to the background rack webserver.
|
10
|
+
@dc = Dalli::Client.new
|
11
|
+
@dc.get(rand(10).to_s)
|
12
|
+
uri = URI('http://gameface.in/gamers')
|
13
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
14
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
15
|
+
http.request(request)
|
16
|
+
@dc.get(rand(10).to_s)
|
17
|
+
@dc.get(rand(10).to_s)
|
18
|
+
@dc.get_multi([:one, :two, :three, :four, :five, :six])
|
19
|
+
end
|
20
|
+
end
|
data/test/minitest_helper.rb
CHANGED
@@ -61,6 +61,10 @@ when /rails3/
|
|
61
61
|
require "./test/servers/rails3x_8140"
|
62
62
|
when /frameworks/
|
63
63
|
when /libraries/
|
64
|
+
if RUBY_VERSION >= '2.0'
|
65
|
+
# Background Sidekiq thread
|
66
|
+
require './test/servers/sidekiq.rb'
|
67
|
+
end
|
64
68
|
end
|
65
69
|
|
66
70
|
##
|
@@ -143,7 +147,6 @@ def valid_edges?(traces)
|
|
143
147
|
traces.reverse.each do |t|
|
144
148
|
if t.key?("Edge")
|
145
149
|
unless has_edge?(t["Edge"], traces)
|
146
|
-
require 'byebug'; debugger
|
147
150
|
return false
|
148
151
|
end
|
149
152
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Copyright (c) 2015 AppNeta, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
|
4
|
+
require 'minitest_helper'
|
5
|
+
|
6
|
+
class TVReporterTest < Minitest::Test
|
7
|
+
def reporter_has_start_method
|
8
|
+
assert_equal true, TV::Reporter.respond_to?(:start), "has restart method"
|
9
|
+
end
|
10
|
+
|
11
|
+
def reporter_has_restart_method
|
12
|
+
assert_equal true, TV::Reporter.respond_to?(:restart), "has start method"
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Copyright (c) 2015 AppNeta, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
|
4
|
+
require 'sidekiq/cli'
|
5
|
+
|
6
|
+
TraceView.logger.info "[traceview/servers] Starting up background Sidekiq."
|
7
|
+
|
8
|
+
options = []
|
9
|
+
arguments = ""
|
10
|
+
options << ["-r", Dir.pwd + "/test/servers/sidekiq_initializer.rb"]
|
11
|
+
options << ["-q", "critical,20", "-q", "default"]
|
12
|
+
options << ["-c", "10"]
|
13
|
+
options << ["-P", "/tmp/sidekiq_#{Process.pid}.pid"]
|
14
|
+
|
15
|
+
options.flatten.each do |x|
|
16
|
+
arguments += " #{x}"
|
17
|
+
end
|
18
|
+
|
19
|
+
TraceView.logger.debug "[traceview/servers] sidekiq #{arguments}"
|
20
|
+
|
21
|
+
# Boot Sidekiq in a new thread
|
22
|
+
Thread.new do
|
23
|
+
system("OBOE_GEM_TEST=true sidekiq #{arguments}")
|
24
|
+
end
|
25
|
+
|
26
|
+
# Allow Sidekiq to boot up
|
27
|
+
sleep 10
|
28
|
+
|
29
|
+
# Add a hook to shutdown sidekiq after Minitest finished running
|
30
|
+
Minitest.after_run {
|
31
|
+
TraceView.logger.warn "[traceview/servers] Shutting down Sidekiq."
|
32
|
+
pid = File.read("/tmp/sidekiq_#{Process.pid}.pid").chomp
|
33
|
+
Process.kill(:TERM, pid.to_i)
|
34
|
+
File.unlink "/tmp/sidekiq_#{Process.pid}.pid"
|
35
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# Copyright (c) 2015 AppNeta, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
|
4
|
+
ENV['BUNDLE_GEMFILE'] = Dir.pwd + "/gemfiles/libraries.gemfile"
|
5
|
+
|
6
|
+
require 'rubygems'
|
7
|
+
require 'bundler/setup'
|
8
|
+
require_relative '../jobs/db_worker_job'
|
9
|
+
require_relative '../jobs/remote_call_worker_job'
|
10
|
+
require_relative '../jobs/error_worker_job'
|
11
|
+
|
12
|
+
ENV["RACK_ENV"] = "test"
|
13
|
+
ENV["TRACEVIEW_GEM_TEST"] = "true"
|
14
|
+
ENV["TRACEVIEW_GEM_VERBOSE"] = "true"
|
15
|
+
|
16
|
+
Bundler.require(:default, :test)
|
17
|
+
|
18
|
+
# Configure TraceView
|
19
|
+
TraceView::Config[:tracing_mode] = "always"
|
20
|
+
TraceView::Config[:sample_rate] = 1000000
|
21
|
+
TraceView.logger.level = Logger::DEBUG
|
22
|
+
|
data/test/support/config_test.rb
CHANGED
@@ -30,7 +30,7 @@ describe "TraceView::Config" do
|
|
30
30
|
instrumentation = TraceView::Config.instrumentation
|
31
31
|
|
32
32
|
# Verify the number of individual instrumentations
|
33
|
-
instrumentation.count.must_equal
|
33
|
+
instrumentation.count.must_equal 24
|
34
34
|
|
35
35
|
TraceView::Config[:action_controller][:enabled].must_equal true
|
36
36
|
TraceView::Config[:action_view][:enabled].must_equal true
|
@@ -53,6 +53,8 @@ describe "TraceView::Config" do
|
|
53
53
|
TraceView::Config[:resque][:enabled].must_equal true
|
54
54
|
TraceView::Config[:rest_client][:enabled].must_equal true
|
55
55
|
TraceView::Config[:sequel][:enabled].must_equal true
|
56
|
+
TraceView::Config[:sidekiqclient][:enabled].must_equal true
|
57
|
+
TraceView::Config[:sidekiqworker][:enabled].must_equal true
|
56
58
|
TraceView::Config[:typhoeus][:enabled].must_equal true
|
57
59
|
|
58
60
|
TraceView::Config[:action_controller][:log_args].must_equal true
|
@@ -76,6 +78,8 @@ describe "TraceView::Config" do
|
|
76
78
|
TraceView::Config[:resque][:log_args].must_equal true
|
77
79
|
TraceView::Config[:rest_client][:log_args].must_equal true
|
78
80
|
TraceView::Config[:sequel][:log_args].must_equal true
|
81
|
+
TraceView::Config[:sidekiqclient][:log_args].must_equal true
|
82
|
+
TraceView::Config[:sidekiqworker][:log_args].must_equal true
|
79
83
|
TraceView::Config[:typhoeus][:log_args].must_equal true
|
80
84
|
|
81
85
|
TraceView::Config[:resque][:link_workers].must_equal false
|