oneapm_rpm 1.1.2 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/one_apm/agent.rb +185 -192
- data/lib/one_apm/agent/agent/connect.rb +17 -17
- data/lib/one_apm/agent/agent/container_data_manager.rb +14 -14
- data/lib/one_apm/agent/agent/forkable_dispatcher_functions.rb +6 -35
- data/lib/one_apm/agent/agent/helpers.rb +6 -17
- data/lib/one_apm/agent/agent/start.rb +27 -27
- data/lib/one_apm/agent/agent/start_worker_thread.rb +19 -51
- data/lib/one_apm/agent/busy_calculator.rb +8 -34
- data/lib/one_apm/agent/cross_app/cross_app_monitor.rb +10 -10
- data/lib/one_apm/agent/cross_app/cross_app_tracing.rb +14 -14
- data/lib/one_apm/agent/database.rb +8 -35
- data/lib/one_apm/agent/database/active_record_helper.rb +1 -1
- data/lib/one_apm/agent/datastores.rb +2 -109
- data/lib/one_apm/agent/datastores/metric_helper.rb +1 -1
- data/lib/one_apm/agent/datastores/mongo/metric_translator.rb +3 -3
- data/lib/one_apm/agent/datastores/mongo/statement_formatter.rb +2 -2
- data/lib/one_apm/agent/harvester.rb +3 -6
- data/lib/one_apm/agent/inbound_request_monitor.rb +2 -2
- data/lib/one_apm/agent/javascript_instrumentor.rb +28 -28
- data/lib/one_apm/agent/sampler.rb +1 -1
- data/lib/one_apm/agent/sampler_collection.rb +6 -9
- data/lib/one_apm/agent/samplers/cpu_sampler.rb +4 -4
- data/lib/one_apm/agent/samplers/delayed_job_sampler.rb +5 -5
- data/lib/one_apm/agent/samplers/memory_sampler.rb +5 -5
- data/lib/one_apm/agent/samplers/object_sampler.rb +1 -1
- data/lib/one_apm/agent/samplers/vm_sampler.rb +6 -6
- data/lib/one_apm/agent/synthetics_monitor.rb +2 -2
- data/lib/one_apm/agent/threading/agent_thread.rb +6 -6
- data/lib/one_apm/agent/threading/backtrace_service.rb +9 -9
- data/lib/one_apm/agent/threading/thread_profile.rb +3 -3
- data/lib/one_apm/collector/collector/helper.rb +10 -10
- data/lib/one_apm/collector/collector/http_connection.rb +14 -14
- data/lib/one_apm/collector/collector/server_methods.rb +12 -12
- data/lib/one_apm/collector/collector_service.rb +8 -8
- data/lib/one_apm/collector/commands/thread_profiler_session.rb +4 -4
- data/lib/one_apm/collector/commands/xray_session.rb +1 -1
- data/lib/one_apm/collector/commands/xray_session_collection.rb +10 -10
- data/lib/one_apm/collector/containers/agent_command_router.rb +7 -7
- data/lib/one_apm/collector/containers/custom_event_aggregator.rb +6 -6
- data/lib/one_apm/collector/containers/error_collector.rb +16 -16
- data/lib/one_apm/collector/containers/sql_sampler.rb +8 -11
- data/lib/one_apm/collector/containers/transaction_event_aggregator.rb +15 -15
- data/lib/one_apm/collector/containers/transaction_sampler.rb +14 -16
- data/lib/one_apm/{agent/pipe/pipe_service.rb → collector/forked_process_service.rb} +3 -3
- data/lib/one_apm/collector/stats_engine/gc_profiler.rb +3 -3
- data/lib/one_apm/collector/stats_engine/metric_stats.rb +4 -4
- data/lib/one_apm/collector/stats_engine/stats_hash.rb +2 -2
- data/lib/one_apm/configuration.rb +16 -16
- data/lib/one_apm/configuration/autostart.rb +4 -4
- data/lib/one_apm/configuration/default_source.rb +9 -9
- data/lib/one_apm/configuration/environment_source.rb +1 -1
- data/lib/one_apm/configuration/high_security_source.rb +1 -1
- data/lib/one_apm/configuration/yaml_source.rb +7 -7
- data/lib/one_apm/errors/noticed_error.rb +2 -2
- data/lib/one_apm/frameworks/external.rb +2 -0
- data/lib/one_apm/frameworks/rails.rb +8 -18
- data/lib/one_apm/frameworks/rails3.rb +1 -0
- data/lib/one_apm/frameworks/rails4.rb +2 -6
- data/lib/one_apm/frameworks/ruby.rb +7 -2
- data/lib/one_apm/frameworks/sinatra.rb +1 -2
- data/lib/one_apm/inst/3rd/active_merchant.rb +1 -1
- data/lib/one_apm/inst/3rd/acts_as_solr.rb +2 -2
- data/lib/one_apm/inst/3rd/authlogic.rb +1 -1
- data/lib/one_apm/inst/3rd/sunspot.rb +1 -1
- data/lib/one_apm/inst/background_job/active_job.rb +1 -1
- data/lib/one_apm/inst/background_job/delayed_job.rb +4 -4
- data/lib/one_apm/inst/background_job/event_machine_standalone.rb +2 -2
- data/lib/one_apm/inst/background_job/resque.rb +11 -11
- data/lib/one_apm/inst/background_job/sidekiq.rb +5 -5
- data/lib/one_apm/inst/dispatcher/passenger.rb +4 -4
- data/lib/one_apm/inst/dispatcher/puma.rb +23 -0
- data/lib/one_apm/inst/dispatcher/rainbows.rb +2 -2
- data/lib/one_apm/inst/framework/grape.rb +4 -4
- data/lib/one_apm/inst/framework/padrino.rb +2 -2
- data/lib/one_apm/inst/framework/sinatra.rb +9 -9
- data/lib/one_apm/inst/framework/sinatra/transaction_namer.rb +1 -1
- data/lib/one_apm/inst/http_clients/curb.rb +6 -6
- data/lib/one_apm/inst/http_clients/excon.rb +4 -4
- data/lib/one_apm/inst/http_clients/excon/middleware.rb +3 -3
- data/lib/one_apm/inst/http_clients/httpclient.rb +1 -1
- data/lib/one_apm/inst/http_clients/net.rb +2 -2
- data/lib/one_apm/inst/http_clients/typhoeus.rb +2 -2
- data/lib/one_apm/inst/nosql/memcache.rb +7 -7
- data/lib/one_apm/inst/nosql/mongo.rb +6 -6
- data/lib/one_apm/inst/nosql/mongo_moped.rb +2 -2
- data/lib/one_apm/inst/nosql/redis.rb +3 -3
- data/lib/one_apm/inst/orm/active_record.rb +4 -4
- data/lib/one_apm/inst/orm/active_record_4.rb +2 -2
- data/lib/one_apm/inst/orm/sequel.rb +4 -4
- data/lib/one_apm/inst/rack.rb +3 -3
- data/lib/one_apm/inst/rack/rack_builder.rb +4 -4
- data/lib/one_apm/inst/rails/action_controller.rb +7 -7
- data/lib/one_apm/inst/rails/action_web_service.rb +1 -1
- data/lib/one_apm/inst/rails/errors.rb +1 -1
- data/lib/one_apm/inst/rails3/action_controller.rb +6 -6
- data/lib/one_apm/inst/rails3/errors.rb +1 -1
- data/lib/one_apm/inst/rails4/action_controller.rb +1 -1
- data/lib/one_apm/inst/rails4/action_controller_subscriber.rb +4 -4
- data/lib/one_apm/inst/rails4/action_view.rb +2 -2
- data/lib/one_apm/inst/rails4/action_view_subscriber.rb +4 -4
- data/lib/one_apm/inst/rails4/active_record_subscriber.rb +7 -7
- data/lib/one_apm/inst/rails4/errors.rb +1 -1
- data/lib/one_apm/inst/rails_middleware.rb +2 -2
- data/lib/one_apm/inst/support/evented_subscriber.rb +2 -2
- data/lib/one_apm/inst/support/queue_time.rb +1 -1
- data/lib/one_apm/inst/transaction_base.rb +6 -6
- data/lib/one_apm/logger/agent_logger.rb +8 -8
- data/lib/one_apm/logger/audit_logger.rb +8 -8
- data/lib/one_apm/logger/memory_logger.rb +1 -1
- data/lib/one_apm/logger/null_logger.rb +1 -3
- data/lib/one_apm/manager.rb +249 -0
- data/lib/one_apm/metrics/metric_spec.rb +1 -1
- data/lib/one_apm/metrics/stats.rb +1 -1
- data/lib/one_apm/probe.rb +1 -1
- data/lib/one_apm/probe/framework_loader.rb +2 -2
- data/lib/one_apm/probe/instance_methods.rb +19 -19
- data/lib/one_apm/probe/instrumentation.rb +5 -5
- data/lib/one_apm/rack/browser_monitoring.rb +6 -6
- data/lib/one_apm/rack/middleware_hooks.rb +1 -1
- data/lib/one_apm/rack/middleware_tracing.rb +2 -2
- data/lib/one_apm/support/chained_call.rb +1 -1
- data/lib/one_apm/support/coerce.rb +1 -1
- data/lib/one_apm/support/collection_helper.rb +1 -1
- data/lib/one_apm/support/encoders.rb +1 -1
- data/lib/one_apm/support/environment_report.rb +10 -10
- data/lib/one_apm/{agent → support}/event/event_listener.rb +3 -3
- data/lib/one_apm/{agent → support}/event/event_loop.rb +8 -8
- data/lib/one_apm/{agent → support}/event/timer.rb +1 -1
- data/lib/one_apm/{agent → support}/event/worker_loop.rb +5 -19
- data/lib/one_apm/{agent/pipe/pipe_channel_manager.rb → support/forked_process_channel.rb} +13 -51
- data/lib/one_apm/support/json_marshaller.rb +6 -6
- data/lib/one_apm/support/json_wrapper.rb +2 -2
- data/lib/one_apm/support/language_support.rb +1 -1
- data/lib/one_apm/support/library_detection.rb +5 -5
- data/lib/one_apm/support/marshaller.rb +1 -1
- data/lib/one_apm/support/method_tracer.rb +12 -12
- data/lib/one_apm/support/method_tracer/helpers.rb +6 -6
- data/lib/one_apm/support/system_info.rb +2 -2
- data/lib/one_apm/support/traced_method_stack.rb +4 -4
- data/lib/one_apm/support/vm/monotonic_gc_profiler.rb +1 -1
- data/lib/one_apm/support/vm/mri_vm.rb +1 -1
- data/lib/one_apm/transaction.rb +3 -3
- data/lib/one_apm/transaction/class_methods.rb +3 -3
- data/lib/one_apm/transaction/instance_helpers.rb +3 -3
- data/lib/one_apm/transaction/sample_buffer/synthetics_sample_buffer.rb +1 -1
- data/lib/one_apm/transaction/sample_buffer/xray_sample_buffer.rb +5 -5
- data/lib/one_apm/transaction/thread_local_access.rb +2 -2
- data/lib/one_apm/transaction/transaction_apdex.rb +2 -2
- data/lib/one_apm/transaction/transaction_finish_append.rb +1 -1
- data/lib/one_apm/transaction/transaction_jruby_functions.rb +2 -2
- data/lib/one_apm/transaction/transaction_name.rb +2 -2
- data/lib/one_apm/transaction/transaction_sample.rb +1 -1
- data/lib/one_apm/transaction/transaction_sample_builder.rb +7 -7
- data/lib/one_apm/transaction/transaction_state.rb +1 -1
- data/lib/one_apm/version.rb +1 -1
- data/lib/sequel/extensions/oneapm_instrumentation.rb +7 -7
- data/oneapm.yml +6 -7
- metadata +10 -9
- data/lib/one_apm/agent/agent.rb +0 -283
@@ -22,7 +22,7 @@ module OneApm
|
|
22
22
|
@thread_profiler_session = OneApm::Collector::Commands::ThreadProfilerSession.new(@backtrace_service)
|
23
23
|
@xray_session_collection = OneApm::Collector::Commands::XraySessionCollection.new(@backtrace_service, event_listener)
|
24
24
|
|
25
|
-
@handlers['restart'] = Proc.new { OneApm::
|
25
|
+
@handlers['restart'] = Proc.new { OneApm::Manager.restart }
|
26
26
|
@handlers['start_profiler'] = Proc.new { |cmd| thread_profiler_session.handle_start_command(cmd) }
|
27
27
|
@handlers['stop_profiler'] = Proc.new { |cmd| thread_profiler_session.handle_stop_command(cmd) }
|
28
28
|
@handlers['active_xray_sessions'] = Proc.new { |cmd| xray_session_collection.handle_active_xray_sessions(cmd) }
|
@@ -33,7 +33,7 @@ module OneApm
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def one_apm_service
|
36
|
-
OneApm::
|
36
|
+
OneApm::Manager.agent.service
|
37
37
|
end
|
38
38
|
|
39
39
|
def check_for_and_handle_agent_commands
|
@@ -89,16 +89,16 @@ module OneApm
|
|
89
89
|
|
90
90
|
def log_profiles(profiles)
|
91
91
|
if profiles.empty?
|
92
|
-
|
92
|
+
OneApm::Manager.logger.debug "No thread profiles with data found to send."
|
93
93
|
else
|
94
94
|
profile_descriptions = profiles.map { |p| p.to_log_description }
|
95
|
-
|
95
|
+
OneApm::Manager.logger.debug "Sending thread profiles [#{profile_descriptions.join(", ")}]"
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
99
|
def get_agent_commands
|
100
100
|
commands = one_apm_service.get_agent_commands
|
101
|
-
OneApm::
|
101
|
+
OneApm::Manager.logger.info "Received get_agent_commands = #{commands.inspect}" if commands.any?
|
102
102
|
commands.map {|collector_command| OneApm::Collector::Commands::AgentCommand.new(collector_command)}
|
103
103
|
end
|
104
104
|
|
@@ -120,7 +120,7 @@ module OneApm
|
|
120
120
|
call_handler_for(agent_command)
|
121
121
|
return success
|
122
122
|
rescue AgentCommandError => e
|
123
|
-
OneApm::
|
123
|
+
OneApm::Manager.logger.debug(e)
|
124
124
|
error(e)
|
125
125
|
end
|
126
126
|
end
|
@@ -146,7 +146,7 @@ module OneApm
|
|
146
146
|
end
|
147
147
|
|
148
148
|
def unrecognized_agent_command(agent_command)
|
149
|
-
OneApm::
|
149
|
+
OneApm::Manager.logger.debug("Unrecognized agent command #{agent_command.inspect}")
|
150
150
|
end
|
151
151
|
end
|
152
152
|
end
|
@@ -16,14 +16,14 @@ module OneApm
|
|
16
16
|
|
17
17
|
def initialize
|
18
18
|
@lock = Mutex.new
|
19
|
-
@buffer = OneApm::Agent::SampledBuffer.new(OneApm::
|
19
|
+
@buffer = OneApm::Agent::SampledBuffer.new(OneApm::Manager.config[DEFAULT_CAPACITY_KEY])
|
20
20
|
@type_strings = Hash.new { |hash, key| hash[key] = key.to_s.freeze }
|
21
21
|
register_config_callbacks
|
22
22
|
end
|
23
23
|
|
24
24
|
def register_config_callbacks
|
25
|
-
OneApm::
|
26
|
-
OneApm::
|
25
|
+
OneApm::Manager.config.register_callback(DEFAULT_CAPACITY_KEY) do |max_samples|
|
26
|
+
OneApm::Manager.logger.debug "CustomEventAggregator max_samples set to #{max_samples}"
|
27
27
|
@lock.synchronize do
|
28
28
|
@buffer.capacity = max_samples
|
29
29
|
end
|
@@ -63,9 +63,9 @@ module OneApm
|
|
63
63
|
def note_dropped_events(captured_count, dropped_count)
|
64
64
|
total_count = captured_count + dropped_count
|
65
65
|
if dropped_count > 0
|
66
|
-
OneApm::
|
66
|
+
OneApm::Manager.logger.warn("Dropped #{dropped_count} custom events out of #{total_count}.")
|
67
67
|
end
|
68
|
-
engine = OneApm::
|
68
|
+
engine = OneApm::Manager.agent.stats_engine
|
69
69
|
engine.tl_record_supportability_metric_count("Events/Customer/Seen" , total_count)
|
70
70
|
engine.tl_record_supportability_metric_count("Events/Customer/Sent" , captured_count)
|
71
71
|
engine.tl_record_supportability_metric_count("Events/Customer/Dropped", dropped_count)
|
@@ -84,7 +84,7 @@ module OneApm
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def note_dropped_event(type)
|
87
|
-
|
87
|
+
OneApm::Manager.logger.log_once(:warn, "dropping_event_of_type:#{type}",
|
88
88
|
"Invalid event type name '#{type}', not recording.")
|
89
89
|
@buffer.note_dropped
|
90
90
|
end
|
@@ -24,13 +24,13 @@ module OneApm
|
|
24
24
|
# lookup of exception class names to ignore. Hash for fast access
|
25
25
|
@ignore = {}
|
26
26
|
|
27
|
-
initialize_ignored_errors(
|
27
|
+
initialize_ignored_errors(Manager.config[:'error_collector.ignore_errors'])
|
28
28
|
@lock = Mutex.new
|
29
29
|
|
30
|
-
|
31
|
-
|
30
|
+
OneApm::Manager.config.register_callback(:'error_collector.enabled') do |config_enabled|
|
31
|
+
OneApm::Manager.logger.debug "Errors will #{config_enabled ? '' : 'not '}be sent to the OneApm service."
|
32
32
|
end
|
33
|
-
|
33
|
+
OneApm::Manager.config.register_callback(:'error_collector.ignore_errors') do |ignore_errors|
|
34
34
|
initialize_ignored_errors(ignore_errors)
|
35
35
|
end
|
36
36
|
end
|
@@ -43,7 +43,7 @@ module OneApm
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def enabled?
|
46
|
-
|
46
|
+
OneApm::Manager.config[:'error_collector.enabled']
|
47
47
|
end
|
48
48
|
|
49
49
|
def disabled?
|
@@ -83,7 +83,7 @@ module OneApm
|
|
83
83
|
def ignore(errors)
|
84
84
|
errors.each do |error|
|
85
85
|
@ignore[error] = true
|
86
|
-
|
86
|
+
OneApm::Manager.logger.debug("Ignoring errors of type '#{error}'")
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
@@ -106,7 +106,7 @@ module OneApm
|
|
106
106
|
def error_is_ignored?(error)
|
107
107
|
error && filtered_error?(error)
|
108
108
|
rescue => e
|
109
|
-
OneApm::
|
109
|
+
OneApm::Manager.logger.error("Error '#{error}' will NOT be ignored. Exception '#{e}' while determining whether to ignore or not.", e)
|
110
110
|
false
|
111
111
|
end
|
112
112
|
|
@@ -149,7 +149,7 @@ module OneApm
|
|
149
149
|
blamed_metric = blamed_metric_name(txn, options)
|
150
150
|
metric_names << blamed_metric if blamed_metric
|
151
151
|
|
152
|
-
stats_engine = OneApm::
|
152
|
+
stats_engine = OneApm::Manager.agent.stats_engine
|
153
153
|
stats_engine.record_unscoped_metrics(state, metric_names) do |stats|
|
154
154
|
stats.increment_count
|
155
155
|
end
|
@@ -180,7 +180,7 @@ module OneApm
|
|
180
180
|
# If anything else is left over, we treat it like a custom param
|
181
181
|
def custom_params_from_opts(options)
|
182
182
|
# If anything else is left over, treat it like a custom param:
|
183
|
-
if
|
183
|
+
if OneApm::Manager.config[:'error_collector.capture_attributes']
|
184
184
|
fetch_from_options(options, :custom_params, {}).merge(options)
|
185
185
|
else
|
186
186
|
{}
|
@@ -192,7 +192,7 @@ module OneApm
|
|
192
192
|
# returns nil
|
193
193
|
def request_params_from_opts(options)
|
194
194
|
value = options.delete(:request_params)
|
195
|
-
if
|
195
|
+
if OneApm::Manager.config[:capture_params]
|
196
196
|
value
|
197
197
|
else
|
198
198
|
nil
|
@@ -247,7 +247,7 @@ module OneApm
|
|
247
247
|
# the maximum limit, and logs a warning if we are over the limit.
|
248
248
|
def over_queue_limit?(message)
|
249
249
|
over_limit = (@errors.reject{|err| err.is_internal}.length >= MAX_ERROR_QUEUE_LENGTH)
|
250
|
-
|
250
|
+
OneApm::Manager.logger.warn("The error reporting queue has reached #{MAX_ERROR_QUEUE_LENGTH}. The error detail for this and subsequent errors will not be transmitted to OneApm until the queued errors have been sent: #{message}") if over_limit
|
251
251
|
over_limit
|
252
252
|
end
|
253
253
|
|
@@ -276,14 +276,14 @@ module OneApm
|
|
276
276
|
#
|
277
277
|
# If anything is left over, it's added to custom params
|
278
278
|
# If exception is nil, the error count is bumped and no traced error is recorded
|
279
|
-
def notice_error(exception, options={})
|
279
|
+
def notice_error(exception, options={})
|
280
280
|
state = ::OneApm::TransactionState.tl_get
|
281
281
|
|
282
282
|
return if skip_notice_error?(state, exception)
|
283
283
|
tag_as_seen(state, exception)
|
284
284
|
|
285
285
|
increment_error_count!(state, exception, options)
|
286
|
-
OneApm::
|
286
|
+
OneApm::Manager.agent.events.notify(:notice_error, exception, options)
|
287
287
|
|
288
288
|
action_path = fetch_from_options(options, :metric, "")
|
289
289
|
exception_options = error_params_from_options(options).merge(exception_info(exception))
|
@@ -291,7 +291,7 @@ module OneApm
|
|
291
291
|
|
292
292
|
exception
|
293
293
|
rescue => e
|
294
|
-
|
294
|
+
OneApm::Manager.logger.warn("Failure when capturing error '#{exception}':", e)
|
295
295
|
end
|
296
296
|
|
297
297
|
# *Use sparingly for difficult to track bugs.*
|
@@ -307,7 +307,7 @@ module OneApm
|
|
307
307
|
return unless exception.class < OneApm::Agent::InternalAgentError
|
308
308
|
|
309
309
|
# Log 'em all!
|
310
|
-
OneApm::
|
310
|
+
OneApm::Manager.logger.info(exception)
|
311
311
|
|
312
312
|
@lock.synchronize do
|
313
313
|
# Already seen this class once? Bail!
|
@@ -320,7 +320,7 @@ module OneApm
|
|
320
320
|
@errors << noticed_error
|
321
321
|
end
|
322
322
|
rescue => e
|
323
|
-
OneApm::
|
323
|
+
OneApm::Manager.logger.info("Unable to capture internal agent error due to an exception:", e)
|
324
324
|
end
|
325
325
|
|
326
326
|
def merge!(errors)
|
@@ -4,9 +4,6 @@ require 'zlib'
|
|
4
4
|
require 'base64'
|
5
5
|
require 'digest/md5'
|
6
6
|
|
7
|
-
require 'one_apm/agent'
|
8
|
-
require 'one_apm/probe'
|
9
|
-
|
10
7
|
module OneApm
|
11
8
|
module Collector
|
12
9
|
# This class contains the logic of recording slow SQL traces, which may
|
@@ -49,8 +46,8 @@ module OneApm
|
|
49
46
|
end
|
50
47
|
|
51
48
|
def enabled?
|
52
|
-
|
53
|
-
|
49
|
+
OneApm::Manager.config[:'slow_sql.enabled'] &&
|
50
|
+
OneApm::Manager.config[:'transaction_tracer.enabled'] &&
|
54
51
|
OneApm::Agent::Database.should_record_sql?(:slow_sql)
|
55
52
|
end
|
56
53
|
|
@@ -63,7 +60,7 @@ module OneApm
|
|
63
60
|
guid = state.transaction_sample_builder.sample.guid
|
64
61
|
end
|
65
62
|
|
66
|
-
if
|
63
|
+
if OneApm::Manager.config[:'slow_sql.enabled'] && state.sql_sampler_transaction_data
|
67
64
|
state.sql_sampler_transaction_data.set_transaction_info(uri, guid)
|
68
65
|
end
|
69
66
|
end
|
@@ -82,7 +79,7 @@ module OneApm
|
|
82
79
|
data.set_transaction_name(name)
|
83
80
|
if data.sql_data.size > 0
|
84
81
|
@samples_lock.synchronize do
|
85
|
-
|
82
|
+
OneApm::Manager.logger.debug "Examining #{data.sql_data.size} slow transaction sql statement(s)"
|
86
83
|
save_slow_sql data
|
87
84
|
end
|
88
85
|
end
|
@@ -147,13 +144,13 @@ module OneApm
|
|
147
144
|
#
|
148
145
|
# @api public
|
149
146
|
#
|
150
|
-
def notice_sql(sql, metric_name, config, duration, state=nil, &explainer)
|
147
|
+
def notice_sql(sql, metric_name, config, duration, state=nil, &explainer)
|
151
148
|
state ||= OneApm::TransactionState.tl_get
|
152
149
|
data = state.sql_sampler_transaction_data
|
153
150
|
return unless data
|
154
151
|
|
155
152
|
if state.is_sql_recorded?
|
156
|
-
if duration >
|
153
|
+
if duration > OneApm::Manager.config[:'slow_sql.explain_threshold']
|
157
154
|
backtrace = caller
|
158
155
|
backtrace.reject! { |t| t.include?('one_apm') }
|
159
156
|
data.sql_data << SlowSql.new(OneApm::Agent::Database.capture_query(sql),
|
@@ -297,11 +294,11 @@ module OneApm
|
|
297
294
|
end
|
298
295
|
|
299
296
|
def need_to_obfuscate?
|
300
|
-
|
297
|
+
OneApm::Manager.config[:'slow_sql.record_sql'].to_s == 'obfuscated'
|
301
298
|
end
|
302
299
|
|
303
300
|
def need_to_explain?
|
304
|
-
|
301
|
+
OneApm::Manager.config[:'slow_sql.explain_enabled']
|
305
302
|
end
|
306
303
|
|
307
304
|
include OneApm::Coerce
|
@@ -31,8 +31,8 @@ class OneApm::Collector::TransactionEventAggregator
|
|
31
31
|
@enabled = false
|
32
32
|
@notified_full = false
|
33
33
|
|
34
|
-
@samples = ::OneApm::Agent::SampledBuffer.new(OneApm::
|
35
|
-
@synthetics_samples = ::OneApm::Agent::SyntheticsEventBuffer.new(OneApm::
|
34
|
+
@samples = ::OneApm::Agent::SampledBuffer.new(OneApm::Manager.config[:'analytics_events.max_samples_stored'])
|
35
|
+
@synthetics_samples = ::OneApm::Agent::SyntheticsEventBuffer.new(OneApm::Manager.config[:'synthetics.events_limit'])
|
36
36
|
|
37
37
|
event_listener.subscribe(:transaction_finished, &method(:on_transaction_finished))
|
38
38
|
self.register_config_callbacks
|
@@ -80,10 +80,10 @@ class OneApm::Collector::TransactionEventAggregator
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
-
def record_sampling_rate(request_count, sample_count)
|
83
|
+
def record_sampling_rate(request_count, sample_count)
|
84
84
|
request_count_lifetime = @samples.seen_lifetime
|
85
85
|
sample_count_lifetime = @samples.captured_lifetime
|
86
|
-
OneApm::
|
86
|
+
OneApm::Manager.logger.debug("Sampled %d / %d (%.1f %%) requests this cycle, %d / %d (%.1f %%) since startup" % [
|
87
87
|
sample_count,
|
88
88
|
request_count,
|
89
89
|
(sample_count.to_f / request_count * 100.0),
|
@@ -92,7 +92,7 @@ class OneApm::Collector::TransactionEventAggregator
|
|
92
92
|
(sample_count_lifetime.to_f / request_count_lifetime * 100.0)
|
93
93
|
])
|
94
94
|
|
95
|
-
engine = OneApm::
|
95
|
+
engine = OneApm::Manager.agent.stats_engine
|
96
96
|
engine.tl_record_supportability_metric_count("TransactionEventAggregator/requests", request_count)
|
97
97
|
engine.tl_record_supportability_metric_count("TransactionEventAggregator/samples", sample_count)
|
98
98
|
end
|
@@ -100,30 +100,30 @@ class OneApm::Collector::TransactionEventAggregator
|
|
100
100
|
def record_dropped_synthetics(synthetics_dropped)
|
101
101
|
return unless synthetics_dropped > 0
|
102
102
|
|
103
|
-
OneApm::
|
103
|
+
OneApm::Manager.logger.debug("Synthetics transaction event limit (#{@samples.capacity}) reached. Further synthetics events this harvest period dropped.")
|
104
104
|
|
105
|
-
engine = OneApm::
|
105
|
+
engine = OneApm::Manager.agent.stats_engine
|
106
106
|
engine.tl_record_supportability_metric_count("TransactionEventAggregator/synthetics_events_dropped", synthetics_dropped)
|
107
107
|
end
|
108
108
|
|
109
109
|
def register_config_callbacks
|
110
|
-
OneApm::
|
111
|
-
OneApm::
|
110
|
+
OneApm::Manager.config.register_callback(:'analytics_events.max_samples_stored') do |max_samples|
|
111
|
+
OneApm::Manager.logger.debug "TransactionEventAggregator max_samples set to #{max_samples}"
|
112
112
|
self.synchronize { @samples.capacity = max_samples }
|
113
113
|
end
|
114
114
|
|
115
|
-
OneApm::
|
116
|
-
OneApm::
|
115
|
+
OneApm::Manager.config.register_callback(:'synthetics.events_limit') do |max_samples|
|
116
|
+
OneApm::Manager.logger.debug "TransactionEventAggregator limit for synthetics events set to #{max_samples}"
|
117
117
|
self.synchronize { @synthetics_samples.capacity = max_samples }
|
118
118
|
end
|
119
119
|
|
120
|
-
OneApm::
|
120
|
+
OneApm::Manager.config.register_callback(:'analytics_events.enabled') do |enabled|
|
121
121
|
@enabled = enabled
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
125
125
|
def notify_full
|
126
|
-
OneApm::
|
126
|
+
OneApm::Manager.logger.debug "Transaction event capacity of #{@samples.capacity} reached, beginning sampling"
|
127
127
|
@notified_full = true
|
128
128
|
end
|
129
129
|
|
@@ -221,7 +221,7 @@ class OneApm::Collector::TransactionEventAggregator
|
|
221
221
|
end
|
222
222
|
|
223
223
|
def append_http_response_code(sample, payload)
|
224
|
-
unless OneApm::
|
224
|
+
unless OneApm::Manager.config[:disable_rack_middleware]
|
225
225
|
optionally_append(HTTP_RESPONSE_CODE_KEY, :http_response_code, sample, payload)
|
226
226
|
end
|
227
227
|
end
|
@@ -240,7 +240,7 @@ class OneApm::Collector::TransactionEventAggregator
|
|
240
240
|
|
241
241
|
def create_custom_parameters(payload)
|
242
242
|
custom_params = {}
|
243
|
-
if
|
243
|
+
if OneApm::Manager.config[:'analytics_events.capture_attributes']
|
244
244
|
custom_params.merge!(event_params(payload[:custom_params] || {}))
|
245
245
|
end
|
246
246
|
custom_params
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require 'one_apm/agent'
|
4
|
-
require 'one_apm/probe'
|
5
3
|
require 'one_apm/transaction/transaction_sample_builder'
|
6
4
|
require 'one_apm/transaction/sample_buffer/force_persist_sample_buffer'
|
7
5
|
require 'one_apm/transaction/sample_buffer/slowest_sample_buffer'
|
@@ -45,24 +43,24 @@ module OneApm
|
|
45
43
|
# any 'honest-to-god'-multithreaded system
|
46
44
|
@samples_lock = Mutex.new
|
47
45
|
|
48
|
-
|
46
|
+
OneApm::Manager.config.register_callback(:'transaction_tracer.enabled') do |enabled|
|
49
47
|
if enabled
|
50
|
-
threshold =
|
51
|
-
|
48
|
+
threshold = OneApm::Manager.config[:'transaction_tracer.transaction_threshold']
|
49
|
+
OneApm::Manager.logger.debug "Transaction tracing threshold is #{threshold} seconds."
|
52
50
|
else
|
53
|
-
|
51
|
+
OneApm::Manager.logger.debug "Transaction traces will not be sent to the OneApm service."
|
54
52
|
end
|
55
53
|
end
|
56
54
|
|
57
|
-
|
55
|
+
OneApm::Manager.config.register_callback(:'transaction_tracer.record_sql') do |config|
|
58
56
|
if config == 'raw'
|
59
|
-
|
57
|
+
OneApm::Manager.logger.warn("Agent is configured to send raw SQL to the service")
|
60
58
|
end
|
61
59
|
end
|
62
60
|
end
|
63
61
|
|
64
62
|
def enabled?
|
65
|
-
|
63
|
+
OneApm::Manager.config[:'transaction_tracer.enabled']
|
66
64
|
end
|
67
65
|
|
68
66
|
def on_start_transaction(state, start_time, uri=nil)
|
@@ -95,7 +93,7 @@ module OneApm
|
|
95
93
|
end
|
96
94
|
|
97
95
|
def custom_parameters_from_transaction(txn)
|
98
|
-
if
|
96
|
+
if OneApm::Manager.config[:'transaction_tracer.capture_attributes']
|
99
97
|
txn.custom_parameters
|
100
98
|
else
|
101
99
|
{}
|
@@ -200,7 +198,7 @@ module OneApm
|
|
200
198
|
# Appends a backtrace to a segment if that segment took longer
|
201
199
|
# than the specified duration
|
202
200
|
def append_backtrace(segment, duration)
|
203
|
-
if duration >=
|
201
|
+
if duration >= OneApm::Manager.config[:'transaction_tracer.stack_trace_threshold']
|
204
202
|
segment[:backtrace] = caller.join("\n")
|
205
203
|
end
|
206
204
|
end
|
@@ -219,7 +217,7 @@ module OneApm
|
|
219
217
|
#
|
220
218
|
# @api public
|
221
219
|
#
|
222
|
-
def notice_sql(sql, config, duration, state=nil, &explainer)
|
220
|
+
def notice_sql(sql, config, duration, state=nil, &explainer)
|
223
221
|
# some statements (particularly INSERTS with large BLOBS
|
224
222
|
# may be very large; we should trim them to a maximum usable length
|
225
223
|
state ||= OneApm::TransactionState.tl_get
|
@@ -256,18 +254,18 @@ module OneApm
|
|
256
254
|
#
|
257
255
|
# @api public
|
258
256
|
#
|
259
|
-
def notice_nosql(key, duration)
|
257
|
+
def notice_nosql(key, duration)
|
260
258
|
builder = tl_builder
|
261
259
|
notice_extra_data(builder, key, duration, :key)
|
262
260
|
end
|
263
261
|
|
264
|
-
def notice_nosql_statement(statement, duration)
|
262
|
+
def notice_nosql_statement(statement, duration)
|
265
263
|
builder = tl_builder
|
266
264
|
notice_extra_data(builder, statement, duration, :statement)
|
267
265
|
end
|
268
266
|
|
269
267
|
# Set parameters on the current segment.
|
270
|
-
def add_segment_parameters(params)
|
268
|
+
def add_segment_parameters(params)
|
271
269
|
builder = tl_builder
|
272
270
|
return unless builder
|
273
271
|
params.each { |k,v| builder.current_segment[k] = v }
|
@@ -289,7 +287,7 @@ module OneApm
|
|
289
287
|
begin
|
290
288
|
sample.prepare_to_send!
|
291
289
|
rescue => e
|
292
|
-
OneApm::
|
290
|
+
OneApm::Manager.logger.error("Failed to prepare transaction trace. Error: ", e)
|
293
291
|
false
|
294
292
|
else
|
295
293
|
true
|