mmtrix_rpm 1.0.0.1

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 (1036) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +27 -0
  3. data/.project +23 -0
  4. data/.travis.yml +12 -0
  5. data/.yardopts +21 -0
  6. data/CHANGELOG +2342 -0
  7. data/GUIDELINES_FOR_CONTRIBUTING.md +80 -0
  8. data/Gemfile +3 -0
  9. data/Guardfile +8 -0
  10. data/LICENSE +151 -0
  11. data/README.md +202 -0
  12. data/Rakefile +154 -0
  13. data/bin/mmtrix +13 -0
  14. data/bin/mmtrix_cmd +5 -0
  15. data/bin/mongrel_rpm +33 -0
  16. data/bin/nrdebug +279 -0
  17. data/cert/cacert.pem +1177 -0
  18. data/config/database.yml +5 -0
  19. data/config.dot +287 -0
  20. data/init.rb +32 -0
  21. data/install.rb +13 -0
  22. data/lib/conditional_vendored_dependency_detection.rb +7 -0
  23. data/lib/conditional_vendored_metric_parser.rb +9 -0
  24. data/lib/mmtrix/agent/agent.rb +1152 -0
  25. data/lib/mmtrix/agent/agent_logger.rb +184 -0
  26. data/lib/mmtrix/agent/attribute_filter.rb +242 -0
  27. data/lib/mmtrix/agent/attribute_processing.rb +62 -0
  28. data/lib/mmtrix/agent/audit_logger.rb +94 -0
  29. data/lib/mmtrix/agent/autostart.rb +65 -0
  30. data/lib/mmtrix/agent/aws_info.rb +90 -0
  31. data/lib/mmtrix/agent/busy_calculator.rb +117 -0
  32. data/lib/mmtrix/agent/chained_call.rb +17 -0
  33. data/lib/mmtrix/agent/commands/agent_command.rb +19 -0
  34. data/lib/mmtrix/agent/commands/agent_command_router.rb +160 -0
  35. data/lib/mmtrix/agent/commands/thread_profiler_session.rb +110 -0
  36. data/lib/mmtrix/agent/commands/xray_session.rb +55 -0
  37. data/lib/mmtrix/agent/commands/xray_session_collection.rb +161 -0
  38. data/lib/mmtrix/agent/configuration/default_source.rb +1471 -0
  39. data/lib/mmtrix/agent/configuration/dotted_hash.rb +50 -0
  40. data/lib/mmtrix/agent/configuration/environment_source.rb +116 -0
  41. data/lib/mmtrix/agent/configuration/high_security_source.rb +51 -0
  42. data/lib/mmtrix/agent/configuration/manager.rb +395 -0
  43. data/lib/mmtrix/agent/configuration/manual_source.rb +17 -0
  44. data/lib/mmtrix/agent/configuration/mask_defaults.rb +14 -0
  45. data/lib/mmtrix/agent/configuration/server_source.rb +117 -0
  46. data/lib/mmtrix/agent/configuration/yaml_source.rb +155 -0
  47. data/lib/mmtrix/agent/configuration.rb +35 -0
  48. data/lib/mmtrix/agent/cross_app_monitor.rb +178 -0
  49. data/lib/mmtrix/agent/cross_app_tracing.rb +339 -0
  50. data/lib/mmtrix/agent/custom_event_aggregator.rb +100 -0
  51. data/lib/mmtrix/agent/database/obfuscation_helpers.rb +78 -0
  52. data/lib/mmtrix/agent/database/obfuscator.rb +80 -0
  53. data/lib/mmtrix/agent/database/postgres_explain_obfuscator.rb +46 -0
  54. data/lib/mmtrix/agent/database.rb +325 -0
  55. data/lib/mmtrix/agent/datastores/metric_helper.rb +98 -0
  56. data/lib/mmtrix/agent/datastores/mongo/metric_translator.rb +191 -0
  57. data/lib/mmtrix/agent/datastores/mongo/obfuscator.rb +39 -0
  58. data/lib/mmtrix/agent/datastores/mongo/statement_formatter.rb +53 -0
  59. data/lib/mmtrix/agent/datastores/mongo.rb +29 -0
  60. data/lib/mmtrix/agent/datastores.rb +191 -0
  61. data/lib/mmtrix/agent/deprecator.rb +18 -0
  62. data/lib/mmtrix/agent/encoding_normalizer.rb +82 -0
  63. data/lib/mmtrix/agent/error_collector.rb +316 -0
  64. data/lib/mmtrix/agent/event_buffer.rb +84 -0
  65. data/lib/mmtrix/agent/event_listener.rb +47 -0
  66. data/lib/mmtrix/agent/event_loop.rb +193 -0
  67. data/lib/mmtrix/agent/harvester.rb +52 -0
  68. data/lib/mmtrix/agent/hash_extensions.rb +26 -0
  69. data/lib/mmtrix/agent/hostname.rb +30 -0
  70. data/lib/mmtrix/agent/http_clients/curb_wrappers.rb +67 -0
  71. data/lib/mmtrix/agent/http_clients/excon_wrappers.rb +67 -0
  72. data/lib/mmtrix/agent/http_clients/httpclient_wrappers.rb +63 -0
  73. data/lib/mmtrix/agent/http_clients/net_http_wrappers.rb +50 -0
  74. data/lib/mmtrix/agent/http_clients/typhoeus_wrappers.rb +75 -0
  75. data/lib/mmtrix/agent/http_clients/uri_util.rb +51 -0
  76. data/lib/mmtrix/agent/inbound_request_monitor.rb +41 -0
  77. data/lib/mmtrix/agent/instrumentation/action_controller_subscriber.rb +121 -0
  78. data/lib/mmtrix/agent/instrumentation/action_view_subscriber.rb +95 -0
  79. data/lib/mmtrix/agent/instrumentation/active_job.rb +90 -0
  80. data/lib/mmtrix/agent/instrumentation/active_merchant.rb +37 -0
  81. data/lib/mmtrix/agent/instrumentation/active_record.rb +105 -0
  82. data/lib/mmtrix/agent/instrumentation/active_record_4.rb +29 -0
  83. data/lib/mmtrix/agent/instrumentation/active_record_helper.rb +189 -0
  84. data/lib/mmtrix/agent/instrumentation/active_record_subscriber.rb +104 -0
  85. data/lib/mmtrix/agent/instrumentation/acts_as_solr.rb +72 -0
  86. data/lib/mmtrix/agent/instrumentation/authlogic.rb +25 -0
  87. data/lib/mmtrix/agent/instrumentation/controller_instrumentation.rb +458 -0
  88. data/lib/mmtrix/agent/instrumentation/curb.rb +191 -0
  89. data/lib/mmtrix/agent/instrumentation/data_mapper.rb +167 -0
  90. data/lib/mmtrix/agent/instrumentation/delayed_job_instrumentation.rb +56 -0
  91. data/lib/mmtrix/agent/instrumentation/evented_subscriber.rb +100 -0
  92. data/lib/mmtrix/agent/instrumentation/excon/connection.rb +33 -0
  93. data/lib/mmtrix/agent/instrumentation/excon/middleware.rb +57 -0
  94. data/lib/mmtrix/agent/instrumentation/excon.rb +72 -0
  95. data/lib/mmtrix/agent/instrumentation/grape.rb +111 -0
  96. data/lib/mmtrix/agent/instrumentation/httpclient.rb +46 -0
  97. data/lib/mmtrix/agent/instrumentation/ignore_actions.rb +41 -0
  98. data/lib/mmtrix/agent/instrumentation/memcache.rb +143 -0
  99. data/lib/mmtrix/agent/instrumentation/merb/controller.rb +44 -0
  100. data/lib/mmtrix/agent/instrumentation/merb/errors.rb +33 -0
  101. data/lib/mmtrix/agent/instrumentation/metric_frame.rb +39 -0
  102. data/lib/mmtrix/agent/instrumentation/middleware_proxy.rb +109 -0
  103. data/lib/mmtrix/agent/instrumentation/middleware_tracing.rb +87 -0
  104. data/lib/mmtrix/agent/instrumentation/mongo.rb +128 -0
  105. data/lib/mmtrix/agent/instrumentation/net.rb +36 -0
  106. data/lib/mmtrix/agent/instrumentation/padrino.rb +32 -0
  107. data/lib/mmtrix/agent/instrumentation/passenger_instrumentation.rb +27 -0
  108. data/lib/mmtrix/agent/instrumentation/queue_time.rb +78 -0
  109. data/lib/mmtrix/agent/instrumentation/rack.rb +186 -0
  110. data/lib/mmtrix/agent/instrumentation/rails/action_controller.rb +123 -0
  111. data/lib/mmtrix/agent/instrumentation/rails/action_web_service.rb +46 -0
  112. data/lib/mmtrix/agent/instrumentation/rails/errors.rb +51 -0
  113. data/lib/mmtrix/agent/instrumentation/rails3/action_controller.rb +173 -0
  114. data/lib/mmtrix/agent/instrumentation/rails3/errors.rb +47 -0
  115. data/lib/mmtrix/agent/instrumentation/rails4/action_controller.rb +29 -0
  116. data/lib/mmtrix/agent/instrumentation/rails4/action_view.rb +25 -0
  117. data/lib/mmtrix/agent/instrumentation/rails4/errors.rb +46 -0
  118. data/lib/mmtrix/agent/instrumentation/rails_middleware.rb +39 -0
  119. data/lib/mmtrix/agent/instrumentation/rainbows_instrumentation.rb +26 -0
  120. data/lib/mmtrix/agent/instrumentation/resque.rb +96 -0
  121. data/lib/mmtrix/agent/instrumentation/rubyprof.rb +26 -0
  122. data/lib/mmtrix/agent/instrumentation/sequel.rb +51 -0
  123. data/lib/mmtrix/agent/instrumentation/sequel_helper.rb +36 -0
  124. data/lib/mmtrix/agent/instrumentation/sidekiq.rb +72 -0
  125. data/lib/mmtrix/agent/instrumentation/sinatra/ignorer.rb +52 -0
  126. data/lib/mmtrix/agent/instrumentation/sinatra/transaction_namer.rb +56 -0
  127. data/lib/mmtrix/agent/instrumentation/sinatra.rb +188 -0
  128. data/lib/mmtrix/agent/instrumentation/sunspot.rb +33 -0
  129. data/lib/mmtrix/agent/instrumentation/typhoeus.rb +78 -0
  130. data/lib/mmtrix/agent/instrumentation.rb +13 -0
  131. data/lib/mmtrix/agent/internal_agent_error.rb +18 -0
  132. data/lib/mmtrix/agent/javascript_instrumentor.rb +196 -0
  133. data/lib/mmtrix/agent/log_once.rb +39 -0
  134. data/lib/mmtrix/agent/memory_logger.rb +59 -0
  135. data/lib/mmtrix/agent/method_tracer.rb +391 -0
  136. data/lib/mmtrix/agent/method_tracer_helpers.rb +92 -0
  137. data/lib/mmtrix/agent/mmtrix_service/encoders.rb +38 -0
  138. data/lib/mmtrix/agent/mmtrix_service/json_marshaller.rb +75 -0
  139. data/lib/mmtrix/agent/mmtrix_service/marshaller.rb +62 -0
  140. data/lib/mmtrix/agent/mmtrix_service/pruby_marshaller.rb +56 -0
  141. data/lib/mmtrix/agent/mmtrix_service.rb +580 -0
  142. data/lib/mmtrix/agent/null_logger.rb +21 -0
  143. data/lib/mmtrix/agent/obfuscator.rb +49 -0
  144. data/lib/mmtrix/agent/parameter_filtering.rb +44 -0
  145. data/lib/mmtrix/agent/pipe_channel_manager.rb +277 -0
  146. data/lib/mmtrix/agent/pipe_service.rb +84 -0
  147. data/lib/mmtrix/agent/rules_engine/replacement_rule.rb +76 -0
  148. data/lib/mmtrix/agent/rules_engine/segment_terms_rule.rb +48 -0
  149. data/lib/mmtrix/agent/rules_engine.rb +58 -0
  150. data/lib/mmtrix/agent/sampled_buffer.rb +51 -0
  151. data/lib/mmtrix/agent/sampler.rb +64 -0
  152. data/lib/mmtrix/agent/sampler_collection.rb +72 -0
  153. data/lib/mmtrix/agent/samplers/cpu_sampler.rb +76 -0
  154. data/lib/mmtrix/agent/samplers/delayed_job_sampler.rb +111 -0
  155. data/lib/mmtrix/agent/samplers/memory_sampler.rb +149 -0
  156. data/lib/mmtrix/agent/samplers/object_sampler.rb +24 -0
  157. data/lib/mmtrix/agent/samplers/vm_sampler.rb +126 -0
  158. data/lib/mmtrix/agent/sized_buffer.rb +23 -0
  159. data/lib/mmtrix/agent/sql_sampler.rb +322 -0
  160. data/lib/mmtrix/agent/stats.rb +159 -0
  161. data/lib/mmtrix/agent/stats_engine/gc_profiler.rb +109 -0
  162. data/lib/mmtrix/agent/stats_engine/metric_stats.rb +237 -0
  163. data/lib/mmtrix/agent/stats_engine/samplers.rb +22 -0
  164. data/lib/mmtrix/agent/stats_engine/stats_hash.rb +168 -0
  165. data/lib/mmtrix/agent/stats_engine.rb +32 -0
  166. data/lib/mmtrix/agent/supported_versions.rb +259 -0
  167. data/lib/mmtrix/agent/synthetics_event_buffer.rb +42 -0
  168. data/lib/mmtrix/agent/synthetics_monitor.rb +50 -0
  169. data/lib/mmtrix/agent/system_info.rb +251 -0
  170. data/lib/mmtrix/agent/threading/agent_thread.rb +76 -0
  171. data/lib/mmtrix/agent/threading/backtrace_node.rb +135 -0
  172. data/lib/mmtrix/agent/threading/backtrace_service.rb +283 -0
  173. data/lib/mmtrix/agent/threading/thread_profile.rb +149 -0
  174. data/lib/mmtrix/agent/traced_method_stack.rb +99 -0
  175. data/lib/mmtrix/agent/transaction/attributes.rb +163 -0
  176. data/lib/mmtrix/agent/transaction/developer_mode_sample_buffer.rb +62 -0
  177. data/lib/mmtrix/agent/transaction/slowest_sample_buffer.rb +25 -0
  178. data/lib/mmtrix/agent/transaction/synthetics_sample_buffer.rb +25 -0
  179. data/lib/mmtrix/agent/transaction/trace.rb +150 -0
  180. data/lib/mmtrix/agent/transaction/trace_node.rb +190 -0
  181. data/lib/mmtrix/agent/transaction/transaction_sample_buffer.rb +105 -0
  182. data/lib/mmtrix/agent/transaction/xray_sample_buffer.rb +64 -0
  183. data/lib/mmtrix/agent/transaction.rb +940 -0
  184. data/lib/mmtrix/agent/transaction_event_aggregator.rb +265 -0
  185. data/lib/mmtrix/agent/transaction_metrics.rb +57 -0
  186. data/lib/mmtrix/agent/transaction_sample_builder.rb +141 -0
  187. data/lib/mmtrix/agent/transaction_sampler.rb +317 -0
  188. data/lib/mmtrix/agent/transaction_state.rb +153 -0
  189. data/lib/mmtrix/agent/transaction_timings.rb +57 -0
  190. data/lib/mmtrix/agent/utilization_data.rb +64 -0
  191. data/lib/mmtrix/agent/vm/jruby_vm.rb +40 -0
  192. data/lib/mmtrix/agent/vm/monotonic_gc_profiler.rb +45 -0
  193. data/lib/mmtrix/agent/vm/mri_vm.rb +87 -0
  194. data/lib/mmtrix/agent/vm/rubinius_vm.rb +132 -0
  195. data/lib/mmtrix/agent/vm/snapshot.rb +20 -0
  196. data/lib/mmtrix/agent/vm.rb +32 -0
  197. data/lib/mmtrix/agent/worker_loop.rb +98 -0
  198. data/lib/mmtrix/agent.rb +714 -0
  199. data/lib/mmtrix/build.rb +2 -0
  200. data/lib/mmtrix/cli/command.rb +91 -0
  201. data/lib/mmtrix/cli/commands/deployments.rb +134 -0
  202. data/lib/mmtrix/cli/commands/install.rb +84 -0
  203. data/lib/mmtrix/coerce.rb +70 -0
  204. data/lib/mmtrix/collection_helper.rb +79 -0
  205. data/lib/mmtrix/control/class_methods.rb +62 -0
  206. data/lib/mmtrix/control/frameworks/external.rb +20 -0
  207. data/lib/mmtrix/control/frameworks/merb.rb +29 -0
  208. data/lib/mmtrix/control/frameworks/rails.rb +139 -0
  209. data/lib/mmtrix/control/frameworks/rails3.rb +45 -0
  210. data/lib/mmtrix/control/frameworks/rails4.rb +23 -0
  211. data/lib/mmtrix/control/frameworks/ruby.rb +24 -0
  212. data/lib/mmtrix/control/frameworks/sinatra.rb +14 -0
  213. data/lib/mmtrix/control/frameworks.rb +14 -0
  214. data/lib/mmtrix/control/instance_methods.rb +161 -0
  215. data/lib/mmtrix/control/instrumentation.rb +71 -0
  216. data/lib/mmtrix/control/server_methods.rb +32 -0
  217. data/lib/mmtrix/control.rb +43 -0
  218. data/lib/mmtrix/delayed_job_injection.rb +10 -0
  219. data/lib/mmtrix/environment_report.rb +131 -0
  220. data/lib/mmtrix/helper.rb +55 -0
  221. data/lib/mmtrix/json_wrapper.rb +78 -0
  222. data/lib/mmtrix/language_support.rb +144 -0
  223. data/lib/mmtrix/latest_changes.rb +64 -0
  224. data/lib/mmtrix/local_environment.rb +207 -0
  225. data/lib/mmtrix/merbtasks.rb +10 -0
  226. data/lib/mmtrix/metric_data.rb +74 -0
  227. data/lib/mmtrix/metric_spec.rb +81 -0
  228. data/lib/mmtrix/metrics.rb +13 -0
  229. data/lib/mmtrix/noticed_error.rb +164 -0
  230. data/lib/mmtrix/okjson.rb +602 -0
  231. data/lib/mmtrix/rack/agent_hooks.rb +33 -0
  232. data/lib/mmtrix/rack/agent_middleware.rb +40 -0
  233. data/lib/mmtrix/rack/browser_monitoring.rb +150 -0
  234. data/lib/mmtrix/rack/developer_mode/segment_summary.rb +56 -0
  235. data/lib/mmtrix/rack/developer_mode.rb +321 -0
  236. data/lib/mmtrix/rack/error_collector.rb +27 -0
  237. data/lib/mmtrix/rack.rb +17 -0
  238. data/lib/mmtrix/recipes/capistrano3.rb +66 -0
  239. data/lib/mmtrix/recipes/capistrano_legacy.rb +98 -0
  240. data/lib/mmtrix/recipes.rb +24 -0
  241. data/lib/mmtrix/timer_lib.rb +31 -0
  242. data/lib/mmtrix/version.rb +70 -0
  243. data/lib/mmtrix_rpm.rb +54 -0
  244. data/lib/sequel/extensions/mmtrix_instrumentation.rb +79 -0
  245. data/lib/sequel/plugins/mmtrix_instrumentation.rb +65 -0
  246. data/lib/tasks/all.rb +8 -0
  247. data/lib/tasks/config.html.erb +28 -0
  248. data/lib/tasks/config.rake +134 -0
  249. data/lib/tasks/config.text.erb +7 -0
  250. data/lib/tasks/install.rake +11 -0
  251. data/lib/tasks/multiverse.rake +2 -0
  252. data/lib/tasks/multiverse.rb +50 -0
  253. data/lib/tasks/tests.rake +36 -0
  254. data/lib/tasks/versions.html.erb +27 -0
  255. data/lib/tasks/versions.rake +53 -0
  256. data/lib/tasks/versions.txt.erb +14 -0
  257. data/mmtrix.yml +47 -0
  258. data/mmtrix_rpm.gemspec +73 -0
  259. data/recipes/mmtrix.rb +10 -0
  260. data/test/agent_helper.rb +666 -0
  261. data/test/config/mmtrix.yml +46 -0
  262. data/test/config/test.cert.crt +18 -0
  263. data/test/config/test.cert.key +15 -0
  264. data/test/config/test_control.rb +54 -0
  265. data/test/environments/.gitignore +16 -0
  266. data/test/environments/lib/environments/runner.rb +113 -0
  267. data/test/environments/norails/Gemfile +21 -0
  268. data/test/environments/norails/Rakefile +9 -0
  269. data/test/environments/rails21/Gemfile +25 -0
  270. data/test/environments/rails21/Rakefile +16 -0
  271. data/test/environments/rails21/app/controllers/application.rb +20 -0
  272. data/test/environments/rails21/config/boot.rb +113 -0
  273. data/test/environments/rails21/config/database.yml +26 -0
  274. data/test/environments/rails21/config/environment.rb +26 -0
  275. data/test/environments/rails21/config/environments/development.rb +10 -0
  276. data/test/environments/rails21/config/environments/production.rb +8 -0
  277. data/test/environments/rails21/config/environments/test.rb +10 -0
  278. data/test/environments/rails21/config/routes.rb +5 -0
  279. data/test/environments/rails21/db/schema.rb +5 -0
  280. data/test/environments/rails22/Gemfile +25 -0
  281. data/test/environments/rails22/Rakefile +16 -0
  282. data/test/environments/rails22/app/controllers/application.rb +20 -0
  283. data/test/environments/rails22/config/boot.rb +113 -0
  284. data/test/environments/rails22/config/database.yml +26 -0
  285. data/test/environments/rails22/config/environment.rb +25 -0
  286. data/test/environments/rails22/config/environments/development.rb +10 -0
  287. data/test/environments/rails22/config/environments/production.rb +8 -0
  288. data/test/environments/rails22/config/environments/test.rb +10 -0
  289. data/test/environments/rails22/config/routes.rb +5 -0
  290. data/test/environments/rails22/db/schema.rb +5 -0
  291. data/test/environments/rails23/Gemfile +24 -0
  292. data/test/environments/rails23/Rakefile +16 -0
  293. data/test/environments/rails23/app/controllers/application.rb +20 -0
  294. data/test/environments/rails23/config/boot.rb +127 -0
  295. data/test/environments/rails23/config/database.yml +26 -0
  296. data/test/environments/rails23/config/environment.rb +16 -0
  297. data/test/environments/rails23/config/environments/production.rb +8 -0
  298. data/test/environments/rails23/config/environments/test.rb +10 -0
  299. data/test/environments/rails23/config/preinitializer.rb +25 -0
  300. data/test/environments/rails23/config/routes.rb +5 -0
  301. data/test/environments/rails23/db/schema.rb +5 -0
  302. data/test/environments/rails30/Gemfile +23 -0
  303. data/test/environments/rails30/Rakefile +11 -0
  304. data/test/environments/rails30/config/application.rb +17 -0
  305. data/test/environments/rails30/config/boot.rb +10 -0
  306. data/test/environments/rails30/config/database.yml +26 -0
  307. data/test/environments/rails30/config/environment.rb +6 -0
  308. data/test/environments/rails30/config/initializers/new_rails_defaults.rb +11 -0
  309. data/test/environments/rails30/db/schema.rb +5 -0
  310. data/test/environments/rails31/Gemfile +24 -0
  311. data/test/environments/rails31/Rakefile +11 -0
  312. data/test/environments/rails31/config/application.rb +18 -0
  313. data/test/environments/rails31/config/boot.rb +10 -0
  314. data/test/environments/rails31/config/database.yml +26 -0
  315. data/test/environments/rails31/config/environment.rb +6 -0
  316. data/test/environments/rails31/config/initializers/new_rails_defaults.rb +21 -0
  317. data/test/environments/rails31/db/schema.rb +5 -0
  318. data/test/environments/rails32/Gemfile +26 -0
  319. data/test/environments/rails32/Rakefile +11 -0
  320. data/test/environments/rails32/config/application.rb +19 -0
  321. data/test/environments/rails32/config/boot.rb +10 -0
  322. data/test/environments/rails32/config/database.yml +31 -0
  323. data/test/environments/rails32/config/environment.rb +6 -0
  324. data/test/environments/rails32/db/schema.rb +5 -0
  325. data/test/environments/rails40/Gemfile +43 -0
  326. data/test/environments/rails40/Rakefile +11 -0
  327. data/test/environments/rails40/config/application.rb +18 -0
  328. data/test/environments/rails40/config/boot.rb +10 -0
  329. data/test/environments/rails40/config/database.yml +26 -0
  330. data/test/environments/rails40/config/environment.rb +6 -0
  331. data/test/environments/rails40/db/schema.rb +5 -0
  332. data/test/environments/rails41/Gemfile +35 -0
  333. data/test/environments/rails41/Rakefile +11 -0
  334. data/test/environments/rails41/config/application.rb +18 -0
  335. data/test/environments/rails41/config/boot.rb +10 -0
  336. data/test/environments/rails41/config/database.yml +26 -0
  337. data/test/environments/rails41/config/environment.rb +6 -0
  338. data/test/environments/rails41/db/schema.rb +5 -0
  339. data/test/environments/rails42/Gemfile +39 -0
  340. data/test/environments/rails42/Rakefile +11 -0
  341. data/test/environments/rails42/config/application.rb +18 -0
  342. data/test/environments/rails42/config/boot.rb +10 -0
  343. data/test/environments/rails42/config/database.yml +26 -0
  344. data/test/environments/rails42/config/environment.rb +6 -0
  345. data/test/environments/rails42/db/schema.rb +5 -0
  346. data/test/fixtures/cross_agent_tests/README.md +56 -0
  347. data/test/fixtures/cross_agent_tests/attribute_configuration.json +384 -0
  348. data/test/fixtures/cross_agent_tests/aws.json +218 -0
  349. data/test/fixtures/cross_agent_tests/cat_map.json +597 -0
  350. data/test/fixtures/cross_agent_tests/docker_container_id/README.md +6 -0
  351. data/test/fixtures/cross_agent_tests/docker_container_id/cases.json +75 -0
  352. data/test/fixtures/cross_agent_tests/docker_container_id/docker-0.9.1.txt +10 -0
  353. data/test/fixtures/cross_agent_tests/docker_container_id/docker-1.0.0.txt +10 -0
  354. data/test/fixtures/cross_agent_tests/docker_container_id/docker-1.1.2-lxc-driver.txt +10 -0
  355. data/test/fixtures/cross_agent_tests/docker_container_id/docker-1.1.2-native-driver-fs.txt +10 -0
  356. data/test/fixtures/cross_agent_tests/docker_container_id/docker-1.1.2-native-driver-systemd.txt +10 -0
  357. data/test/fixtures/cross_agent_tests/docker_container_id/docker-1.3.txt +9 -0
  358. data/test/fixtures/cross_agent_tests/docker_container_id/empty.txt +0 -0
  359. data/test/fixtures/cross_agent_tests/docker_container_id/heroku.txt +1 -0
  360. data/test/fixtures/cross_agent_tests/docker_container_id/invalid-characters.txt +9 -0
  361. data/test/fixtures/cross_agent_tests/docker_container_id/invalid-length.txt +9 -0
  362. data/test/fixtures/cross_agent_tests/docker_container_id/ubuntu-14.04-lxc-container.txt +10 -0
  363. data/test/fixtures/cross_agent_tests/docker_container_id/ubuntu-14.04-no-container.txt +10 -0
  364. data/test/fixtures/cross_agent_tests/docker_container_id/ubuntu-14.10-no-container.txt +10 -0
  365. data/test/fixtures/cross_agent_tests/labels.json +133 -0
  366. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/README.md +16 -0
  367. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/basic_where.colon_obfuscated.txt +3 -0
  368. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/basic_where.explain.txt +3 -0
  369. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/basic_where.obfuscated.txt +3 -0
  370. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/basic_where.query.txt +1 -0
  371. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/current_date.colon_obfuscated.txt +2 -0
  372. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/current_date.explain.txt +2 -0
  373. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/current_date.obfuscated.txt +2 -0
  374. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/current_date.query.txt +1 -0
  375. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/date.colon_obfuscated.txt +2 -0
  376. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/date.explain.txt +2 -0
  377. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/date.obfuscated.txt +2 -0
  378. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/date.query.txt +1 -0
  379. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/embedded_newline.colon_obfuscated.txt +2 -0
  380. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/embedded_newline.explain.txt +3 -0
  381. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/embedded_newline.obfuscated.txt +2 -0
  382. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/embedded_newline.query.txt +1 -0
  383. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/embedded_quote.colon_obfuscated.txt +2 -0
  384. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/embedded_quote.explain.txt +2 -0
  385. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/embedded_quote.obfuscated.txt +2 -0
  386. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/embedded_quote.query.txt +1 -0
  387. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/floating_point.colon_obfuscated.txt +2 -0
  388. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/floating_point.explain.txt +2 -0
  389. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/floating_point.obfuscated.txt +2 -0
  390. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/floating_point.query.txt +1 -0
  391. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/function_with_strings.colon_obfuscated.txt +5 -0
  392. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/function_with_strings.explain.txt +5 -0
  393. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/function_with_strings.obfuscated.txt +5 -0
  394. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/function_with_strings.query.txt +1 -0
  395. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/quote_in_table_name.colon_obfuscated.txt +2 -0
  396. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/quote_in_table_name.explain.txt +2 -0
  397. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/quote_in_table_name.obfuscated.txt +2 -0
  398. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/quote_in_table_name.query.txt +1 -0
  399. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/subplan.colon_obfuscated.txt +5 -0
  400. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/subplan.explain.txt +5 -0
  401. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/subplan.obfuscated.txt +5 -0
  402. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/subplan.query.txt +1 -0
  403. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/where_with_integer.colon_obfuscated.txt +2 -0
  404. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/where_with_integer.explain.txt +2 -0
  405. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/where_with_integer.obfuscated.txt +2 -0
  406. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/where_with_integer.query.txt +1 -0
  407. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/where_with_regex_chars.colon_obfuscated.txt +2 -0
  408. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/where_with_regex_chars.explain.txt +2 -0
  409. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/where_with_regex_chars.obfuscated.txt +2 -0
  410. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/where_with_regex_chars.query.txt +1 -0
  411. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/where_with_substring.colon_obfuscated.txt +3 -0
  412. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/where_with_substring.explain.txt +3 -0
  413. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/where_with_substring.obfuscated.txt +3 -0
  414. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/where_with_substring.query.txt +1 -0
  415. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case1.colon_obfuscated.txt +2 -0
  416. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case1.explain.txt +2 -0
  417. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case1.obfuscated.txt +2 -0
  418. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case1.query.txt +1 -0
  419. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case2.colon_obfuscated.txt +2 -0
  420. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case2.explain.txt +3 -0
  421. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case2.obfuscated.txt +2 -0
  422. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case2.query.txt +1 -0
  423. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case3.colon_obfuscated.txt +2 -0
  424. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case3.explain.txt +2 -0
  425. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case3.obfuscated.txt +2 -0
  426. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case3.query.txt +1 -0
  427. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case4.colon_obfuscated.txt +2 -0
  428. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case4.explain.txt +2 -0
  429. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case4.obfuscated.txt +2 -0
  430. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case4.query.txt +1 -0
  431. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case5.colon_obfuscated.txt +2 -0
  432. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case5.explain.txt +2 -0
  433. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case5.obfuscated.txt +2 -0
  434. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case5.query.txt +1 -0
  435. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case6.colon_obfuscated.txt +2 -0
  436. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case6.explain.txt +2 -0
  437. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case6.obfuscated.txt +2 -0
  438. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case6.query.txt +1 -0
  439. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case7.colon_obfuscated.txt +2 -0
  440. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case7.explain.txt +2 -0
  441. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case7.obfuscated.txt +2 -0
  442. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case7.query.txt +1 -0
  443. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case8.colon_obfuscated.txt +2 -0
  444. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case8.explain.txt +2 -0
  445. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case8.obfuscated.txt +2 -0
  446. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case8.query.txt +1 -0
  447. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case9.colon_obfuscated.txt +2 -0
  448. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case9.explain.txt +2 -0
  449. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case9.obfuscated.txt +2 -0
  450. data/test/fixtures/cross_agent_tests/postgres_explain_obfuscation/with_escape_case9.query.txt +1 -0
  451. data/test/fixtures/cross_agent_tests/proc_cpuinfo/1pack_1core_1logical.txt +3 -0
  452. data/test/fixtures/cross_agent_tests/proc_cpuinfo/1pack_1core_2logical.txt +14 -0
  453. data/test/fixtures/cross_agent_tests/proc_cpuinfo/1pack_2core_2logical.txt +14 -0
  454. data/test/fixtures/cross_agent_tests/proc_cpuinfo/1pack_4core_4logical.txt +28 -0
  455. data/test/fixtures/cross_agent_tests/proc_cpuinfo/2pack_12core_24logical.txt +575 -0
  456. data/test/fixtures/cross_agent_tests/proc_cpuinfo/2pack_20core_40logical.txt +999 -0
  457. data/test/fixtures/cross_agent_tests/proc_cpuinfo/2pack_2core_2logical.txt +51 -0
  458. data/test/fixtures/cross_agent_tests/proc_cpuinfo/2pack_2core_4logical.txt +28 -0
  459. data/test/fixtures/cross_agent_tests/proc_cpuinfo/2pack_4core_4logical.txt +28 -0
  460. data/test/fixtures/cross_agent_tests/proc_cpuinfo/4pack_4core_4logical.txt +103 -0
  461. data/test/fixtures/cross_agent_tests/proc_cpuinfo/8pack_8core_8logical.txt +199 -0
  462. data/test/fixtures/cross_agent_tests/proc_cpuinfo/README.md +24 -0
  463. data/test/fixtures/cross_agent_tests/proc_cpuinfo/Xpack_Xcore_2logical.txt +43 -0
  464. data/test/fixtures/cross_agent_tests/proc_meminfo/README.md +7 -0
  465. data/test/fixtures/cross_agent_tests/proc_meminfo/meminfo_4096MB.txt +47 -0
  466. data/test/fixtures/cross_agent_tests/rules.json +165 -0
  467. data/test/fixtures/cross_agent_tests/rum_client_config.json +62 -0
  468. data/test/fixtures/cross_agent_tests/rum_footer_insertion_location/close-body-in-comment.html +10 -0
  469. data/test/fixtures/cross_agent_tests/rum_footer_insertion_location/dynamic-iframe.html +19 -0
  470. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/basic.html +10 -0
  471. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/body_with_attributes.html +3 -0
  472. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/charset_tag.html +11 -0
  473. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/charset_tag_after_x_ua_tag.html +11 -0
  474. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/charset_tag_before_x_ua_tag.html +11 -0
  475. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/charset_tag_with_spaces.html +11 -0
  476. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/comments1.html +24 -0
  477. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/comments2.html +24 -0
  478. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/content_type_charset_tag.html +11 -0
  479. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/content_type_charset_tag_after_x_ua_tag.html +11 -0
  480. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/content_type_charset_tag_before_x_ua_tag.html +11 -0
  481. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/empty_head +4 -0
  482. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/gt_in_quotes1.html +27 -0
  483. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/gt_in_quotes2.html +24 -0
  484. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/gt_in_quotes_mismatch.html +24 -0
  485. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/gt_in_single_quotes1.html +25 -0
  486. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/gt_in_single_quotes_mismatch.html +25 -0
  487. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/head_with_attributes.html +10 -0
  488. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/incomplete_non_meta_tags.html +10 -0
  489. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/no_end_header.html +6 -0
  490. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/no_header.html +7 -0
  491. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/no_html_and_no_header.html +3 -0
  492. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/no_start_header.html +9 -0
  493. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/script1.html +19 -0
  494. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/script2.html +17 -0
  495. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/x_ua_meta_tag.html +10 -0
  496. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/x_ua_meta_tag_multiline.html +11 -0
  497. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/x_ua_meta_tag_multiple_tags.html +12 -0
  498. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/x_ua_meta_tag_spaces_around_equals.html +10 -0
  499. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/x_ua_meta_tag_with_others.html +11 -0
  500. data/test/fixtures/cross_agent_tests/rum_loader_insertion_location/x_ua_meta_tag_with_spaces.html +10 -0
  501. data/test/fixtures/cross_agent_tests/sql_obfuscation/README.md +30 -0
  502. data/test/fixtures/cross_agent_tests/sql_obfuscation/sql_obfuscation.json +365 -0
  503. data/test/fixtures/cross_agent_tests/sql_parsing.json +55 -0
  504. data/test/fixtures/cross_agent_tests/synthetics/README.md +65 -0
  505. data/test/fixtures/cross_agent_tests/synthetics/synthetics.json +317 -0
  506. data/test/fixtures/cross_agent_tests/transaction_segment_terms.json +101 -0
  507. data/test/fixtures/cross_agent_tests/url_clean.json +15 -0
  508. data/test/fixtures/cross_agent_tests/url_domain_extraction.json +35 -0
  509. data/test/helpers/exceptions.rb +16 -0
  510. data/test/helpers/file_searching.rb +28 -0
  511. data/test/helpers/mongo_metric_builder.rb +28 -0
  512. data/test/helpers/runtime_detection.rb +17 -0
  513. data/test/intentional_fail.rb +13 -0
  514. data/test/mmtrix/FAKECHANGELOG +21 -0
  515. data/test/mmtrix/agent/agent/connect_test.rb +308 -0
  516. data/test/mmtrix/agent/agent/start_test.rb +191 -0
  517. data/test/mmtrix/agent/agent/start_worker_thread_test.rb +74 -0
  518. data/test/mmtrix/agent/agent_logger_test.rb +392 -0
  519. data/test/mmtrix/agent/agent_test.rb +631 -0
  520. data/test/mmtrix/agent/agent_test_controller.rb +84 -0
  521. data/test/mmtrix/agent/apdex_from_server_test.rb +13 -0
  522. data/test/mmtrix/agent/attribute_filter_test.rb +218 -0
  523. data/test/mmtrix/agent/attribute_processing_test.rb +165 -0
  524. data/test/mmtrix/agent/audit_logger_test.rb +213 -0
  525. data/test/mmtrix/agent/autostart_test.rb +79 -0
  526. data/test/mmtrix/agent/aws_info_test.rb +61 -0
  527. data/test/mmtrix/agent/busy_calculator_test.rb +98 -0
  528. data/test/mmtrix/agent/commands/agent_command_router_test.rb +256 -0
  529. data/test/mmtrix/agent/commands/agent_command_test.rb +37 -0
  530. data/test/mmtrix/agent/commands/thread_profiler_session_test.rb +215 -0
  531. data/test/mmtrix/agent/commands/xray_session_collection_test.rb +332 -0
  532. data/test/mmtrix/agent/commands/xray_session_test.rb +42 -0
  533. data/test/mmtrix/agent/configuration/default_source_test.rb +226 -0
  534. data/test/mmtrix/agent/configuration/dotted_hash_test.rb +53 -0
  535. data/test/mmtrix/agent/configuration/environment_source_test.rb +201 -0
  536. data/test/mmtrix/agent/configuration/high_security_source_test.rb +83 -0
  537. data/test/mmtrix/agent/configuration/manager_test.rb +460 -0
  538. data/test/mmtrix/agent/configuration/manual_source_test.rb +18 -0
  539. data/test/mmtrix/agent/configuration/orphan_configuration_test.rb +89 -0
  540. data/test/mmtrix/agent/configuration/server_source_test.rb +202 -0
  541. data/test/mmtrix/agent/configuration/yaml_source_test.rb +117 -0
  542. data/test/mmtrix/agent/cross_app_monitor_test.rb +248 -0
  543. data/test/mmtrix/agent/cross_app_tracing_test.rb +71 -0
  544. data/test/mmtrix/agent/custom_event_aggregator_test.rb +88 -0
  545. data/test/mmtrix/agent/database/postgres_explain_obfuscator_test.rb +34 -0
  546. data/test/mmtrix/agent/database/sql_obfuscation_test.rb +59 -0
  547. data/test/mmtrix/agent/database_test.rb +401 -0
  548. data/test/mmtrix/agent/datastores/metric_helper_test.rb +132 -0
  549. data/test/mmtrix/agent/datastores/mongo/metric_translator_test.rb +320 -0
  550. data/test/mmtrix/agent/datastores/mongo/obfuscator_test.rb +91 -0
  551. data/test/mmtrix/agent/datastores/mongo/statement_formatter_test.rb +72 -0
  552. data/test/mmtrix/agent/datastores_test.rb +195 -0
  553. data/test/mmtrix/agent/deprecator_test.rb +52 -0
  554. data/test/mmtrix/agent/encoding_normalizer_test.rb +66 -0
  555. data/test/mmtrix/agent/error_collector_test.rb +618 -0
  556. data/test/mmtrix/agent/event_buffer_test_cases.rb +152 -0
  557. data/test/mmtrix/agent/event_listener_test.rb +70 -0
  558. data/test/mmtrix/agent/event_loop_test.rb +202 -0
  559. data/test/mmtrix/agent/harvester_test.rb +79 -0
  560. data/test/mmtrix/agent/hash_extensions_test.rb +34 -0
  561. data/test/mmtrix/agent/hostname_test.rb +93 -0
  562. data/test/mmtrix/agent/http_clients/uri_util_test.rb +64 -0
  563. data/test/mmtrix/agent/inbound_request_monitor_test.rb +49 -0
  564. data/test/mmtrix/agent/instrumentation/action_controller_subscriber_test.rb +299 -0
  565. data/test/mmtrix/agent/instrumentation/action_view_subscriber_test.rb +239 -0
  566. data/test/mmtrix/agent/instrumentation/active_job_test.rb +20 -0
  567. data/test/mmtrix/agent/instrumentation/active_record_helper_test.rb +77 -0
  568. data/test/mmtrix/agent/instrumentation/active_record_subscriber_test.rb +132 -0
  569. data/test/mmtrix/agent/instrumentation/controller_instrumentation_test.rb +328 -0
  570. data/test/mmtrix/agent/instrumentation/instrumentation_test.rb +14 -0
  571. data/test/mmtrix/agent/instrumentation/metric_frame_test.rb +22 -0
  572. data/test/mmtrix/agent/instrumentation/middleware_proxy_test.rb +257 -0
  573. data/test/mmtrix/agent/instrumentation/middleware_tracing_test.rb +49 -0
  574. data/test/mmtrix/agent/instrumentation/net_instrumentation_test.rb +35 -0
  575. data/test/mmtrix/agent/instrumentation/queue_time_test.rb +103 -0
  576. data/test/mmtrix/agent/instrumentation/rack_test.rb +47 -0
  577. data/test/mmtrix/agent/instrumentation/sequel_helper_test.rb +36 -0
  578. data/test/mmtrix/agent/instrumentation/sinatra/transaction_namer_test.rb +55 -0
  579. data/test/mmtrix/agent/instrumentation/sinatra_test.rb +80 -0
  580. data/test/mmtrix/agent/instrumentation/task_instrumentation_test.rb +196 -0
  581. data/test/mmtrix/agent/javascript_instrumentor_test.rb +340 -0
  582. data/test/mmtrix/agent/memory_logger_test.rb +85 -0
  583. data/test/mmtrix/agent/method_interrobang_test.rb +31 -0
  584. data/test/mmtrix/agent/method_tracer/class_methods/add_method_tracer_test.rb +122 -0
  585. data/test/mmtrix/agent/method_tracer/instance_methods/trace_execution_scoped_test.rb +224 -0
  586. data/test/mmtrix/agent/method_tracer_test.rb +474 -0
  587. data/test/mmtrix/agent/method_visibility_test.rb +90 -0
  588. data/test/mmtrix/agent/mmtrix_service_test.rb +1056 -0
  589. data/test/mmtrix/agent/mock_scope_listener.rb +27 -0
  590. data/test/mmtrix/agent/obfuscator_test.rb +77 -0
  591. data/test/mmtrix/agent/parameter_filtering_test.rb +39 -0
  592. data/test/mmtrix/agent/pipe_channel_manager_test.rb +278 -0
  593. data/test/mmtrix/agent/pipe_service_test.rb +145 -0
  594. data/test/mmtrix/agent/rpm_agent_test.rb +94 -0
  595. data/test/mmtrix/agent/rules_engine_test.rb +136 -0
  596. data/test/mmtrix/agent/sampled_buffer_test.rb +106 -0
  597. data/test/mmtrix/agent/sampler_collection_test.rb +90 -0
  598. data/test/mmtrix/agent/sampler_test.rb +66 -0
  599. data/test/mmtrix/agent/samplers/cpu_sampler_test.rb +51 -0
  600. data/test/mmtrix/agent/samplers/vm_sampler_test.rb +349 -0
  601. data/test/mmtrix/agent/sized_buffer_test.rb +29 -0
  602. data/test/mmtrix/agent/sql_sampler_test.rb +403 -0
  603. data/test/mmtrix/agent/stats_engine/gc_profiler_test.rb +188 -0
  604. data/test/mmtrix/agent/stats_engine/metric_stats_test.rb +347 -0
  605. data/test/mmtrix/agent/stats_engine/samplers_test.rb +98 -0
  606. data/test/mmtrix/agent/stats_engine/stats_hash_test.rb +194 -0
  607. data/test/mmtrix/agent/stats_engine_test.rb +32 -0
  608. data/test/mmtrix/agent/stats_test.rb +189 -0
  609. data/test/mmtrix/agent/synthetics_event_buffer_test.rb +54 -0
  610. data/test/mmtrix/agent/synthetics_monitor_test.rb +93 -0
  611. data/test/mmtrix/agent/system_info_test.rb +119 -0
  612. data/test/mmtrix/agent/threading/agent_thread_test.rb +149 -0
  613. data/test/mmtrix/agent/threading/backtrace_node_test.rb +184 -0
  614. data/test/mmtrix/agent/threading/backtrace_service_test.rb +595 -0
  615. data/test/mmtrix/agent/threading/fake_thread.rb +43 -0
  616. data/test/mmtrix/agent/threading/thread_profile_test.rb +272 -0
  617. data/test/mmtrix/agent/threading/threaded_test_case.rb +18 -0
  618. data/test/mmtrix/agent/traced_method_stack_test.rb +187 -0
  619. data/test/mmtrix/agent/transaction/attributes_test.rb +276 -0
  620. data/test/mmtrix/agent/transaction/developer_mode_sample_buffer_test.rb +75 -0
  621. data/test/mmtrix/agent/transaction/slowest_sample_buffer_test.rb +67 -0
  622. data/test/mmtrix/agent/transaction/synthetics_sample_buffer_test.rb +38 -0
  623. data/test/mmtrix/agent/transaction/trace_node_test.rb +361 -0
  624. data/test/mmtrix/agent/transaction/trace_test.rb +394 -0
  625. data/test/mmtrix/agent/transaction/xray_sample_buffer_test.rb +71 -0
  626. data/test/mmtrix/agent/transaction_event_aggregator_test.rb +426 -0
  627. data/test/mmtrix/agent/transaction_interrobang_test.rb +33 -0
  628. data/test/mmtrix/agent/transaction_metrics_test.rb +113 -0
  629. data/test/mmtrix/agent/transaction_sample_builder_test.rb +215 -0
  630. data/test/mmtrix/agent/transaction_sampler_test.rb +849 -0
  631. data/test/mmtrix/agent/transaction_state_test.rb +122 -0
  632. data/test/mmtrix/agent/transaction_test.rb +1435 -0
  633. data/test/mmtrix/agent/transaction_timings_test.rb +91 -0
  634. data/test/mmtrix/agent/utilization_data_test.rb +147 -0
  635. data/test/mmtrix/agent/vm/monotonic_gc_profiler_test.rb +42 -0
  636. data/test/mmtrix/agent/vm/mri_vm_test.rb +42 -0
  637. data/test/mmtrix/agent/vm/rubinius_vm_test.rb +69 -0
  638. data/test/mmtrix/agent/vm/snapshot_test.rb +13 -0
  639. data/test/mmtrix/agent/vm_test.rb +48 -0
  640. data/test/mmtrix/agent/worker_loop_test.rb +98 -0
  641. data/test/mmtrix/agent_test.rb +471 -0
  642. data/test/mmtrix/cli/commands/deployments_test.rb +131 -0
  643. data/test/mmtrix/cli/commands/install_test.rb +27 -0
  644. data/test/mmtrix/coerce_test.rb +95 -0
  645. data/test/mmtrix/collection_helper_test.rb +151 -0
  646. data/test/mmtrix/control/class_methods_test.rb +48 -0
  647. data/test/mmtrix/control/frameworks/rails_test.rb +29 -0
  648. data/test/mmtrix/control/instance_methods_test.rb +50 -0
  649. data/test/mmtrix/control/instrumentation_test.rb +41 -0
  650. data/test/mmtrix/control_test.rb +169 -0
  651. data/test/mmtrix/data_container_tests.rb +76 -0
  652. data/test/mmtrix/dependency_detection_test.rb +155 -0
  653. data/test/mmtrix/dispatcher_test.rb +59 -0
  654. data/test/mmtrix/environment_report_test.rb +107 -0
  655. data/test/mmtrix/evil_server.rb +55 -0
  656. data/test/mmtrix/fake_collector.rb +385 -0
  657. data/test/mmtrix/fake_external_server.rb +65 -0
  658. data/test/mmtrix/fake_instance_metadata_service.rb +45 -0
  659. data/test/mmtrix/fake_rpm_site.rb +35 -0
  660. data/test/mmtrix/fake_server.rb +104 -0
  661. data/test/mmtrix/filtering_test_app.rb +19 -0
  662. data/test/mmtrix/framework_test.rb +58 -0
  663. data/test/mmtrix/http_client_test_cases.rb +621 -0
  664. data/test/mmtrix/json_wrapper_test.rb +32 -0
  665. data/test/mmtrix/language_support_test.rb +104 -0
  666. data/test/mmtrix/latest_changes_test.rb +45 -0
  667. data/test/mmtrix/license_test.rb +128 -0
  668. data/test/mmtrix/load_test.rb +15 -0
  669. data/test/mmtrix/local_environment_test.rb +103 -0
  670. data/test/mmtrix/marshalling_test_cases.rb +140 -0
  671. data/test/mmtrix/metric_data_test.rb +191 -0
  672. data/test/mmtrix/metric_parser/metric_parser_test.rb +17 -0
  673. data/test/mmtrix/metric_spec_test.rb +145 -0
  674. data/test/mmtrix/multiverse_helpers.rb +283 -0
  675. data/test/mmtrix/noticed_error_test.rb +197 -0
  676. data/test/mmtrix/rack/agent_hooks_test.rb +44 -0
  677. data/test/mmtrix/rack/agent_middleware_test.rb +32 -0
  678. data/test/mmtrix/rack/browser_monitoring_test.rb +197 -0
  679. data/test/mmtrix/rack/deferred_instrumentation_test.rb +33 -0
  680. data/test/mmtrix/rack/developer_mode/segment_summary_test.rb +96 -0
  681. data/test/mmtrix/rack/developer_mode_helper_test.rb +136 -0
  682. data/test/mmtrix/rack/developer_mode_test.rb +93 -0
  683. data/test/mmtrix/rack/error_collector_test.rb +77 -0
  684. data/test/mmtrix/transaction_ignoring_test_cases.rb +102 -0
  685. data/test/mmtrix/version_number_test.rb +101 -0
  686. data/test/multiverse/.gitignore +13 -0
  687. data/test/multiverse/README.md +85 -0
  688. data/test/multiverse/lib/multiverse/color.rb +23 -0
  689. data/test/multiverse/lib/multiverse/envfile.rb +66 -0
  690. data/test/multiverse/lib/multiverse/environment.rb +19 -0
  691. data/test/multiverse/lib/multiverse/output_collector.rb +82 -0
  692. data/test/multiverse/lib/multiverse/runner.rb +117 -0
  693. data/test/multiverse/lib/multiverse/suite.rb +528 -0
  694. data/test/multiverse/script/runner +5 -0
  695. data/test/multiverse/suites/active_record/.gitignore +1 -0
  696. data/test/multiverse/suites/active_record/Envfile +73 -0
  697. data/test/multiverse/suites/active_record/Rakefile +9 -0
  698. data/test/multiverse/suites/active_record/active_record_test.rb +568 -0
  699. data/test/multiverse/suites/active_record/app/models/models.rb +34 -0
  700. data/test/multiverse/suites/active_record/ar_method_aliasing.rb +43 -0
  701. data/test/multiverse/suites/active_record/before_suite.rb +23 -0
  702. data/test/multiverse/suites/active_record/config/database.rb +80 -0
  703. data/test/multiverse/suites/active_record/config/database.yml +19 -0
  704. data/test/multiverse/suites/active_record/config/mmtrix.yml +18 -0
  705. data/test/multiverse/suites/active_record/db/migrate/20141105131800_create_users_and_aliases.rb +21 -0
  706. data/test/multiverse/suites/active_record/db/migrate/20141106082200_create_orders_and_shipments.rb +25 -0
  707. data/test/multiverse/suites/active_record/db/migrate/20150413011200_add_timestamps_to_orders.rb +16 -0
  708. data/test/multiverse/suites/active_record/db/migrate/20150414084400_create_groups.rb +21 -0
  709. data/test/multiverse/suites/activemerchant/Envfile +36 -0
  710. data/test/multiverse/suites/activemerchant/activemerchant_test.rb +62 -0
  711. data/test/multiverse/suites/agent_only/Envfile +4 -0
  712. data/test/multiverse/suites/agent_only/agent_attributes_test.rb +168 -0
  713. data/test/multiverse/suites/agent_only/agent_run_id_handling_test.rb +39 -0
  714. data/test/multiverse/suites/agent_only/audit_log_test.rb +58 -0
  715. data/test/multiverse/suites/agent_only/collector_exception_handling_test.rb +87 -0
  716. data/test/multiverse/suites/agent_only/config/mmtrix.yml +27 -0
  717. data/test/multiverse/suites/agent_only/cross_application_tracing_test.rb +94 -0
  718. data/test/multiverse/suites/agent_only/custom_analytics_events_test.rb +67 -0
  719. data/test/multiverse/suites/agent_only/custom_queue_time_test.rb +60 -0
  720. data/test/multiverse/suites/agent_only/encoding_handling_test.rb +130 -0
  721. data/test/multiverse/suites/agent_only/exclusive_time_test.rb +176 -0
  722. data/test/multiverse/suites/agent_only/harvest_timestamps_test.rb +83 -0
  723. data/test/multiverse/suites/agent_only/http_response_code_test.rb +38 -0
  724. data/test/multiverse/suites/agent_only/keepalive_test.rb +24 -0
  725. data/test/multiverse/suites/agent_only/key_transactions_test.rb +118 -0
  726. data/test/multiverse/suites/agent_only/labels_test.rb +83 -0
  727. data/test/multiverse/suites/agent_only/logging_test.rb +162 -0
  728. data/test/multiverse/suites/agent_only/marshaling_test.rb +88 -0
  729. data/test/multiverse/suites/agent_only/pipe_manager_test.rb +41 -0
  730. data/test/multiverse/suites/agent_only/rename_rule_test.rb +91 -0
  731. data/test/multiverse/suites/agent_only/rum_instrumentation_test.rb +97 -0
  732. data/test/multiverse/suites/agent_only/script/env_change.rb +10 -0
  733. data/test/multiverse/suites/agent_only/script/loading.rb +20 -0
  734. data/test/multiverse/suites/agent_only/script/public_api_when_disabled.rb +68 -0
  735. data/test/multiverse/suites/agent_only/script/symbol_env.rb +10 -0
  736. data/test/multiverse/suites/agent_only/service_timeout_test.rb +39 -0
  737. data/test/multiverse/suites/agent_only/set_transaction_name_test.rb +118 -0
  738. data/test/multiverse/suites/agent_only/ssl_test.rb +21 -0
  739. data/test/multiverse/suites/agent_only/start_up_test.rb +74 -0
  740. data/test/multiverse/suites/agent_only/synthetics_test.rb +131 -0
  741. data/test/multiverse/suites/agent_only/testing_app.rb +58 -0
  742. data/test/multiverse/suites/agent_only/thread_profiling_test.rb +160 -0
  743. data/test/multiverse/suites/agent_only/transaction_ignoring_test.rb +42 -0
  744. data/test/multiverse/suites/agent_only/utilization_data_collection_test.rb +110 -0
  745. data/test/multiverse/suites/agent_only/xray_sessions_test.rb +199 -0
  746. data/test/multiverse/suites/bare/Envfile +3 -0
  747. data/test/multiverse/suites/bare/standalone_instrumentation_test.rb +43 -0
  748. data/test/multiverse/suites/capistrano/Capfile +26 -0
  749. data/test/multiverse/suites/capistrano/Envfile +18 -0
  750. data/test/multiverse/suites/capistrano/config/deploy/production.rb +9 -0
  751. data/test/multiverse/suites/capistrano/config/deploy.rb +14 -0
  752. data/test/multiverse/suites/capistrano/config/mmtrix.yml +21 -0
  753. data/test/multiverse/suites/capistrano/deployment_test.rb +54 -0
  754. data/test/multiverse/suites/capistrano2/Capfile +4 -0
  755. data/test/multiverse/suites/capistrano2/Envfile +8 -0
  756. data/test/multiverse/suites/capistrano2/config/deploy.rb +19 -0
  757. data/test/multiverse/suites/capistrano2/config/mmtrix.yml +21 -0
  758. data/test/multiverse/suites/capistrano2/deployment_test.rb +37 -0
  759. data/test/multiverse/suites/config_file_loading/Envfile +13 -0
  760. data/test/multiverse/suites/config_file_loading/config_file_loading_test.rb +213 -0
  761. data/test/multiverse/suites/curb/Envfile +31 -0
  762. data/test/multiverse/suites/curb/config/mmtrix.yml +18 -0
  763. data/test/multiverse/suites/curb/curb_test.rb +213 -0
  764. data/test/multiverse/suites/datamapper/Envfile +30 -0
  765. data/test/multiverse/suites/datamapper/config/mmtrix.yml +20 -0
  766. data/test/multiverse/suites/datamapper/datamapper_test.rb +335 -0
  767. data/test/multiverse/suites/deferred_instrumentation/Envfile +15 -0
  768. data/test/multiverse/suites/deferred_instrumentation/config/mmtrix.yml +20 -0
  769. data/test/multiverse/suites/deferred_instrumentation/sinatra_test.rb +107 -0
  770. data/test/multiverse/suites/delayed_job/Envfile +102 -0
  771. data/test/multiverse/suites/delayed_job/before_suite.rb +33 -0
  772. data/test/multiverse/suites/delayed_job/config/mmtrix.yml +18 -0
  773. data/test/multiverse/suites/delayed_job/delayed_job_sampler_test.rb +128 -0
  774. data/test/multiverse/suites/delayed_job/unsupported_backend_test.rb +21 -0
  775. data/test/multiverse/suites/excon/Envfile +21 -0
  776. data/test/multiverse/suites/excon/config/mmtrix.yml +18 -0
  777. data/test/multiverse/suites/excon/excon_test.rb +81 -0
  778. data/test/multiverse/suites/grape/Envfile +13 -0
  779. data/test/multiverse/suites/grape/config/mmtrix.yml +19 -0
  780. data/test/multiverse/suites/grape/grape_test.rb +202 -0
  781. data/test/multiverse/suites/grape/grape_test_api.rb +64 -0
  782. data/test/multiverse/suites/grape/grape_versioning_test.rb +64 -0
  783. data/test/multiverse/suites/grape/grape_versioning_test_api.rb +72 -0
  784. data/test/multiverse/suites/grape/unsupported_version_test.rb +28 -0
  785. data/test/multiverse/suites/high_security/Envfile +3 -0
  786. data/test/multiverse/suites/high_security/config/mmtrix.yml +70 -0
  787. data/test/multiverse/suites/high_security/high_security_test.rb +214 -0
  788. data/test/multiverse/suites/httpclient/Envfile +13 -0
  789. data/test/multiverse/suites/httpclient/config/mmtrix.yml +18 -0
  790. data/test/multiverse/suites/httpclient/httpclient_test.rb +75 -0
  791. data/test/multiverse/suites/json/Envfile +25 -0
  792. data/test/multiverse/suites/json/config/mmtrix.yml +22 -0
  793. data/test/multiverse/suites/json/json_test.rb +16 -0
  794. data/test/multiverse/suites/marshalling/Envfile +12 -0
  795. data/test/multiverse/suites/marshalling/config/mmtrix.yml +20 -0
  796. data/test/multiverse/suites/marshalling/marshalling_test.rb +16 -0
  797. data/test/multiverse/suites/memcached/Envfile +52 -0
  798. data/test/multiverse/suites/memcached/dalli_test.rb +89 -0
  799. data/test/multiverse/suites/memcached/memcache_client_test.rb +25 -0
  800. data/test/multiverse/suites/memcached/memcache_test_cases.rb +302 -0
  801. data/test/multiverse/suites/memcached/memcached_test.rb +159 -0
  802. data/test/multiverse/suites/mongo/Envfile +69 -0
  803. data/test/multiverse/suites/mongo/config/mmtrix.yml +18 -0
  804. data/test/multiverse/suites/mongo/helpers/mongo_operation_tests.rb +489 -0
  805. data/test/multiverse/suites/mongo/helpers/mongo_replica_set.rb +97 -0
  806. data/test/multiverse/suites/mongo/helpers/mongo_replica_set_test.rb +82 -0
  807. data/test/multiverse/suites/mongo/helpers/mongo_server.rb +241 -0
  808. data/test/multiverse/suites/mongo/helpers/mongo_server_test.rb +176 -0
  809. data/test/multiverse/suites/mongo/mongo_connection_test.rb +39 -0
  810. data/test/multiverse/suites/mongo/mongo_instrumentation_test.rb +39 -0
  811. data/test/multiverse/suites/mongo/mongo_unsupported_version_test.rb +72 -0
  812. data/test/multiverse/suites/net_http/Envfile +4 -0
  813. data/test/multiverse/suites/net_http/config/mmtrix.yml +18 -0
  814. data/test/multiverse/suites/net_http/net_http_test.rb +111 -0
  815. data/test/multiverse/suites/padrino/Envfile +14 -0
  816. data/test/multiverse/suites/padrino/config/mmtrix.yml +20 -0
  817. data/test/multiverse/suites/padrino/padrino_test.rb +52 -0
  818. data/test/multiverse/suites/rack/Envfile +35 -0
  819. data/test/multiverse/suites/rack/builder_map_test.rb +128 -0
  820. data/test/multiverse/suites/rack/example_app.rb +100 -0
  821. data/test/multiverse/suites/rack/http_response_code_test.rb +50 -0
  822. data/test/multiverse/suites/rack/nested_non_rack_app_test.rb +66 -0
  823. data/test/multiverse/suites/rack/rack_auto_instrumentation_test.rb +144 -0
  824. data/test/multiverse/suites/rack/rack_cascade_test.rb +45 -0
  825. data/test/multiverse/suites/rack/rack_env_mutation_test.rb +53 -0
  826. data/test/multiverse/suites/rack/rack_parameter_filtering_test.rb +49 -0
  827. data/test/multiverse/suites/rack/rack_unsupported_version_test.rb +43 -0
  828. data/test/multiverse/suites/rack/url_map_test.rb +117 -0
  829. data/test/multiverse/suites/rails/Envfile +61 -0
  830. data/test/multiverse/suites/rails/action_controller_live_rum_test.rb +39 -0
  831. data/test/multiverse/suites/rails/activejob_test.rb +152 -0
  832. data/test/multiverse/suites/rails/app/views/foos/_foo.html.haml +1 -0
  833. data/test/multiverse/suites/rails/app/views/views/_a_partial.html.erb +2 -0
  834. data/test/multiverse/suites/rails/app/views/views/_mid_partial.html.erb +1 -0
  835. data/test/multiverse/suites/rails/app/views/views/_top_partial.html.erb +3 -0
  836. data/test/multiverse/suites/rails/app/views/views/deep_partial.html.erb +3 -0
  837. data/test/multiverse/suites/rails/app/views/views/haml_view.html.haml +6 -0
  838. data/test/multiverse/suites/rails/app/views/views/index.html.erb +4 -0
  839. data/test/multiverse/suites/rails/app.rb +44 -0
  840. data/test/multiverse/suites/rails/bad_instrumentation_test.rb +29 -0
  841. data/test/multiverse/suites/rails/config/mmtrix.yml +30 -0
  842. data/test/multiverse/suites/rails/dummy.txt +1 -0
  843. data/test/multiverse/suites/rails/error_tracing_test.rb +322 -0
  844. data/test/multiverse/suites/rails/gc_instrumentation_test.rb +93 -0
  845. data/test/multiverse/suites/rails/ignore_test.rb +79 -0
  846. data/test/multiverse/suites/rails/middleware_instrumentation_test.rb +41 -0
  847. data/test/multiverse/suites/rails/middlewares.rb +19 -0
  848. data/test/multiverse/suites/rails/parameter_capture_test.rb +299 -0
  849. data/test/multiverse/suites/rails/queue_time_test.rb +89 -0
  850. data/test/multiverse/suites/rails/rails2_app/app/controllers/application.rb +7 -0
  851. data/test/multiverse/suites/rails/rails2_app/config/boot.rb +127 -0
  852. data/test/multiverse/suites/rails/rails2_app/config/database.yml +18 -0
  853. data/test/multiverse/suites/rails/rails2_app/config/environment.rb +16 -0
  854. data/test/multiverse/suites/rails/rails2_app/config/environments/development.rb +10 -0
  855. data/test/multiverse/suites/rails/rails2_app/config/initializers/load_mmtrix_rpm.rb +9 -0
  856. data/test/multiverse/suites/rails/rails2_app/config/preinitializer.rb +25 -0
  857. data/test/multiverse/suites/rails/rails2_app/config/routes.rb +19 -0
  858. data/test/multiverse/suites/rails/rails2_app/db/schema.rb +5 -0
  859. data/test/multiverse/suites/rails/rails3_app/app_rails3_plus.rb +92 -0
  860. data/test/multiverse/suites/rails/request_statistics_test.rb +192 -0
  861. data/test/multiverse/suites/rails/transaction_ignoring_test.rb +41 -0
  862. data/test/multiverse/suites/rails/view_instrumentation_test.rb +254 -0
  863. data/test/multiverse/suites/resque/Envfile +11 -0
  864. data/test/multiverse/suites/resque/Rakefile +3 -0
  865. data/test/multiverse/suites/resque/config/mmtrix.yml +19 -0
  866. data/test/multiverse/suites/resque/instrumentation_test.rb +155 -0
  867. data/test/multiverse/suites/resque/resque_marshalling_test.rb +53 -0
  868. data/test/multiverse/suites/sequel/Envfile +34 -0
  869. data/test/multiverse/suites/sequel/config/mmtrix.yml +18 -0
  870. data/test/multiverse/suites/sequel/database.rb +57 -0
  871. data/test/multiverse/suites/sequel/sequel_extension_test.rb +142 -0
  872. data/test/multiverse/suites/sequel/sequel_helpers.rb +62 -0
  873. data/test/multiverse/suites/sequel/sequel_plugin_test.rb +230 -0
  874. data/test/multiverse/suites/sequel/sequel_safety_test.rb +30 -0
  875. data/test/multiverse/suites/sidekiq/Envfile +31 -0
  876. data/test/multiverse/suites/sidekiq/after_suite.rb +16 -0
  877. data/test/multiverse/suites/sidekiq/config/mmtrix.yml +20 -0
  878. data/test/multiverse/suites/sidekiq/log/.gitkeep +0 -0
  879. data/test/multiverse/suites/sidekiq/sidekiq_instrumentation_test.rb +219 -0
  880. data/test/multiverse/suites/sidekiq/sidekiq_server.rb +31 -0
  881. data/test/multiverse/suites/sidekiq/test_worker.rb +71 -0
  882. data/test/multiverse/suites/sinatra/Envfile +17 -0
  883. data/test/multiverse/suites/sinatra/config/mmtrix.yml +21 -0
  884. data/test/multiverse/suites/sinatra/ignoring_test.rb +208 -0
  885. data/test/multiverse/suites/sinatra/nested_middleware_test.rb +39 -0
  886. data/test/multiverse/suites/sinatra/sinatra_classic_test.rb +99 -0
  887. data/test/multiverse/suites/sinatra/sinatra_error_tracing_test.rb +45 -0
  888. data/test/multiverse/suites/sinatra/sinatra_metric_explosion_test.rb +96 -0
  889. data/test/multiverse/suites/sinatra/sinatra_modular_test.rb +89 -0
  890. data/test/multiverse/suites/sinatra/sinatra_parameter_capture_test.rb +65 -0
  891. data/test/multiverse/suites/sinatra/sinatra_routes_test.rb +49 -0
  892. data/test/multiverse/suites/sinatra/sinatra_test_cases.rb +137 -0
  893. data/test/multiverse/suites/typhoeus/Envfile +57 -0
  894. data/test/multiverse/suites/typhoeus/config/mmtrix.yml +18 -0
  895. data/test/multiverse/suites/typhoeus/typhoeus_test.rb +144 -0
  896. data/test/multiverse/suites/yajl/Envfile +13 -0
  897. data/test/multiverse/suites/yajl/config/mmtrix.yml +21 -0
  898. data/test/multiverse/suites/yajl/yajl_test.rb +18 -0
  899. data/test/multiverse/test/multiverse_test.rb +59 -0
  900. data/test/multiverse/test/suite_examples/one/a/Envfile +3 -0
  901. data/test/multiverse/test/suite_examples/one/a/a_test.rb +14 -0
  902. data/test/multiverse/test/suite_examples/one/a/config/mmtrix.yml +22 -0
  903. data/test/multiverse/test/suite_examples/one/b/Envfile +3 -0
  904. data/test/multiverse/test/suite_examples/one/b/b_test.rb +14 -0
  905. data/test/multiverse/test/suite_examples/one/b/config/mmtrix.yml +22 -0
  906. data/test/multiverse/test/suite_examples/three/a/Envfile +2 -0
  907. data/test/multiverse/test/suite_examples/three/a/fail_test.rb +10 -0
  908. data/test/multiverse/test/suite_examples/three/b/Envfile +2 -0
  909. data/test/multiverse/test/suite_examples/three/b/win_test.rb +10 -0
  910. data/test/multiverse/test/suite_examples/two/a/Envfile +1 -0
  911. data/test/multiverse/test/suite_examples/two/a/fail_test.rb +10 -0
  912. data/test/performance/README.md +182 -0
  913. data/test/performance/lib/performance/baseline.rb +36 -0
  914. data/test/performance/lib/performance/baseline_compare_reporter.rb +103 -0
  915. data/test/performance/lib/performance/baseline_save_reporter.rb +24 -0
  916. data/test/performance/lib/performance/console_reporter.rb +66 -0
  917. data/test/performance/lib/performance/formatting_helpers.rb +22 -0
  918. data/test/performance/lib/performance/hako_client.rb +31 -0
  919. data/test/performance/lib/performance/hako_reporter.rb +26 -0
  920. data/test/performance/lib/performance/instrumentation/cpu_usage.rb +26 -0
  921. data/test/performance/lib/performance/instrumentation/gc_stats.rb +58 -0
  922. data/test/performance/lib/performance/instrumentation/perf_tools.rb +30 -0
  923. data/test/performance/lib/performance/instrumentation/stackprof.rb +46 -0
  924. data/test/performance/lib/performance/instrumentor.rb +96 -0
  925. data/test/performance/lib/performance/json_reporter.rb +15 -0
  926. data/test/performance/lib/performance/platform.rb +37 -0
  927. data/test/performance/lib/performance/reporting.rb +36 -0
  928. data/test/performance/lib/performance/result.rb +104 -0
  929. data/test/performance/lib/performance/runner.rb +221 -0
  930. data/test/performance/lib/performance/table.rb +105 -0
  931. data/test/performance/lib/performance/test_case.rb +152 -0
  932. data/test/performance/lib/performance/timer.rb +40 -0
  933. data/test/performance/lib/performance.rb +38 -0
  934. data/test/performance/script/baselines +102 -0
  935. data/test/performance/script/mega-runner +37 -0
  936. data/test/performance/script/runner +133 -0
  937. data/test/performance/suites/active_record.rb +47 -0
  938. data/test/performance/suites/agent_attributes.rb +62 -0
  939. data/test/performance/suites/config.rb +35 -0
  940. data/test/performance/suites/marshalling.rb +156 -0
  941. data/test/performance/suites/queue_time.rb +21 -0
  942. data/test/performance/suites/rack_middleware.rb +136 -0
  943. data/test/performance/suites/rum_autoinsertion.rb +75 -0
  944. data/test/performance/suites/sql_obfuscation.rb +30 -0
  945. data/test/performance/suites/startup.rb +12 -0
  946. data/test/performance/suites/stats_hash.rb +31 -0
  947. data/test/performance/suites/thread_profiling.rb +116 -0
  948. data/test/performance/suites/trace_execution_scoped.rb +32 -0
  949. data/test/performance/suites/transaction_tracing.rb +106 -0
  950. data/test/script/build_test_gem.sh +57 -0
  951. data/test/script/ci.sh +170 -0
  952. data/test/script/ci_agent-tests_runner.sh +82 -0
  953. data/test/script/ci_bench.sh +52 -0
  954. data/test/script/ci_multiverse_runner.sh +63 -0
  955. data/test/script/path_hash.rb +49 -0
  956. data/test/test_helper.rb +266 -0
  957. data/ui/helpers/developer_mode_helper.rb +324 -0
  958. data/ui/helpers/google_pie_chart.rb +53 -0
  959. data/ui/views/layouts/mmtrix_default.rhtml +48 -0
  960. data/ui/views/mmtrix/_explain_plans.rhtml +27 -0
  961. data/ui/views/mmtrix/_sample.rhtml +20 -0
  962. data/ui/views/mmtrix/_segment.rhtml +28 -0
  963. data/ui/views/mmtrix/_segment_limit_message.rhtml +1 -0
  964. data/ui/views/mmtrix/_segment_row.rhtml +12 -0
  965. data/ui/views/mmtrix/_show_sample_detail.rhtml +24 -0
  966. data/ui/views/mmtrix/_show_sample_sql.rhtml +24 -0
  967. data/ui/views/mmtrix/_show_sample_summary.rhtml +3 -0
  968. data/ui/views/mmtrix/_sql_row.rhtml +16 -0
  969. data/ui/views/mmtrix/_stack_trace.rhtml +15 -0
  970. data/ui/views/mmtrix/_table.rhtml +12 -0
  971. data/ui/views/mmtrix/explain_sql.rhtml +43 -0
  972. data/ui/views/mmtrix/file/images/arrow-close.png +0 -0
  973. data/ui/views/mmtrix/file/images/arrow-open.png +0 -0
  974. data/ui/views/mmtrix/file/images/blue_bar.gif +0 -0
  975. data/ui/views/mmtrix/file/images/file_icon.png +0 -0
  976. data/ui/views/mmtrix/file/images/gray_bar.gif +0 -0
  977. data/ui/views/mmtrix/file/images/mmtrix-rpm-desktop.gif +0 -0
  978. data/ui/views/mmtrix/file/images/mmtrix_rpm_desktop.gif +0 -0
  979. data/ui/views/mmtrix/file/images/textmate.png +0 -0
  980. data/ui/views/mmtrix/file/javascript/jquery-1.4.2.js +6243 -0
  981. data/ui/views/mmtrix/file/javascript/transaction_sample.js +123 -0
  982. data/ui/views/mmtrix/file/stylesheets/style.css +490 -0
  983. data/ui/views/mmtrix/index.rhtml +70 -0
  984. data/ui/views/mmtrix/sample_not_found.rhtml +2 -0
  985. data/ui/views/mmtrix/show_sample.rhtml +81 -0
  986. data/ui/views/mmtrix/threads.rhtml +45 -0
  987. data/vendor/gems/dependency_detection-0.0.1.build/lib/dependency_detection/version.rb +7 -0
  988. data/vendor/gems/dependency_detection-0.0.1.build/lib/dependency_detection.rb +122 -0
  989. data/vendor/gems/metric_parser-0.1.0.pre1/.specification +116 -0
  990. data/vendor/gems/metric_parser-0.1.0.pre1/lib/metric_parser.rb +5 -0
  991. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/action_mailer.rb +18 -0
  992. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/active_merchant.rb +35 -0
  993. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/active_record.rb +37 -0
  994. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/apdex.rb +93 -0
  995. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/background_transaction.rb +11 -0
  996. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/client.rb +50 -0
  997. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/controller.rb +71 -0
  998. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/controller_cpu.rb +47 -0
  999. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/controller_ext.rb +21 -0
  1000. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/database.rb +52 -0
  1001. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/database_pool.rb +28 -0
  1002. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/dot_net.rb +32 -0
  1003. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/dot_net_parser.rb +21 -0
  1004. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/errors.rb +15 -0
  1005. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/external.rb +59 -0
  1006. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/frontend.rb +44 -0
  1007. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/gc.rb +24 -0
  1008. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/hibernate_session.rb +11 -0
  1009. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/java.rb +35 -0
  1010. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/java_parser.rb +21 -0
  1011. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/jsp.rb +38 -0
  1012. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/jsp_tag.rb +11 -0
  1013. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/mem_cache.rb +59 -0
  1014. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/metric_parser.rb +138 -0
  1015. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/middleware.rb +34 -0
  1016. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/nested.rb +24 -0
  1017. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/orm.rb +31 -0
  1018. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/other_transaction.rb +44 -0
  1019. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/servlet.rb +11 -0
  1020. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/servlet_context_listener.rb +11 -0
  1021. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/servlet_filter.rb +11 -0
  1022. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/servlet_init.rb +11 -0
  1023. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/solr.rb +31 -0
  1024. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/solr_request_handler.rb +19 -0
  1025. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/spring.rb +58 -0
  1026. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/spring_controller.rb +10 -0
  1027. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/spring_view.rb +10 -0
  1028. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/struts_action.rb +24 -0
  1029. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/struts_result.rb +24 -0
  1030. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/version.rb +9 -0
  1031. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/view.rb +74 -0
  1032. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/web_frontend.rb +22 -0
  1033. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/web_service.rb +18 -0
  1034. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser/web_transaction.rb +137 -0
  1035. data/vendor/gems/metric_parser-0.1.0.pre1/lib/mmtrix/metric_parser.rb +70 -0
  1036. metadata +1263 -0
@@ -0,0 +1,1435 @@
1
+ # encoding: utf-8
2
+ # This file is distributed under Mmtrix's license terms.
3
+ # See https://github.com/mmtrix/rpm/blob/master/LICENSE for complete details.
4
+
5
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
6
+
7
+ class Mmtrix::Agent::TransactionTest < Minitest::Test
8
+
9
+ def setup
10
+ @stats_engine = Mmtrix::Agent.instance.stats_engine
11
+ @stats_engine.reset!
12
+ Mmtrix::Agent.instance.error_collector.reset!
13
+ end
14
+
15
+ def teardown
16
+ # Failed transactions can leave partial stack, so pave it for next test
17
+
18
+ ::Mmtrix::Agent.logger.clear_already_logged
19
+ cleanup_transaction
20
+ end
21
+
22
+ def cleanup_transaction
23
+ Mmtrix::Agent::TransactionState.tl_clear_for_testing
24
+ end
25
+
26
+ def test_request_parsing_none
27
+ in_transaction do |txn|
28
+ assert_nil txn.request_path
29
+ assert_nil txn.referer
30
+ end
31
+ end
32
+
33
+ # note: technically this shouldn't happen if the request we are dealing with is
34
+ # a Rack::Request (or subclass such as ActionDispatch::Request or the old
35
+ # ActionController::AbstractRequest)
36
+ def test_request_with_path_with_query_string
37
+ request = stub(:path => '/path?hello=bob#none')
38
+ in_transaction(:request => request) do |txn|
39
+ assert_equal "/path", txn.request_path
40
+ end
41
+ end
42
+
43
+ def test_request_parsing_referer
44
+ request = stub(:referer => 'https://www.yahoo.com:8080/path/hello?bob=none&foo=bar', :path => "/")
45
+ in_transaction(:request => request) do |txn|
46
+ assert_equal "https://www.yahoo.com:8080/path/hello", txn.referer
47
+ end
48
+ end
49
+
50
+ def test_strips_query_string_from_path_and_referer
51
+ request = stub(:path => '/path?hello=bob#none', :referer => '/path/hello?bob=none&foo=bar')
52
+ in_transaction(:request => request) do |txn|
53
+ assert_equal "/path", txn.request_path
54
+ assert_equal "/path/hello", txn.referer
55
+ end
56
+ end
57
+
58
+ def test_transaction_referer_nil_if_request_referer_nil
59
+ request = stub(:path => '/path?hello=bob#none', :referer => nil)
60
+ in_transaction(:request => request) do |txn|
61
+ assert_nil txn.referer
62
+ end
63
+ end
64
+
65
+ def test_request_with_normal_path
66
+ request = stub(:path => '/blogs')
67
+ in_transaction(:request => request) do |txn|
68
+ assert_equal "/blogs", txn.request_path
69
+ assert_nil txn.referer
70
+ end
71
+ end
72
+
73
+ def test_request_with_empty_path
74
+ request = stub(:path => '')
75
+ in_transaction(:request => request) do |txn|
76
+ assert_equal "/", txn.request_path
77
+ assert_nil txn.referer
78
+ end
79
+ end
80
+
81
+ def test_request_to_root_path
82
+ request = stub(:path => '/')
83
+ in_transaction(:request => request) do |txn|
84
+ assert_equal "/", txn.request_path
85
+ assert_nil txn.referer
86
+ end
87
+ end
88
+
89
+ def test_request_with_empty_path_with_query_string
90
+ request = stub(:path => '?k=v')
91
+ in_transaction(:request => request) do |txn|
92
+ assert_equal "/", txn.request_path
93
+ assert_nil txn.referer
94
+ end
95
+ end
96
+
97
+ def test_queue_time
98
+ in_transaction do |txn|
99
+ txn.apdex_start = 1000
100
+ txn.start_time = 1500
101
+ assert_equal 500, txn.queue_time
102
+ end
103
+ end
104
+
105
+ def test_apdex_bucket_counts_errors_as_frustrating
106
+ bucket = Mmtrix::Agent::Transaction.apdex_bucket(0.1, true, 2)
107
+ assert_equal(:apdex_f, bucket)
108
+ end
109
+
110
+ def test_apdex_bucket_counts_values_under_apdex_t_as_satisfying
111
+ bucket = Mmtrix::Agent::Transaction.apdex_bucket(0.5, false, 1)
112
+ assert_equal(:apdex_s, bucket)
113
+ end
114
+
115
+ def test_apdex_bucket_counts_values_of_1_to_4x_apdex_t_as_tolerating
116
+ bucket = Mmtrix::Agent::Transaction.apdex_bucket(1.01, false, 1)
117
+ assert_equal(:apdex_t, bucket)
118
+ bucket = Mmtrix::Agent::Transaction.apdex_bucket(3.99, false, 1)
119
+ assert_equal(:apdex_t, bucket)
120
+ end
121
+
122
+ def test_apdex_bucket_count_values_over_4x_apdex_t_as_frustrating
123
+ bucket = Mmtrix::Agent::Transaction.apdex_bucket(4.01, false, 1)
124
+ assert_equal(:apdex_f, bucket)
125
+ end
126
+
127
+ def test_has_correct_apdex_t_for_transaction
128
+ config = {
129
+ :web_transactions_apdex => {'Controller/foo/bar' => 1.5},
130
+ :apdex_t => 2.0
131
+ }
132
+
133
+ with_config(config) do
134
+ in_transaction('Controller/foo/bar') do |txn|
135
+ assert_equal 1.5, txn.apdex_t
136
+ end
137
+
138
+ in_transaction('Controller/some/other') do |txn|
139
+ assert_equal 2.0, txn.apdex_t
140
+ end
141
+ end
142
+ end
143
+
144
+ KEY_TRANSACTION_CONFIG = {
145
+ :web_transactions_apdex => {
146
+ 'Controller/slow/txn' => 4,
147
+ 'OtherTransaction/back/ground' => 8
148
+ },
149
+ :apdex => 1
150
+ }
151
+
152
+ def test_update_apdex_records_correct_apdex_for_key_transaction
153
+ t0 = freeze_time
154
+
155
+ with_config(KEY_TRANSACTION_CONFIG) do
156
+ in_web_transaction('Controller/slow/txn') do
157
+ state = Mmtrix::Agent::TransactionState.tl_get
158
+ txn = state.current_transaction
159
+ txn.record_apdex(state, t0 + 3.5)
160
+ txn.record_apdex(state, t0 + 5.5)
161
+ txn.record_apdex(state, t0 + 16.5)
162
+ end
163
+
164
+ # apdex_s is 2 because the transaction itself records apdex
165
+ assert_metrics_recorded(
166
+ 'ApdexAll' => { :apdex_s => 2, :apdex_t => 1, :apdex_f => 1 },
167
+ 'Apdex' => { :apdex_s => 2, :apdex_t => 1, :apdex_f => 1 },
168
+ 'Apdex/slow/txn' => { :apdex_s => 2, :apdex_t => 1, :apdex_f => 1 }
169
+ )
170
+ end
171
+ end
172
+
173
+ def test_update_apdex_records_correct_apdex_for_non_key_transaction
174
+ t0 = freeze_time
175
+
176
+ with_config(KEY_TRANSACTION_CONFIG) do
177
+ in_web_transaction('Controller/other/txn') do
178
+ state = Mmtrix::Agent::TransactionState.tl_get
179
+ txn = state.current_transaction
180
+ txn.record_apdex(state, t0 + 0.5)
181
+ txn.record_apdex(state, t0 + 2)
182
+ txn.record_apdex(state, t0 + 5)
183
+ end
184
+
185
+ # apdex_s is 2 because the transaction itself records apdex
186
+ assert_metrics_recorded(
187
+ 'ApdexAll' => { :apdex_s => 2, :apdex_t => 1, :apdex_f => 1 },
188
+ 'Apdex' => { :apdex_s => 2, :apdex_t => 1, :apdex_f => 1 },
189
+ 'Apdex/other/txn' => { :apdex_s => 2, :apdex_t => 1, :apdex_f => 1 }
190
+ )
191
+ end
192
+ end
193
+
194
+ def test_update_apdex_records_for_background_key_transaction
195
+ t0 = freeze_time
196
+ with_config(KEY_TRANSACTION_CONFIG) do
197
+ in_background_transaction('OtherTransaction/back/ground') do
198
+ state = Mmtrix::Agent::TransactionState.tl_get
199
+ txn = state.current_transaction
200
+ txn.record_apdex(state, t0 + 7.5)
201
+ txn.record_apdex(state, t0 + 9.5)
202
+ txn.record_apdex(state, t0 + 32.5)
203
+ end
204
+
205
+ assert_metrics_recorded(
206
+ 'ApdexAll' => { :apdex_s => 2, :apdex_t => 1, :apdex_f => 1 },
207
+ 'ApdexOther' => { :apdex_s => 2, :apdex_t => 1, :apdex_f => 1 },
208
+ 'ApdexOther/Transaction/back/ground' => { :apdex_s => 2, :apdex_t => 1, :apdex_f => 1 }
209
+ )
210
+ end
211
+ end
212
+
213
+ def test_skips_apdex_records_for_background_non_key_transaction
214
+ t0 = freeze_time
215
+ with_config(KEY_TRANSACTION_CONFIG) do
216
+ in_background_transaction('OtherTransaction/other/task') do
217
+ state = Mmtrix::Agent::TransactionState.tl_get
218
+ txn = state.current_transaction
219
+ txn.record_apdex(state, t0 + 7.5)
220
+ txn.record_apdex(state, t0 + 9.5)
221
+ txn.record_apdex(state, t0 + 32.5)
222
+ end
223
+
224
+ refute_metrics_recorded(['ApdexOther', 'ApdexOther/Transaction/other/task'])
225
+ end
226
+ end
227
+
228
+ def test_record_apdex_stores_apdex_t_in_min_and_max
229
+ with_config(:apdex_t => 2.5) do
230
+ in_web_transaction('Controller/some/txn') do
231
+ state = Mmtrix::Agent::TransactionState.tl_get
232
+ txn = state.current_transaction
233
+ txn.record_apdex(state, Time.now)
234
+ end
235
+ end
236
+
237
+ expected = { :min_call_time => 2.5, :max_call_time => 2.5 }
238
+ assert_metrics_recorded(
239
+ 'ApdexAll' => expected,
240
+ 'Apdex' => expected,
241
+ 'Apdex/some/txn' => expected
242
+ )
243
+ end
244
+
245
+ def test_records_apdex_all_for_both_transaction_types
246
+ t0 = freeze_time
247
+ with_config(KEY_TRANSACTION_CONFIG) do
248
+ in_background_transaction('OtherTransaction/back/ground') do
249
+ state = Mmtrix::Agent::TransactionState.tl_get
250
+ txn = state.current_transaction
251
+ txn.record_apdex(state, t0 + 7.5)
252
+ txn.record_apdex(state, t0 + 9.5)
253
+ txn.record_apdex(state, t0 + 32.5)
254
+ end
255
+
256
+ in_web_transaction('Controller/slow/txn') do
257
+ state = Mmtrix::Agent::TransactionState.tl_get
258
+ txn = state.current_transaction
259
+ txn.record_apdex(state, t0 + 3.5)
260
+ txn.record_apdex(state, t0 + 5.5)
261
+ txn.record_apdex(state, t0 + 16.5)
262
+ end
263
+
264
+ # apdex_s is 2 because the transaction itself records apdex
265
+ assert_metrics_recorded(
266
+ 'ApdexAll' => { :apdex_s => 4, :apdex_t => 2, :apdex_f => 2 },
267
+ 'Apdex' => { :apdex_s => 2, :apdex_t => 1, :apdex_f => 1 },
268
+ 'Apdex/slow/txn' => { :apdex_s => 2, :apdex_t => 1, :apdex_f => 1 },
269
+ 'ApdexOther' => { :apdex_s => 2, :apdex_t => 1, :apdex_f => 1 },
270
+ 'ApdexOther/Transaction/back/ground' => { :apdex_s => 2, :apdex_t => 1, :apdex_f => 1 }
271
+ )
272
+ end
273
+ end
274
+
275
+ class SillyError < StandardError
276
+ end
277
+
278
+ def test_apdex_success_with_ignored_error
279
+ filter = Proc.new do |error|
280
+ error.is_a?(SillyError) ? nil : error
281
+ end
282
+
283
+ with_ignore_error_filter(filter) do
284
+ txn_name = 'Controller/whatever'
285
+ in_web_transaction(txn_name) do
286
+ Mmtrix::Agent::Transaction.notice_error(SillyError.new)
287
+ end
288
+
289
+ in_web_transaction(txn_name) do
290
+ Mmtrix::Agent::Transaction.notice_error(RuntimeError.new)
291
+ end
292
+ end
293
+
294
+ assert_metrics_recorded(
295
+ 'Apdex' => { :apdex_s => 1, :apdex_t => 0, :apdex_f => 1 },
296
+ 'Apdex/whatever' => { :apdex_s => 1, :apdex_t => 0, :apdex_f => 1 }
297
+ )
298
+ end
299
+
300
+ def test_apdex_success_with_config_ignored_error
301
+ txn_name = 'Controller/whatever'
302
+ with_config(:'error_collector.ignore_errors' => SillyError.name) do
303
+ in_web_transaction(txn_name) do
304
+ Mmtrix::Agent::Transaction.notice_error(SillyError.new)
305
+ end
306
+
307
+ in_web_transaction(txn_name) do
308
+ Mmtrix::Agent::Transaction.notice_error(RuntimeError.new)
309
+ end
310
+
311
+ assert_metrics_recorded(
312
+ 'Apdex' => { :apdex_s => 1, :apdex_t => 0, :apdex_f => 1 },
313
+ 'Apdex/whatever' => { :apdex_s => 1, :apdex_t => 0, :apdex_f => 1 }
314
+ )
315
+ end
316
+ end
317
+
318
+ def test_name_is_unset_if_nil
319
+ in_transaction(:transaction_name => nil) do |txn|
320
+ assert !txn.name_set?
321
+ end
322
+ end
323
+
324
+ def test_name_set_if_anything_else
325
+ in_transaction("anything else") do |txn|
326
+ assert txn.name_set?
327
+ end
328
+ end
329
+
330
+ def test_set_default_transaction_name_without_category
331
+ in_transaction('foo', :category => :controller) do |txn|
332
+ Mmtrix::Agent::Transaction.set_default_transaction_name('bar')
333
+ assert_equal("Controller/bar", txn.best_name)
334
+ assert_equal("Controller/bar", txn.frame_stack.last.name)
335
+ end
336
+ end
337
+
338
+ def test_set_default_transaction_name_with_category
339
+ in_transaction('foo', :category => :controller) do |txn|
340
+ Mmtrix::Agent::Transaction.set_default_transaction_name('bar', :rack)
341
+ assert_equal("Controller/Rack/bar", txn.best_name)
342
+ assert_equal("Controller/Rack/bar", txn.frame_stack.last.name)
343
+ end
344
+ end
345
+
346
+ def test_set_default_transaction_name_with_category_and_node_name
347
+ in_transaction('foo', :category => :controller) do |txn|
348
+ Mmtrix::Agent::Transaction.set_default_transaction_name('bar', :grape, 'baz')
349
+ assert_equal("Controller/Grape/bar", txn.best_name)
350
+ assert_equal("baz", txn.frame_stack.last.name)
351
+ end
352
+ end
353
+
354
+ def test_generates_guid_on_initialization
355
+ in_transaction do |txn|
356
+ refute_empty txn.guid
357
+ end
358
+ end
359
+
360
+ def test_end_applies_transaction_name_rules
361
+ rules = [
362
+ {
363
+ 'match_expression' => '[0-9]+',
364
+ 'replacement' => '*',
365
+ 'replace_all' => true
366
+ }
367
+ ]
368
+
369
+ with_transaction_renaming_rules(rules) do
370
+ in_transaction('Controller/foo/1/bar/22') do |txn|
371
+ Mmtrix::Agent::Transaction.tl_current.freeze_name_and_execute_if_not_ignored
372
+ assert_equal 'Controller/foo/*/bar/*', txn.best_name
373
+ end
374
+ end
375
+ end
376
+
377
+ def test_end_fires_a_transaction_finished_event
378
+ name, timestamp, duration = nil
379
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
380
+ name = payload[:name]
381
+ timestamp = payload[:start_timestamp]
382
+ duration = payload[:duration]
383
+ end
384
+
385
+ start_time = freeze_time
386
+ in_web_transaction('Controller/foo/1/bar/22') do
387
+ advance_time(5)
388
+ Mmtrix::Agent::Transaction.tl_current.freeze_name_and_execute_if_not_ignored
389
+ end
390
+
391
+ assert_equal 'Controller/foo/1/bar/22', name
392
+ assert_equal start_time.to_f, timestamp
393
+ assert_equal 5.0, duration
394
+ end
395
+
396
+ def test_end_fires_a_transaction_finished_event_with_overview_metrics
397
+ freeze_time
398
+ options = nil
399
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
400
+ options = payload[:metrics]
401
+ end
402
+
403
+ in_web_transaction('Controller/foo/1/bar/22') do
404
+ Mmtrix::Agent.record_metric("HttpDispatcher", 2.1)
405
+ end
406
+
407
+ assert_equal 2.1, options['HttpDispatcher'].total_call_time
408
+ end
409
+
410
+ def test_end_fires_a_transaction_finished_event_with_attributes_attached
411
+ attributes = nil
412
+
413
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
414
+ attributes = payload[:attributes]
415
+ end
416
+
417
+ txn = in_web_transaction('Controller/foo/1/bar/22') do
418
+ end
419
+
420
+ assert_equal txn.attributes, attributes
421
+ end
422
+
423
+ def test_end_fires_a_transaction_finished_event_with_transaction_guid
424
+ guid = nil
425
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
426
+ guid = payload[:guid]
427
+ end
428
+
429
+ in_transaction do
430
+ Mmtrix::Agent::TransactionState.tl_get.is_cross_app_caller = true
431
+ end
432
+
433
+ refute_empty guid
434
+ end
435
+
436
+ def test_end_fires_a_transaction_finished_event_without_transaction_guid_if_not_cross_app
437
+ found_guid = :untouched
438
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
439
+ found_guid = payload.key?(:guid)
440
+ end
441
+
442
+ in_transaction do
443
+ Mmtrix::Agent::TransactionState.tl_get.is_cross_app_caller = false
444
+ end
445
+
446
+ refute found_guid
447
+ end
448
+
449
+ def test_end_fires_a_transaction_finished_event_with_guid_if_referring_transaction
450
+ guid = nil
451
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
452
+ guid = payload[:guid]
453
+ end
454
+
455
+ with_config(:apdex_t => 2.0) do
456
+ in_transaction do
457
+ state = Mmtrix::Agent::TransactionState.tl_get
458
+ state.referring_transaction_info = ["another"]
459
+ end
460
+ end
461
+
462
+ refute_empty guid
463
+ end
464
+
465
+ def test_end_fires_a_transaction_finished_event_with_referring_transaction_guid
466
+ referring_guid = nil
467
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
468
+ referring_guid = payload[:referring_transaction_guid]
469
+ end
470
+
471
+ in_transaction do
472
+ Mmtrix::Agent::TransactionState.tl_get.referring_transaction_info = ["GUID"]
473
+ end
474
+
475
+ assert_equal "GUID", referring_guid
476
+ end
477
+
478
+ def test_end_fires_a_transaction_finished_event_without_referring_guid_if_not_present
479
+ found_referring_guid = :untouched
480
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
481
+ found_referring_guid = payload.key?(:referring_transaction_guid)
482
+ end
483
+
484
+ in_transaction do
485
+ # Make sure we don't have referring transaction state floating around
486
+ Mmtrix::Agent::TransactionState.tl_get.referring_transaction_info = nil
487
+ end
488
+
489
+ refute found_referring_guid
490
+ end
491
+
492
+ def test_end_fires_a_transaction_finished_event_with_apdex_perf_zone
493
+ apdex = nil
494
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
495
+ apdex = payload[:apdex_perf_zone]
496
+ end
497
+
498
+ freeze_time
499
+
500
+ with_config(:apdex_t => 1.0) do
501
+ in_web_transaction { advance_time 0.5 }
502
+ assert_equal('S', apdex)
503
+
504
+ in_web_transaction { advance_time 1.5 }
505
+ assert_equal('T', apdex)
506
+
507
+ in_web_transaction { advance_time 4.5 }
508
+ assert_equal('F', apdex)
509
+ end
510
+ end
511
+
512
+ def test_default_background_transaction_event_doesnt_include_apdex_perf_zone
513
+ apdex = nil
514
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
515
+ apdex = payload[:apdex_perf_zone]
516
+ end
517
+
518
+ freeze_time
519
+
520
+ with_config(:apdex_t => 1.0) do
521
+ in_background_transaction { advance_time 0.5 }
522
+ assert_nil apdex
523
+ end
524
+ end
525
+
526
+ def test_background_transaction_event_include_apdex_perf_zone_if_key_transaction
527
+ apdex = nil
528
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
529
+ apdex = payload[:apdex_perf_zone]
530
+ end
531
+
532
+ freeze_time
533
+
534
+ txn_name = 'OtherTransaction/back/ground'
535
+ key_transactions = { txn_name => 1.0 }
536
+
537
+ with_config(:apdex_t => 1.0, :web_transactions_apdex => key_transactions) do
538
+ in_background_transaction(txn_name) { advance_time 0.5 }
539
+ assert_equal('S', apdex)
540
+
541
+ in_background_transaction(txn_name) { advance_time 1.5 }
542
+ assert_equal('T', apdex)
543
+
544
+ in_background_transaction(txn_name) { advance_time 4.5 }
545
+ assert_equal('F', apdex)
546
+ end
547
+ end
548
+
549
+ def test_guid_in_finish_event_payload_if_incoming_synthetics_header
550
+ keys = []
551
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
552
+ keys = payload.keys
553
+ end
554
+
555
+ raw_synthetics_header = 'dummy data'
556
+ synthetics_payload = [123, 456, 789, 111]
557
+
558
+ in_transaction do |txn|
559
+ txn.raw_synthetics_header = raw_synthetics_header
560
+ txn.synthetics_payload = synthetics_payload
561
+ end
562
+
563
+ assert_includes keys, :guid
564
+ end
565
+
566
+ def test_cross_app_fields_in_finish_event_payload
567
+ keys = []
568
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
569
+ keys = payload.keys
570
+ end
571
+
572
+ in_transaction do
573
+ Mmtrix::Agent::TransactionState.tl_get.is_cross_app_caller = true
574
+ end
575
+
576
+ assert_includes keys, :cat_trip_id
577
+ assert_includes keys, :cat_path_hash
578
+ end
579
+
580
+ def test_cross_app_fields_not_in_finish_event_payload_if_no_cross_app_calls
581
+ keys = []
582
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
583
+ keys = payload.keys
584
+ end
585
+
586
+ freeze_time
587
+
588
+ in_transaction do
589
+ advance_time(10)
590
+
591
+ state = Mmtrix::Agent::TransactionState.tl_get
592
+ state.is_cross_app_caller = false
593
+ end
594
+
595
+ refute_includes keys, :cat_trip_id
596
+ refute_includes keys, :cat_path_hash
597
+ end
598
+
599
+ def test_is_not_synthetic_request_without_payload
600
+ in_transaction do |txn|
601
+ txn.raw_synthetics_header = ""
602
+ refute txn.is_synthetics_request?
603
+ end
604
+ end
605
+
606
+ def test_is_not_synthetic_request_without_header
607
+ in_transaction do |txn|
608
+ txn.synthetics_payload = [1,2,3,4,5]
609
+ refute txn.is_synthetics_request?
610
+ end
611
+ end
612
+
613
+ def test_is_synthetic_request
614
+ in_transaction do |txn|
615
+ txn.raw_synthetics_header = ""
616
+ txn.synthetics_payload = [1,2,3,4,5]
617
+ assert txn.is_synthetics_request?
618
+ end
619
+ end
620
+
621
+ def test_synthetics_accessors
622
+ in_transaction do
623
+ state = Mmtrix::Agent::TransactionState.tl_get
624
+ txn = state.current_transaction
625
+ txn.synthetics_payload = [1,2,3,4,5]
626
+
627
+ assert_equal 1, txn.synthetics_version
628
+ assert_equal 2, txn.synthetics_account_id
629
+ assert_equal 3, txn.synthetics_resource_id
630
+ assert_equal 4, txn.synthetics_job_id
631
+ assert_equal 5, txn.synthetics_monitor_id
632
+ end
633
+ end
634
+
635
+ def test_synthetics_fields_in_finish_event_payload
636
+ keys = []
637
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
638
+ keys = payload.keys
639
+ end
640
+
641
+ in_transaction do |txn|
642
+ txn.raw_synthetics_header = "something"
643
+ txn.synthetics_payload = [1, 1, 100, 200, 300]
644
+ end
645
+
646
+ assert_includes keys, :synthetics_resource_id
647
+ assert_includes keys, :synthetics_job_id
648
+ assert_includes keys, :synthetics_monitor_id
649
+ end
650
+
651
+ def test_synthetics_fields_not_in_finish_event_payload_if_no_cross_app_calls
652
+ keys = []
653
+ Mmtrix::Agent.subscribe(:transaction_finished) do |payload|
654
+ keys = payload.keys
655
+ end
656
+
657
+ in_transaction do |txn|
658
+ # Make totally sure we're not synthetic
659
+ txn.raw_synthetics_header = nil
660
+ end
661
+
662
+ refute_includes keys, :synthetics_resource_id
663
+ refute_includes keys, :synthetics_job_id
664
+ refute_includes keys, :synthetics_monitor_id
665
+ end
666
+
667
+ def test_logs_warning_if_a_non_hash_arg_is_passed_to_add_custom_attributes
668
+ expects_logging(:warn, includes("add_custom_attributes"))
669
+ in_transaction do
670
+ Mmtrix::Agent.add_custom_attributes('fooz')
671
+ end
672
+ end
673
+
674
+ def test_ignores_custom_attributes_when_in_high_security
675
+ with_config(:high_security => true) do
676
+ in_transaction do |txn|
677
+ Mmtrix::Agent.add_custom_attributes(:failure => "is an option")
678
+ assert_empty attributes_for(txn, :custom)
679
+ end
680
+ end
681
+ end
682
+
683
+ def test_user_attributes_alias_to_custom_parameters
684
+ in_transaction('user_attributes') do |txn|
685
+ txn.set_user_attributes(:set_instance => :set_instance)
686
+ assert_has_custom_attribute(txn, "set_instance")
687
+ end
688
+ end
689
+
690
+ def test_notice_error_in_current_transaction_saves_it_for_finishing
691
+ in_transaction('failing') do |txn|
692
+ Mmtrix::Agent::Transaction.notice_error("")
693
+ assert_equal 1, txn.exceptions.count
694
+ end
695
+ end
696
+
697
+ def test_notice_error_in_transaction_sends_attributes_along
698
+ txn = in_transaction('oops') do
699
+ Mmtrix::Agent::Transaction.notice_error("wat?")
700
+ end
701
+
702
+ error = Mmtrix::Agent.instance.error_collector.errors.first
703
+ assert_equal txn.attributes, error.attributes
704
+ end
705
+
706
+ def test_notice_error_after_current_transaction_notifies_error_collector
707
+ in_transaction('failing') do
708
+ # no-op
709
+ end
710
+ Mmtrix::Agent::Transaction.notice_error("")
711
+ assert_equal 1, Mmtrix::Agent.instance.error_collector.errors.count
712
+ end
713
+
714
+ def test_notice_error_without_transaction_notifies_error_collector
715
+ cleanup_transaction
716
+ Mmtrix::Agent::Transaction.notice_error("")
717
+ assert_equal 1, Mmtrix::Agent.instance.error_collector.errors.count
718
+ end
719
+
720
+ def test_notice_error_sends_uri_and_referer_from_request
721
+ request = stub(:path => "/here")
722
+ in_transaction(:request => request) do |txn|
723
+ Mmtrix::Agent::Transaction.notice_error("wat")
724
+ end
725
+
726
+ assert_equal 1, Mmtrix::Agent.instance.error_collector.errors.count
727
+ error = Mmtrix::Agent.instance.error_collector.errors.first
728
+ assert_equal "/here", error.request_uri
729
+ end
730
+
731
+ def test_records_gc_time
732
+ gc_start = mock('gc start')
733
+ gc_end = mock('gc end')
734
+ Mmtrix::Agent::StatsEngine::GCProfiler.stubs(:take_snapshot).returns(gc_start, gc_end)
735
+
736
+ txn = in_transaction do |transaction|
737
+ Mmtrix::Agent::StatsEngine::GCProfiler.expects(:record_delta).with(gc_start, gc_end).returns(42)
738
+ transaction
739
+ end
740
+
741
+ trace = txn.transaction_trace
742
+ assert_equal(42, attributes_for(trace, :intrinsic)[:gc_time])
743
+ end
744
+
745
+ def test_freeze_name_and_execute_if_not_ignored_executes_given_block_if_not_ignored
746
+ Mmtrix::Agent.instance.transaction_rules.expects(:rename).
747
+ returns('non-ignored-transaction')
748
+ in_transaction('non-ignored-transaction') do |txn|
749
+ block_was_called = false
750
+ txn.freeze_name_and_execute_if_not_ignored do
751
+ block_was_called = true
752
+ end
753
+
754
+ assert block_was_called
755
+ end
756
+ end
757
+
758
+ def test_freeze_name_and_execute_if_not_ignored_ignores_given_block_if_transaction_ignored
759
+ Mmtrix::Agent.instance.transaction_rules.expects(:rename).
760
+ returns(nil)
761
+ in_transaction('ignored-transaction') do |txn|
762
+ block_was_called = false
763
+ txn.freeze_name_and_execute_if_not_ignored do
764
+ block_was_called = true
765
+ end
766
+
767
+ refute block_was_called
768
+ end
769
+ end
770
+
771
+ def test_normal_cpu_burn_positive
772
+ in_transaction do |txn|
773
+ txn.instance_variable_set(:@process_cpu_start, 3)
774
+ txn.stubs(:process_cpu).returns(4)
775
+ assert_equal 1, txn.normal_cpu_burn
776
+ end
777
+ end
778
+
779
+ def test_normal_cpu_burn_negative
780
+ in_transaction do |txn|
781
+ txn.instance_variable_set(:@process_cpu_start, nil)
782
+ txn.expects(:process_cpu).never
783
+ assert_equal nil, txn.normal_cpu_burn
784
+ end
785
+ end
786
+
787
+ def test_jruby_cpu_burn_negative
788
+ in_transaction do |txn|
789
+ txn.instance_variable_set(:@jruby_cpu_start, nil)
790
+ txn.expects(:jruby_cpu_time).never
791
+ assert_equal nil, txn.jruby_cpu_burn
792
+ end
793
+ end
794
+
795
+ module ::Java
796
+ module JavaLangManagement
797
+ class ManagementFactory
798
+ end
799
+ end
800
+ end
801
+
802
+ def test_jruby_cpu_time_returns_0_for_neg1_java_utime
803
+ in_transaction do |txn|
804
+ with_java_classes_loaded do
805
+ bean = mock(:getCurrentThreadUserTime => -1)
806
+ bean.stubs(:isCurrentThreadCpuTimeSupported).returns(true)
807
+ ::Java::JavaLangManagement::ManagementFactory.stubs(:getThreadMXBean).returns(bean)
808
+ assert_equal 0.0, txn.send(:jruby_cpu_time)
809
+ end
810
+ end
811
+ end
812
+
813
+ def test_jruby_cpu_time_returns_java_utime_over_1e9_if_java_utime_is_1
814
+ java_utime = 1
815
+ in_transaction do |txn|
816
+ with_java_classes_loaded do
817
+ bean = stub(:getCurrentThreadUserTime => java_utime)
818
+ bean.stubs(:isCurrentThreadCpuTimeSupported).returns(true)
819
+ ::Java::JavaLangManagement::ManagementFactory.stubs(:getThreadMXBean).returns(bean)
820
+ assert_equal java_utime/1e9, txn.send(:jruby_cpu_time)
821
+ end
822
+ end
823
+ end
824
+
825
+ def test_jruby_cpu_time_logs_errors_once_at_warn
826
+ in_transaction do |txn|
827
+ with_java_classes_loaded do
828
+ bean = mock
829
+ bean.stubs(:isCurrentThreadCpuTimeSupported).returns(true)
830
+ bean.stubs(:getCurrentThreadUserTime).raises(StandardError, 'Error calculating JRuby CPU Time')
831
+ ::Java::JavaLangManagement::ManagementFactory.stubs(:getThreadMXBean).returns(bean)
832
+
833
+ expects_logging(:warn, includes("Error calculating JRuby CPU Time"), any_parameters)
834
+ txn.send(:jruby_cpu_time)
835
+ expects_no_logging(:warn)
836
+ txn.send(:jruby_cpu_time)
837
+ end
838
+ end
839
+ end
840
+
841
+ def test_jruby_cpu_time_always_logs_errors_at_debug
842
+ in_transaction do |txn|
843
+ with_java_classes_loaded do
844
+ bean = mock
845
+ bean.stubs(:isCurrentThreadCpuTimeSupported).returns(true)
846
+ bean.stubs(:getCurrentThreadUserTime).raises(StandardError, 'Error calculating JRuby CPU Time')
847
+ ::Java::JavaLangManagement::ManagementFactory.stubs(:getThreadMXBean).returns(bean)
848
+
849
+ expects_logging(:warn, includes("Error calculating JRuby CPU Time"), any_parameters)
850
+ txn.send(:jruby_cpu_time)
851
+ expects_logging(:debug, includes("Error calculating JRuby CPU Time"), any_parameters)
852
+ txn.send(:jruby_cpu_time)
853
+ end
854
+ end
855
+ end
856
+
857
+ def test_jruby_cpu_time_returns_nil_if_current_thread_user_time_raises
858
+ in_transaction do |txn|
859
+ with_java_classes_loaded do
860
+ bean = mock
861
+ bean.stubs(:isCurrentThreadCpuTimeSupported).returns(true)
862
+ bean.stubs(:getCurrentThreadUserTime).raises(StandardError, 'Error calculating JRuby CPU Time')
863
+ ::Java::JavaLangManagement::ManagementFactory.stubs(:getThreadMXBean).returns(bean)
864
+
865
+ assert_nil txn.send(:jruby_cpu_time)
866
+ end
867
+ end
868
+ end
869
+
870
+ def test_jruby_cpu_time_does_not_call_get_current_thread_user_time_if_unsupported
871
+ in_transaction do |txn|
872
+ with_java_classes_loaded do
873
+ bean = mock
874
+ bean.stubs(:isCurrentThreadCpuTimeSupported).returns(false)
875
+ ::Java::JavaLangManagement::ManagementFactory.stubs(:getThreadMXBean).returns(bean)
876
+ bean.expects(:getCurrentThreadUserTime).never
877
+
878
+ assert_nil txn.send(:jruby_cpu_time)
879
+ end
880
+ end
881
+ end
882
+
883
+ def with_java_classes_loaded
884
+ # class_variable_set is private on 1.8.7 :(
885
+ ::Mmtrix::Agent::Transaction.send(:class_variable_set, :@@java_classes_loaded, true)
886
+ yield
887
+ ensure
888
+ ::Mmtrix::Agent::Transaction.send(:class_variable_set, :@@java_classes_loaded, false)
889
+ end
890
+
891
+ def test_cpu_burn_normal
892
+ in_transaction do |txn|
893
+ txn.stubs(:normal_cpu_burn).returns(1)
894
+ txn.expects(:jruby_cpu_burn).never
895
+ assert_equal 1, txn.cpu_burn
896
+ end
897
+ end
898
+
899
+ def test_cpu_burn_jruby
900
+ in_transaction do |txn|
901
+ txn.stubs(:normal_cpu_burn).returns(nil)
902
+ txn.stubs(:jruby_cpu_burn).returns(2)
903
+ assert_equal 2, txn.cpu_burn
904
+ end
905
+ end
906
+
907
+ def test_transaction_takes_child_name_if_similar_category
908
+ in_transaction('Controller/parent', :category => :sinatra) do
909
+ in_transaction('Controller/child', :category => :controller) do
910
+ end
911
+ end
912
+
913
+ assert_metrics_recorded(['Controller/child'])
914
+ end
915
+
916
+ def test_transaction_doesnt_take_child_name_if_different_category
917
+ in_transaction('Controller/parent', :category => :sinatra) do
918
+ in_transaction('Whatever/child', :category => :task) do
919
+ end
920
+ end
921
+
922
+ assert_metrics_recorded(['Controller/parent'])
923
+ end
924
+
925
+ def test_transaction_should_take_child_name_if_frozen_early
926
+ in_transaction('Controller/parent', :category => :sinatra) do
927
+ in_transaction('Controller/child', :category => :controller) do |txn|
928
+ txn.freeze_name_and_execute_if_not_ignored
929
+ end
930
+ end
931
+
932
+ assert_metrics_recorded(['Controller/child'])
933
+ end
934
+
935
+ def test_ignored_returns_false_if_a_transaction_is_not_ignored
936
+ in_transaction('Controller/test', :category => :sinatra) do |txn|
937
+ refute txn.ignore?
938
+ end
939
+ end
940
+
941
+ def test_ignored_returns_true_for_an_ignored_transaction
942
+ in_transaction('Controller/test', :category => :sinatra) do |txn|
943
+ txn.ignore!
944
+ assert txn.ignore?
945
+ end
946
+ end
947
+
948
+ def test_ignore_apdex_returns_true_if_apdex_is_ignored
949
+ in_transaction('Controller/test', :category => :sinatra) do |txn|
950
+ txn.ignore_apdex!
951
+ assert txn.ignore_apdex?
952
+ end
953
+ end
954
+
955
+ def test_ignore_apdex_returns_false_if_apdex_is_not_ignored
956
+ in_transaction('Controller/test', :category => :sinatra) do |txn|
957
+ refute txn.ignore_apdex?
958
+ end
959
+ end
960
+
961
+ def test_ignore_enduser_returns_true_if_enduser_is_ignored
962
+ in_transaction('Controller/test', :category => :sinatra) do |txn|
963
+ txn.ignore_enduser!
964
+ assert txn.ignore_enduser?
965
+ end
966
+ end
967
+
968
+ def test_ignore_enduser_returns_false_if_enduser_is_not_ignored
969
+ in_transaction('Controller/test', :category => :sinatra) do |txn|
970
+ refute txn.ignore_enduser?
971
+ end
972
+ end
973
+
974
+ def test_ignored_transactions_do_not_record_metrics
975
+ in_transaction('Controller/test', :category => :sinatra) do |txn|
976
+ txn.ignore!
977
+ end
978
+
979
+ assert_metrics_not_recorded(['Controller/test'])
980
+ end
981
+
982
+ def test_nested_transactions_are_ignored_if_nested_transaction_is_ignored
983
+ in_transaction('Controller/parent', :category => :sinatra) do
984
+ in_transaction('Controller/child', :category => :controller) do |txn|
985
+ txn.ignore!
986
+ end
987
+ end
988
+
989
+ assert_metrics_not_recorded(['Controller/sinatra', 'Controller/child'])
990
+ end
991
+
992
+ def test_nested_transactions_are_ignored_if_double_nested_transaction_is_ignored
993
+ in_transaction('Controller/parent', :category => :sinatra) do
994
+ in_transaction('Controller/toddler', :category => :controller) do
995
+ in_transaction('Controller/infant', :category => :controller) do |txn|
996
+ txn.ignore!
997
+ end
998
+ end
999
+ end
1000
+
1001
+ assert_metrics_not_recorded(['Controller/sinatra', 'Controller/toddler', 'Controller/infant'])
1002
+ end
1003
+
1004
+ def test_nested_other_transaction
1005
+ in_transaction('OtherTransaction/outer', :category => :task) do
1006
+ in_transaction('OtherTransaction/inner', :category => :task) do
1007
+ end
1008
+ end
1009
+
1010
+ assert_metrics_recorded(['OtherTransaction/inner'])
1011
+ assert_metrics_not_recorded(['OtherTransaction/outer'])
1012
+ end
1013
+
1014
+ def test_failure_during_ignore_error_filter_doesnt_prevent_transaction
1015
+ filter = Proc.new do |*_|
1016
+ raise "HAHAHAHAH, error in the filter for ignoring errors!"
1017
+ end
1018
+
1019
+ with_ignore_error_filter(filter) do
1020
+ expects_logging(:error, includes("HAHAHAHAH"), any_parameters)
1021
+
1022
+ in_transaction("Controller/boom") do
1023
+ Mmtrix::Agent::Transaction.notice_error(SillyError.new)
1024
+ end
1025
+
1026
+ assert_metrics_recorded('Controller/boom')
1027
+ end
1028
+ end
1029
+
1030
+ def test_multiple_similar_errors_in_transaction_do_not_crash
1031
+ error_class = Class.new(StandardError) do
1032
+ def ==(other)
1033
+ self.message == other.message
1034
+ end
1035
+ end
1036
+
1037
+ in_transaction do |txn|
1038
+ e0 = error_class.new('err')
1039
+ e1 = error_class.new('err')
1040
+ assert_equal(e0, e1)
1041
+ txn.notice_error(e0)
1042
+ txn.notice_error(e1)
1043
+ end
1044
+
1045
+ assert_metrics_recorded('Errors/all' => { :call_count => 2 })
1046
+ end
1047
+
1048
+ def test_start_safe_from_exceptions
1049
+ Mmtrix::Agent::Transaction.any_instance.stubs(:start).raises("Haha")
1050
+ expects_logging(:error, any_parameters)
1051
+
1052
+ in_transaction("Controller/boom") do
1053
+ # nope
1054
+ end
1055
+
1056
+ # We expect our transaction to fail, but no exception should surface
1057
+ assert_metrics_not_recorded(['Controller/boom'])
1058
+ end
1059
+
1060
+ def test_stop_safe_from_exceptions
1061
+ Mmtrix::Agent::Transaction.any_instance.stubs(:stop).raises("Haha")
1062
+ expects_logging(:error, any_parameters)
1063
+
1064
+ in_transaction("Controller/boom") do
1065
+ # nope
1066
+ end
1067
+
1068
+ # We expect our transaction to fail, but no exception should surface
1069
+ assert_metrics_not_recorded(['Controller/boom'])
1070
+ end
1071
+
1072
+ def test_stop_safe_when_no_transaction_available
1073
+ expects_logging(:error, includes(Mmtrix::Agent::Transaction::FAILED_TO_STOP_MESSAGE))
1074
+
1075
+ state = Mmtrix::Agent::TransactionState.new
1076
+ Mmtrix::Agent::Transaction.stop(state)
1077
+ end
1078
+
1079
+ def test_user_defined_rules_ignore_returns_true_for_matched_path
1080
+ rule = 'ignored'
1081
+ with_config(:rules => { :ignore_url_regexes => [rule] }) do
1082
+ in_transaction do |txn|
1083
+ txn.stubs(:request_path).returns(rule + '/path')
1084
+ assert txn.user_defined_rules_ignore?, "Paths should be ignored based on user defined rules. Rule: '#{rule}', Path: '#{txn.request_path}'."
1085
+ end
1086
+ end
1087
+ end
1088
+
1089
+ def test_stop_ignores_transactions_from_ignored_paths
1090
+ with_config(:rules => { :ignore_url_regexes => ['ignored/path'] }) do
1091
+ in_transaction do |txn|
1092
+ txn.stubs(:request_path).returns('ignored/path')
1093
+ txn.expects(:ignore!)
1094
+ end
1095
+ end
1096
+ end
1097
+
1098
+ def test_user_defined_rules_ignore_returns_false_if_cannot_parse_uri
1099
+ with_config(:rules => { :ignore_url_regexes => ['notempty'] }) do
1100
+ in_transaction do |txn|
1101
+ txn.stubs(:uri).returns('http://foo bar.com')
1102
+ refute txn.user_defined_rules_ignore?
1103
+ end
1104
+ end
1105
+ end
1106
+
1107
+ def test_stop_resets_the_transaction_state_if_there_is_an_error
1108
+ in_transaction do |txn|
1109
+ state = mock
1110
+ state.stubs(:current_transaction).raises(StandardError, 'StandardError')
1111
+
1112
+ state.expects(:reset)
1113
+ Mmtrix::Agent::Transaction.stop(state)
1114
+ end
1115
+ end
1116
+
1117
+ def test_doesnt_record_queue_time_if_it_is_zero
1118
+ in_transaction('boo') do
1119
+ # nothing
1120
+ end
1121
+ assert_metrics_not_recorded(['WebFrontend/QueueTime'])
1122
+ end
1123
+
1124
+ def test_doesnt_record_scoped_queue_time_metric
1125
+ t0 = freeze_time
1126
+ advance_time 10.0
1127
+ in_transaction('boo', :apdex_start_time => t0) do
1128
+ # nothing
1129
+ end
1130
+ assert_metrics_recorded('WebFrontend/QueueTime' => { :call_count => 1, :total_call_time => 10.0 })
1131
+ assert_metrics_not_recorded(
1132
+ [['WebFrontend/QueueTime', 'boo']]
1133
+ )
1134
+ end
1135
+
1136
+ def test_doesnt_record_crazy_high_queue_times
1137
+ t0 = freeze_time(Time.at(10.0))
1138
+ advance_time(40 * 365 * 24 * 60 * 60) # 40 years
1139
+ in_transaction('boo', :apdex_start_time => t0) do
1140
+ # nothing
1141
+ end
1142
+ assert_metrics_not_recorded(['WebFrontend/QueueTime'])
1143
+ end
1144
+
1145
+ def test_background_transactions_with_ignore_rules_are_ok
1146
+ with_config(:'rules.ignore_url_regexes' => ['foobar']) do
1147
+ in_transaction('foo') do
1148
+ end
1149
+ end
1150
+
1151
+ assert_metrics_recorded(['foo'])
1152
+ end
1153
+
1154
+ def test_transaction_start_sets_default_name_for_transactions_with_matching_categories
1155
+ in_transaction('outside_cascade') do
1156
+ in_transaction('inside_cascade') do |txn|
1157
+ assert_equal 'inside_cascade', txn.best_name
1158
+ end
1159
+ end
1160
+ end
1161
+
1162
+ def test_similar_category?
1163
+ web_category1 = Mmtrix::Agent::Transaction::WEB_TRANSACTION_CATEGORIES.first
1164
+ web_category2 = Mmtrix::Agent::Transaction::WEB_TRANSACTION_CATEGORIES.last
1165
+
1166
+ in_transaction('test', :category => web_category1) do |txn|
1167
+ assert txn.similar_category?(web_category2)
1168
+ end
1169
+ end
1170
+
1171
+ def test_similar_category_returns_false_with_mismatched_categories
1172
+ web_category = Mmtrix::Agent::Transaction::WEB_TRANSACTION_CATEGORIES.first
1173
+
1174
+ in_transaction('test', :category => web_category) do |txn|
1175
+ frame = stub(:category => :other)
1176
+ refute txn.similar_category?(frame)
1177
+ end
1178
+ end
1179
+
1180
+ def test_similar_category_returns_true_with_nonweb_categories
1181
+ in_transaction('test', :category => :other) do |txn|
1182
+ frame = stub(:category => :other)
1183
+ assert txn.similar_category?(frame)
1184
+ end
1185
+ end
1186
+
1187
+ def test_set_overriding_transaction_name_sets_name_from_api
1188
+ in_transaction('test') do |txn|
1189
+ txn.class.set_overriding_transaction_name('name_from_api', 'category')
1190
+
1191
+ assert_equal 'category/name_from_api', txn.best_name
1192
+ end
1193
+ end
1194
+
1195
+ def assert_has_custom_attribute(txn, key, value = key)
1196
+ assert_equal(value, attributes_for(txn, :custom)[key])
1197
+ end
1198
+
1199
+ def test_wrap_transaction
1200
+ state = Mmtrix::Agent::TransactionState.tl_get
1201
+ Mmtrix::Agent::Transaction.wrap(state, 'test', :other) do
1202
+ # No-op
1203
+ end
1204
+
1205
+ assert_metrics_recorded(['test'])
1206
+ end
1207
+
1208
+ def test_wrap_transaction_with_early_failure
1209
+ yielded = false
1210
+ state = Mmtrix::Agent::TransactionState.tl_get
1211
+ Mmtrix::Agent::Transaction.any_instance.stubs(:start).raises("Boom")
1212
+ Mmtrix::Agent::Transaction.wrap(state, 'test', :other) do
1213
+ yielded = true
1214
+ end
1215
+
1216
+ assert yielded
1217
+ end
1218
+
1219
+ def test_wrap_transaction_with_late_failure
1220
+ state = Mmtrix::Agent::TransactionState.tl_get
1221
+ Mmtrix::Agent::Transaction.any_instance.stubs(:stop).raises("Boom")
1222
+ Mmtrix::Agent::Transaction.wrap(state, 'test', :other) do
1223
+ # No-op
1224
+ end
1225
+
1226
+ refute_metrics_recorded(['test'])
1227
+ end
1228
+
1229
+ def test_wrap_transaction_notices_errors
1230
+ state = Mmtrix::Agent::TransactionState.tl_get
1231
+ assert_raises RuntimeError do
1232
+ Mmtrix::Agent::Transaction.wrap(state, 'test', :other) do
1233
+ raise "O_o"
1234
+ end
1235
+ end
1236
+
1237
+ assert_metrics_recorded(["Errors/all"])
1238
+ end
1239
+
1240
+ def test_instrumentation_state
1241
+ in_transaction do |txn|
1242
+ txn.instrumentation_state[:a] = 42
1243
+ assert_equal(42, txn.instrumentation_state[:a])
1244
+ end
1245
+ end
1246
+
1247
+ def test_adding_custom_attributes
1248
+ with_config(:'transaction_tracer.attributes.enabled' => true) do
1249
+ in_transaction do |txn|
1250
+ Mmtrix::Agent.add_custom_attributes(:foo => "bar")
1251
+ actual = txn.attributes.custom_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1252
+ assert_equal({"foo" => "bar"}, actual)
1253
+ end
1254
+ end
1255
+ end
1256
+
1257
+ def test_adding_agent_attributes
1258
+ with_config(:'transaction_tracer.attributes.enabled' => true) do
1259
+ in_transaction do |txn|
1260
+ txn.add_agent_attribute(:foo, "bar", Mmtrix::Agent::AttributeFilter::DST_ALL)
1261
+ actual = txn.attributes.agent_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1262
+ assert_equal({:foo => "bar"}, actual)
1263
+ end
1264
+ end
1265
+ end
1266
+
1267
+ def test_adding_agent_attributes_via_class
1268
+ with_config(:'transaction_tracer.attributes.enabled' => true) do
1269
+ in_transaction do |txn|
1270
+ Mmtrix::Agent::Transaction.add_agent_attribute(:foo, "bar", Mmtrix::Agent::AttributeFilter::DST_ALL)
1271
+ actual = txn.attributes.agent_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1272
+ assert_equal({:foo => "bar"}, actual)
1273
+ end
1274
+ end
1275
+ end
1276
+
1277
+ def test_adding_agent_attributes_via_class_outside_of_txn_is_safe
1278
+ expects_logging(:debug, includes("foo"))
1279
+ Mmtrix::Agent::Transaction.add_agent_attribute(:foo, "bar", Mmtrix::Agent::AttributeFilter::DST_ALL)
1280
+ end
1281
+
1282
+ def test_adding_intrinsic_attributes
1283
+ in_transaction do |txn|
1284
+ txn.attributes.add_intrinsic_attribute(:foo, "bar")
1285
+
1286
+ actual = txn.attributes.intrinsic_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1287
+ assert_equal({:foo => "bar"}, actual)
1288
+ end
1289
+ end
1290
+
1291
+ def test_assigns_synthetics_to_intrinsic_attributes
1292
+ txn = in_transaction do |txn|
1293
+ txn.raw_synthetics_header = ""
1294
+ txn.synthetics_payload = [1, 1, 100, 200, 300]
1295
+ txn
1296
+ end
1297
+
1298
+ result = txn.attributes.intrinsic_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1299
+ assert_equal 100, result[:synthetics_resource_id]
1300
+ assert_equal 200, result[:synthetics_job_id]
1301
+ assert_equal 300, result[:synthetics_monitor_id]
1302
+ end
1303
+
1304
+
1305
+ def test_intrinsic_attributes_include_gc_time
1306
+ txn = in_transaction do |txn|
1307
+ Mmtrix::Agent::StatsEngine::GCProfiler.stubs(:record_delta).returns(10.0)
1308
+ end
1309
+
1310
+ result = txn.attributes.intrinsic_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1311
+ assert_equal 10.0, result[:gc_time]
1312
+ end
1313
+
1314
+ def test_intrinsic_attributes_include_tripid
1315
+ guid = nil
1316
+
1317
+ Mmtrix::Agent.instance.cross_app_monitor.stubs(:client_referring_transaction_trip_id).returns('PDX-NRT')
1318
+
1319
+ txn = in_transaction do |txn|
1320
+ Mmtrix::Agent::TransactionState.tl_get.is_cross_app_caller = true
1321
+ guid = txn.guid
1322
+ end
1323
+
1324
+ result = txn.attributes.intrinsic_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1325
+ assert_equal 'PDX-NRT', result[:trip_id]
1326
+ end
1327
+
1328
+ def test_intrinsic_attributes_dont_include_tripid_if_not_cross_app_transaction
1329
+ Mmtrix::Agent.instance.cross_app_monitor.stubs(:client_referring_transaction_trip_id).returns('PDX-NRT')
1330
+
1331
+ txn = in_transaction do
1332
+ Mmtrix::Agent::TransactionState.tl_get.is_cross_app_caller = false
1333
+ end
1334
+
1335
+ result = txn.attributes.intrinsic_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1336
+ assert_nil result[:trip_id]
1337
+ end
1338
+
1339
+ def test_intrinsic_attributes_include_path_hash
1340
+ path_hash = nil
1341
+
1342
+ txn = in_transaction do |txn|
1343
+ state = Mmtrix::Agent::TransactionState.tl_get
1344
+ state.is_cross_app_caller = true
1345
+ path_hash = txn.cat_path_hash(state)
1346
+ end
1347
+
1348
+ result = txn.attributes.intrinsic_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1349
+ assert_equal path_hash, result[:path_hash]
1350
+ end
1351
+
1352
+ def test_synthetics_attributes_not_included_if_not_valid_synthetics_request
1353
+ txn = in_transaction do |txn|
1354
+ txn.raw_synthetics_header = nil
1355
+ txn.synthetics_payload = nil
1356
+ end
1357
+
1358
+ result = txn.attributes.intrinsic_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1359
+ assert_nil result[:synthetics_resource_id]
1360
+ assert_nil result[:synthetics_job_id]
1361
+ assert_nil result[:synthetics_monitor_id]
1362
+ end
1363
+
1364
+ def test_intrinsic_attributes_include_cpu_time
1365
+ txn = in_transaction do |txn|
1366
+ txn.stubs(:cpu_burn).returns(22.0)
1367
+ end
1368
+
1369
+ result = txn.attributes.intrinsic_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1370
+ assert_equal 22.0, result[:cpu_time]
1371
+ end
1372
+
1373
+ def test_request_params_included_in_agent_attributes
1374
+ txn = with_config(:capture_params => true) do
1375
+ in_transaction(:filtered_params => {:foo => "bar"}) do
1376
+ end
1377
+ end
1378
+
1379
+ actual = txn.attributes.agent_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1380
+ assert_equal "bar", actual['request.parameters.foo']
1381
+ end
1382
+
1383
+ def test_request_params_included_in_agent_attributes_in_nested_txn
1384
+ txn = with_config(:capture_params => true) do
1385
+ in_transaction(:filtered_params => {:foo => "bar", :bar => "baz"}) do
1386
+ in_transaction(:filtered_params => {:bar => "qux"}) do
1387
+ end
1388
+ end
1389
+ end
1390
+
1391
+ actual = txn.attributes.agent_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1392
+ assert_equal "bar", actual['request.parameters.foo']
1393
+ assert_equal "qux", actual['request.parameters.bar']
1394
+ end
1395
+
1396
+ def test_request_params_get_key_length_limits
1397
+ key = "x" * 1000
1398
+ expects_logging(:debug, includes(key))
1399
+
1400
+ txn = with_config(:capture_params => true) do
1401
+ in_transaction(:filtered_params => {key => "bar"}) do
1402
+ end
1403
+ end
1404
+
1405
+ actual = txn.attributes.agent_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1406
+ assert_empty actual
1407
+ end
1408
+
1409
+ def test_http_response_code_included_in_agent_attributes
1410
+ txn = in_transaction do |txn|
1411
+ txn.http_response_code = 418
1412
+ end
1413
+
1414
+ actual = txn.attributes.agent_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1415
+ assert_equal "418", actual[:"httpResponseCode"]
1416
+ end
1417
+
1418
+ def test_referer_in_agent_attributes
1419
+ request = stub('request', :referer => "/referered", :path => "/")
1420
+ txn = in_transaction(:request => request) do |txn|
1421
+ end
1422
+
1423
+ actual = txn.attributes.agent_attributes_for(Mmtrix::Agent::AttributeFilter::DST_ERROR_COLLECTOR)
1424
+ assert_equal "/referered", actual[:'request.headers.referer']
1425
+ end
1426
+
1427
+ def test_referer_omitted_if_not_on_request
1428
+ request = stub('request', :path => "/")
1429
+ txn = in_transaction(:request => request) do |txn|
1430
+ end
1431
+
1432
+ actual = txn.attributes.agent_attributes_for(Mmtrix::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
1433
+ refute_includes actual, :'request.headers.referer'
1434
+ end
1435
+ end