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,260 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ require 'minitest_helper'
5
+
6
+ # Since memcache is loaded late, the instrumentation
7
+ # loaded out of order. Here we force inject instrumentation
8
+ require 'memcache'
9
+ ::MemCache.class_eval do
10
+ include AppOpticsAPM::Inst::MemCache
11
+ end
12
+
13
+ describe "Memcache" do
14
+ before do
15
+ clear_all_traces
16
+ @mc = ::MemCache.new('127.0.0.1')
17
+
18
+ # These are standard entry/exit KVs that are passed up with all mongo operations
19
+ @entry_kvs = {
20
+ 'Layer' => 'memcache',
21
+ 'Label' => 'entry' }
22
+
23
+ @info_kvs = {
24
+ 'Layer' => 'memcache',
25
+ 'Label' => 'info' }
26
+
27
+ @exit_kvs = { 'Layer' => 'memcache', 'Label' => 'exit' }
28
+ @collect_backtraces = AppOpticsAPM::Config[:memcache][:collect_backtraces]
29
+ end
30
+
31
+ after do
32
+ AppOpticsAPM::Config[:memcache][:collect_backtraces] = @collect_backtraces
33
+ end
34
+
35
+ it 'Stock MemCache should be loaded, defined and ready' do
36
+ defined?(::MemCache).wont_match nil
37
+ end
38
+
39
+ it 'MemCache should have appoptics_apm methods defined' do
40
+ AppOpticsAPM::API::Memcache::MEMCACHE_OPS.each do |m|
41
+ if ::MemCache.method_defined?(m)
42
+ ::MemCache.method_defined?("#{m}_with_appoptics").must_equal true
43
+ end
44
+ ::MemCache.method_defined?(:request_setup_with_appoptics).must_equal true
45
+ ::MemCache.method_defined?(:cache_get_with_appoptics).must_equal true
46
+ ::MemCache.method_defined?(:get_multi_with_appoptics).must_equal true
47
+ end
48
+ end
49
+
50
+ it "should trace set" do
51
+ AppOpticsAPM::API.start_trace('memcache_test', '', {}) do
52
+ @mc.set('msg', 'blah')
53
+ end
54
+
55
+ traces = get_all_traces
56
+
57
+ traces.count.must_equal 5
58
+ validate_outer_layers(traces, 'memcache_test')
59
+
60
+ validate_event_keys(traces[1], @entry_kvs)
61
+
62
+ traces[1]['KVOp'].must_equal "set"
63
+ traces[1].has_key?('Backtrace').must_equal AppOpticsAPM::Config[:memcache][:collect_backtraces]
64
+
65
+ validate_event_keys(traces[2], @info_kvs)
66
+ traces[2]['KVKey'].must_equal "msg"
67
+ traces[2].has_key?('Backtrace').must_equal AppOpticsAPM::Config[:memcache][:collect_backtraces]
68
+
69
+ validate_event_keys(traces[3], @exit_kvs)
70
+ end
71
+
72
+ it "should trace get" do
73
+ AppOpticsAPM::API.start_trace('memcache_test', '', {}) do
74
+ @mc.get('msg')
75
+ end
76
+
77
+ traces = get_all_traces
78
+
79
+ traces.count.must_equal 6
80
+ validate_outer_layers(traces, 'memcache_test')
81
+
82
+ validate_event_keys(traces[1], @entry_kvs)
83
+
84
+ traces[1]['KVOp'].must_equal "get"
85
+ traces[1].has_key?('Backtrace').must_equal AppOpticsAPM::Config[:memcache][:collect_backtraces]
86
+
87
+ validate_event_keys(traces[2], @info_kvs)
88
+ traces[2]['KVKey'].must_equal "msg"
89
+ traces[2]['RemoteHost'].must_equal "127.0.0.1"
90
+ traces[2].has_key?('Backtrace').must_equal AppOpticsAPM::Config[:memcache][:collect_backtraces]
91
+
92
+ traces[3].has_key?('KVHit').must_equal true
93
+ traces[3].has_key?('Backtrace').must_equal AppOpticsAPM::Config[:memcache][:collect_backtraces]
94
+
95
+ validate_event_keys(traces[4], @exit_kvs)
96
+ end
97
+
98
+ it "should trace get_multi" do
99
+ AppOpticsAPM::API.start_trace('memcache_test', '', {}) do
100
+ @mc.get_multi(['one', 'two', 'three', 'four', 'five', 'six'])
101
+ end
102
+
103
+ traces = get_all_traces
104
+
105
+ traces.count.must_equal 5
106
+ validate_outer_layers(traces, 'memcache_test')
107
+
108
+ validate_event_keys(traces[1], @entry_kvs)
109
+
110
+ traces[1]['KVOp'].must_equal "get_multi"
111
+
112
+ validate_event_keys(traces[2], @info_kvs)
113
+ traces[2]['KVKeyCount'].must_equal 6
114
+ traces[2].has_key?('KVHitCount').must_equal true
115
+ traces[2].has_key?('Backtrace').must_equal AppOpticsAPM::Config[:memcache][:collect_backtraces]
116
+
117
+ validate_event_keys(traces[3], @exit_kvs)
118
+ end
119
+
120
+ it "should trace add for existing key" do
121
+ @mc.set('testKey', 'x', 1200)
122
+ AppOpticsAPM::API.start_trace('memcache_test', '', {}) do
123
+ @mc.add('testKey', 'x', 1200)
124
+ end
125
+
126
+ traces = get_all_traces
127
+
128
+ traces.count.must_equal 5
129
+ validate_outer_layers(traces, 'memcache_test')
130
+
131
+ validate_event_keys(traces[1], @entry_kvs)
132
+
133
+ traces[1]['KVOp'].must_equal "add"
134
+ traces[1].has_key?('Backtrace').must_equal AppOpticsAPM::Config[:memcache][:collect_backtraces]
135
+
136
+ validate_event_keys(traces[2], @info_kvs)
137
+ traces[2]['KVKey'].must_equal "testKey"
138
+
139
+ validate_event_keys(traces[3], @exit_kvs)
140
+ end
141
+
142
+ it "should trace append" do
143
+ @mc.set('rawKey', "Peanut Butter ", 600, :raw => true)
144
+ AppOpticsAPM::API.start_trace('memcache_test', '', {}) do
145
+ @mc.append('rawKey', "Jelly")
146
+ end
147
+
148
+ traces = get_all_traces
149
+
150
+ traces.count.must_equal 5
151
+ validate_outer_layers(traces, 'memcache_test')
152
+
153
+ validate_event_keys(traces[1], @entry_kvs)
154
+
155
+ traces[1]['KVOp'].must_equal "append"
156
+ traces[1].has_key?('Backtrace').must_equal AppOpticsAPM::Config[:memcache][:collect_backtraces]
157
+
158
+ validate_event_keys(traces[2], @info_kvs)
159
+
160
+ traces[2]['KVKey'].must_equal "rawKey"
161
+ traces[2].has_key?('Backtrace').must_equal AppOpticsAPM::Config[:memcache][:collect_backtraces]
162
+
163
+ validate_event_keys(traces[3], @exit_kvs)
164
+ end
165
+
166
+ it "should trace decrement" do
167
+ AppOpticsAPM::API.start_trace('memcache_test', '', {}) do
168
+ @mc.decr('memcache_key_counter', 1)
169
+ end
170
+
171
+ traces = get_all_traces
172
+
173
+ traces.count.must_equal 5
174
+ validate_outer_layers(traces, 'memcache_test')
175
+
176
+ validate_event_keys(traces[1], @entry_kvs)
177
+
178
+ traces[1]['KVOp'].must_equal "decr"
179
+ traces[1].has_key?('Backtrace').must_equal AppOpticsAPM::Config[:memcache][:collect_backtraces]
180
+
181
+ traces[2]['KVKey'].must_equal "memcache_key_counter"
182
+ traces[2].has_key?('Backtrace').must_equal AppOpticsAPM::Config[:memcache][:collect_backtraces]
183
+
184
+ validate_event_keys(traces[3], @exit_kvs)
185
+ end
186
+
187
+ it "should trace increment" do
188
+ AppOpticsAPM::API.start_trace('memcache_test', '', {}) do
189
+ @mc.incr("memcache_key_counter", 1)
190
+ end
191
+
192
+ traces = get_all_traces
193
+
194
+ traces.count.must_equal 5
195
+ validate_outer_layers(traces, 'memcache_test')
196
+
197
+ validate_event_keys(traces[1], @entry_kvs)
198
+ traces[1]['KVOp'].must_equal "incr"
199
+ validate_event_keys(traces[2], @info_kvs)
200
+ traces[2]['KVKey'].must_equal "memcache_key_counter"
201
+ validate_event_keys(traces[3], @exit_kvs)
202
+ end
203
+
204
+ it "should trace replace" do
205
+ @mc.set("some_key", "blah")
206
+ AppOpticsAPM::API.start_trace('memcache_test', '', {}) do
207
+ @mc.replace("some_key", "woop")
208
+ end
209
+
210
+ traces = get_all_traces
211
+
212
+ traces.count.must_equal 5
213
+ validate_outer_layers(traces, 'memcache_test')
214
+
215
+ validate_event_keys(traces[1], @entry_kvs)
216
+ traces[1]['KVOp'].must_equal "replace"
217
+ traces[2]['KVKey'].must_equal "some_key"
218
+ validate_event_keys(traces[2], @info_kvs)
219
+ validate_event_keys(traces[3], @exit_kvs)
220
+ end
221
+
222
+ it "should trace delete" do
223
+ AppOpticsAPM::API.start_trace('memcache_test', '', {}) do
224
+ @mc.delete("some_key")
225
+ end
226
+
227
+ traces = get_all_traces
228
+
229
+ traces.count.must_equal 5
230
+ validate_outer_layers(traces, 'memcache_test')
231
+
232
+ validate_event_keys(traces[1], @entry_kvs)
233
+ traces[1]['KVOp'].must_equal "delete"
234
+ traces[2]['KVKey'].must_equal "some_key"
235
+ validate_event_keys(traces[2], @info_kvs)
236
+ validate_event_keys(traces[3], @exit_kvs)
237
+ end
238
+
239
+ it "should obey :collect_backtraces setting when true" do
240
+ AppOpticsAPM::Config[:memcache][:collect_backtraces] = true
241
+
242
+ AppOpticsAPM::API.start_trace('memcache_test', '', {}) do
243
+ @mc.set('some_key', 1)
244
+ end
245
+
246
+ traces = get_all_traces
247
+ layer_has_key(traces, 'memcache', 'Backtrace')
248
+ end
249
+
250
+ it "should obey :collect_backtraces setting when false" do
251
+ AppOpticsAPM::Config[:memcache][:collect_backtraces] = false
252
+
253
+ AppOpticsAPM::API.start_trace('memcache_test', '', {}) do
254
+ @mc.set('some_key', 1)
255
+ end
256
+
257
+ traces = get_all_traces
258
+ layer_doesnt_have_key(traces, 'memcache', 'Backtrace')
259
+ end
260
+ end
@@ -0,0 +1,229 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ require 'minitest_helper'
5
+
6
+ if RUBY_VERSION < '2.0' and not defined?(JRUBY_VERSION)
7
+ describe "Memcached" do
8
+ require 'memcached'
9
+ require 'memcached/rails'
10
+
11
+ before do
12
+ clear_all_traces
13
+ @mc = ::Memcached::Rails.new(:servers => ['127.0.0.1'])
14
+
15
+ # These are standard entry/exit KVs that are passed up with all mongo operations
16
+ @entry_kvs = {
17
+ 'Layer' => 'memcache',
18
+ 'Label' => 'entry' }
19
+
20
+ @info_kvs = {
21
+ 'Layer' => 'memcache',
22
+ 'Label' => 'info' }
23
+
24
+ @exit_kvs = { 'Layer' => 'memcache', 'Label' => 'exit' }
25
+ @collect_backtraces = AppOpticsAPM::Config[:memcached][:collect_backtraces]
26
+ end
27
+
28
+ after do
29
+ AppOpticsAPM::Config[:memcached][:collect_backtraces] = @collect_backtraces
30
+ end
31
+
32
+ it 'Stock Memcached should be loaded, defined and ready' do
33
+ defined?(::Memcached).wont_match nil
34
+ defined?(::Memcached::Rails).wont_match nil
35
+ end
36
+
37
+ it 'Memcached should have appoptics_apm methods defined' do
38
+ AppOpticsAPM::API::Memcache::MEMCACHE_OPS.each do |m|
39
+ if ::Memcached.method_defined?(m)
40
+ ::Memcached.method_defined?("#{m}_with_appoptics").must_equal true
41
+ end
42
+ ::Memcached::Rails.method_defined?(:get_multi_with_appoptics).must_equal true
43
+ end
44
+ end
45
+
46
+ it "should trace set" do
47
+ AppOpticsAPM::API.start_trace('memcached_test', '', {}) do
48
+ @mc.set('testKey', 'blah')
49
+ end
50
+
51
+ traces = get_all_traces
52
+ traces.count.must_equal 4
53
+
54
+ validate_outer_layers(traces, 'memcached_test')
55
+ validate_event_keys(traces[1], @entry_kvs)
56
+ validate_event_keys(traces[2], @exit_kvs)
57
+
58
+ traces[1]['KVOp'].must_equal "set"
59
+ traces[1]['KVKey'].must_equal "testKey"
60
+ end
61
+
62
+ it "should trace get" do
63
+ @mc.set('testKey', 'blah')
64
+
65
+ AppOpticsAPM::API.start_trace('memcached_test', '', {}) do
66
+ @mc.get('testKey')
67
+ end
68
+
69
+ traces = get_all_traces
70
+ traces.count.must_equal 4
71
+
72
+ validate_outer_layers(traces, 'memcached_test')
73
+ validate_event_keys(traces[1], @entry_kvs)
74
+ validate_event_keys(traces[2], @exit_kvs)
75
+
76
+ traces[1]['KVOp'].must_equal "get"
77
+ traces[1]['KVKey'].must_equal "testKey"
78
+ end
79
+
80
+ it "should trace get_multi" do
81
+ AppOpticsAPM::API.start_trace('memcached_test', '', {}) do
82
+ @mc.get_multi(['one', 'two', 'three', 'four', 'five', 'six'])
83
+ end
84
+
85
+ traces = get_all_traces
86
+ traces.count.must_equal 5
87
+
88
+ validate_outer_layers(traces, 'memcached_test')
89
+ validate_event_keys(traces[1], @entry_kvs)
90
+ validate_event_keys(traces[2], @info_kvs)
91
+ validate_event_keys(traces[3], @exit_kvs)
92
+
93
+ traces[1]['KVOp'].must_equal "get_multi"
94
+
95
+ traces[2]['KVKeyCount'].must_equal 6
96
+ traces[2].has_key?('KVHitCount').must_equal true
97
+ end
98
+
99
+ it "should trace add for existing key" do
100
+ @mc.set('testKey', 'x', 1200)
101
+
102
+ AppOpticsAPM::API.start_trace('memcached_test', '', {}) do
103
+ @mc.add('testKey', 'x', 1200)
104
+ end
105
+
106
+ traces = get_all_traces
107
+ traces.count.must_equal 5
108
+
109
+ validate_outer_layers(traces, 'memcached_test')
110
+ validate_event_keys(traces[1], @entry_kvs)
111
+ validate_event_keys(traces[3], @exit_kvs)
112
+
113
+ traces[1]['KVOp'].must_equal "add"
114
+ traces[1]['KVKey'].must_equal "testKey"
115
+
116
+ traces[2]['ErrorClass'].must_equal "Memcached::NotStored"
117
+ traces[2]['ErrorMsg'].must_equal "Memcached::NotStored"
118
+ end
119
+
120
+ it "should trace append" do
121
+ @mc.set('rawKey', "Peanut Butter ", 600, :raw => true)
122
+ AppOpticsAPM::API.start_trace('memcached_test', '', {}) do
123
+ @mc.append('rawKey', "Jelly")
124
+ end
125
+
126
+ traces = get_all_traces
127
+ traces.count.must_equal 4
128
+
129
+ validate_outer_layers(traces, 'memcached_test')
130
+ validate_event_keys(traces[1], @entry_kvs)
131
+ validate_event_keys(traces[2], @exit_kvs)
132
+
133
+ traces[1]['KVOp'].must_equal "append"
134
+ traces[1]['KVKey'].must_equal "rawKey"
135
+ end
136
+
137
+ it "should trace decr" do
138
+ @mc.set('some_key_counter', "100", 0, false)
139
+
140
+ AppOpticsAPM::API.start_trace('memcached_test', '', {}) do
141
+ @mc.decr('some_key_counter', 1)
142
+ end
143
+
144
+ traces = get_all_traces
145
+ traces.count.must_equal 4
146
+
147
+ validate_outer_layers(traces, 'memcached_test')
148
+ validate_event_keys(traces[1], @entry_kvs)
149
+ validate_event_keys(traces[2], @exit_kvs)
150
+
151
+ traces[1]['KVOp'].must_equal "decr"
152
+ traces[1]['KVKey'].must_equal "some_key_counter"
153
+ end
154
+
155
+ it "should trace increment" do
156
+ @mc.set('some_key_counter', "100", 0, false)
157
+
158
+ AppOpticsAPM::API.start_trace('memcached_test', '', {}) do
159
+ @mc.incr("some_key_counter", 1)
160
+ end
161
+
162
+ traces = get_all_traces
163
+ traces.count.must_equal 4
164
+
165
+ validate_outer_layers(traces, 'memcached_test')
166
+ validate_event_keys(traces[1], @entry_kvs)
167
+ validate_event_keys(traces[2], @exit_kvs)
168
+
169
+ traces[1]['KVOp'].must_equal "incr"
170
+ traces[1]['KVKey'].must_equal "some_key_counter"
171
+ end
172
+
173
+ it "should trace replace" do
174
+ @mc.set('some_key', 'blah')
175
+ AppOpticsAPM::API.start_trace('memcached_test', '', {}) do
176
+ @mc.replace("some_key", "woop")
177
+ end
178
+
179
+ traces = get_all_traces
180
+ traces.count.must_equal 4
181
+
182
+ validate_outer_layers(traces, 'memcached_test')
183
+ validate_event_keys(traces[1], @entry_kvs)
184
+ validate_event_keys(traces[2], @exit_kvs)
185
+
186
+ traces[1]['KVOp'].must_equal "replace"
187
+ traces[1]['KVKey'].must_equal "some_key"
188
+ end
189
+
190
+ it "should trace delete" do
191
+ @mc.set('some_key', 'blah')
192
+ AppOpticsAPM::API.start_trace('memcached_test', '', {}) do
193
+ @mc.delete("some_key")
194
+ end
195
+
196
+ traces = get_all_traces
197
+ traces.count.must_equal 4
198
+
199
+ validate_outer_layers(traces, 'memcached_test')
200
+ validate_event_keys(traces[1], @entry_kvs)
201
+ validate_event_keys(traces[2], @exit_kvs)
202
+
203
+ traces[1]['KVOp'].must_equal "delete"
204
+ traces[1]['KVKey'].must_equal "some_key"
205
+ end
206
+
207
+ it "should obey :collect_backtraces setting when true" do
208
+ AppOpticsAPM::Config[:memcached][:collect_backtraces] = true
209
+
210
+ AppOpticsAPM::API.start_trace('memcached_test', '', {}) do
211
+ @mc.set('some_key', 1)
212
+ end
213
+
214
+ traces = get_all_traces
215
+ layer_has_key(traces, 'memcache', 'Backtrace')
216
+ end
217
+
218
+ it "should obey :collect_backtraces setting when false" do
219
+ AppOpticsAPM::Config[:memcached][:collect_backtraces] = false
220
+
221
+ AppOpticsAPM::API.start_trace('memcached_test', '', {}) do
222
+ @mc.set('some_key', 1)
223
+ end
224
+
225
+ traces = get_all_traces
226
+ layer_doesnt_have_key(traces, 'memcache', 'Backtrace')
227
+ end
228
+ end
229
+ end