oneapm_rpm 1.1.0

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 (234) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +30 -0
  3. data/.rubocop.yml +725 -0
  4. data/Gemfile +3 -0
  5. data/Guardfile +7 -0
  6. data/LICENSE +1 -0
  7. data/README.md +3 -0
  8. data/config/cert/cacert.pem +1177 -0
  9. data/config/database.yml +5 -0
  10. data/lib/initializers/goliath.rb +11 -0
  11. data/lib/initializers/other.rb +1 -0
  12. data/lib/initializers/rails.rb +15 -0
  13. data/lib/one_apm/agent.rb +253 -0
  14. data/lib/one_apm/agent/agent.rb +283 -0
  15. data/lib/one_apm/agent/agent/connect.rb +175 -0
  16. data/lib/one_apm/agent/agent/container_data_manager.rb +218 -0
  17. data/lib/one_apm/agent/agent/forkable_dispatcher_functions.rb +96 -0
  18. data/lib/one_apm/agent/agent/helpers.rb +45 -0
  19. data/lib/one_apm/agent/agent/start.rb +226 -0
  20. data/lib/one_apm/agent/agent/start_worker_thread.rb +148 -0
  21. data/lib/one_apm/agent/busy_calculator.rb +115 -0
  22. data/lib/one_apm/agent/cross_app/cross_app_monitor.rb +181 -0
  23. data/lib/one_apm/agent/cross_app/cross_app_tracing.rb +336 -0
  24. data/lib/one_apm/agent/database.rb +308 -0
  25. data/lib/one_apm/agent/database/active_record_helper.rb +80 -0
  26. data/lib/one_apm/agent/database/obfuscation_helpers.rb +76 -0
  27. data/lib/one_apm/agent/database/obfuscator.rb +78 -0
  28. data/lib/one_apm/agent/database/postgres_explain_obfuscator.rb +45 -0
  29. data/lib/one_apm/agent/datastores.rb +175 -0
  30. data/lib/one_apm/agent/datastores/metric_helper.rb +83 -0
  31. data/lib/one_apm/agent/datastores/mongo.rb +27 -0
  32. data/lib/one_apm/agent/datastores/mongo/metric_translator.rb +189 -0
  33. data/lib/one_apm/agent/datastores/mongo/obfuscator.rb +37 -0
  34. data/lib/one_apm/agent/datastores/mongo/statement_formatter.rb +51 -0
  35. data/lib/one_apm/agent/event/event_listener.rb +40 -0
  36. data/lib/one_apm/agent/event/event_loop.rb +191 -0
  37. data/lib/one_apm/agent/event/worker_loop.rb +97 -0
  38. data/lib/one_apm/agent/harvester.rb +48 -0
  39. data/lib/one_apm/agent/inbound_request_monitor.rb +30 -0
  40. data/lib/one_apm/agent/javascript_instrumentor.rb +186 -0
  41. data/lib/one_apm/agent/pipe/pipe_channel_manager.rb +275 -0
  42. data/lib/one_apm/agent/pipe/pipe_service.rb +81 -0
  43. data/lib/one_apm/agent/sampler.rb +55 -0
  44. data/lib/one_apm/agent/sampler_collection.rb +65 -0
  45. data/lib/one_apm/agent/samplers/cpu_sampler.rb +49 -0
  46. data/lib/one_apm/agent/samplers/delayed_job_sampler.rb +109 -0
  47. data/lib/one_apm/agent/samplers/memory_sampler.rb +144 -0
  48. data/lib/one_apm/agent/samplers/object_sampler.rb +22 -0
  49. data/lib/one_apm/agent/samplers/vm_sampler.rb +124 -0
  50. data/lib/one_apm/agent/synthetics_monitor.rb +48 -0
  51. data/lib/one_apm/agent/threading/agent_thread.rb +74 -0
  52. data/lib/one_apm/agent/threading/backtrace_node.rb +133 -0
  53. data/lib/one_apm/agent/threading/backtrace_service.rb +259 -0
  54. data/lib/one_apm/agent/threading/thread_profile.rb +155 -0
  55. data/lib/one_apm/collector/collector/helper.rb +139 -0
  56. data/lib/one_apm/collector/collector/http_connection.rb +254 -0
  57. data/lib/one_apm/collector/collector/server_methods.rb +71 -0
  58. data/lib/one_apm/collector/collector_service.rb +123 -0
  59. data/lib/one_apm/collector/commands/agent_command.rb +17 -0
  60. data/lib/one_apm/collector/commands/thread_profiler_session.rb +108 -0
  61. data/lib/one_apm/collector/commands/xray_session.rb +53 -0
  62. data/lib/one_apm/collector/commands/xray_session_collection.rb +156 -0
  63. data/lib/one_apm/collector/containers/agent_command_router.rb +153 -0
  64. data/lib/one_apm/collector/containers/custom_event_aggregator.rb +94 -0
  65. data/lib/one_apm/collector/containers/error_collector.rb +349 -0
  66. data/lib/one_apm/collector/containers/sql_sampler.rb +331 -0
  67. data/lib/one_apm/collector/containers/stats_engine.rb +34 -0
  68. data/lib/one_apm/collector/containers/transaction_event_aggregator.rb +249 -0
  69. data/lib/one_apm/collector/containers/transaction_sampler.rb +352 -0
  70. data/lib/one_apm/collector/containers/utilization_data.rb +36 -0
  71. data/lib/one_apm/collector/stats_engine/gc_profiler.rb +106 -0
  72. data/lib/one_apm/collector/stats_engine/metric_stats.rb +243 -0
  73. data/lib/one_apm/collector/stats_engine/stats_hash.rb +105 -0
  74. data/lib/one_apm/configuration.rb +429 -0
  75. data/lib/one_apm/configuration/autostart.rb +41 -0
  76. data/lib/one_apm/configuration/default_source.rb +1026 -0
  77. data/lib/one_apm/configuration/environment_source.rb +113 -0
  78. data/lib/one_apm/configuration/high_security_source.rb +56 -0
  79. data/lib/one_apm/configuration/manual_source.rb +13 -0
  80. data/lib/one_apm/configuration/server_source.rb +60 -0
  81. data/lib/one_apm/configuration/yaml_source.rb +134 -0
  82. data/lib/one_apm/errors/agent_errors.rb +26 -0
  83. data/lib/one_apm/errors/internal_agent_error.rb +16 -0
  84. data/lib/one_apm/errors/noticed_error.rb +79 -0
  85. data/lib/one_apm/frameworks/external.rb +15 -0
  86. data/lib/one_apm/frameworks/rails.rb +103 -0
  87. data/lib/one_apm/frameworks/rails3.rb +37 -0
  88. data/lib/one_apm/frameworks/rails4.rb +21 -0
  89. data/lib/one_apm/frameworks/ruby.rb +21 -0
  90. data/lib/one_apm/frameworks/sinatra.rb +12 -0
  91. data/lib/one_apm/inst/3rd/active_merchant.rb +35 -0
  92. data/lib/one_apm/inst/3rd/acts_as_solr.rb +70 -0
  93. data/lib/one_apm/inst/3rd/authlogic.rb +23 -0
  94. data/lib/one_apm/inst/3rd/sunspot.rb +31 -0
  95. data/lib/one_apm/inst/background_job/active_job.rb +88 -0
  96. data/lib/one_apm/inst/background_job/delayed_job.rb +52 -0
  97. data/lib/one_apm/inst/background_job/delayed_job_injection.rb +8 -0
  98. data/lib/one_apm/inst/background_job/resque.rb +107 -0
  99. data/lib/one_apm/inst/background_job/sidekiq.rb +64 -0
  100. data/lib/one_apm/inst/dispatcher/passenger.rb +25 -0
  101. data/lib/one_apm/inst/dispatcher/rainbows.rb +23 -0
  102. data/lib/one_apm/inst/framework/grape.rb +94 -0
  103. data/lib/one_apm/inst/framework/padrino.rb +30 -0
  104. data/lib/one_apm/inst/framework/sinatra.rb +185 -0
  105. data/lib/one_apm/inst/framework/sinatra/ignorer.rb +50 -0
  106. data/lib/one_apm/inst/framework/sinatra/transaction_namer.rb +54 -0
  107. data/lib/one_apm/inst/http_clients/curb.rb +189 -0
  108. data/lib/one_apm/inst/http_clients/excon.rb +70 -0
  109. data/lib/one_apm/inst/http_clients/excon/connection.rb +31 -0
  110. data/lib/one_apm/inst/http_clients/excon/middleware.rb +55 -0
  111. data/lib/one_apm/inst/http_clients/httpclient.rb +44 -0
  112. data/lib/one_apm/inst/http_clients/net.rb +34 -0
  113. data/lib/one_apm/inst/http_clients/typhoeus.rb +76 -0
  114. data/lib/one_apm/inst/nosql/memcache.rb +134 -0
  115. data/lib/one_apm/inst/nosql/mongo.rb +126 -0
  116. data/lib/one_apm/inst/nosql/mongo_moped.rb +85 -0
  117. data/lib/one_apm/inst/nosql/redis.rb +83 -0
  118. data/lib/one_apm/inst/orm/active_record.rb +99 -0
  119. data/lib/one_apm/inst/orm/active_record_4.rb +28 -0
  120. data/lib/one_apm/inst/orm/data_mapper.rb +180 -0
  121. data/lib/one_apm/inst/orm/sequel.rb +47 -0
  122. data/lib/one_apm/inst/rack.rb +38 -0
  123. data/lib/one_apm/inst/rack/rack.rb +44 -0
  124. data/lib/one_apm/inst/rack/rack_builder.rb +51 -0
  125. data/lib/one_apm/inst/rails/action_controller.rb +118 -0
  126. data/lib/one_apm/inst/rails/action_web_service.rb +44 -0
  127. data/lib/one_apm/inst/rails/errors.rb +43 -0
  128. data/lib/one_apm/inst/rails3/action_controller.rb +172 -0
  129. data/lib/one_apm/inst/rails3/errors.rb +43 -0
  130. data/lib/one_apm/inst/rails4/action_controller.rb +27 -0
  131. data/lib/one_apm/inst/rails4/action_controller_subscriber.rb +121 -0
  132. data/lib/one_apm/inst/rails4/action_view.rb +23 -0
  133. data/lib/one_apm/inst/rails4/action_view_subscriber.rb +93 -0
  134. data/lib/one_apm/inst/rails4/active_record_subscriber.rb +96 -0
  135. data/lib/one_apm/inst/rails4/errors.rb +42 -0
  136. data/lib/one_apm/inst/rails_middleware.rb +40 -0
  137. data/lib/one_apm/inst/support/evented_subscriber.rb +98 -0
  138. data/lib/one_apm/inst/support/ignore_actions.rb +39 -0
  139. data/lib/one_apm/inst/support/queue_time.rb +76 -0
  140. data/lib/one_apm/inst/transaction_base.rb +405 -0
  141. data/lib/one_apm/logger/agent_logger.rb +206 -0
  142. data/lib/one_apm/logger/audit_logger.rb +78 -0
  143. data/lib/one_apm/logger/memory_logger.rb +50 -0
  144. data/lib/one_apm/logger/null_logger.rb +19 -0
  145. data/lib/one_apm/metrics/metric_data.rb +72 -0
  146. data/lib/one_apm/metrics/metric_spec.rb +82 -0
  147. data/lib/one_apm/metrics/stats.rb +173 -0
  148. data/lib/one_apm/probe.rb +16 -0
  149. data/lib/one_apm/probe/framework_loader.rb +53 -0
  150. data/lib/one_apm/probe/instance_methods.rb +105 -0
  151. data/lib/one_apm/probe/instrumentation.rb +60 -0
  152. data/lib/one_apm/rack/browser_monitoring.rb +144 -0
  153. data/lib/one_apm/rack/middleware_base.rb +27 -0
  154. data/lib/one_apm/rack/middleware_hooks.rb +17 -0
  155. data/lib/one_apm/rack/middleware_tracing.rb +81 -0
  156. data/lib/one_apm/rack/middleware_wrapper.rb +86 -0
  157. data/lib/one_apm/support/chained_call.rb +15 -0
  158. data/lib/one_apm/support/coerce.rb +81 -0
  159. data/lib/one_apm/support/collection_helper.rb +79 -0
  160. data/lib/one_apm/support/dotted_hash.rb +45 -0
  161. data/lib/one_apm/support/encoders.rb +34 -0
  162. data/lib/one_apm/support/environment_report.rb +127 -0
  163. data/lib/one_apm/support/event_buffer.rb +82 -0
  164. data/lib/one_apm/support/event_buffer/sampled_buffer.rb +45 -0
  165. data/lib/one_apm/support/event_buffer/sized_buffer.rb +21 -0
  166. data/lib/one_apm/support/event_buffer/synthetics_event_buffer.rb +40 -0
  167. data/lib/one_apm/support/helper.rb +49 -0
  168. data/lib/one_apm/support/hostname.rb +13 -0
  169. data/lib/one_apm/support/http_clients/curb_wrappers.rb +65 -0
  170. data/lib/one_apm/support/http_clients/excon_wrappers.rb +63 -0
  171. data/lib/one_apm/support/http_clients/httpclient_wrappers.rb +61 -0
  172. data/lib/one_apm/support/http_clients/net_http_wrappers.rb +48 -0
  173. data/lib/one_apm/support/http_clients/typhoeus_wrappers.rb +73 -0
  174. data/lib/one_apm/support/http_clients/uri_util.rb +39 -0
  175. data/lib/one_apm/support/json_marshaller.rb +68 -0
  176. data/lib/one_apm/support/json_wrapper.rb +130 -0
  177. data/lib/one_apm/support/language_support.rb +142 -0
  178. data/lib/one_apm/support/library_detection.rb +119 -0
  179. data/lib/one_apm/support/local_environment.rb +196 -0
  180. data/lib/one_apm/support/marshaller.rb +62 -0
  181. data/lib/one_apm/support/method_tracer.rb +334 -0
  182. data/lib/one_apm/support/method_tracer/helpers.rb +92 -0
  183. data/lib/one_apm/support/method_tracer/traced_method_stack.rb +103 -0
  184. data/lib/one_apm/support/obfuscator.rb +47 -0
  185. data/lib/one_apm/support/okjson.rb +601 -0
  186. data/lib/one_apm/support/parameter_filtering.rb +35 -0
  187. data/lib/one_apm/support/rules_engine.rb +56 -0
  188. data/lib/one_apm/support/rules_engine/replacement_rule.rb +80 -0
  189. data/lib/one_apm/support/rules_engine/segment_terms_rule.rb +46 -0
  190. data/lib/one_apm/support/server.rb +11 -0
  191. data/lib/one_apm/support/supported_versions.rb +257 -0
  192. data/lib/one_apm/support/system_info.rb +211 -0
  193. data/lib/one_apm/support/timer_lib.rb +29 -0
  194. data/lib/one_apm/support/version_number.rb +51 -0
  195. data/lib/one_apm/support/vm.rb +30 -0
  196. data/lib/one_apm/support/vm/jruby_vm.rb +38 -0
  197. data/lib/one_apm/support/vm/monotonic_gc_profiler.rb +43 -0
  198. data/lib/one_apm/support/vm/mri_vm.rb +85 -0
  199. data/lib/one_apm/support/vm/rubinius_vm.rb +129 -0
  200. data/lib/one_apm/support/vm/snapshot.rb +18 -0
  201. data/lib/one_apm/transaction.rb +336 -0
  202. data/lib/one_apm/transaction/class_methods.rb +132 -0
  203. data/lib/one_apm/transaction/instance_helpers.rb +82 -0
  204. data/lib/one_apm/transaction/metric_constants.rb +42 -0
  205. data/lib/one_apm/transaction/sample_buffer/force_persist_sample_buffer.rb +21 -0
  206. data/lib/one_apm/transaction/sample_buffer/slowest_sample_buffer.rb +21 -0
  207. data/lib/one_apm/transaction/sample_buffer/synthetics_sample_buffer.rb +21 -0
  208. data/lib/one_apm/transaction/sample_buffer/transaction_sample_buffer.rb +101 -0
  209. data/lib/one_apm/transaction/sample_buffer/xray_sample_buffer.rb +60 -0
  210. data/lib/one_apm/transaction/segment.rb +193 -0
  211. data/lib/one_apm/transaction/segment_summary.rb +51 -0
  212. data/lib/one_apm/transaction/thread_local_access.rb +73 -0
  213. data/lib/one_apm/transaction/transaction_analysis.rb +78 -0
  214. data/lib/one_apm/transaction/transaction_apdex.rb +20 -0
  215. data/lib/one_apm/transaction/transaction_cpu.rb +22 -0
  216. data/lib/one_apm/transaction/transaction_finish_append.rb +67 -0
  217. data/lib/one_apm/transaction/transaction_ignore.rb +33 -0
  218. data/lib/one_apm/transaction/transaction_jruby_functions.rb +40 -0
  219. data/lib/one_apm/transaction/transaction_metrics.rb +53 -0
  220. data/lib/one_apm/transaction/transaction_name.rb +90 -0
  221. data/lib/one_apm/transaction/transaction_namer.rb +49 -0
  222. data/lib/one_apm/transaction/transaction_sample.rb +204 -0
  223. data/lib/one_apm/transaction/transaction_sample_builder.rb +168 -0
  224. data/lib/one_apm/transaction/transaction_state.rb +149 -0
  225. data/lib/one_apm/transaction/transaction_summary.rb +28 -0
  226. data/lib/one_apm/transaction/transaction_synthetics.rb +40 -0
  227. data/lib/one_apm/transaction/transaction_timings.rb +54 -0
  228. data/lib/one_apm/version.rb +13 -0
  229. data/lib/oneapm_rpm.rb +16 -0
  230. data/lib/sequel/extensions/oneapm_instrumentation.rb +84 -0
  231. data/lib/sequel/plugins/oneapm_instrumentation.rb +66 -0
  232. data/oneapm.yml +135 -0
  233. data/oneapm_rpm.gemspec +58 -0
  234. metadata +474 -0
@@ -0,0 +1,168 @@
1
+ # encoding: utf-8
2
+
3
+ require 'one_apm/support/collection_helper'
4
+ require 'one_apm/transaction/transaction_sample'
5
+ require 'one_apm/probe'
6
+ require 'one_apm/transaction'
7
+ module OneApm
8
+ # a builder is created with every sampled transaction, to dynamically
9
+ # generate the sampled data. It is a thread-local object, and is not
10
+ # accessed by any other thread so no need for synchronization.
11
+ #
12
+ # @api private
13
+ class TransactionSampleBuilder
14
+
15
+ # Once we hit the TT segment limit, we use this class to hold our place in
16
+ # the tree so that we can still get accurate names and times on the
17
+ # segments we've already created. The placeholder segment keeps a
18
+ # depth counter that's incremented on each segment entry, and decremented
19
+ # on exit, until it reaches zero, when we throw the placeholder away.
20
+ # There should only ever be zero or one placeholder segment at a time.
21
+ #
22
+ # @api private
23
+ class PlaceholderSegment
24
+ attr_reader :parent_segment
25
+ attr_accessor :depth
26
+
27
+ def initialize(parent_segment)
28
+ @parent_segment = parent_segment
29
+ @depth = 1
30
+ end
31
+
32
+ # No-op - some clients expect to be able to use these to read/write
33
+ # params on TT segments.
34
+ def [](key); end
35
+ def []=(key, value); end
36
+
37
+ # Stubbed out in case clients try to touch params directly.
38
+ def params; {}; end
39
+ def params=; end
40
+ end
41
+
42
+ attr_reader :current_segment, :sample
43
+
44
+ include OneApm::CollectionHelper
45
+
46
+ def initialize(time=Time.now)
47
+ @sample = OneApm::TransactionSample.new(time.to_f)
48
+ @sample_start = time.to_f
49
+ @current_segment = @sample.root_segment
50
+ end
51
+
52
+ def sample_id
53
+ @sample.sample_id
54
+ end
55
+
56
+ def ignored?
57
+ @ignore
58
+ end
59
+
60
+ def ignore_transaction
61
+ @ignore = true
62
+ end
63
+
64
+ def segment_limit
65
+ Agent.config[:'transaction_tracer.limit_segments']
66
+ end
67
+
68
+ def trace_entry(time)
69
+ if @sample.count_segments < segment_limit
70
+ segment = @sample.create_segment(time.to_f - @sample_start)
71
+ @current_segment.add_called_segment(segment)
72
+ @current_segment = segment
73
+ if @sample.count_segments == segment_limit()
74
+ ::OneApm::Agent.logger.debug("Segment limit of #{segment_limit} reached, ceasing collection.")
75
+ end
76
+ else
77
+ if @current_segment.is_a?(PlaceholderSegment)
78
+ @current_segment.depth += 1
79
+ else
80
+ @current_segment = PlaceholderSegment.new(@current_segment)
81
+ end
82
+ end
83
+ @current_segment
84
+ end
85
+
86
+ def trace_exit(metric_name, time)
87
+ if @current_segment.is_a?(PlaceholderSegment)
88
+ @current_segment.depth -= 1
89
+ if @current_segment.depth == 0
90
+ @current_segment = @current_segment.parent_segment
91
+ end
92
+ else
93
+ @current_segment.metric_name = metric_name
94
+ @current_segment.end_trace(time.to_f - @sample_start)
95
+ @current_segment = @current_segment.parent_segment
96
+ end
97
+ end
98
+
99
+ def finish_trace(time=Time.now.to_f, custom_params={})
100
+ # Should never get called twice, but in a rare case that we can't
101
+ # reproduce in house it does. log forensics and return gracefully
102
+ if @sample.finished
103
+ ::OneApm::Agent.logger.error "Unexpected double-finish_trace of Transaction Trace Object: \n#{@sample.to_s}"
104
+ return
105
+ end
106
+ @sample.root_segment.end_trace(time.to_f - @sample_start)
107
+ @sample.params[:custom_params] ||= {}
108
+ @sample.params[:custom_params].merge!(normalize_params(custom_params))
109
+
110
+ # If we ever implement saving of TTs based on the record_tt flag on the
111
+ # calling and called applications, we should change this flag's value.
112
+ @sample.force_persist = false
113
+ @sample.threshold = transaction_trace_threshold
114
+ @sample.finished = true
115
+ @current_segment = nil
116
+ end
117
+
118
+ TT_THRESHOLD_KEY = :'transaction_tracer.transaction_threshold'
119
+
120
+ def transaction_trace_threshold #THREAD_LOCAL_ACCESS
121
+ state = TransactionState.tl_get
122
+ source_class = Agent.config.source(TT_THRESHOLD_KEY).class
123
+ if source_class == Configuration::DefaultSource && state.current_transaction
124
+ state.current_transaction.apdex_t * 4
125
+ else
126
+ Agent.config[TT_THRESHOLD_KEY]
127
+ end
128
+ end
129
+
130
+ def scope_depth
131
+ depth = -1 # have to account for the root
132
+ current = @current_segment
133
+
134
+ while(current)
135
+ depth += 1
136
+ current = current.parent_segment
137
+ end
138
+
139
+ depth
140
+ end
141
+
142
+ def set_transaction_uri(uri)
143
+ @sample.params[:uri] ||= uri
144
+ end
145
+
146
+ def set_request_params(params)
147
+ if Agent.config[:capture_params]
148
+ params = normalize_params(params)
149
+ @sample.params[:request_params].merge!(params)
150
+ @sample.params[:request_params].delete :controller
151
+ @sample.params[:request_params].delete :action
152
+ end
153
+ end
154
+
155
+ def set_transaction_name(name)
156
+ @sample.transaction_name = name
157
+ end
158
+
159
+ def set_transaction_cpu_time(cpu_time)
160
+ @sample.set_custom_param(:cpu_time, cpu_time)
161
+ end
162
+
163
+ def sample
164
+ @sample
165
+ end
166
+
167
+ end
168
+ end
@@ -0,0 +1,149 @@
1
+ # encoding: utf-8
2
+
3
+ require 'one_apm/support/method_tracer/traced_method_stack'
4
+
5
+ module OneApm
6
+
7
+ # This is THE location to store thread local information during a transaction
8
+ # Need a new piece of data? Add a method here, NOT a new thread local variable.
9
+ class TransactionState
10
+ def self.tl_get
11
+ tl_state_for(Thread.current)
12
+ end
13
+
14
+ # This method should only be used by TransactionState for access to the
15
+ # current thread's state or to provide read-only accessors for other threads
16
+ #
17
+ # If ever exposed, this requires additional synchronization
18
+ def self.tl_state_for(thread)
19
+ state = thread[:oneapm_transaction_state]
20
+
21
+ if state.nil?
22
+ state = TransactionState.new
23
+ thread[:oneapm_transaction_state] = state
24
+ end
25
+
26
+ state
27
+ end
28
+
29
+ def self.tl_clear_for_testing
30
+ Thread.current[:oneapm_transaction_state] = nil
31
+ end
32
+
33
+ def initialize
34
+ @untraced = []
35
+ @traced_method_stack =OneApm::Support::TracedMethodStack.new
36
+ @current_transaction = nil
37
+ end
38
+
39
+ # This starts the timer for the transaction.
40
+ def reset(transaction=nil)
41
+ # We purposefully don't reset @untraced, @record_tt and @record_sql
42
+ # since those are managed by OneApm::Agent.disable_* calls explicitly
43
+ # and (more importantly) outside the scope of a transaction
44
+
45
+ @timings = nil
46
+ @request = nil
47
+ @current_transaction = transaction
48
+
49
+ @traced_method_stack.clear
50
+
51
+ @is_cross_app_caller = false
52
+ @client_cross_app_id = nil
53
+ @referring_transaction_info = nil
54
+
55
+ @transaction_sample_builder = nil
56
+ @sql_sampler_transaction_data = nil
57
+
58
+ @busy_entries = 0
59
+ end
60
+
61
+ def timings
62
+ @timings ||= TransactionTimings.new(transaction_queue_time, transaction_start_time, transaction_name)
63
+ end
64
+
65
+ # Cross app tracing
66
+ # Because we need values from headers before the transaction actually starts
67
+ attr_accessor :client_cross_app_id, :referring_transaction_info, :is_cross_app_caller
68
+
69
+ def is_cross_app_caller?
70
+ @is_cross_app_caller
71
+ end
72
+
73
+ def is_cross_app_callee?
74
+ referring_transaction_info != nil
75
+ end
76
+
77
+ def is_cross_app?
78
+ is_cross_app_caller? || is_cross_app_callee?
79
+ end
80
+
81
+ # Request data
82
+ attr_accessor :request
83
+
84
+ def request_guid
85
+ return nil unless current_transaction
86
+ current_transaction.guid
87
+ end
88
+
89
+ # Current transaction stack and sample building
90
+ attr_reader :current_transaction
91
+ attr_accessor :transaction_sample_builder
92
+
93
+ def transaction_start_time
94
+ current_transaction.start_time if current_transaction
95
+ end
96
+
97
+ def transaction_queue_time
98
+ current_transaction.nil? ? 0.0 : current_transaction.queue_time
99
+ end
100
+
101
+ def transaction_name
102
+ current_transaction.nil? ? nil : current_transaction.best_name
103
+ end
104
+
105
+ def in_background_transaction?
106
+ !current_transaction.nil? && !current_transaction.recording_web_transaction?
107
+ end
108
+
109
+ def in_web_transaction?
110
+ !current_transaction.nil? && current_transaction.recording_web_transaction?
111
+ end
112
+
113
+ # Execution tracing on current thread
114
+ attr_accessor :untraced
115
+
116
+ def push_traced(should_trace)
117
+ @untraced << should_trace
118
+ end
119
+
120
+ def pop_traced
121
+ @untraced.pop if @untraced
122
+ end
123
+
124
+ def is_execution_traced?
125
+ @untraced.nil? || @untraced.last != false
126
+ end
127
+
128
+ # TT's and SQL
129
+ attr_accessor :record_tt, :record_sql
130
+
131
+ def is_transaction_traced?
132
+ @record_tt != false
133
+ end
134
+
135
+ def is_sql_recorded?
136
+ @record_sql != false
137
+ end
138
+
139
+ # Busy calculator
140
+ attr_accessor :busy_entries
141
+
142
+ # Sql Sampler Transaction Data
143
+ attr_accessor :sql_sampler_transaction_data
144
+
145
+ # Scope stack tracking from OneApm::StatsEngine::Transactions
146
+ # Should not be nil--this class manages its initialization and resetting
147
+ attr_reader :traced_method_stack
148
+ end
149
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+
3
+ module OneApm
4
+ class Transaction
5
+
6
+ def summary_metrics
7
+ if @frozen_name.start_with?(CONTROLLER_PREFIX)
8
+ [WEB_SUMMARY_METRIC]
9
+ else
10
+ background_summary_metrics
11
+ end
12
+ end
13
+
14
+ def background_summary_metrics
15
+ segments = @frozen_name.split('/')
16
+ if segments.size > 2
17
+ ["OtherTransaction/#{segments[1]}/all", OTHER_SUMMARY_METRIC]
18
+ else
19
+ []
20
+ end
21
+ end
22
+
23
+ def needs_middleware_summary_metrics?(name)
24
+ name.start_with?(MIDDLEWARE_PREFIX)
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+
3
+ module OneApm
4
+ class Transaction
5
+ module TransactionSynthetics
6
+
7
+ attr_accessor :raw_synthetics_header, :synthetics_payload
8
+
9
+ def is_synthetics_request?
10
+ synthetics_payload != nil && raw_synthetics_header != nil
11
+ end
12
+
13
+ def synthetics_version
14
+ info = synthetics_payload or return nil
15
+ info[0]
16
+ end
17
+
18
+ def synthetics_account_id
19
+ info = synthetics_payload or return nil
20
+ info[1]
21
+ end
22
+
23
+ def synthetics_resource_id
24
+ info = synthetics_payload or return nil
25
+ info[2]
26
+ end
27
+
28
+ def synthetics_job_id
29
+ info = synthetics_payload or return nil
30
+ info[3]
31
+ end
32
+
33
+ def synthetics_monitor_id
34
+ info = synthetics_payload or return nil
35
+ info[4]
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+
3
+ module OneApm
4
+ class TransactionTimings
5
+
6
+ attr_reader :transaction_name,
7
+ :start_time_in_seconds,
8
+ :queue_time_in_seconds
9
+
10
+ def initialize(queue_time_in_seconds, start_time_in_seconds, transaction_name)
11
+ @now = Time.now.to_f
12
+ @queue_time_in_seconds = clamp_to_positive(queue_time_in_seconds.to_f)
13
+ @start_time_in_seconds = clamp_to_positive(start_time_in_seconds.to_f)
14
+
15
+ @transaction_name = transaction_name
16
+ end
17
+
18
+ def transaction_name_or_unknown
19
+ transaction_name || OneApm::Transaction::UNKNOWN_METRIC
20
+ end
21
+
22
+ def start_time_as_time
23
+ Time.at(@start_time_in_seconds)
24
+ end
25
+
26
+ def start_time_in_millis
27
+ convert_to_milliseconds(@start_time_in_seconds)
28
+ end
29
+
30
+ def queue_time_in_millis
31
+ convert_to_milliseconds(queue_time_in_seconds)
32
+ end
33
+
34
+ def app_time_in_millis
35
+ convert_to_milliseconds(app_time_in_seconds)
36
+ end
37
+
38
+ def app_time_in_seconds
39
+ @now - @start_time_in_seconds
40
+ end
41
+
42
+ # Helpers
43
+
44
+ def convert_to_milliseconds(value_in_seconds)
45
+ clamp_to_positive((value_in_seconds.to_f * 1000.0).round)
46
+ end
47
+
48
+ def clamp_to_positive(value)
49
+ return 0.0 if value < 0.0
50
+ value
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ module OneApm
4
+ module VERSION
5
+
6
+ MAJOR = 1
7
+ MINOR = 1
8
+ TINY = 0
9
+
10
+ STRING = [MAJOR, MINOR, TINY].compact.join('.')
11
+
12
+ end
13
+ end