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,310 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ require 'minitest_helper'
5
+
6
+ if defined?(::Redis)
7
+ describe "Redis Lists" 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
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
+
29
+ it "should trace blpop" do
30
+ min_server_version(2.0)
31
+
32
+ @redis.lpush("savage", "zombie")
33
+
34
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
35
+ @redis.blpop("savage")
36
+ end
37
+
38
+ traces = get_all_traces
39
+ traces.count.must_equal 4
40
+ traces[2]['KVOp'].must_equal "blpop"
41
+ traces[2]['KVKey'].must_equal "savage"
42
+ end
43
+
44
+ it "should trace brpop" do
45
+ min_server_version(2.0)
46
+
47
+ @redis.lpush("savage", "the walking dead")
48
+
49
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
50
+ @redis.brpop("savage")
51
+ end
52
+
53
+ traces = get_all_traces
54
+ traces.count.must_equal 4
55
+ traces[2]['KVOp'].must_equal "brpop"
56
+ traces[2]['KVKey'].must_equal "savage"
57
+ end
58
+
59
+ it "should trace brpoplpush" do
60
+ min_server_version(2.2)
61
+
62
+ @redis.lpush("savage", "night of the walking dead")
63
+
64
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
65
+ @redis.brpoplpush("savage", "crawlies")
66
+ end
67
+
68
+ traces = get_all_traces
69
+ traces.count.must_equal 4
70
+ traces[2]['KVOp'].must_equal "brpoplpush"
71
+ traces[2]['destination'].must_equal "crawlies"
72
+ end
73
+
74
+ it "should trace lindex" do
75
+ min_server_version(1.0)
76
+
77
+ @redis.lpush("fringe", "bishop")
78
+ @redis.lpush("fringe", "dunham")
79
+ @redis.lpush("fringe", "broyles")
80
+
81
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
82
+ @redis.lindex("fringe", 1)
83
+ end
84
+
85
+ traces = get_all_traces
86
+ traces.count.must_equal 4
87
+ traces[2]['KVOp'].must_equal "lindex"
88
+ traces[2]['index'].must_equal 1
89
+ end
90
+
91
+ it "should trace linsert" do
92
+ min_server_version(2.2)
93
+
94
+ @redis.lpush("gods of old", "sun")
95
+ @redis.lpush("gods of old", "moon")
96
+ @redis.lpush("gods of old", "night")
97
+
98
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
99
+ @redis.linsert("gods of old", "BEFORE", "night", "river")
100
+ end
101
+
102
+ traces = get_all_traces
103
+ traces.count.must_equal 4
104
+ traces[2]['KVOp'].must_equal "linsert"
105
+ traces[2]['KVKey'].must_equal "gods of old"
106
+ end
107
+
108
+ it "should trace llen" do
109
+ min_server_version(1.0)
110
+
111
+ @redis.lpush("gods of old", "sun")
112
+ @redis.lpush("gods of old", "moon")
113
+ @redis.lpush("gods of old", "night")
114
+
115
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
116
+ @redis.llen("gods of old")
117
+ end
118
+
119
+ traces = get_all_traces
120
+ traces.count.must_equal 4
121
+ traces[2]['KVOp'].must_equal "llen"
122
+ traces[2]['KVKey'].must_equal "gods of old"
123
+ end
124
+
125
+ it "should trace lpop" do
126
+ min_server_version(1.0)
127
+
128
+ @redis.lpush("gods of old", "sun")
129
+ @redis.lpush("gods of old", "moon")
130
+ @redis.lpush("gods of old", "night")
131
+
132
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
133
+ @redis.lpop("gods of old")
134
+ end
135
+
136
+ traces = get_all_traces
137
+ traces.count.must_equal 4
138
+ traces[2]['KVOp'].must_equal "lpop"
139
+ traces[2]['KVKey'].must_equal "gods of old"
140
+ end
141
+
142
+ it "should trace lpush" do
143
+ min_server_version(1.0)
144
+
145
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
146
+ @redis.lpush("gods of old", "night")
147
+ end
148
+
149
+ traces = get_all_traces
150
+ traces.count.must_equal 4
151
+ traces[2]['KVOp'].must_equal "lpush"
152
+ traces[2]['KVKey'].must_equal "gods of old"
153
+ end
154
+
155
+ it "should trace lpushx" do
156
+ min_server_version(2.2)
157
+
158
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
159
+ @redis.lpushx("gods of old", "night")
160
+ end
161
+
162
+ traces = get_all_traces
163
+ traces.count.must_equal 4
164
+ traces[2]['KVOp'].must_equal "lpushx"
165
+ traces[2]['KVKey'].must_equal "gods of old"
166
+ end
167
+
168
+ it "should trace lrange" do
169
+ min_server_version(1.0)
170
+
171
+ @redis.rpush("protein types", "structural")
172
+ @redis.rpush("protein types", "storage")
173
+ @redis.rpush("protein types", "hormonal")
174
+ @redis.rpush("protein types", "enzyme")
175
+ @redis.rpush("protein types", "immunoglobulins")
176
+
177
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
178
+ @redis.lrange("protein types", 2, 4)
179
+ end
180
+
181
+ traces = get_all_traces
182
+ traces.count.must_equal 4
183
+ traces[2]['KVOp'].must_equal "lrange"
184
+ traces[2]['KVKey'].must_equal "protein types"
185
+ traces[2]['start'].must_equal 2
186
+ traces[2]['stop'].must_equal 4
187
+ end
188
+
189
+ it "should trace lrem" do
190
+ min_server_version(1.0)
191
+
192
+ @redis.rpush("australia", "sydney")
193
+ @redis.rpush("australia", "sydney")
194
+ @redis.rpush("australia", "albury")
195
+ @redis.rpush("australia", "tamworth")
196
+ @redis.rpush("australia", "tamworth")
197
+ @redis.rpush("australia", "penrith")
198
+
199
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
200
+ @redis.lrem("australia", -2, "sydney")
201
+ end
202
+
203
+ traces = get_all_traces
204
+ traces.count.must_equal 4
205
+ traces[2]['KVOp'].must_equal "lrem"
206
+ traces[2]['KVKey'].must_equal "australia"
207
+ end
208
+
209
+ it "should trace lset" do
210
+ min_server_version(1.0)
211
+
212
+ @redis.rpush("australia", "sydney")
213
+ @redis.rpush("australia", "albury")
214
+ @redis.rpush("australia", "tamworth")
215
+ @redis.rpush("australia", "penrith")
216
+
217
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
218
+ @redis.lset("australia", 2, "Kalgoorlie")
219
+ end
220
+
221
+ traces = get_all_traces
222
+ traces.count.must_equal 4
223
+ traces[2]['KVOp'].must_equal "lset"
224
+ traces[2]['KVKey'].must_equal "australia"
225
+ end
226
+
227
+ it "should trace ltrim" do
228
+ min_server_version(1.0)
229
+
230
+ @redis.rpush("australia", "sydney")
231
+ @redis.rpush("australia", "albury")
232
+ @redis.rpush("australia", "tamworth")
233
+ @redis.rpush("australia", "albury")
234
+ @redis.rpush("australia", "tamworth")
235
+ @redis.rpush("australia", "albury")
236
+ @redis.rpush("australia", "tamworth")
237
+ @redis.rpush("australia", "penrith")
238
+
239
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
240
+ @redis.ltrim("australia", 2, 6)
241
+ end
242
+
243
+ traces = get_all_traces
244
+ traces.count.must_equal 4
245
+ traces[2]['KVOp'].must_equal "ltrim"
246
+ traces[2]['KVKey'].must_equal "australia"
247
+ end
248
+
249
+ it "should trace rpop" do
250
+ min_server_version(1.0)
251
+
252
+ @redis.rpush("santa esmeralda", "house of the rising sun")
253
+ @redis.rpush("santa esmeralda", "don't let me be misunderstood")
254
+ @redis.rpush("santa esmeralda", "sevilla nights")
255
+
256
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
257
+ @redis.rpop("santa esmeralda")
258
+ end
259
+
260
+ traces = get_all_traces
261
+ traces.count.must_equal 4
262
+ traces[2]['KVOp'].must_equal "rpop"
263
+ traces[2]['KVKey'].must_equal "santa esmeralda"
264
+ end
265
+
266
+ it "should trace rpoplpush" do
267
+ min_server_version(1.2)
268
+
269
+ @redis.rpush("santa esmeralda", "house of the rising sun")
270
+ @redis.rpush("santa esmeralda", "don't let me be misunderstood")
271
+ @redis.rpush("santa esmeralda", "sevilla nights")
272
+
273
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
274
+ @redis.rpoplpush("santa esmeralda", "the gods of old")
275
+ end
276
+
277
+ traces = get_all_traces
278
+ traces.count.must_equal 4
279
+ traces[2]['KVOp'].must_equal "rpoplpush"
280
+ traces[2]['KVKey'].must_equal "santa esmeralda"
281
+ traces[2]['destination'].must_equal "the gods of old"
282
+ end
283
+
284
+ it "should trace rpush" do
285
+ min_server_version(1.0)
286
+
287
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
288
+ @redis.rpush("boney m", "rasputin")
289
+ end
290
+
291
+ traces = get_all_traces
292
+ traces.count.must_equal 4
293
+ traces[2]['KVOp'].must_equal "rpush"
294
+ traces[2]['KVKey'].must_equal "boney m"
295
+ end
296
+
297
+ it "should trace rpushx" do
298
+ min_server_version(1.0)
299
+
300
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
301
+ @redis.rpushx("boney m", "rasputin")
302
+ end
303
+
304
+ traces = get_all_traces
305
+ traces.count.must_equal 4
306
+ traces[2]['KVOp'].must_equal "rpushx"
307
+ traces[2]['KVKey'].must_equal "boney m"
308
+ end
309
+ end
310
+ end
@@ -0,0 +1,163 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ require 'minitest_helper'
5
+
6
+ if defined?(::Redis)
7
+ describe "Redis Misc" 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 publish" do
29
+ min_server_version(2.0)
30
+
31
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
32
+ @redis.publish("channel1", "Broadcasting live from silicon circuits.")
33
+ end
34
+
35
+ traces = get_all_traces
36
+ traces.count.must_equal 4
37
+ traces[2]['KVOp'].must_equal "publish"
38
+ traces[2]['channel'].must_equal "channel1"
39
+ traces[2].has_key?('KVKey').must_equal false
40
+ end
41
+
42
+ it "should trace select" do
43
+ min_server_version(2.0)
44
+
45
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
46
+ @redis.select(2)
47
+ end
48
+
49
+ traces = get_all_traces
50
+ traces.count.must_equal 4
51
+ traces[2]['KVOp'].must_equal "select"
52
+ traces[2]['db'].must_equal 2
53
+ end
54
+
55
+ it "should trace pipelined operations" do
56
+ min_server_version(1.2)
57
+
58
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
59
+ @redis.pipelined do
60
+ @redis.zadd("staff", 0, "waiter")
61
+ @redis.zadd("staff", 1, "busser")
62
+ @redis.zadd("staff", 2, "chef")
63
+
64
+ @redis.lpush("fringe", "bishop")
65
+ @redis.lpush("fringe", "dunham")
66
+ @redis.lpush("fringe", "broyles")
67
+ end
68
+ end
69
+
70
+ traces = get_all_traces
71
+ traces.count.must_equal 4
72
+ traces[2]['KVOpCount'].must_equal 6
73
+ traces[2]['KVOps'].must_equal "zadd, zadd, zadd, lpush, lpush, lpush"
74
+ end
75
+
76
+ it "should trace multi with block" do
77
+ min_server_version(1.2)
78
+
79
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
80
+ @redis.multi do
81
+ @redis.zadd("presidents", 0, "Lincoln")
82
+ @redis.zadd("presidents", 1, "Adams")
83
+ @redis.zadd("presidents", 2, "Reagan")
84
+
85
+ @redis.lpush("hair", "blue")
86
+ @redis.lpush("hair", "gray")
87
+ @redis.lpush("hair", "yellow")
88
+ end
89
+ end
90
+
91
+ traces = get_all_traces
92
+ traces.count.must_equal 4
93
+ traces[2]['KVOpCount'].must_equal 8
94
+ traces[2]['KVOps'].must_equal "multi, zadd, zadd, zadd, lpush, lpush, lpush, exec"
95
+ end
96
+
97
+ it "should trace eval" do
98
+ min_server_version(2.6)
99
+
100
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
101
+ @redis.eval("return 1")
102
+ @redis.eval("return { KEYS, ARGV }", ["k1", "k2"], ["a1", "a2"])
103
+ @redis.eval("return { KEYS, ARGV }", :keys => ["k1", "k2"], :argv => ["a1", "a2"])
104
+ end
105
+
106
+ traces = get_all_traces
107
+ traces.count.must_equal 8
108
+ traces[2]['KVOp'].must_equal "eval"
109
+ traces[2]['Script'].must_equal "return 1"
110
+ traces[4]['KVOp'].must_equal "eval"
111
+ traces[4]['Script'].must_equal "return { KEYS, ARGV }"
112
+ traces[6]['KVOp'].must_equal "eval"
113
+ traces[6]['Script'].must_equal "return { KEYS, ARGV }"
114
+ end
115
+
116
+ it "should trace evalsha" do
117
+ min_server_version(2.6)
118
+
119
+ sha = @redis.script(:load, "return 1")
120
+
121
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
122
+ @redis.evalsha(sha)
123
+ end
124
+
125
+ traces = get_all_traces
126
+ traces.count.must_equal 4
127
+ traces[2]['KVOp'].must_equal "evalsha"
128
+ traces[2]['sha'].must_equal sha
129
+ end
130
+
131
+ it "should trace script" do
132
+ min_server_version(2.6)
133
+
134
+ AppOpticsAPM::API.start_trace('redis_test', '', {}) do
135
+ @sha = @redis.script(:load, "return 1")
136
+ @it_exists1 = @redis.script(:exists, @sha)
137
+ @it_exists2 = @redis.script(:exists, [@sha, "other_sha"])
138
+ @redis.script(:flush)
139
+ end
140
+
141
+ traces = get_all_traces
142
+ traces.count.must_equal 10
143
+
144
+ # Validate return values
145
+ @it_exists1.must_equal true
146
+ @it_exists2.is_a?(Array).must_equal true
147
+ @it_exists2[0].must_equal true
148
+ @it_exists2[1].must_equal false
149
+
150
+ traces[2]['KVOp'].must_equal "script"
151
+ traces[2]['subcommand'].must_equal "load"
152
+ traces[2]['Script'].must_equal "return 1"
153
+ traces[4]['KVOp'].must_equal "script"
154
+ traces[4]['subcommand'].must_equal "exists"
155
+ traces[4]['KVKey'].must_equal @sha
156
+ traces[6]['KVOp'].must_equal "script"
157
+ traces[6]['subcommand'].must_equal "exists"
158
+ traces[6]['KVKey'].must_equal '["e0e1f9fabfc9d4800c877a703b823ac0578ff8db", "other_sha"]'
159
+ traces[8]['KVOp'].must_equal "script"
160
+ traces[8]['subcommand'].must_equal "flush"
161
+ end
162
+ end
163
+ end