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.
- checksums.yaml +7 -0
- data/.gitignore +30 -0
- data/.rubocop.yml +725 -0
- data/Gemfile +3 -0
- data/Guardfile +7 -0
- data/LICENSE +1 -0
- data/README.md +3 -0
- data/config/cert/cacert.pem +1177 -0
- data/config/database.yml +5 -0
- data/lib/initializers/goliath.rb +11 -0
- data/lib/initializers/other.rb +1 -0
- data/lib/initializers/rails.rb +15 -0
- data/lib/one_apm/agent.rb +253 -0
- data/lib/one_apm/agent/agent.rb +283 -0
- data/lib/one_apm/agent/agent/connect.rb +175 -0
- data/lib/one_apm/agent/agent/container_data_manager.rb +218 -0
- data/lib/one_apm/agent/agent/forkable_dispatcher_functions.rb +96 -0
- data/lib/one_apm/agent/agent/helpers.rb +45 -0
- data/lib/one_apm/agent/agent/start.rb +226 -0
- data/lib/one_apm/agent/agent/start_worker_thread.rb +148 -0
- data/lib/one_apm/agent/busy_calculator.rb +115 -0
- data/lib/one_apm/agent/cross_app/cross_app_monitor.rb +181 -0
- data/lib/one_apm/agent/cross_app/cross_app_tracing.rb +336 -0
- data/lib/one_apm/agent/database.rb +308 -0
- data/lib/one_apm/agent/database/active_record_helper.rb +80 -0
- data/lib/one_apm/agent/database/obfuscation_helpers.rb +76 -0
- data/lib/one_apm/agent/database/obfuscator.rb +78 -0
- data/lib/one_apm/agent/database/postgres_explain_obfuscator.rb +45 -0
- data/lib/one_apm/agent/datastores.rb +175 -0
- data/lib/one_apm/agent/datastores/metric_helper.rb +83 -0
- data/lib/one_apm/agent/datastores/mongo.rb +27 -0
- data/lib/one_apm/agent/datastores/mongo/metric_translator.rb +189 -0
- data/lib/one_apm/agent/datastores/mongo/obfuscator.rb +37 -0
- data/lib/one_apm/agent/datastores/mongo/statement_formatter.rb +51 -0
- data/lib/one_apm/agent/event/event_listener.rb +40 -0
- data/lib/one_apm/agent/event/event_loop.rb +191 -0
- data/lib/one_apm/agent/event/worker_loop.rb +97 -0
- data/lib/one_apm/agent/harvester.rb +48 -0
- data/lib/one_apm/agent/inbound_request_monitor.rb +30 -0
- data/lib/one_apm/agent/javascript_instrumentor.rb +186 -0
- data/lib/one_apm/agent/pipe/pipe_channel_manager.rb +275 -0
- data/lib/one_apm/agent/pipe/pipe_service.rb +81 -0
- data/lib/one_apm/agent/sampler.rb +55 -0
- data/lib/one_apm/agent/sampler_collection.rb +65 -0
- data/lib/one_apm/agent/samplers/cpu_sampler.rb +49 -0
- data/lib/one_apm/agent/samplers/delayed_job_sampler.rb +109 -0
- data/lib/one_apm/agent/samplers/memory_sampler.rb +144 -0
- data/lib/one_apm/agent/samplers/object_sampler.rb +22 -0
- data/lib/one_apm/agent/samplers/vm_sampler.rb +124 -0
- data/lib/one_apm/agent/synthetics_monitor.rb +48 -0
- data/lib/one_apm/agent/threading/agent_thread.rb +74 -0
- data/lib/one_apm/agent/threading/backtrace_node.rb +133 -0
- data/lib/one_apm/agent/threading/backtrace_service.rb +259 -0
- data/lib/one_apm/agent/threading/thread_profile.rb +155 -0
- data/lib/one_apm/collector/collector/helper.rb +139 -0
- data/lib/one_apm/collector/collector/http_connection.rb +254 -0
- data/lib/one_apm/collector/collector/server_methods.rb +71 -0
- data/lib/one_apm/collector/collector_service.rb +123 -0
- data/lib/one_apm/collector/commands/agent_command.rb +17 -0
- data/lib/one_apm/collector/commands/thread_profiler_session.rb +108 -0
- data/lib/one_apm/collector/commands/xray_session.rb +53 -0
- data/lib/one_apm/collector/commands/xray_session_collection.rb +156 -0
- data/lib/one_apm/collector/containers/agent_command_router.rb +153 -0
- data/lib/one_apm/collector/containers/custom_event_aggregator.rb +94 -0
- data/lib/one_apm/collector/containers/error_collector.rb +349 -0
- data/lib/one_apm/collector/containers/sql_sampler.rb +331 -0
- data/lib/one_apm/collector/containers/stats_engine.rb +34 -0
- data/lib/one_apm/collector/containers/transaction_event_aggregator.rb +249 -0
- data/lib/one_apm/collector/containers/transaction_sampler.rb +352 -0
- data/lib/one_apm/collector/containers/utilization_data.rb +36 -0
- data/lib/one_apm/collector/stats_engine/gc_profiler.rb +106 -0
- data/lib/one_apm/collector/stats_engine/metric_stats.rb +243 -0
- data/lib/one_apm/collector/stats_engine/stats_hash.rb +105 -0
- data/lib/one_apm/configuration.rb +429 -0
- data/lib/one_apm/configuration/autostart.rb +41 -0
- data/lib/one_apm/configuration/default_source.rb +1026 -0
- data/lib/one_apm/configuration/environment_source.rb +113 -0
- data/lib/one_apm/configuration/high_security_source.rb +56 -0
- data/lib/one_apm/configuration/manual_source.rb +13 -0
- data/lib/one_apm/configuration/server_source.rb +60 -0
- data/lib/one_apm/configuration/yaml_source.rb +134 -0
- data/lib/one_apm/errors/agent_errors.rb +26 -0
- data/lib/one_apm/errors/internal_agent_error.rb +16 -0
- data/lib/one_apm/errors/noticed_error.rb +79 -0
- data/lib/one_apm/frameworks/external.rb +15 -0
- data/lib/one_apm/frameworks/rails.rb +103 -0
- data/lib/one_apm/frameworks/rails3.rb +37 -0
- data/lib/one_apm/frameworks/rails4.rb +21 -0
- data/lib/one_apm/frameworks/ruby.rb +21 -0
- data/lib/one_apm/frameworks/sinatra.rb +12 -0
- data/lib/one_apm/inst/3rd/active_merchant.rb +35 -0
- data/lib/one_apm/inst/3rd/acts_as_solr.rb +70 -0
- data/lib/one_apm/inst/3rd/authlogic.rb +23 -0
- data/lib/one_apm/inst/3rd/sunspot.rb +31 -0
- data/lib/one_apm/inst/background_job/active_job.rb +88 -0
- data/lib/one_apm/inst/background_job/delayed_job.rb +52 -0
- data/lib/one_apm/inst/background_job/delayed_job_injection.rb +8 -0
- data/lib/one_apm/inst/background_job/resque.rb +107 -0
- data/lib/one_apm/inst/background_job/sidekiq.rb +64 -0
- data/lib/one_apm/inst/dispatcher/passenger.rb +25 -0
- data/lib/one_apm/inst/dispatcher/rainbows.rb +23 -0
- data/lib/one_apm/inst/framework/grape.rb +94 -0
- data/lib/one_apm/inst/framework/padrino.rb +30 -0
- data/lib/one_apm/inst/framework/sinatra.rb +185 -0
- data/lib/one_apm/inst/framework/sinatra/ignorer.rb +50 -0
- data/lib/one_apm/inst/framework/sinatra/transaction_namer.rb +54 -0
- data/lib/one_apm/inst/http_clients/curb.rb +189 -0
- data/lib/one_apm/inst/http_clients/excon.rb +70 -0
- data/lib/one_apm/inst/http_clients/excon/connection.rb +31 -0
- data/lib/one_apm/inst/http_clients/excon/middleware.rb +55 -0
- data/lib/one_apm/inst/http_clients/httpclient.rb +44 -0
- data/lib/one_apm/inst/http_clients/net.rb +34 -0
- data/lib/one_apm/inst/http_clients/typhoeus.rb +76 -0
- data/lib/one_apm/inst/nosql/memcache.rb +134 -0
- data/lib/one_apm/inst/nosql/mongo.rb +126 -0
- data/lib/one_apm/inst/nosql/mongo_moped.rb +85 -0
- data/lib/one_apm/inst/nosql/redis.rb +83 -0
- data/lib/one_apm/inst/orm/active_record.rb +99 -0
- data/lib/one_apm/inst/orm/active_record_4.rb +28 -0
- data/lib/one_apm/inst/orm/data_mapper.rb +180 -0
- data/lib/one_apm/inst/orm/sequel.rb +47 -0
- data/lib/one_apm/inst/rack.rb +38 -0
- data/lib/one_apm/inst/rack/rack.rb +44 -0
- data/lib/one_apm/inst/rack/rack_builder.rb +51 -0
- data/lib/one_apm/inst/rails/action_controller.rb +118 -0
- data/lib/one_apm/inst/rails/action_web_service.rb +44 -0
- data/lib/one_apm/inst/rails/errors.rb +43 -0
- data/lib/one_apm/inst/rails3/action_controller.rb +172 -0
- data/lib/one_apm/inst/rails3/errors.rb +43 -0
- data/lib/one_apm/inst/rails4/action_controller.rb +27 -0
- data/lib/one_apm/inst/rails4/action_controller_subscriber.rb +121 -0
- data/lib/one_apm/inst/rails4/action_view.rb +23 -0
- data/lib/one_apm/inst/rails4/action_view_subscriber.rb +93 -0
- data/lib/one_apm/inst/rails4/active_record_subscriber.rb +96 -0
- data/lib/one_apm/inst/rails4/errors.rb +42 -0
- data/lib/one_apm/inst/rails_middleware.rb +40 -0
- data/lib/one_apm/inst/support/evented_subscriber.rb +98 -0
- data/lib/one_apm/inst/support/ignore_actions.rb +39 -0
- data/lib/one_apm/inst/support/queue_time.rb +76 -0
- data/lib/one_apm/inst/transaction_base.rb +405 -0
- data/lib/one_apm/logger/agent_logger.rb +206 -0
- data/lib/one_apm/logger/audit_logger.rb +78 -0
- data/lib/one_apm/logger/memory_logger.rb +50 -0
- data/lib/one_apm/logger/null_logger.rb +19 -0
- data/lib/one_apm/metrics/metric_data.rb +72 -0
- data/lib/one_apm/metrics/metric_spec.rb +82 -0
- data/lib/one_apm/metrics/stats.rb +173 -0
- data/lib/one_apm/probe.rb +16 -0
- data/lib/one_apm/probe/framework_loader.rb +53 -0
- data/lib/one_apm/probe/instance_methods.rb +105 -0
- data/lib/one_apm/probe/instrumentation.rb +60 -0
- data/lib/one_apm/rack/browser_monitoring.rb +144 -0
- data/lib/one_apm/rack/middleware_base.rb +27 -0
- data/lib/one_apm/rack/middleware_hooks.rb +17 -0
- data/lib/one_apm/rack/middleware_tracing.rb +81 -0
- data/lib/one_apm/rack/middleware_wrapper.rb +86 -0
- data/lib/one_apm/support/chained_call.rb +15 -0
- data/lib/one_apm/support/coerce.rb +81 -0
- data/lib/one_apm/support/collection_helper.rb +79 -0
- data/lib/one_apm/support/dotted_hash.rb +45 -0
- data/lib/one_apm/support/encoders.rb +34 -0
- data/lib/one_apm/support/environment_report.rb +127 -0
- data/lib/one_apm/support/event_buffer.rb +82 -0
- data/lib/one_apm/support/event_buffer/sampled_buffer.rb +45 -0
- data/lib/one_apm/support/event_buffer/sized_buffer.rb +21 -0
- data/lib/one_apm/support/event_buffer/synthetics_event_buffer.rb +40 -0
- data/lib/one_apm/support/helper.rb +49 -0
- data/lib/one_apm/support/hostname.rb +13 -0
- data/lib/one_apm/support/http_clients/curb_wrappers.rb +65 -0
- data/lib/one_apm/support/http_clients/excon_wrappers.rb +63 -0
- data/lib/one_apm/support/http_clients/httpclient_wrappers.rb +61 -0
- data/lib/one_apm/support/http_clients/net_http_wrappers.rb +48 -0
- data/lib/one_apm/support/http_clients/typhoeus_wrappers.rb +73 -0
- data/lib/one_apm/support/http_clients/uri_util.rb +39 -0
- data/lib/one_apm/support/json_marshaller.rb +68 -0
- data/lib/one_apm/support/json_wrapper.rb +130 -0
- data/lib/one_apm/support/language_support.rb +142 -0
- data/lib/one_apm/support/library_detection.rb +119 -0
- data/lib/one_apm/support/local_environment.rb +196 -0
- data/lib/one_apm/support/marshaller.rb +62 -0
- data/lib/one_apm/support/method_tracer.rb +334 -0
- data/lib/one_apm/support/method_tracer/helpers.rb +92 -0
- data/lib/one_apm/support/method_tracer/traced_method_stack.rb +103 -0
- data/lib/one_apm/support/obfuscator.rb +47 -0
- data/lib/one_apm/support/okjson.rb +601 -0
- data/lib/one_apm/support/parameter_filtering.rb +35 -0
- data/lib/one_apm/support/rules_engine.rb +56 -0
- data/lib/one_apm/support/rules_engine/replacement_rule.rb +80 -0
- data/lib/one_apm/support/rules_engine/segment_terms_rule.rb +46 -0
- data/lib/one_apm/support/server.rb +11 -0
- data/lib/one_apm/support/supported_versions.rb +257 -0
- data/lib/one_apm/support/system_info.rb +211 -0
- data/lib/one_apm/support/timer_lib.rb +29 -0
- data/lib/one_apm/support/version_number.rb +51 -0
- data/lib/one_apm/support/vm.rb +30 -0
- data/lib/one_apm/support/vm/jruby_vm.rb +38 -0
- data/lib/one_apm/support/vm/monotonic_gc_profiler.rb +43 -0
- data/lib/one_apm/support/vm/mri_vm.rb +85 -0
- data/lib/one_apm/support/vm/rubinius_vm.rb +129 -0
- data/lib/one_apm/support/vm/snapshot.rb +18 -0
- data/lib/one_apm/transaction.rb +336 -0
- data/lib/one_apm/transaction/class_methods.rb +132 -0
- data/lib/one_apm/transaction/instance_helpers.rb +82 -0
- data/lib/one_apm/transaction/metric_constants.rb +42 -0
- data/lib/one_apm/transaction/sample_buffer/force_persist_sample_buffer.rb +21 -0
- data/lib/one_apm/transaction/sample_buffer/slowest_sample_buffer.rb +21 -0
- data/lib/one_apm/transaction/sample_buffer/synthetics_sample_buffer.rb +21 -0
- data/lib/one_apm/transaction/sample_buffer/transaction_sample_buffer.rb +101 -0
- data/lib/one_apm/transaction/sample_buffer/xray_sample_buffer.rb +60 -0
- data/lib/one_apm/transaction/segment.rb +193 -0
- data/lib/one_apm/transaction/segment_summary.rb +51 -0
- data/lib/one_apm/transaction/thread_local_access.rb +73 -0
- data/lib/one_apm/transaction/transaction_analysis.rb +78 -0
- data/lib/one_apm/transaction/transaction_apdex.rb +20 -0
- data/lib/one_apm/transaction/transaction_cpu.rb +22 -0
- data/lib/one_apm/transaction/transaction_finish_append.rb +67 -0
- data/lib/one_apm/transaction/transaction_ignore.rb +33 -0
- data/lib/one_apm/transaction/transaction_jruby_functions.rb +40 -0
- data/lib/one_apm/transaction/transaction_metrics.rb +53 -0
- data/lib/one_apm/transaction/transaction_name.rb +90 -0
- data/lib/one_apm/transaction/transaction_namer.rb +49 -0
- data/lib/one_apm/transaction/transaction_sample.rb +204 -0
- data/lib/one_apm/transaction/transaction_sample_builder.rb +168 -0
- data/lib/one_apm/transaction/transaction_state.rb +149 -0
- data/lib/one_apm/transaction/transaction_summary.rb +28 -0
- data/lib/one_apm/transaction/transaction_synthetics.rb +40 -0
- data/lib/one_apm/transaction/transaction_timings.rb +54 -0
- data/lib/one_apm/version.rb +13 -0
- data/lib/oneapm_rpm.rb +16 -0
- data/lib/sequel/extensions/oneapm_instrumentation.rb +84 -0
- data/lib/sequel/plugins/oneapm_instrumentation.rb +66 -0
- data/oneapm.yml +135 -0
- data/oneapm_rpm.gemspec +58 -0
- 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
|