oboe 1.3.7 → 1.3.8
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.
- data/lib/joboe_metal.rb +118 -0
- data/lib/method_profiling.rb +79 -0
- data/lib/oboe.rb +10 -3
- data/lib/oboe/api.rb +0 -7
- data/lib/oboe/api/layerinit.rb +4 -12
- data/lib/oboe/api/logging.rb +2 -25
- data/lib/oboe/api/tracing.rb +1 -15
- data/lib/oboe/api/util.rb +14 -7
- data/lib/oboe/loading.rb +1 -1
- data/lib/oboe/version.rb +1 -1
- data/lib/oboe_metal.rb +16 -82
- metadata +5 -3
data/lib/joboe_metal.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
# Copyright (c) 2012 by Tracelytics, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
|
4
|
+
module Oboe_metal
|
5
|
+
include_package 'com.tracelytics.joboe'
|
6
|
+
import 'com.tracelytics.joboe'
|
7
|
+
include_package 'com.tracelytics.joboe.Context'
|
8
|
+
import 'com.tracelytics.joboe.Context'
|
9
|
+
include_package 'com.tracelytics.joboe.Event'
|
10
|
+
import 'com.tracelytics.joboe.Event'
|
11
|
+
|
12
|
+
class Context
|
13
|
+
def self.log(layer, label, options = {}, with_backtrace = true)
|
14
|
+
evt = Oboe::Context.createEvent()
|
15
|
+
evt.addInfo("Layer", layer.to_s)
|
16
|
+
evt.addInfo("Label", label.to_s)
|
17
|
+
|
18
|
+
options.each_pair do |k, v|
|
19
|
+
evt.addInfo(k.to_s, v.to_s)
|
20
|
+
end
|
21
|
+
|
22
|
+
evt.addInfo("Backtrace", Oboe::API.backtrace) if with_backtrace
|
23
|
+
|
24
|
+
Oboe::Reporter.sendReport(evt)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.layer_op=(op)
|
28
|
+
@layer_op = op
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.layer_op
|
32
|
+
@layer_op
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.tracing_layer_op?(operation)
|
36
|
+
if operation.is_a?(Array)
|
37
|
+
return operation.include?(@layer_op)
|
38
|
+
else
|
39
|
+
return @layer_op == operation
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.toString
|
44
|
+
md = getMetadata.toString
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.clear
|
48
|
+
clearMetadata
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.get
|
52
|
+
getMetadata
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class Event
|
57
|
+
def self.metadataString(evt)
|
58
|
+
evt.getMetadata.toHexString
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def UdpReporter
|
63
|
+
Java::ComTracelyticsJoboe
|
64
|
+
end
|
65
|
+
|
66
|
+
module Metadata
|
67
|
+
Java::ComTracelyticsJoboeMetaData
|
68
|
+
end
|
69
|
+
|
70
|
+
module Reporter
|
71
|
+
def self.sendReport(evt)
|
72
|
+
evt.report
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
module Oboe
|
78
|
+
include Oboe_metal
|
79
|
+
|
80
|
+
# TODO: Ensure that the :tracing_mode is set to "always", "through", or "never"
|
81
|
+
Config = {
|
82
|
+
:tracing_mode => "through",
|
83
|
+
:reporter_host => "127.0.0.1",
|
84
|
+
:sample_rate => 1000000
|
85
|
+
}
|
86
|
+
|
87
|
+
def self.passthrough?
|
88
|
+
["always", "through"].include?(Oboe::Config[:tracing_mode])
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.always?
|
92
|
+
Oboe::Config[:tracing_mode] == "always"
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.through?
|
96
|
+
Oboe::Config[:tracing_mode] == "through"
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.never?
|
100
|
+
Oboe::Config[:tracing_mode] == "never"
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.now?
|
104
|
+
Oboe::Context.isValid and not Oboe.never?
|
105
|
+
end
|
106
|
+
|
107
|
+
def self.start?
|
108
|
+
not Oboe::Context.isValid and Oboe.always?
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.continue?
|
112
|
+
Oboe::Context.isValid and not Oboe.never?
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.log(layer, label, options = {})
|
116
|
+
Context.log(layer, label, options = options)
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# Copyright (c) 2012 by Tracelytics, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
|
4
|
+
module OboeMethodProfiling
|
5
|
+
def self.included klass
|
6
|
+
klass.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def profile_method(method_name, profile_name, store_args=false, store_return=false, profile=false)
|
11
|
+
#this only gets file and line where profiling is turned on, presumably
|
12
|
+
#right after the function definition. ruby 1.9 has nice introspection (Method.source_location)
|
13
|
+
#but its appears no such luck for ruby 1.8
|
14
|
+
version = RbConfig::CONFIG['ruby_version']
|
15
|
+
file = nil
|
16
|
+
line = nil
|
17
|
+
if version and version.match(/^1.9/)
|
18
|
+
info = self.method(method_name).source_location
|
19
|
+
if !info.nil?
|
20
|
+
file = info[0]
|
21
|
+
line = info[1]
|
22
|
+
end
|
23
|
+
else
|
24
|
+
info = Kernel.caller[0].split(':')
|
25
|
+
file = info.first
|
26
|
+
line = info.last
|
27
|
+
end
|
28
|
+
|
29
|
+
#profiling via ruby-prof, is it possible to get return value of profiled code?
|
30
|
+
code = "def _oboe_profiled_#{method_name}(*args, &block)
|
31
|
+
def pps(*args)
|
32
|
+
old_out = $stdout
|
33
|
+
begin
|
34
|
+
s = StringIO.new
|
35
|
+
$stdout = s
|
36
|
+
pp(*args)
|
37
|
+
ensure
|
38
|
+
$stdout = old_out
|
39
|
+
end
|
40
|
+
s.string
|
41
|
+
end
|
42
|
+
|
43
|
+
# file and line number are fetched in Context.log
|
44
|
+
# because we have access to the correct backtrace there
|
45
|
+
entry_kvs = {'Language' => 'ruby',
|
46
|
+
'ProfileName' => '#{profile_name}',
|
47
|
+
'FunctionName' => '#{method_name}',
|
48
|
+
'Class' => self.class.to_s.rpartition('::').last,
|
49
|
+
'Module' => self.class.to_s.rpartition('::').first,
|
50
|
+
'File' => '#{file}',
|
51
|
+
'LineNumber' => '#{line}'
|
52
|
+
}
|
53
|
+
|
54
|
+
if #{store_args}
|
55
|
+
entry_kvs['Args'] = pps *args
|
56
|
+
end
|
57
|
+
|
58
|
+
Oboe::Context.log(nil, 'profile_entry', entry_kvs)
|
59
|
+
|
60
|
+
ret = _oboe_orig_#{method_name}(*args, &block)
|
61
|
+
|
62
|
+
exit_kvs = {'Language' => 'ruby',
|
63
|
+
'ProfileName' => '#{profile_name}'
|
64
|
+
}
|
65
|
+
|
66
|
+
if #{store_return}
|
67
|
+
exit_kvs['ReturnValue'] = pps ret
|
68
|
+
end
|
69
|
+
|
70
|
+
Oboe::Context.log(nil, 'profile_exit', exit_kvs)
|
71
|
+
|
72
|
+
ret
|
73
|
+
end"
|
74
|
+
class_eval code, __FILE__, __LINE__
|
75
|
+
alias_method "_oboe_orig_#{method_name}", method_name
|
76
|
+
alias_method method_name, "_oboe_profiled_#{method_name}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/lib/oboe.rb
CHANGED
@@ -1,10 +1,17 @@
|
|
1
1
|
# Copyright (c) 2012 by Tracelytics, Inc.
|
2
2
|
# All rights reserved.
|
3
|
-
|
3
|
+
|
4
4
|
begin
|
5
|
-
require 'oboe_metal.so'
|
6
5
|
require 'rbconfig'
|
7
|
-
|
6
|
+
if RUBY_PLATFORM == 'java'
|
7
|
+
require '/usr/local/tracelytics/tracelyticsagent.jar'
|
8
|
+
require 'joboe_metal'
|
9
|
+
else
|
10
|
+
require 'oboe_metal.so'
|
11
|
+
require 'oboe_metal'
|
12
|
+
end
|
13
|
+
require 'rbconfig'
|
14
|
+
require 'method_profiling'
|
8
15
|
require 'oboe/config'
|
9
16
|
require 'oboe/loading'
|
10
17
|
|
data/lib/oboe/api.rb
CHANGED
@@ -8,13 +8,6 @@ module Oboe
|
|
8
8
|
extend Oboe::API::Tracing
|
9
9
|
extend Oboe::API::LayerInit
|
10
10
|
end
|
11
|
-
|
12
|
-
def self.extend_with_noop
|
13
|
-
extend Oboe::API::LoggingNoop
|
14
|
-
extend Oboe::API::TracingNoop
|
15
|
-
extend Oboe::API::LayerInitNoop
|
16
|
-
end
|
17
|
-
|
18
11
|
extend Oboe::API::Util
|
19
12
|
end
|
20
13
|
end
|
data/lib/oboe/api/layerinit.rb
CHANGED
@@ -7,9 +7,10 @@ module Oboe
|
|
7
7
|
#
|
8
8
|
def report_init(layer)
|
9
9
|
platform_info = { '__Init' => 1 }
|
10
|
-
platform_info['
|
11
|
-
platform_info['
|
12
|
-
platform_info['
|
10
|
+
platform_info['RubyPlatform'] = RUBY_PLATFORM
|
11
|
+
platform_info['RubyVersion'] = RUBY_VERSION
|
12
|
+
platform_info['RailsVersion'] = ::Rails.version if defined?(Rails)
|
13
|
+
platform_info['OboeVersion'] = Gem.loaded_specs['oboe'].try(:version).to_s
|
13
14
|
|
14
15
|
force_trace do
|
15
16
|
start_trace(layer, nil, platform_info) { }
|
@@ -24,14 +25,5 @@ module Oboe
|
|
24
25
|
Oboe::Config[:tracing_mode] = saved_mode
|
25
26
|
end
|
26
27
|
end
|
27
|
-
|
28
|
-
module LayerInitNoop
|
29
|
-
def report_init(layer)
|
30
|
-
end
|
31
|
-
|
32
|
-
def force_trace
|
33
|
-
yield
|
34
|
-
end
|
35
|
-
end
|
36
28
|
end
|
37
29
|
end
|
data/lib/oboe/api/logging.rb
CHANGED
@@ -116,31 +116,8 @@ module Oboe
|
|
116
116
|
opts.each do |k, v|
|
117
117
|
event.addInfo(k.to_s, v.to_s) if valid_key? k
|
118
118
|
end if !opts.nil? and opts.any?
|
119
|
-
|
120
|
-
Oboe.
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
module LoggingNoop
|
125
|
-
def log(layer, label, opts={})
|
126
|
-
end
|
127
|
-
|
128
|
-
def log_exception(layer, exn)
|
129
|
-
end
|
130
|
-
|
131
|
-
def log_start(layer, xtrace, opts={})
|
132
|
-
end
|
133
|
-
|
134
|
-
def log_end(layer, opts={})
|
135
|
-
end
|
136
|
-
|
137
|
-
def log_entry(layer, opts={})
|
138
|
-
end
|
139
|
-
|
140
|
-
def log_exit(layer, opts={})
|
141
|
-
end
|
142
|
-
|
143
|
-
def log_event(layer, label, event, opts={})
|
119
|
+
|
120
|
+
Oboe::Reporter.sendReport(event)
|
144
121
|
end
|
145
122
|
end
|
146
123
|
end
|
data/lib/oboe/api/tracing.rb
CHANGED
@@ -118,7 +118,7 @@ module Oboe
|
|
118
118
|
log_start(layer, xtrace, opts)
|
119
119
|
exit_evt = Oboe::Context.createEvent
|
120
120
|
begin
|
121
|
-
target['X-Trace'] =
|
121
|
+
target['X-Trace'] = Oboe::Event.metadataString(exit_evt) if Oboe::Config.tracing?
|
122
122
|
yield
|
123
123
|
rescue Exception => e
|
124
124
|
log_exception(layer, e)
|
@@ -130,19 +130,5 @@ module Oboe
|
|
130
130
|
end
|
131
131
|
end
|
132
132
|
end
|
133
|
-
|
134
|
-
module TracingNoop
|
135
|
-
def trace(layer, opts={})
|
136
|
-
yield
|
137
|
-
end
|
138
|
-
|
139
|
-
def start_trace(layer, xtrace, opts={})
|
140
|
-
[yield, xtrace]
|
141
|
-
end
|
142
|
-
|
143
|
-
def start_trace_with_target(layer, xtrace, target, opts={})
|
144
|
-
yield
|
145
|
-
end
|
146
|
-
end
|
147
133
|
end
|
148
134
|
end
|
data/lib/oboe/api/util.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
module Oboe
|
5
5
|
module API
|
6
6
|
module Util
|
7
|
-
BACKTRACE_CUTOFF =
|
7
|
+
BACKTRACE_CUTOFF = 200
|
8
8
|
|
9
9
|
# Internal: Check whether the provided key is reserved or not. Reserved
|
10
10
|
# keys are either keys that are handled by liboboe calls or the oboe gem.
|
@@ -24,13 +24,20 @@ module Oboe
|
|
24
24
|
#
|
25
25
|
# Returns a string with each frame of the backtrace separated by '\r\n'.
|
26
26
|
def backtrace(ignore=1)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
trim_backtrace(Kernel.caller).join("\r\n");
|
28
|
+
end
|
29
|
+
|
30
|
+
def trim_backtrace(backtrace)
|
31
|
+
return backtrace unless backtrace.is_a?(Array)
|
32
|
+
|
33
|
+
length = backtrace.size
|
34
|
+
if length > BACKTRACE_CUTOFF
|
35
|
+
# Trim backtraces by getting the first 180 and last 20 lines
|
36
|
+
trimmed = backtrace[0, 180] + ['...[snip]...'] + backtrace[length - 20, 20]
|
31
37
|
else
|
32
|
-
|
33
|
-
end
|
38
|
+
trimmed = backtrace
|
39
|
+
end
|
40
|
+
trimmed
|
34
41
|
end
|
35
42
|
end
|
36
43
|
end
|
data/lib/oboe/loading.rb
CHANGED
data/lib/oboe/version.rb
CHANGED
data/lib/oboe_metal.rb
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
# All rights reserved.
|
3
3
|
|
4
4
|
module Oboe_metal
|
5
|
+
class Event
|
6
|
+
def self.metadataString(evt)
|
7
|
+
evt.metadataString()
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
5
11
|
class Context
|
6
12
|
def self.log(layer, label, options = {}, with_backtrace = true)
|
7
13
|
evt = Oboe::Context.createEvent()
|
@@ -12,9 +18,9 @@ module Oboe_metal
|
|
12
18
|
evt.addInfo(k.to_s, v.to_s)
|
13
19
|
end
|
14
20
|
|
15
|
-
evt.addInfo("Backtrace",
|
21
|
+
evt.addInfo("Backtrace", Oboe::API.backtrace) if with_backtrace
|
16
22
|
|
17
|
-
Oboe.
|
23
|
+
Oboe::Reporter.sendReport(evt)
|
18
24
|
end
|
19
25
|
|
20
26
|
def self.layer_op=(op)
|
@@ -33,86 +39,14 @@ module Oboe_metal
|
|
33
39
|
end
|
34
40
|
end
|
35
41
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
def self.included klass
|
41
|
-
klass.extend ClassMethods
|
42
|
-
end
|
43
|
-
|
44
|
-
module ClassMethods
|
45
|
-
def profile_method(method_name, profile_name, store_args=false, store_return=false, profile=false)
|
46
|
-
#this only gets file and line where profiling is turned on, presumably
|
47
|
-
#right after the function definition. ruby 1.9 has nice introspection (Method.source_location)
|
48
|
-
#but its appears no such luck for ruby 1.8
|
49
|
-
version = RbConfig::CONFIG['ruby_version']
|
50
|
-
file = nil
|
51
|
-
line = nil
|
52
|
-
if version and version.match(/^1.9/)
|
53
|
-
info = self.method(method_name).source_location
|
54
|
-
if !info.nil?
|
55
|
-
file = info[0]
|
56
|
-
line = info[1]
|
57
|
-
end
|
58
|
-
else
|
59
|
-
info = Kernel.caller[0].split(':')
|
60
|
-
file = info.first
|
61
|
-
line = info.last
|
62
|
-
end
|
63
|
-
|
64
|
-
#profiling via ruby-prof, is it possible to get return value of profiled code?
|
65
|
-
code = "def _oboe_profiled_#{method_name}(*args, &block)
|
66
|
-
def pps(*args)
|
67
|
-
old_out = $stdout
|
68
|
-
begin
|
69
|
-
s = StringIO.new
|
70
|
-
$stdout = s
|
71
|
-
pp(*args)
|
72
|
-
ensure
|
73
|
-
$stdout = old_out
|
74
|
-
end
|
75
|
-
s.string
|
76
|
-
end
|
77
|
-
|
78
|
-
# file and line number are fetched in Context.log
|
79
|
-
# because we have access to the correct backtrace there
|
80
|
-
entry_kvs = {'Language' => 'ruby',
|
81
|
-
'ProfileName' => '#{profile_name}',
|
82
|
-
'FunctionName' => '#{method_name}',
|
83
|
-
'Class' => self.class.to_s.rpartition('::').last,
|
84
|
-
'Module' => self.class.to_s.rpartition('::').first,
|
85
|
-
'File' => '#{file}',
|
86
|
-
'LineNumber' => '#{line}'
|
87
|
-
}
|
88
|
-
|
89
|
-
if #{store_args}
|
90
|
-
entry_kvs['Args'] = pps *args
|
91
|
-
end
|
92
|
-
|
93
|
-
Oboe::Context.log(nil, 'profile_entry', entry_kvs)
|
94
|
-
|
95
|
-
ret = _oboe_orig_#{method_name}(*args, &block)
|
96
|
-
|
97
|
-
exit_kvs = {'Language' => 'ruby',
|
98
|
-
'ProfileName' => '#{profile_name}'
|
99
|
-
}
|
100
|
-
|
101
|
-
if #{store_return}
|
102
|
-
exit_kvs['ReturnValue'] = pps ret
|
103
|
-
end
|
104
|
-
|
105
|
-
Oboe::Context.log(nil, 'profile_exit', exit_kvs)
|
106
|
-
|
107
|
-
ret
|
108
|
-
end"
|
109
|
-
class_eval code, __FILE__, __LINE__
|
110
|
-
alias_method "_oboe_orig_#{method_name}", method_name
|
111
|
-
alias_method method_name, "_oboe_profiled_#{method_name}"
|
112
|
-
end
|
42
|
+
|
43
|
+
module Reporter
|
44
|
+
def self.sendReport(evt)
|
45
|
+
Oboe.reporter.sendReport(evt)
|
113
46
|
end
|
47
|
+
end
|
114
48
|
end
|
115
|
-
|
49
|
+
|
116
50
|
module Oboe
|
117
51
|
include Oboe_metal
|
118
52
|
|
@@ -159,9 +93,9 @@ module Oboe
|
|
159
93
|
if !@reporter
|
160
94
|
@reporter = Oboe::UdpReporter.new(Oboe::Config[:reporter_host])
|
161
95
|
end
|
162
|
-
|
163
96
|
return @reporter
|
164
97
|
end
|
165
98
|
end
|
166
99
|
|
167
|
-
Oboe_metal::Context.init()
|
100
|
+
Oboe_metal::Context.init()
|
101
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oboe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,9 +9,9 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-04 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
|
-
description: The oboe gem provides
|
14
|
+
description: The oboe gem provides AppNeta instrumentation for Ruby and Ruby frameworks.
|
15
15
|
email: contact@tracelytics.com
|
16
16
|
executables: []
|
17
17
|
extensions:
|
@@ -20,6 +20,7 @@ extra_rdoc_files:
|
|
20
20
|
- LICENSE
|
21
21
|
files:
|
22
22
|
- lib/oboe_metal.rb
|
23
|
+
- lib/joboe_metal.rb
|
23
24
|
- lib/oboe.rb
|
24
25
|
- lib/oboe/loading.rb
|
25
26
|
- lib/oboe/api.rb
|
@@ -42,6 +43,7 @@ files:
|
|
42
43
|
- lib/oboe/frameworks/rails/inst/cassandra.rb
|
43
44
|
- lib/oboe/frameworks/rails/inst/memcached.rb
|
44
45
|
- lib/oboe/frameworks/rails/rails.rb
|
46
|
+
- lib/method_profiling.rb
|
45
47
|
- lib/oboe_fu.rb
|
46
48
|
- lib/rails/generators/oboe/install_generator.rb
|
47
49
|
- lib/rails/generators/oboe/templates/oboe_initializer.rb
|