appoptics_apm 4.0.2

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.
Files changed (226) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +43 -0
  3. data/.dockerignore +5 -0
  4. data/.gitignore +23 -0
  5. data/.rubocop.yml +5 -0
  6. data/.travis.yml +82 -0
  7. data/CHANGELOG.md +769 -0
  8. data/CONFIG.md +33 -0
  9. data/Dockerfile +41 -0
  10. data/Dockerfile_test +66 -0
  11. data/Gemfile +41 -0
  12. data/LICENSE +193 -0
  13. data/README.md +351 -0
  14. data/Rakefile +202 -0
  15. data/Vagrantfile +67 -0
  16. data/appoptics_apm.gemspec +55 -0
  17. data/build_gems.sh +15 -0
  18. data/docker-compose.yml +73 -0
  19. data/examples/DNT.md +35 -0
  20. data/examples/carrying_context.rb +220 -0
  21. data/examples/instrumenting_metal_controller.rb +8 -0
  22. data/examples/puma_on_heroku_config.rb +17 -0
  23. data/examples/tracing_async_threads.rb +124 -0
  24. data/examples/tracing_background_jobs.rb +53 -0
  25. data/examples/tracing_forked_processes.rb +99 -0
  26. data/examples/unicorn_on_heroku_config.rb +28 -0
  27. data/ext/oboe_metal/extconf.rb +54 -0
  28. data/ext/oboe_metal/lib/.keep +0 -0
  29. data/ext/oboe_metal/lib/liboboe-1.0.so.0.0.0 +0 -0
  30. data/ext/oboe_metal/noop/noop.c +7 -0
  31. data/ext/oboe_metal/src/VERSION +1 -0
  32. data/ext/oboe_metal/src/bson/bson.h +221 -0
  33. data/ext/oboe_metal/src/bson/platform_hacks.h +91 -0
  34. data/ext/oboe_metal/src/oboe.h +883 -0
  35. data/ext/oboe_metal/src/oboe.hpp +793 -0
  36. data/ext/oboe_metal/src/oboe_debug.h +50 -0
  37. data/ext/oboe_metal/src/oboe_wrap.cxx +6088 -0
  38. data/ext/oboe_metal/tests/test.rb +11 -0
  39. data/gemfiles/delayed_job.gemfile +36 -0
  40. data/gemfiles/frameworks.gemfile +44 -0
  41. data/gemfiles/instrumentation_mocked.gemfile +29 -0
  42. data/gemfiles/libraries.gemfile +85 -0
  43. data/gemfiles/rails23.gemfile +39 -0
  44. data/gemfiles/rails30.gemfile +42 -0
  45. data/gemfiles/rails31.gemfile +44 -0
  46. data/gemfiles/rails32.gemfile +54 -0
  47. data/gemfiles/rails40.gemfile +27 -0
  48. data/gemfiles/rails41.gemfile +27 -0
  49. data/gemfiles/rails42.gemfile +35 -0
  50. data/gemfiles/rails50.gemfile +44 -0
  51. data/gemfiles/rails51.gemfile +44 -0
  52. data/get_version.rb +5 -0
  53. data/init.rb +4 -0
  54. data/lib/appoptics_apm/api/layerinit.rb +39 -0
  55. data/lib/appoptics_apm/api/logging.rb +359 -0
  56. data/lib/appoptics_apm/api/memcache.rb +34 -0
  57. data/lib/appoptics_apm/api/profiling.rb +201 -0
  58. data/lib/appoptics_apm/api/tracing.rb +152 -0
  59. data/lib/appoptics_apm/api/util.rb +128 -0
  60. data/lib/appoptics_apm/api.rb +18 -0
  61. data/lib/appoptics_apm/base.rb +252 -0
  62. data/lib/appoptics_apm/config.rb +281 -0
  63. data/lib/appoptics_apm/frameworks/grape.rb +93 -0
  64. data/lib/appoptics_apm/frameworks/padrino/templates.rb +58 -0
  65. data/lib/appoptics_apm/frameworks/padrino.rb +52 -0
  66. data/lib/appoptics_apm/frameworks/rails/inst/action_controller.rb +106 -0
  67. data/lib/appoptics_apm/frameworks/rails/inst/action_controller2.rb +61 -0
  68. data/lib/appoptics_apm/frameworks/rails/inst/action_controller3.rb +58 -0
  69. data/lib/appoptics_apm/frameworks/rails/inst/action_controller4.rb +48 -0
  70. data/lib/appoptics_apm/frameworks/rails/inst/action_controller5.rb +50 -0
  71. data/lib/appoptics_apm/frameworks/rails/inst/action_controller_api.rb +50 -0
  72. data/lib/appoptics_apm/frameworks/rails/inst/action_view.rb +58 -0
  73. data/lib/appoptics_apm/frameworks/rails/inst/action_view_2x.rb +56 -0
  74. data/lib/appoptics_apm/frameworks/rails/inst/action_view_30.rb +50 -0
  75. data/lib/appoptics_apm/frameworks/rails/inst/active_record.rb +27 -0
  76. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql.rb +43 -0
  77. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql2.rb +28 -0
  78. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/postgresql.rb +30 -0
  79. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils.rb +120 -0
  80. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils5x.rb +101 -0
  81. data/lib/appoptics_apm/frameworks/rails.rb +116 -0
  82. data/lib/appoptics_apm/frameworks/sinatra/templates.rb +56 -0
  83. data/lib/appoptics_apm/frameworks/sinatra.rb +71 -0
  84. data/lib/appoptics_apm/inst/bunny-client.rb +148 -0
  85. data/lib/appoptics_apm/inst/bunny-consumer.rb +92 -0
  86. data/lib/appoptics_apm/inst/curb.rb +329 -0
  87. data/lib/appoptics_apm/inst/dalli.rb +85 -0
  88. data/lib/appoptics_apm/inst/delayed_job.rb +92 -0
  89. data/lib/appoptics_apm/inst/em-http-request.rb +105 -0
  90. data/lib/appoptics_apm/inst/excon.rb +130 -0
  91. data/lib/appoptics_apm/inst/faraday.rb +77 -0
  92. data/lib/appoptics_apm/inst/http.rb +83 -0
  93. data/lib/appoptics_apm/inst/httpclient.rb +176 -0
  94. data/lib/appoptics_apm/inst/memcache.rb +102 -0
  95. data/lib/appoptics_apm/inst/memcached.rb +94 -0
  96. data/lib/appoptics_apm/inst/mongo.rb +242 -0
  97. data/lib/appoptics_apm/inst/mongo2.rb +225 -0
  98. data/lib/appoptics_apm/inst/moped.rb +466 -0
  99. data/lib/appoptics_apm/inst/rack.rb +146 -0
  100. data/lib/appoptics_apm/inst/redis.rb +275 -0
  101. data/lib/appoptics_apm/inst/resque.rb +151 -0
  102. data/lib/appoptics_apm/inst/rest-client.rb +50 -0
  103. data/lib/appoptics_apm/inst/sequel.rb +178 -0
  104. data/lib/appoptics_apm/inst/sidekiq-client.rb +53 -0
  105. data/lib/appoptics_apm/inst/sidekiq-worker.rb +67 -0
  106. data/lib/appoptics_apm/inst/twitter-cassandra.rb +294 -0
  107. data/lib/appoptics_apm/inst/typhoeus.rb +113 -0
  108. data/lib/appoptics_apm/instrumentation.rb +22 -0
  109. data/lib/appoptics_apm/legacy_method_profiling.rb +97 -0
  110. data/lib/appoptics_apm/loading.rb +66 -0
  111. data/lib/appoptics_apm/logger.rb +41 -0
  112. data/lib/appoptics_apm/method_profiling.rb +33 -0
  113. data/lib/appoptics_apm/ruby.rb +35 -0
  114. data/lib/appoptics_apm/support.rb +135 -0
  115. data/lib/appoptics_apm/test.rb +94 -0
  116. data/lib/appoptics_apm/thread_local.rb +26 -0
  117. data/lib/appoptics_apm/util.rb +312 -0
  118. data/lib/appoptics_apm/version.rb +15 -0
  119. data/lib/appoptics_apm/xtrace.rb +103 -0
  120. data/lib/appoptics_apm.rb +72 -0
  121. data/lib/joboe_metal.rb +214 -0
  122. data/lib/oboe/README +2 -0
  123. data/lib/oboe/backward_compatibility.rb +80 -0
  124. data/lib/oboe/inst/rack.rb +11 -0
  125. data/lib/oboe.rb +7 -0
  126. data/lib/oboe_metal.rb +187 -0
  127. data/lib/rails/generators/appoptics_apm/install_generator.rb +45 -0
  128. data/lib/rails/generators/appoptics_apm/templates/appoptics_apm_initializer.rb +222 -0
  129. data/ruby_setup.sh +47 -0
  130. data/run_docker_build_gem_upload_to_packagecloud.sh +20 -0
  131. data/run_tests_docker.rb +32 -0
  132. data/test/benchmark/README.md +65 -0
  133. data/test/benchmark/logging_bench.rb +54 -0
  134. data/test/benchmark/with_libraries_gemfile/bunny_bench.rb +69 -0
  135. data/test/benchmark/with_rails5x_gemfile/action_controller5x_bench.rb +43 -0
  136. data/test/frameworks/apps/grape_nested.rb +33 -0
  137. data/test/frameworks/apps/grape_simple.rb +80 -0
  138. data/test/frameworks/apps/padrino_simple.rb +80 -0
  139. data/test/frameworks/apps/sinatra_simple.rb +55 -0
  140. data/test/frameworks/grape_test.rb +286 -0
  141. data/test/frameworks/padrino_test.rb +222 -0
  142. data/test/frameworks/rails3x_test.rb +554 -0
  143. data/test/frameworks/rails4x_test.rb +570 -0
  144. data/test/frameworks/rails5x_api_test.rb +210 -0
  145. data/test/frameworks/rails5x_test.rb +376 -0
  146. data/test/frameworks/rails_shared_tests.rb +172 -0
  147. data/test/frameworks/sinatra_test.rb +140 -0
  148. data/test/instrumentation/bunny_client_test.rb +276 -0
  149. data/test/instrumentation/bunny_consumer_test.rb +204 -0
  150. data/test/instrumentation/curb_test.rb +398 -0
  151. data/test/instrumentation/dalli_test.rb +177 -0
  152. data/test/instrumentation/em_http_request_test.rb +89 -0
  153. data/test/instrumentation/excon_test.rb +231 -0
  154. data/test/instrumentation/faraday_test.rb +228 -0
  155. data/test/instrumentation/http_test.rb +143 -0
  156. data/test/instrumentation/httpclient_test.rb +320 -0
  157. data/test/instrumentation/memcache_test.rb +260 -0
  158. data/test/instrumentation/memcached_test.rb +229 -0
  159. data/test/instrumentation/mongo_v1_test.rb +479 -0
  160. data/test/instrumentation/mongo_v2_index_test.rb +124 -0
  161. data/test/instrumentation/mongo_v2_test.rb +584 -0
  162. data/test/instrumentation/mongo_v2_view_test.rb +435 -0
  163. data/test/instrumentation/moped_test.rb +517 -0
  164. data/test/instrumentation/rack_test.rb +165 -0
  165. data/test/instrumentation/redis_hashes_test.rb +268 -0
  166. data/test/instrumentation/redis_keys_test.rb +321 -0
  167. data/test/instrumentation/redis_lists_test.rb +310 -0
  168. data/test/instrumentation/redis_misc_test.rb +163 -0
  169. data/test/instrumentation/redis_sets_test.rb +296 -0
  170. data/test/instrumentation/redis_sortedsets_test.rb +328 -0
  171. data/test/instrumentation/redis_strings_test.rb +349 -0
  172. data/test/instrumentation/resque_test.rb +185 -0
  173. data/test/instrumentation/rest-client_test.rb +288 -0
  174. data/test/instrumentation/sequel_mysql2_test.rb +353 -0
  175. data/test/instrumentation/sequel_mysql_test.rb +334 -0
  176. data/test/instrumentation/sequel_pg_test.rb +336 -0
  177. data/test/instrumentation/sidekiq-client_test.rb +159 -0
  178. data/test/instrumentation/sidekiq-worker_test.rb +180 -0
  179. data/test/instrumentation/twitter-cassandra_test.rb +424 -0
  180. data/test/instrumentation/typhoeus_test.rb +284 -0
  181. data/test/jobs/delayed_job/db_worker_job.rb +29 -0
  182. data/test/jobs/delayed_job/error_worker_job.rb +10 -0
  183. data/test/jobs/delayed_job/remote_call_worker_job.rb +20 -0
  184. data/test/jobs/resque/db_worker_job.rb +29 -0
  185. data/test/jobs/resque/error_worker_job.rb +10 -0
  186. data/test/jobs/resque/remote_call_worker_job.rb +20 -0
  187. data/test/jobs/sidekiq/db_worker_job.rb +29 -0
  188. data/test/jobs/sidekiq/error_worker_job.rb +10 -0
  189. data/test/jobs/sidekiq/remote_call_worker_job.rb +20 -0
  190. data/test/minitest_helper.rb +276 -0
  191. data/test/mocked/curb_mocked_test.rb +311 -0
  192. data/test/mocked/excon_mocked_test.rb +166 -0
  193. data/test/mocked/faraday_mocked_test.rb +93 -0
  194. data/test/mocked/http_mocked_test.rb +129 -0
  195. data/test/mocked/httpclient_mocked_test.rb +245 -0
  196. data/test/mocked/rest_client_mocked_test.rb +103 -0
  197. data/test/mocked/typhoeus_mocked_test.rb +192 -0
  198. data/test/models/widget.rb +36 -0
  199. data/test/profiling/legacy_method_profiling_test.rb +201 -0
  200. data/test/profiling/method_profiling_test.rb +631 -0
  201. data/test/queues/delayed_job-client_test.rb +95 -0
  202. data/test/queues/delayed_job-worker_test.rb +91 -0
  203. data/test/reporter/reporter_test.rb +14 -0
  204. data/test/servers/delayed_job.rb +107 -0
  205. data/test/servers/rackapp_8101.rb +29 -0
  206. data/test/servers/rails3x_8140.rb +96 -0
  207. data/test/servers/rails4x_8140.rb +96 -0
  208. data/test/servers/rails5x_8140.rb +95 -0
  209. data/test/servers/rails5x_api_8150.rb +78 -0
  210. data/test/servers/sidekiq.rb +29 -0
  211. data/test/servers/sidekiq.yml +7 -0
  212. data/test/servers/sidekiq_initializer.rb +25 -0
  213. data/test/settings +0 -0
  214. data/test/support/auto_tracing_test.rb +50 -0
  215. data/test/support/backcompat_test.rb +276 -0
  216. data/test/support/config_test.rb +149 -0
  217. data/test/support/dnt_test.rb +98 -0
  218. data/test/support/init_report_test.rb +25 -0
  219. data/test/support/liboboe_settings_test.rb +110 -0
  220. data/test/support/logging_test.rb +130 -0
  221. data/test/support/noop_test.rb +88 -0
  222. data/test/support/sql_sanitize_test.rb +55 -0
  223. data/test/support/tracing_mode_test.rb +33 -0
  224. data/test/support/tvalias_test.rb +15 -0
  225. data/test/support/xtrace_test.rb +41 -0
  226. metadata +475 -0
@@ -0,0 +1,159 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ if RUBY_VERSION >= '2.0' && !defined?(JRUBY_VERSION)
5
+ require 'minitest_helper'
6
+ require 'sidekiq'
7
+ require_relative "../jobs/sidekiq/remote_call_worker_job"
8
+ require_relative "../jobs/sidekiq/db_worker_job"
9
+ require_relative "../jobs/sidekiq/error_worker_job"
10
+
11
+ class SidekiqClientTest < Minitest::Test
12
+ def setup
13
+ clear_all_traces
14
+ AppOpticsAPM::Context.clear
15
+ @collect_backtraces = AppOpticsAPM::Config[:sidekiqclient][:collect_backtraces]
16
+ @log_args = AppOpticsAPM::Config[:sidekiqclient][:log_args]
17
+ @tracing_mode = AppOpticsAPM::Config[:tracing_mode]
18
+ end
19
+
20
+ def teardown
21
+ AppOpticsAPM::Config[:sidekiqclient][:collect_backtraces] = @collect_backtraces
22
+ AppOpticsAPM::Config[:sidekiqclient][:log_args] = @log_args
23
+ AppOpticsAPM::Config[:tracing_mode] = @tracing_mode
24
+ end
25
+
26
+ def refined_trace_count(traces)
27
+ # we expect 23 traces, but it looks like there are cases where an extra 2 or 4 redis traces slip in
28
+ # This method will allow the tests to pass despite the inconsistency in counts and also log some information
29
+
30
+ redis_traces = traces.select { |h| h['Layer'] == 'redis' }
31
+ traces.count - redis_traces.count
32
+ end
33
+
34
+ def test_enqueue
35
+ # Queue up a job to be run
36
+ jid, _ = ::AppOpticsAPM::API.start_trace(:enqueue_test) do
37
+ Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
38
+ end
39
+
40
+ # Allow the job to be run
41
+ sleep 5
42
+
43
+ traces = get_all_traces
44
+ assert_equal 21, refined_trace_count(traces)
45
+ assert valid_edges?(traces), "Invalid edge in traces"
46
+
47
+ assert_equal 'sidekiq-client', traces[1]['Layer']
48
+ assert_equal 'entry', traces[1]['Label']
49
+
50
+ assert_equal 'pushq', traces[1]['Spec']
51
+ assert_equal 'sidekiq', traces[1]['Flavor']
52
+ assert_equal 'critical', traces[1]['Queue']
53
+ assert_equal jid, traces[1]['MsgID']
54
+ assert_equal '[1, 2, 3]', traces[1]['Args']
55
+ assert_equal "RemoteCallWorkerJob", traces[1]['JobName']
56
+ assert_equal 'false', traces[1]['Retry']
57
+ assert_equal false, traces[1].key?('Backtrace')
58
+
59
+ assert_equal 'sidekiq-client', traces[2]['Layer']
60
+ assert_equal 'exit', traces[2]['Label']
61
+ end
62
+
63
+ def test_collect_backtraces_default_value
64
+ assert_equal AppOpticsAPM::Config[:sidekiqclient][:collect_backtraces], false, "default backtrace collection"
65
+ end
66
+
67
+ def test_log_args_default_value
68
+ assert_equal AppOpticsAPM::Config[:sidekiqclient][:log_args], true, "log_args default "
69
+ end
70
+
71
+ def test_obey_collect_backtraces_when_false
72
+ AppOpticsAPM::Config[:sidekiqclient][:collect_backtraces] = false
73
+
74
+ # Queue up a job to be run
75
+ ::AppOpticsAPM::API.start_trace(:enqueue_test) do
76
+ Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
77
+ end
78
+
79
+ # Allow the job to be run
80
+ sleep 5
81
+
82
+ traces = get_all_traces
83
+ assert_equal 21, refined_trace_count(traces)
84
+ assert valid_edges?(traces), "Invalid edge in traces"
85
+ assert_equal 'sidekiq-client', traces[1]['Layer']
86
+ assert_equal false, traces[1].key?('Backtrace')
87
+ end
88
+
89
+ def test_obey_collect_backtraces_when_true
90
+ AppOpticsAPM::Config[:sidekiqclient][:collect_backtraces] = true
91
+
92
+ # Queue up a job to be run
93
+ ::AppOpticsAPM::API.start_trace(:enqueue_test) do
94
+ Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
95
+ end
96
+
97
+ # Allow the job to be run
98
+ sleep 5
99
+
100
+ traces = get_all_traces
101
+ assert_equal 21, refined_trace_count(traces)
102
+ assert valid_edges?(traces), "Invalid edge in traces"
103
+ assert_equal 'sidekiq-client', traces[1]['Layer']
104
+ assert_equal true, traces[1].key?('Backtrace')
105
+ end
106
+
107
+ def test_obey_log_args_when_false
108
+ AppOpticsAPM::Config[:sidekiqclient][:log_args] = false
109
+
110
+ # Queue up a job to be run
111
+ ::AppOpticsAPM::API.start_trace(:enqueue_test) do
112
+ Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
113
+ end
114
+
115
+ # Allow the job to be run
116
+ sleep 5
117
+
118
+ traces = get_all_traces
119
+ assert_equal 21, refined_trace_count(traces)
120
+ assert valid_edges?(traces), "Invalid edge in traces"
121
+ assert_equal false, traces[1].key?('Args')
122
+ end
123
+
124
+ def test_obey_log_args_when_true
125
+ AppOpticsAPM::Config[:sidekiqclient][:log_args] = true
126
+
127
+ # Queue up a job to be run
128
+ ::AppOpticsAPM::API.start_trace(:enqueue_test) do
129
+ Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
130
+ end
131
+
132
+ # Allow the job to be run
133
+ sleep 5
134
+
135
+ traces = get_all_traces
136
+ assert_equal 21, refined_trace_count(traces)
137
+ assert valid_edges?(traces), "Invalid edge in traces"
138
+ assert_equal true, traces[1].key?('Args')
139
+ assert_equal '[1, 2, 3]', traces[1]['Args']
140
+ end
141
+
142
+ def test_dont_log_when_not_sampling
143
+ AppOpticsAPM::Config[:sidekiqclient][:log_args] = true
144
+ AppOpticsAPM::Config[:tracing_mode] = 'never'
145
+
146
+ ::AppOpticsAPM::API.start_trace(:enqueue_test) do
147
+ Sidekiq::Client.push('queue' => 'critical', 'class' => ::RemoteCallWorkerJob, 'args' => [1, 2, 3], 'retry' => false)
148
+ end
149
+
150
+ sleep 3
151
+ traces = get_all_traces
152
+
153
+ # FIXME: the sidekiq worker is not respecting the AppOpticsAPM::Config[:tracing_mode] = 'never' setting
154
+ # ____ instead of no traces we are getting 17, that is 4 less than we would get with tracing
155
+ # assert_equal 0, traces.count
156
+ assert_equal 17, refined_trace_count(traces)
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,180 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ if RUBY_VERSION >= '2.0' && !defined?(JRUBY_VERSION)
5
+ require 'minitest_helper'
6
+ require 'sidekiq'
7
+ require_relative "../jobs/sidekiq/remote_call_worker_job"
8
+ require_relative "../jobs/sidekiq/db_worker_job"
9
+ require_relative "../jobs/sidekiq/error_worker_job"
10
+
11
+ class SidekiqWorkerTest < Minitest::Test
12
+ def setup
13
+ clear_all_traces
14
+ @collect_backtraces = AppOpticsAPM::Config[:sidekiqworker][:collect_backtraces]
15
+ @log_args = AppOpticsAPM::Config[:sidekiqworker][:log_args]
16
+ end
17
+
18
+ def teardown
19
+ AppOpticsAPM::Config[:sidekiqworker][:collect_backtraces] = @collect_backtraces
20
+ AppOpticsAPM::Config[:sidekiqworker][:log_args] = @log_args
21
+ end
22
+
23
+ def test_reports_version_init
24
+ init_kvs = ::AppOpticsAPM::Util.build_init_report
25
+ assert init_kvs.key?('Ruby.sidekiq.Version')
26
+ assert_equal ::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
+ assert valid_edges?(traces), "Invalid edge in 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
+ assert valid_edges?(traces), "Invalid edge in 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 AppOpticsAPM::Config[:sidekiqworker][:collect_backtraces], false, "default backtrace collection"
103
+ end
104
+
105
+ def test_log_args_default_value
106
+ assert_equal AppOpticsAPM::Config[:sidekiqworker][:log_args], true, "log_args default "
107
+ end
108
+
109
+ def test_obey_collect_backtraces_when_false
110
+ AppOpticsAPM::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
+ assert valid_edges?(traces), "Invalid edge in 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
+ AppOpticsAPM::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
+ assert valid_edges?(traces), "Invalid edge in 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
+ AppOpticsAPM::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
+ assert valid_edges?(traces), "Invalid edge in traces"
161
+ assert_equal false, traces[0].key?('Args')
162
+ end
163
+
164
+ def test_obey_log_args_when_true
165
+ AppOpticsAPM::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
+ assert valid_edges?(traces), "Invalid edge in traces"
176
+ assert_equal true, traces[0].key?('Args')
177
+ assert_equal '[1, 2, 3]', traces[0]['Args']
178
+ end
179
+ end
180
+ end