app_perf_rpm 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/app_perf_rpm/aggregator.rb +77 -0
- data/lib/app_perf_rpm/backtrace.rb +92 -0
- data/lib/app_perf_rpm/configuration.rb +56 -0
- data/lib/app_perf_rpm/dispatcher.rb +85 -0
- data/lib/app_perf_rpm/instrumentation.rb +21 -0
- data/lib/app_perf_rpm/instruments/action_controller.rb +51 -0
- data/lib/app_perf_rpm/instruments/action_view.rb +126 -0
- data/lib/app_perf_rpm/instruments/active_record/adapters/mysql2.rb +45 -0
- data/lib/app_perf_rpm/instruments/active_record/adapters/postgresql.rb +102 -0
- data/lib/app_perf_rpm/instruments/active_record/adapters/sqlite3.rb +103 -0
- data/lib/app_perf_rpm/instruments/active_record.rb +57 -0
- data/lib/app_perf_rpm/instruments/activerecord_import.rb +47 -0
- data/lib/app_perf_rpm/instruments/emque_consuming.rb +31 -0
- data/lib/app_perf_rpm/instruments/faraday.rb +37 -0
- data/lib/app_perf_rpm/instruments/net_http.rb +36 -0
- data/lib/app_perf_rpm/instruments/rack.rb +41 -0
- data/lib/app_perf_rpm/instruments/rack_middleware.rb +69 -0
- data/lib/app_perf_rpm/instruments/redis.rb +39 -0
- data/lib/app_perf_rpm/instruments/sequel.rb +92 -0
- data/lib/app_perf_rpm/instruments/sidekiq.rb +55 -0
- data/lib/app_perf_rpm/instruments/sinatra.rb +68 -0
- data/lib/app_perf_rpm/instruments/typhoeus.rb +55 -0
- data/lib/app_perf_rpm/introspector.rb +51 -0
- data/lib/app_perf_rpm/logger.rb +32 -0
- data/lib/app_perf_rpm/middleware.rb +30 -0
- data/lib/app_perf_rpm/rails.rb +14 -0
- data/lib/app_perf_rpm/railtie.rb +29 -0
- data/lib/app_perf_rpm/span.rb +103 -0
- data/lib/app_perf_rpm/tracer.rb +139 -0
- data/lib/app_perf_rpm/utils.rb +9 -0
- data/lib/app_perf_rpm/worker.rb +46 -0
- data/lib/app_perf_rpm.rb +124 -0
- data/lib/tasks/install.rake +6 -0
- metadata +146 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
module AppPerfRpm
|
2
|
+
module Instruments
|
3
|
+
module TyphoeusRequest
|
4
|
+
def run_with_trace
|
5
|
+
if ::AppPerfRpm.tracing?
|
6
|
+
span = ::AppPerfRpm::Tracer.start_span("typhoeus")
|
7
|
+
response = run_without_trace
|
8
|
+
span.finish
|
9
|
+
|
10
|
+
uri = URI(response.effective_url)
|
11
|
+
|
12
|
+
span.options = {
|
13
|
+
"http_status" => response.code,
|
14
|
+
"remote_url" => uri.to_s,
|
15
|
+
"http_method" => options[:method]
|
16
|
+
}
|
17
|
+
span.submit(opts)
|
18
|
+
|
19
|
+
response
|
20
|
+
else
|
21
|
+
run_without_trace
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module TyphoeusHydra
|
27
|
+
def run_with_trace
|
28
|
+
::AppPerfRpm::Tracer.trace("typhoeus") do |span|
|
29
|
+
span.options = {
|
30
|
+
"method" => :hydra,
|
31
|
+
"queued_requests" => queued_requests.count,
|
32
|
+
"max_concurrency" => max_concurrency
|
33
|
+
}
|
34
|
+
run_without_trace
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
if ::AppPerfRpm.configuration.instrumentation[:typhoeus][:enabled] && defined?(::Typhoeus)
|
42
|
+
::AppPerfRpm.logger.info "Initializing typhoeus tracer."
|
43
|
+
|
44
|
+
::Typhoeus::Request::Operations.send(:include, AppPerfRpm::Instruments::TyphoeusRequest)
|
45
|
+
::Typhoeus::Request::Operations.class_eval do
|
46
|
+
alias_method :run_without_trace, :run
|
47
|
+
alias_method :run, :run_with_trace
|
48
|
+
end
|
49
|
+
|
50
|
+
::Typhoeus::Hydra.send(:include, AppPerfRpm::Instruments::TyphoeusHydra)
|
51
|
+
::Typhoeus::Hydra.class_eval do
|
52
|
+
alias_method :run_without_trace, :run
|
53
|
+
alias_method :run, :run_with_trace
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module AppPerfRpm
|
2
|
+
class Introspector
|
3
|
+
|
4
|
+
VALID_RUNNERS = [
|
5
|
+
:Passenger,
|
6
|
+
:Puma,
|
7
|
+
:Rainbows,
|
8
|
+
:Resque,
|
9
|
+
:Sidekiq,
|
10
|
+
:Sinatra,
|
11
|
+
:Unicorn,
|
12
|
+
:Webrick
|
13
|
+
]
|
14
|
+
class << self
|
15
|
+
|
16
|
+
def agentable?
|
17
|
+
if raking? || rspecing?
|
18
|
+
AppPerfRpm.logger.info("Detected rake, not initializing agent")
|
19
|
+
return false
|
20
|
+
end
|
21
|
+
AppPerfRpm.logger.info("Detecting runner...")
|
22
|
+
VALID_RUNNERS.each do |runner|
|
23
|
+
if const_defined?(runner.to_s)
|
24
|
+
AppPerfRpm.logger.info("#{runner} detected. You're valid")
|
25
|
+
return true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
AppPerfRpm.logger.info("No valid runner detected!")
|
29
|
+
false
|
30
|
+
end
|
31
|
+
|
32
|
+
def rspecing?
|
33
|
+
(File.basename($0) =~ /\Arspec/) == 0
|
34
|
+
end
|
35
|
+
|
36
|
+
def raking?
|
37
|
+
(File.basename($0) =~ /\Arake/) == 0
|
38
|
+
end
|
39
|
+
|
40
|
+
def const_defined?(string_const)
|
41
|
+
begin
|
42
|
+
Object.const_get(string_const)
|
43
|
+
true
|
44
|
+
rescue NameError
|
45
|
+
false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module AppPerfRpm
|
4
|
+
class << self
|
5
|
+
attr_accessor :logger
|
6
|
+
end
|
7
|
+
|
8
|
+
class Logger
|
9
|
+
def info(msg)
|
10
|
+
AppPerfRpm.info(msg)
|
11
|
+
end
|
12
|
+
|
13
|
+
def debug(msg)
|
14
|
+
AppPerfRpm.info(msg)
|
15
|
+
end
|
16
|
+
|
17
|
+
def warn(msg)
|
18
|
+
AppPerfRpm.info(msg)
|
19
|
+
end
|
20
|
+
|
21
|
+
def error(msg)
|
22
|
+
AppPerfRpm.info(msg)
|
23
|
+
end
|
24
|
+
|
25
|
+
def fatal(msg)
|
26
|
+
AppPerfRpm.info(msg)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
AppPerfRpm.logger = Logger.new(STDERR)
|
32
|
+
AppPerfRpm.logger.level = Logger::INFO
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module AppPerfRpm
|
2
|
+
class Middleware
|
3
|
+
attr_reader :app
|
4
|
+
|
5
|
+
def initialize(app)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
begin
|
11
|
+
@status, @headers, @response = @app.call(env)
|
12
|
+
rescue Exception => e
|
13
|
+
handle_exception(env, e)
|
14
|
+
end
|
15
|
+
[@status, @headers, @response]
|
16
|
+
end
|
17
|
+
|
18
|
+
def handle_exception(env, exception)
|
19
|
+
::AppPerfRpm::Tracer.log_event("error",
|
20
|
+
"path" => env["PATH_INFO"],
|
21
|
+
"method" => env["REQUEST_METHOD"],
|
22
|
+
"message" => exception.message,
|
23
|
+
"error_class" => exception.class.to_s,
|
24
|
+
"backtrace" => ::AppPerfRpm::Backtrace.clean(exception.backtrace),
|
25
|
+
"source" => ::AppPerfRpm::Backtrace.source_extract(exception.backtrace)
|
26
|
+
)
|
27
|
+
raise exception
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
if defined?(::Rails)
|
2
|
+
if ::Rails::VERSION::MAJOR > 2
|
3
|
+
require 'app_perf_rpm/railtie'
|
4
|
+
else
|
5
|
+
Rails.configuration.after_initialize do
|
6
|
+
unless AppPerfRpm.disable_agent?
|
7
|
+
AppPerfRpm.load
|
8
|
+
Rails.configuration.middleware.use AppPerfRpm::Middleware
|
9
|
+
AppPerfRpm.logger.info "Initializing rack middleware tracer."
|
10
|
+
Rails.configuration.middleware.insert 0, AppPerfRpm::Instruments::Rack
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module AppPerfRpm
|
2
|
+
class Railtie < ::Rails::Railtie
|
3
|
+
require 'app_perf_rpm/instruments/rack'
|
4
|
+
|
5
|
+
# TODO: Why this isn't working with the initializer?
|
6
|
+
initializer "app_perf.initialize" do |app|
|
7
|
+
unless AppPerfRpm.disable_agent?
|
8
|
+
app.middleware.use AppPerfRpm::Middleware
|
9
|
+
|
10
|
+
if ::AppPerfRpm.configuration.instrumentation[:rack][:enabled]
|
11
|
+
AppPerfRpm.logger.info "Initializing rack tracer."
|
12
|
+
app.middleware.insert 0, AppPerfRpm::Instruments::Rack
|
13
|
+
|
14
|
+
if AppPerfRpm.configuration.instrumentation[:rack][:trace_middleware]
|
15
|
+
AppPerfRpm.logger.info "Initializing rack middleware tracer."
|
16
|
+
require 'app_perf_rpm/instruments/rack_middleware'
|
17
|
+
app.middleware.insert 1, AppPerfRpm::Instruments::RackMiddleware
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
config.after_initialize do
|
23
|
+
AppPerfRpm.configuration.app_root = Rails.root
|
24
|
+
AppPerfRpm.configuration.reload
|
25
|
+
AppPerfRpm.load
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module AppPerfRpm
|
2
|
+
class Span
|
3
|
+
attr_accessor :layer,
|
4
|
+
:controller,
|
5
|
+
:action,
|
6
|
+
:url,
|
7
|
+
:domain,
|
8
|
+
:type,
|
9
|
+
:backtrace,
|
10
|
+
:source,
|
11
|
+
:trace_id,
|
12
|
+
:started_at,
|
13
|
+
:ended_at,
|
14
|
+
:children,
|
15
|
+
:options
|
16
|
+
|
17
|
+
def self.arrange(spans)
|
18
|
+
spans.sort! { |a, b| (a.ended_at <=> b.ended_at) }
|
19
|
+
|
20
|
+
null_span = Span.new
|
21
|
+
controller = (spans.find {|s| s.controller } || null_span).controller
|
22
|
+
action = (spans.find {|s| s.action } || null_span).action
|
23
|
+
domain = (spans.find {|s| s.domain } || null_span).domain
|
24
|
+
url = (spans.find {|s| s.url } || null_span).url
|
25
|
+
|
26
|
+
while span = spans.shift
|
27
|
+
span.controller ||= controller
|
28
|
+
span.action ||= action
|
29
|
+
span.domain ||= domain
|
30
|
+
span.url ||= url
|
31
|
+
|
32
|
+
if parent = spans.find { |n| n.parent_of?(span) }
|
33
|
+
parent.children << span
|
34
|
+
elsif spans.empty?
|
35
|
+
root = span
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
root
|
40
|
+
end
|
41
|
+
|
42
|
+
def initialize
|
43
|
+
self.children = []
|
44
|
+
self.type = "web"
|
45
|
+
self.options = {}
|
46
|
+
end
|
47
|
+
|
48
|
+
def duration
|
49
|
+
@duration ||= (ended_at - started_at) * 1000.0
|
50
|
+
end
|
51
|
+
|
52
|
+
def exclusive_duration
|
53
|
+
@exclusive_duration ||= duration - children.inject(0.0) { |sum, child| sum + child.duration }
|
54
|
+
end
|
55
|
+
|
56
|
+
def parent_of?(span)
|
57
|
+
start = (started_at - span.started_at) * 1000.0
|
58
|
+
start <= 0 && (start + duration >= span.duration)
|
59
|
+
end
|
60
|
+
|
61
|
+
def child_of?(span)
|
62
|
+
span.parent_of?(self)
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_spans
|
66
|
+
span = self.dup
|
67
|
+
span.exclusive_duration
|
68
|
+
span.children = []
|
69
|
+
|
70
|
+
if children.size > 0
|
71
|
+
return [span] + children.map(&:to_spans)
|
72
|
+
else
|
73
|
+
return [span]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def base_options
|
78
|
+
opts = {}
|
79
|
+
opts["domain"] = domain
|
80
|
+
opts["controller"] = controller
|
81
|
+
opts["action"] = action
|
82
|
+
opts["url"] = url
|
83
|
+
opts["type"] = type
|
84
|
+
#opts["backtrace"] = ::AppPerfRpm::Backtrace.backtrace
|
85
|
+
opts["source"] = ::AppPerfRpm::Backtrace.source_extract
|
86
|
+
opts.delete_if { |k, v| v.nil? }
|
87
|
+
end
|
88
|
+
|
89
|
+
def to_s
|
90
|
+
"#{layer}:#{trace_id}:#{started_at}:#{exclusive_duration}"
|
91
|
+
end
|
92
|
+
|
93
|
+
def to_a
|
94
|
+
[
|
95
|
+
layer,
|
96
|
+
trace_id,
|
97
|
+
started_at,
|
98
|
+
duration,
|
99
|
+
base_options.merge(options)
|
100
|
+
]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
module AppPerfRpm
|
2
|
+
class Tracer
|
3
|
+
class << self
|
4
|
+
def trace_id
|
5
|
+
Thread.current[:trace_id]
|
6
|
+
end
|
7
|
+
|
8
|
+
def trace_id=(t)
|
9
|
+
Thread.current[:trace_id] = t
|
10
|
+
end
|
11
|
+
|
12
|
+
def tracing?
|
13
|
+
Thread.current[:trace_id]
|
14
|
+
end
|
15
|
+
|
16
|
+
def in_trace?
|
17
|
+
!Thread.current[:trace_id].nil?
|
18
|
+
end
|
19
|
+
|
20
|
+
def start_span(layer, opts = {})
|
21
|
+
Instance.new(layer, opts)
|
22
|
+
end
|
23
|
+
|
24
|
+
def random_percentage
|
25
|
+
rand * 100
|
26
|
+
end
|
27
|
+
|
28
|
+
def should_trace?
|
29
|
+
random_percentage < ::AppPerfRpm.configuration.sample_rate.to_i
|
30
|
+
end
|
31
|
+
|
32
|
+
def start_trace(layer, opts = {})
|
33
|
+
start = Time.now.to_f
|
34
|
+
|
35
|
+
trace_id = opts.delete("trace_id")
|
36
|
+
if trace_id || should_trace?
|
37
|
+
self.trace_id = trace_id || generate_trace_id
|
38
|
+
result = trace(layer, opts) do |span|
|
39
|
+
yield(span)
|
40
|
+
end
|
41
|
+
self.trace_id = nil
|
42
|
+
else
|
43
|
+
result = yield
|
44
|
+
end
|
45
|
+
|
46
|
+
return result, (Time.now.to_f - start) * 1000
|
47
|
+
end
|
48
|
+
|
49
|
+
def trace(layer, opts = {})
|
50
|
+
result = nil
|
51
|
+
|
52
|
+
if tracing?
|
53
|
+
span = Span.new
|
54
|
+
span.layer = layer
|
55
|
+
span.trace_id = self.trace_id
|
56
|
+
span.started_at = Time.now.to_f
|
57
|
+
result = yield(span)
|
58
|
+
span.ended_at = Time.now.to_f
|
59
|
+
span.options.merge!(opts)
|
60
|
+
::AppPerfRpm.store(span)
|
61
|
+
else
|
62
|
+
result = yield
|
63
|
+
end
|
64
|
+
|
65
|
+
result
|
66
|
+
end
|
67
|
+
|
68
|
+
def profile(layer, opts = {})
|
69
|
+
if defined?(TracePoint)
|
70
|
+
@times = {}
|
71
|
+
traces = []
|
72
|
+
tracer = TracePoint.new(:call, :return) do |tp|
|
73
|
+
backtrace = caller(0)
|
74
|
+
key = "#{tp.defined_class}_#{tp.method_id}_#{backtrace.size}"
|
75
|
+
if tp.event == :call
|
76
|
+
@times[key] = Time.now.to_f
|
77
|
+
else
|
78
|
+
if @times[key]
|
79
|
+
@times[key] = Time.now.to_f - @times[key].to_f
|
80
|
+
traces << {
|
81
|
+
"duration "=> @times[key].to_f,
|
82
|
+
"class" => tp.defined_class,
|
83
|
+
"method" => tp.method_id,
|
84
|
+
"backtrace" => backtrace,
|
85
|
+
"line" => ::AppPerfRpm::Backtrace.send(:clean_line, tp.path),
|
86
|
+
"line_number" => tp.lineno
|
87
|
+
}
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
result = tracer.enable { yield }
|
93
|
+
@times = {}
|
94
|
+
|
95
|
+
return traces, result
|
96
|
+
else
|
97
|
+
return [], yield
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def log_event(event, opts = {})
|
102
|
+
::AppPerfRpm.store([event, generate_trace_id, Time.now.to_f, opts])
|
103
|
+
end
|
104
|
+
|
105
|
+
def generate_trace_id
|
106
|
+
Digest::SHA1.hexdigest([Time.now, rand].join)
|
107
|
+
end
|
108
|
+
|
109
|
+
class Instance
|
110
|
+
attr_accessor :layer, :opts, :start, :duration
|
111
|
+
|
112
|
+
def initialize(layer, opts = {})
|
113
|
+
@span = Span.new
|
114
|
+
@span.layer = layer
|
115
|
+
@span.options = opts
|
116
|
+
@span.started_at = Time.now.to_f
|
117
|
+
end
|
118
|
+
|
119
|
+
def finish(opts = {})
|
120
|
+
@span.options.merge!(opts)
|
121
|
+
@span.ended_at = Time.now.to_f
|
122
|
+
end
|
123
|
+
|
124
|
+
def submit(opts = {})
|
125
|
+
if ::AppPerfRpm::Tracer.tracing?
|
126
|
+
@span.options.merge!(opts)
|
127
|
+
::AppPerfRpm.store(@span)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
def trace_id
|
134
|
+
::AppPerfRpm::Tracer.trace_id
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module AppPerfRpm
|
2
|
+
class Worker
|
3
|
+
def initialize
|
4
|
+
AppPerfRpm.logger.info "Starting worker."
|
5
|
+
@dispatcher = Dispatcher.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def save(event)
|
9
|
+
start
|
10
|
+
return if event.nil?
|
11
|
+
@dispatcher.add_event(event)
|
12
|
+
end
|
13
|
+
|
14
|
+
def start
|
15
|
+
return if worker_running?
|
16
|
+
::AppPerfRpm.mutex.synchronize do
|
17
|
+
return if worker_running?
|
18
|
+
start_dispatcher
|
19
|
+
::AppPerfRpm.logger.info "Worker is running."
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def worker_running?
|
24
|
+
@worker_thread && @worker_thread.alive?
|
25
|
+
end
|
26
|
+
|
27
|
+
def start_dispatcher
|
28
|
+
@worker_thread = Thread.new do
|
29
|
+
::AppPerfRpm.configuration.reload
|
30
|
+
@dispatcher.reset
|
31
|
+
|
32
|
+
loop do
|
33
|
+
start = Time.now
|
34
|
+
if @dispatcher.ready?
|
35
|
+
@dispatcher.dispatch
|
36
|
+
@dispatcher.reset
|
37
|
+
end
|
38
|
+
sleep_for = (start + 15 - Time.now)
|
39
|
+
sleep_for = 1 if sleep_for < 1
|
40
|
+
sleep sleep_for
|
41
|
+
end
|
42
|
+
end
|
43
|
+
@worker_thread.abort_on_exception = true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/app_perf_rpm.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'oj'
|
2
|
+
|
3
|
+
module AppPerfRpm
|
4
|
+
require 'app_perf_rpm/logger'
|
5
|
+
require 'app_perf_rpm/configuration'
|
6
|
+
require 'app_perf_rpm/span'
|
7
|
+
require 'app_perf_rpm/aggregator'
|
8
|
+
require 'app_perf_rpm/dispatcher'
|
9
|
+
require 'app_perf_rpm/worker'
|
10
|
+
require 'app_perf_rpm/backtrace'
|
11
|
+
require 'app_perf_rpm/tracer'
|
12
|
+
require 'app_perf_rpm/utils'
|
13
|
+
require 'app_perf_rpm/middleware'
|
14
|
+
require 'app_perf_rpm/instrumentation'
|
15
|
+
require 'app_perf_rpm/rails'
|
16
|
+
require 'app_perf_rpm/introspector'
|
17
|
+
|
18
|
+
class << self
|
19
|
+
attr_writer :configuration
|
20
|
+
|
21
|
+
def configuration
|
22
|
+
@configuration ||= Configuration.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def configure
|
26
|
+
yield(configuration)
|
27
|
+
end
|
28
|
+
|
29
|
+
def load
|
30
|
+
#Oj.mimic_JSON
|
31
|
+
unless disable_agent?
|
32
|
+
AppPerfRpm::Instrumentation.load
|
33
|
+
@worker = ::AppPerfRpm::Worker.new
|
34
|
+
|
35
|
+
if @worker.start
|
36
|
+
@worker_running = true
|
37
|
+
AppPerfRpm.tracing_on
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def worker
|
43
|
+
@worker
|
44
|
+
end
|
45
|
+
|
46
|
+
def mutex
|
47
|
+
@mutex ||= Mutex.new
|
48
|
+
end
|
49
|
+
|
50
|
+
def store(event)
|
51
|
+
if @worker_running && tracing?
|
52
|
+
@worker.save(event)
|
53
|
+
end
|
54
|
+
event
|
55
|
+
end
|
56
|
+
|
57
|
+
def tracing_on
|
58
|
+
if @without_tracing_enabled
|
59
|
+
AppPerfRpm.logger.debug "Not turning tracing on due to without tracing mode."
|
60
|
+
return
|
61
|
+
end
|
62
|
+
mutex.synchronize do
|
63
|
+
AppPerfRpm.logger.debug "Enabling tracing."
|
64
|
+
@tracing = true
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def tracing_off
|
69
|
+
mutex.synchronize do
|
70
|
+
AppPerfRpm.logger.debug "Disabling tracing."
|
71
|
+
@tracing = false
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def tracing?
|
76
|
+
@tracing
|
77
|
+
end
|
78
|
+
|
79
|
+
def without_tracing
|
80
|
+
@previously_tracing = AppPerfRpm.tracing?
|
81
|
+
@without_tracing_enabled = true
|
82
|
+
AppPerfRpm.tracing_off
|
83
|
+
yield if block_given?
|
84
|
+
@without_tracing_enabled = false
|
85
|
+
ensure
|
86
|
+
AppPerfRpm.tracing_on if @previously_tracing
|
87
|
+
end
|
88
|
+
|
89
|
+
def host
|
90
|
+
@host ||= Socket.gethostname
|
91
|
+
end
|
92
|
+
|
93
|
+
def round_time(t, sec = 1)
|
94
|
+
t = Time.parse(t.to_s)
|
95
|
+
|
96
|
+
down = t - (t.to_i % sec)
|
97
|
+
up = down + sec
|
98
|
+
|
99
|
+
difference_down = t - down
|
100
|
+
difference_up = up - t
|
101
|
+
|
102
|
+
if (difference_down < difference_up)
|
103
|
+
return down
|
104
|
+
else
|
105
|
+
return up
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def floor_time(t, sec = 1)
|
110
|
+
Time.at((t.to_f / sec).floor * sec)
|
111
|
+
end
|
112
|
+
|
113
|
+
def disable_agent?
|
114
|
+
if configuration.agent_disabled
|
115
|
+
true
|
116
|
+
elsif Introspector.agentable?
|
117
|
+
false
|
118
|
+
else
|
119
|
+
true
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|