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,349 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ require 'minitest_helper'
5
+
6
+ if defined?(::Redis)
7
+ describe "Redis Strings" do
8
+ attr_reader :entry_kvs, :exit_kvs, :redis, :redis_version
9
+
10
+ def min_server_version(version)
11
+ unless Gem::Version.new(@redis_version) >= Gem::Version.new(version.to_s)
12
+ skip "supported only on redis-server #{version} or greater"
13
+ end
14
+ end
15
+
16
+ before do
17
+ clear_all_traces
18
+
19
+ @redis ||= Redis.new(:host => ENV['APPOPTICS_REDIS_SERVER'] || '127.0.0.1')
20
+
21
+ @redis_version ||= @redis.info["redis_version"]
22
+
23
+ # These are standard entry/exit KVs that are passed up with all moped operations
24
+ @entry_kvs ||= { 'Layer' => 'redis_test', 'Label' => 'entry' }
25
+ @exit_kvs ||= { 'Layer' => 'redis_test', 'Label' => 'exit' }
26
+ end
27
+
28
+ it "should trace append" do
29
+ @redis.set("yourkey", "test")
30
+
31
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
32
+ @redis.append("yourkey", "blah")
33
+ end
34
+
35
+ traces = get_all_traces
36
+ traces.count.must_equal 4
37
+ traces[2]['KVOp'].must_equal "append"
38
+ traces[2]['KVKey'].must_equal "yourkey"
39
+ end
40
+
41
+ it "should trace bitcount (>=2.6)" do
42
+
43
+ min_server_version("2.6")
44
+
45
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
46
+ @redis.bitcount("yourkey")
47
+ end
48
+
49
+ traces = get_all_traces
50
+ traces.count.must_equal 4
51
+ traces[2]['KVOp'].must_equal "bitcount"
52
+ traces[2]['start'].must_equal 0
53
+ traces[2]['stop'].must_equal (-1)
54
+ end
55
+
56
+ it "should trace bitop (>=2.6)" do
57
+
58
+ min_server_version("2.6")
59
+
60
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
61
+ @redis.bitop("not", "bitopkey", "yourkey")
62
+ end
63
+
64
+ traces = get_all_traces
65
+ traces.count.must_equal 4
66
+ traces[2]['KVOp'].must_equal "bitop"
67
+ traces[2]['operation'].must_equal "not"
68
+ traces[2]['destkey'].must_equal "bitopkey"
69
+ end
70
+
71
+ it "should trace decr" do
72
+ @redis.setex("decr", 60, 0)
73
+
74
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
75
+ @redis.decr("decr")
76
+ end
77
+
78
+ traces = get_all_traces
79
+ traces.count.must_equal 4
80
+ traces[2]['KVOp'].must_equal "decr"
81
+ traces[2]['KVKey'].must_equal "decr"
82
+ end
83
+
84
+ it "should trace decrby" do
85
+ @redis.setex("decr", 60, 0)
86
+
87
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
88
+ @redis.decrby("decr", 1)
89
+ end
90
+
91
+ traces = get_all_traces
92
+ traces.count.must_equal 4
93
+ traces[2]['KVOp'].must_equal "decrby"
94
+ traces[2]['KVKey'].must_equal "decr"
95
+ traces[2]['decrement'].must_equal 1
96
+ end
97
+
98
+ it "should trace get" do
99
+ @redis.setex("diwore", 60, "okokok")
100
+
101
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
102
+ @rv = @redis.get("diwore")
103
+ end
104
+
105
+ @rv.must_equal "okokok"
106
+
107
+ traces = get_all_traces
108
+ traces.count.must_equal 4
109
+ traces[2]['KVOp'].must_equal "get"
110
+ traces[2]['KVKey'].must_equal "diwore"
111
+ end
112
+
113
+ it "should trace getbit" do
114
+ min_server_version(2.2)
115
+
116
+ @redis.setex("diwore", 60, "okokok")
117
+
118
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
119
+ @redis.getbit("diwore", 3)
120
+ end
121
+
122
+ traces = get_all_traces
123
+ traces.count.must_equal 4
124
+ traces[2]['KVOp'].must_equal "getbit"
125
+ traces[2]['KVKey'].must_equal "diwore"
126
+ traces[2]['offset'].must_equal 3
127
+ end
128
+
129
+ it "should trace getrange" do
130
+ min_server_version(2.2)
131
+
132
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
133
+ @redis.getrange("yourkey", 0, 3)
134
+ end
135
+
136
+ traces = get_all_traces
137
+ traces.count.must_equal 4
138
+ traces[2]['KVOp'].must_equal "getrange"
139
+ traces[2]['KVKey'].must_equal "yourkey"
140
+ traces[2]['start'].must_equal 0
141
+ traces[2]['end'].must_equal 3
142
+ end
143
+
144
+ it "should trace getset" do
145
+ min_server_version(2.2)
146
+
147
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
148
+ @redis.getset("dollar", 0)
149
+ end
150
+
151
+ traces = get_all_traces
152
+ traces.count.must_equal 4
153
+ traces[2]['KVOp'].must_equal "getset"
154
+ traces[2]['KVKey'].must_equal "dollar"
155
+ traces[2]['value'].must_equal "0"
156
+ end
157
+
158
+ it "should trace incr" do
159
+ @redis.setex("dotcom", 60, 0)
160
+
161
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
162
+ @redis.incr("dotcom")
163
+ end
164
+
165
+ traces = get_all_traces
166
+ traces.count.must_equal 4
167
+ traces[2]['KVOp'].must_equal "incr"
168
+ traces[2]['KVKey'].must_equal "dotcom"
169
+ end
170
+
171
+ it "should trace incrby" do
172
+ @redis.setex("incr", 60, 0)
173
+
174
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
175
+ @redis.incrby("incr", 1)
176
+ end
177
+
178
+ traces = get_all_traces
179
+ traces.count.must_equal 4
180
+ traces[2]['KVOp'].must_equal "incrby"
181
+ traces[2]['KVKey'].must_equal "incr"
182
+ traces[2]['increment'].must_equal 1
183
+ end
184
+
185
+ it "should trace incrbyfloat" do
186
+ min_server_version(2.6)
187
+
188
+ @redis.setex("incrfloat", 60, 0.0)
189
+
190
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
191
+ @redis.incrbyfloat("incrfloat", 1.01)
192
+ end
193
+
194
+ traces = get_all_traces
195
+ traces.count.must_equal 4
196
+ traces[2]['KVOp'].must_equal "incrbyfloat"
197
+ traces[2]['KVKey'].must_equal "incrfloat"
198
+ traces[2]['increment'].must_equal 1.01
199
+ end
200
+
201
+ it "should trace mget" do
202
+ @redis.setex("france", 60, "ok")
203
+ @redis.setex("denmark", 60, "ok")
204
+ @redis.setex("germany", 60, "ok")
205
+
206
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
207
+ @redis.mget(["france", "nothing", "denmark"])
208
+ @redis.mget("germany")
209
+ end
210
+
211
+ traces = get_all_traces
212
+ traces.count.must_equal 6
213
+ traces[2]['KVOp'].must_equal "mget"
214
+ traces[2]['KVKeyCount'].must_equal 3
215
+ traces[2]['KVHitCount'].must_equal 2
216
+ traces[4]['KVOp'].must_equal "mget"
217
+ traces[4]['KVKeyCount'].must_equal 1
218
+ traces[4]['KVHitCount'].must_equal 1
219
+ end
220
+
221
+ it "should trace mset" do
222
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
223
+ @redis.mset(["one", 1, "two", 2, "three", 3])
224
+ @redis.mset("one", 1)
225
+ end
226
+
227
+ traces = get_all_traces
228
+ traces.count.must_equal 6
229
+ traces[2]['KVOp'].must_equal "mset"
230
+ traces[2]['KVKeyCount'].must_equal 3
231
+ traces[4]['KVOp'].must_equal "mset"
232
+ traces[4]['KVKeyCount'].must_equal 1
233
+ end
234
+
235
+ it "should trace msetnx" do
236
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
237
+ @redis.msetnx(["one", 1, "two", 2, "three", 3])
238
+ end
239
+
240
+ traces = get_all_traces
241
+ traces.count.must_equal 4
242
+ traces[2]['KVOp'].must_equal "msetnx"
243
+ end
244
+
245
+ it "should trace psetex (>= v2.6)" do
246
+
247
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
248
+ @redis.psetex("one", 60, "hello")
249
+ end
250
+
251
+ traces = get_all_traces
252
+ traces.count.must_equal 4
253
+ traces[2]['KVOp'].must_equal "psetex"
254
+ traces[2]['KVKey'].must_equal "one"
255
+ traces[2]['ttl'].must_equal 60
256
+ end
257
+
258
+ it "should trace basic set" do
259
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
260
+ @redis.set("one", "hello")
261
+ end
262
+
263
+ traces = get_all_traces
264
+ traces.count.must_equal 4
265
+ traces[2]['KVOp'].must_equal "set"
266
+ traces[2]['KVKey'].must_equal "one"
267
+ end
268
+
269
+ it "should trace set + expiration" do
270
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
271
+ @redis.set("one", "hello", :ex => 12)
272
+ end
273
+
274
+ traces = get_all_traces
275
+ traces.count.must_equal 4
276
+ traces[2]['KVOp'].must_equal "set"
277
+ traces[2]['KVKey'].must_equal "one"
278
+ traces[2]['ex'].must_equal 12
279
+ end
280
+
281
+ it "should trace setbit" do
282
+ min_server_version(2.2)
283
+
284
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
285
+ @redis.setbit("yourkey", 3, 0)
286
+ end
287
+
288
+ traces = get_all_traces
289
+ traces.count.must_equal 4
290
+ traces[2]['KVOp'].must_equal "setbit"
291
+ traces[2]['KVKey'].must_equal "yourkey"
292
+ traces[2]['offset'].must_equal 3
293
+ end
294
+
295
+ it "should trace setex" do
296
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
297
+ @redis.setex("one", 60, "hello")
298
+ end
299
+
300
+ traces = get_all_traces
301
+ traces.count.must_equal 4
302
+ traces[2]['KVOp'].must_equal "setex"
303
+ traces[2]['KVKey'].must_equal "one"
304
+ traces[2]['ttl'].must_equal 60
305
+ end
306
+
307
+ it "should trace setnx" do
308
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
309
+ @redis.setnx("one", "hello")
310
+ end
311
+
312
+ traces = get_all_traces
313
+ traces.count.must_equal 4
314
+ traces[2]['KVOp'].must_equal "setnx"
315
+ traces[2]['KVKey'].must_equal "one"
316
+ end
317
+
318
+ it "should trace setrange" do
319
+ min_server_version(2.2)
320
+
321
+ @redis.setex("spandau_ballet", 60, "XXXXXXXXXXXXXXX")
322
+
323
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
324
+ @redis.setrange("yourkey", 2, "ok")
325
+ end
326
+
327
+ traces = get_all_traces
328
+ traces.count.must_equal 4
329
+ traces[2]['KVOp'].must_equal "setrange"
330
+ traces[2]['KVKey'].must_equal "yourkey"
331
+ traces[2]['offset'].must_equal 2
332
+ end
333
+
334
+ it "should trace strlen" do
335
+ min_server_version(2.2)
336
+
337
+ @redis.setex("talking_heads", 60, "burning down the house")
338
+
339
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
340
+ @redis.strlen("talking_heads")
341
+ end
342
+
343
+ traces = get_all_traces
344
+ traces.count.must_equal 4
345
+ traces[2]['KVOp'].must_equal "strlen"
346
+ traces[2]['KVKey'].must_equal "talking_heads"
347
+ end
348
+ end
349
+ end
@@ -0,0 +1,185 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ if RUBY_VERSION >= '1.9.3' && !defined?(JRUBY_VERSION)
5
+ require 'minitest_helper'
6
+ require_relative "../jobs/resque/remote_call_worker_job"
7
+ require_relative "../jobs/resque/error_worker_job"
8
+
9
+ class ResqueClientTest < Minitest::Test
10
+ def setup
11
+ clear_all_traces
12
+ @collect_backtraces = AppOpticsAPM::Config[:resqueclient][:collect_backtraces]
13
+ @log_args = AppOpticsAPM::Config[:resqueclient][:log_args]
14
+ end
15
+
16
+ def teardown
17
+ AppOpticsAPM::Config[:resqueclient][:collect_backtraces] = @collect_backtraces
18
+ AppOpticsAPM::Config[:resqueclient][:log_args] = @log_args
19
+ end
20
+
21
+ def test_appoptics_methods_defined
22
+ [ :enqueue, :enqueue_to, :dequeue ].each do |m|
23
+ assert_equal true, ::Resque.method_defined?("#{m}_with_appoptics")
24
+ end
25
+
26
+ assert_equal true, ::Resque::Worker.method_defined?("perform_with_appoptics")
27
+ assert_equal true, ::Resque::Job.method_defined?("fail_with_appoptics")
28
+ end
29
+
30
+ def not_tracing_validation
31
+ assert_equal true, Resque.enqueue(ResqueRemoteCallWorkerJob), "not tracing; enqueue return value"
32
+ assert_equal true, Resque.enqueue(ResqueRemoteCallWorkerJob, 1, 2, "3"), "not tracing; enqueue extra params"
33
+ end
34
+
35
+ def test_enqueue
36
+ AppOpticsAPM::API.start_trace('resque-client_test', '', {}) do
37
+ Resque.enqueue(ResqueRemoteCallWorkerJob)
38
+ end
39
+
40
+ traces = get_all_traces
41
+
42
+ assert_equal 6, traces.count, "trace count"
43
+ validate_outer_layers(traces, 'resque-client_test')
44
+
45
+ assert_equal "resque-client", traces[1]['Layer'], "entry event layer name"
46
+ assert_equal "entry", traces[1]['Label'], "entry event label"
47
+ assert_equal "pushq", traces[1]['Spec']
48
+ assert_equal "resque", traces[1]['Flavor']
49
+ assert_equal "ResqueRemoteCallWorkerJob", traces[1]['JobName']
50
+ assert_equal "critical", traces[1]['Queue']
51
+ assert_equal "resque-client", traces[4]['Layer'], "exit event layer name"
52
+ assert_equal "exit", traces[4]['Label'], "exit event label"
53
+ end
54
+
55
+ def test_dequeue
56
+ AppOpticsAPM::API.start_trace('resque-client_test', '', {}) do
57
+ Resque.dequeue(ResqueRemoteCallWorkerJob, { :generate => :moped })
58
+ end
59
+
60
+ traces = get_all_traces
61
+
62
+ assert_equal 6, traces.count, "trace count"
63
+ validate_outer_layers(traces, 'resque-client_test')
64
+
65
+ assert_equal "resque-client", traces[1]['Layer'], "entry event layer name"
66
+ assert_equal "entry", traces[1]['Label'], "entry event label"
67
+ assert_equal "pushq", traces[1]['Spec']
68
+ assert_equal "resque", traces[1]['Flavor']
69
+ assert_equal "ResqueRemoteCallWorkerJob", traces[1]['JobName']
70
+ assert_equal "critical", traces[1]['Queue']
71
+ assert_equal "resque-client", traces[4]['Layer'], "exit event layer name"
72
+ assert_equal "exit", traces[4]['Label'], "exit event label"
73
+ end
74
+
75
+ def test_legacy_resque_config
76
+ assert_equal true, (AppOpticsAPM::Config[:resque][:enabled] = true), "set legacy resque config options don't die"
77
+ assert_equal true, (AppOpticsAPM::Config[:resque][:link_workers] = true), "set legacy resque config options don't die"
78
+ end
79
+
80
+ def test_collect_backtraces_default_value
81
+ assert_equal AppOpticsAPM::Config[:resqueclient][:collect_backtraces], true, "default backtrace collection"
82
+ end
83
+
84
+ def test_log_args_default_value
85
+ assert_equal AppOpticsAPM::Config[:resqueclient][:log_args], true, "log_args default "
86
+ end
87
+
88
+ def test_obey_collect_backtraces_when_false
89
+ AppOpticsAPM::Config[:resqueclient][:collect_backtraces] = false
90
+
91
+ # Queue up a job to be run
92
+ ::AppOpticsAPM::API.start_trace('resque-client_test') do
93
+ Resque.enqueue(ResqueRemoteCallWorkerJob, [1, 2, 3])
94
+ end
95
+
96
+ traces = get_all_traces
97
+ assert_equal 6, traces.count, "trace count"
98
+ validate_outer_layers(traces, 'resque-client_test')
99
+
100
+ assert_equal false, traces[1].key?('Backtrace')
101
+
102
+ assert_equal "resque-client", traces[1]['Layer'], "entry event layer name"
103
+ assert_equal "entry", traces[1]['Label'], "entry event label"
104
+ assert_equal "pushq", traces[1]['Spec']
105
+ assert_equal "resque", traces[1]['Flavor']
106
+ assert_equal "ResqueRemoteCallWorkerJob", traces[1]['JobName']
107
+ assert_equal "critical", traces[1]['Queue']
108
+ assert_equal "resque-client", traces[4]['Layer'], "exit event layer name"
109
+ assert_equal "exit", traces[4]['Label'], "exit event label"
110
+ end
111
+
112
+ def test_obey_collect_backtraces_when_true
113
+ AppOpticsAPM::Config[:resqueclient][:collect_backtraces] = true
114
+
115
+ # Queue up a job to be run
116
+ ::AppOpticsAPM::API.start_trace('resque-client_test') do
117
+ Resque.enqueue(ResqueRemoteCallWorkerJob, [1, 2, 3])
118
+ end
119
+
120
+ traces = get_all_traces
121
+ assert_equal 6, traces.count, "trace count"
122
+ validate_outer_layers(traces, 'resque-client_test')
123
+
124
+ assert_equal true, traces[1].key?('Backtrace')
125
+
126
+ assert_equal "resque-client", traces[1]['Layer'], "entry event layer name"
127
+ assert_equal "entry", traces[1]['Label'], "entry event label"
128
+ assert_equal "pushq", traces[1]['Spec']
129
+ assert_equal "resque", traces[1]['Flavor']
130
+ assert_equal "ResqueRemoteCallWorkerJob", traces[1]['JobName']
131
+ assert_equal "critical", traces[1]['Queue']
132
+ assert_equal "resque-client", traces[4]['Layer'], "exit event layer name"
133
+ assert_equal "exit", traces[4]['Label'], "exit event label"
134
+ end
135
+
136
+ def test_obey_log_args_when_false
137
+ AppOpticsAPM::Config[:resqueclient][:log_args] = false
138
+
139
+ # Queue up a job to be run
140
+ ::AppOpticsAPM::API.start_trace('resque-client_test') do
141
+ Resque.enqueue(ResqueRemoteCallWorkerJob, [1, 2, 3])
142
+ end
143
+
144
+ traces = get_all_traces
145
+ assert_equal 6, traces.count, "trace count"
146
+ validate_outer_layers(traces, 'resque-client_test')
147
+
148
+ assert_equal false, traces[1].key?('Args')
149
+
150
+ assert_equal "resque-client", traces[1]['Layer'], "entry event layer name"
151
+ assert_equal "entry", traces[1]['Label'], "entry event label"
152
+ assert_equal "pushq", traces[1]['Spec']
153
+ assert_equal "resque", traces[1]['Flavor']
154
+ assert_equal "ResqueRemoteCallWorkerJob", traces[1]['JobName']
155
+ assert_equal "critical", traces[1]['Queue']
156
+ assert_equal "resque-client", traces[4]['Layer'], "exit event layer name"
157
+ assert_equal "exit", traces[4]['Label'], "exit event label"
158
+ end
159
+
160
+ def test_obey_log_args_when_true
161
+ AppOpticsAPM::Config[:resqueclient][:log_args] = true
162
+
163
+ # Queue up a job to be run
164
+ ::AppOpticsAPM::API.start_trace('resque-client_test') do
165
+ Resque.enqueue(ResqueRemoteCallWorkerJob, 1, 2, 3)
166
+ end
167
+
168
+ traces = get_all_traces
169
+ assert_equal 6, traces.count, "trace count"
170
+ validate_outer_layers(traces, 'resque-client_test')
171
+
172
+ assert_equal true, traces[1].key?('Args')
173
+ assert_equal "[1,2,3]", traces[1]['Args']
174
+
175
+ assert_equal "resque-client", traces[1]['Layer'], "entry event layer name"
176
+ assert_equal "entry", traces[1]['Label'], "entry event label"
177
+ assert_equal "pushq", traces[1]['Spec']
178
+ assert_equal "resque", traces[1]['Flavor']
179
+ assert_equal "ResqueRemoteCallWorkerJob", traces[1]['JobName']
180
+ assert_equal "critical", traces[1]['Queue']
181
+ assert_equal "resque-client", traces[4]['Layer'], "exit event layer name"
182
+ assert_equal "exit", traces[4]['Label'], "exit event label"
183
+ end
184
+ end
185
+ end