traceview 3.2.1 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|