oboe 2.7.0.3-java

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 (102) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.travis.yml +51 -0
  4. data/Appraisals +10 -0
  5. data/CHANGELOG.md +223 -0
  6. data/Gemfile +49 -0
  7. data/LICENSE +199 -0
  8. data/README.md +380 -0
  9. data/Rakefile +106 -0
  10. data/ext/oboe_metal/extconf.rb +61 -0
  11. data/ext/oboe_metal/noop/noop.c +7 -0
  12. data/ext/oboe_metal/src/bson/bson.h +221 -0
  13. data/ext/oboe_metal/src/bson/platform_hacks.h +91 -0
  14. data/ext/oboe_metal/src/oboe.h +275 -0
  15. data/ext/oboe_metal/src/oboe.hpp +352 -0
  16. data/ext/oboe_metal/src/oboe_wrap.cxx +3886 -0
  17. data/ext/oboe_metal/tests/test.rb +11 -0
  18. data/gemfiles/mongo.gemfile +33 -0
  19. data/gemfiles/moped.gemfile +33 -0
  20. data/get_version.rb +5 -0
  21. data/init.rb +4 -0
  22. data/lib/base.rb +99 -0
  23. data/lib/joboe_metal.rb +185 -0
  24. data/lib/method_profiling.rb +70 -0
  25. data/lib/oboe.rb +50 -0
  26. data/lib/oboe/api.rb +14 -0
  27. data/lib/oboe/api/layerinit.rb +99 -0
  28. data/lib/oboe/api/logging.rb +129 -0
  29. data/lib/oboe/api/memcache.rb +29 -0
  30. data/lib/oboe/api/profiling.rb +50 -0
  31. data/lib/oboe/api/tracing.rb +134 -0
  32. data/lib/oboe/api/util.rb +117 -0
  33. data/lib/oboe/config.rb +140 -0
  34. data/lib/oboe/frameworks/grape.rb +74 -0
  35. data/lib/oboe/frameworks/padrino.rb +66 -0
  36. data/lib/oboe/frameworks/padrino/templates.rb +59 -0
  37. data/lib/oboe/frameworks/rails.rb +139 -0
  38. data/lib/oboe/frameworks/rails/helpers/rum/rum_ajax_header.js.erb +5 -0
  39. data/lib/oboe/frameworks/rails/helpers/rum/rum_footer.js.erb +1 -0
  40. data/lib/oboe/frameworks/rails/helpers/rum/rum_header.js.erb +3 -0
  41. data/lib/oboe/frameworks/rails/inst/action_controller.rb +123 -0
  42. data/lib/oboe/frameworks/rails/inst/action_view.rb +56 -0
  43. data/lib/oboe/frameworks/rails/inst/action_view_2x.rb +54 -0
  44. data/lib/oboe/frameworks/rails/inst/action_view_30.rb +48 -0
  45. data/lib/oboe/frameworks/rails/inst/active_record.rb +24 -0
  46. data/lib/oboe/frameworks/rails/inst/connection_adapters/mysql.rb +43 -0
  47. data/lib/oboe/frameworks/rails/inst/connection_adapters/mysql2.rb +28 -0
  48. data/lib/oboe/frameworks/rails/inst/connection_adapters/oracle.rb +18 -0
  49. data/lib/oboe/frameworks/rails/inst/connection_adapters/postgresql.rb +30 -0
  50. data/lib/oboe/frameworks/rails/inst/connection_adapters/utils.rb +118 -0
  51. data/lib/oboe/frameworks/sinatra.rb +96 -0
  52. data/lib/oboe/frameworks/sinatra/templates.rb +56 -0
  53. data/lib/oboe/inst/cassandra.rb +281 -0
  54. data/lib/oboe/inst/dalli.rb +75 -0
  55. data/lib/oboe/inst/http.rb +72 -0
  56. data/lib/oboe/inst/memcache.rb +105 -0
  57. data/lib/oboe/inst/memcached.rb +96 -0
  58. data/lib/oboe/inst/mongo.rb +240 -0
  59. data/lib/oboe/inst/moped.rb +474 -0
  60. data/lib/oboe/inst/rack.rb +81 -0
  61. data/lib/oboe/inst/redis.rb +273 -0
  62. data/lib/oboe/inst/resque.rb +193 -0
  63. data/lib/oboe/instrumentation.rb +18 -0
  64. data/lib/oboe/loading.rb +98 -0
  65. data/lib/oboe/logger.rb +41 -0
  66. data/lib/oboe/ruby.rb +11 -0
  67. data/lib/oboe/util.rb +129 -0
  68. data/lib/oboe/version.rb +13 -0
  69. data/lib/oboe/xtrace.rb +52 -0
  70. data/lib/oboe_metal.rb +140 -0
  71. data/lib/rails/generators/oboe/install_generator.rb +76 -0
  72. data/lib/rails/generators/oboe/templates/oboe_initializer.rb +94 -0
  73. data/oboe.gemspec +29 -0
  74. data/release.sh +65 -0
  75. data/test/frameworks/apps/grape_simple.rb +10 -0
  76. data/test/frameworks/apps/padrino_simple.rb +41 -0
  77. data/test/frameworks/apps/sinatra_simple.rb +20 -0
  78. data/test/frameworks/grape_test.rb +27 -0
  79. data/test/frameworks/padrino_test.rb +25 -0
  80. data/test/frameworks/sinatra_test.rb +25 -0
  81. data/test/instrumentation/cassandra_test.rb +381 -0
  82. data/test/instrumentation/dalli_test.rb +164 -0
  83. data/test/instrumentation/http_test.rb +97 -0
  84. data/test/instrumentation/memcache_test.rb +251 -0
  85. data/test/instrumentation/memcached_test.rb +226 -0
  86. data/test/instrumentation/mongo_test.rb +462 -0
  87. data/test/instrumentation/moped_test.rb +473 -0
  88. data/test/instrumentation/rack_test.rb +73 -0
  89. data/test/instrumentation/redis_hashes_test.rb +265 -0
  90. data/test/instrumentation/redis_keys_test.rb +318 -0
  91. data/test/instrumentation/redis_lists_test.rb +310 -0
  92. data/test/instrumentation/redis_misc_test.rb +160 -0
  93. data/test/instrumentation/redis_sets_test.rb +293 -0
  94. data/test/instrumentation/redis_sortedsets_test.rb +325 -0
  95. data/test/instrumentation/redis_strings_test.rb +333 -0
  96. data/test/instrumentation/resque_test.rb +62 -0
  97. data/test/minitest_helper.rb +148 -0
  98. data/test/profiling/method_test.rb +198 -0
  99. data/test/support/config_test.rb +39 -0
  100. data/test/support/liboboe_settings_test.rb +46 -0
  101. data/test/support/xtrace_test.rb +35 -0
  102. metadata +200 -0
@@ -0,0 +1,117 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ require 'pp'
5
+
6
+ module Oboe
7
+ module API
8
+ module Util
9
+ BACKTRACE_CUTOFF = 200
10
+
11
+ # Internal: Check whether the provided key is reserved or not. Reserved
12
+ # keys are either keys that are handled by liboboe calls or the oboe gem.
13
+ #
14
+ # key - the key to check.
15
+ #
16
+ # Return a boolean indicating whether or not key is reserved.
17
+ def valid_key?(key)
18
+ !%w[ Label Layer Edge Timestamp Timestamp_u ].include? key.to_s
19
+ end
20
+
21
+ # Internal: Get the current backtrace.
22
+ #
23
+ # ignore - Number of frames to ignore at the end of the backtrace. Use
24
+ # when you know how many layers deep in oboe the call is being
25
+ # made.
26
+ #
27
+ # Returns a string with each frame of the backtrace separated by '\r\n'.
28
+ def backtrace(ignore=1)
29
+ trim_backtrace(Kernel.caller).join("\r\n")
30
+ end
31
+
32
+ # Internal: Trim a backtrace to a manageable size
33
+ #
34
+ # backtrace - the backtrace (an array of stack frames/from Kernel.caller)
35
+ #
36
+ # Returns a trimmed backtrace
37
+ def trim_backtrace(backtrace)
38
+ return backtrace unless backtrace.is_a?(Array)
39
+
40
+ length = backtrace.size
41
+ if length > BACKTRACE_CUTOFF
42
+ # Trim backtraces by getting the first 180 and last 20 lines
43
+ trimmed = backtrace[0, 180] + ['...[snip]...'] + backtrace[length - 20, 20]
44
+ else
45
+ trimmed = backtrace
46
+ end
47
+ trimmed
48
+ end
49
+
50
+ # Internal: Check if a host is blacklisted from tracing
51
+ #
52
+ # addr_port - the addr_port from Net::HTTP although this method
53
+ # can be used from any component in reality
54
+ #
55
+ # Returns a boolean on blacklisted state
56
+ def blacklisted?(addr_port)
57
+ return false unless Oboe::Config.blacklist
58
+
59
+ # Ensure that the blacklist is an array
60
+ unless Oboe::Config.blacklist.is_a?(Array)
61
+ val = Oboe::Config[:blacklist]
62
+ Oboe::Config[:blacklist] = [ val.to_s ]
63
+ end
64
+
65
+ Oboe::Config.blacklist.each do |h|
66
+ return true if addr_port.to_s.match(h.to_s)
67
+ end
68
+
69
+ false
70
+ end
71
+
72
+ # Internal: Pretty print a list of arguments for reporting
73
+ #
74
+ # args - the list of arguments to work on
75
+ #
76
+ # Returns a pretty string representation of arguments
77
+ def pps(*args)
78
+ old_out = $stdout
79
+ begin
80
+ s = StringIO.new
81
+ $stdout = s
82
+ pp(*args)
83
+ ensure
84
+ $stdout = old_out
85
+ end
86
+ s.string
87
+ end
88
+
89
+ # Internal: Determine a string to report representing klass
90
+ #
91
+ # args - an instance of a Class, a Class or a Module
92
+ #
93
+ # Returns a string representation of klass
94
+ def get_class_name(klass)
95
+ kv = {}
96
+ if klass.to_s =~ /::/
97
+ klass.class.to_s.rpartition('::').last
98
+ else
99
+ if klass.is_a?(Class) and klass.is_a?(Module)
100
+ # Class
101
+ kv["Class"] = klass.to_s
102
+
103
+ elsif (not klass.is_a?(Class) and not klass.is_a?(Module))
104
+ # Class instance
105
+ kv["Class"] = klass.class.to_s
106
+
107
+ else
108
+ # Module
109
+ kv["Module"] = klass.to_s
110
+ end
111
+ end
112
+ kv
113
+ end
114
+
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,140 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ module Oboe
5
+ ##
6
+ # This module exposes a nested configuration hash that can be used to
7
+ # configure and/or modify the functionality of the oboe gem.
8
+ #
9
+ # Use Oboe::Config.show to view the entire nested hash.
10
+ #
11
+ module Config
12
+ @@config = {}
13
+
14
+ @@instrumentation = [ :cassandra, :dalli, :nethttp, :memcached, :memcache, :mongo,
15
+ :moped, :rack, :redis, :resque, :action_controller, :action_view,
16
+ :active_record ]
17
+
18
+ ##
19
+ # Return the raw nested hash.
20
+ #
21
+ def self.show
22
+ @@config
23
+ end
24
+
25
+ def self.initialize(data={})
26
+ # Setup default instrumentation values
27
+ @@instrumentation.each do |k|
28
+ @@config[k] = {}
29
+ @@config[k][:enabled] = true
30
+ @@config[k][:collect_backtraces] = false
31
+ @@config[k][:log_args] = true
32
+ end
33
+
34
+ # Set collect_backtraces defaults
35
+ Oboe::Config[:action_controller][:collect_backtraces] = true
36
+ Oboe::Config[:active_record][:collect_backtraces] = true
37
+ Oboe::Config[:action_view][:collect_backtraces] = true
38
+ Oboe::Config[:cassandra][:collect_backtraces] = true
39
+ Oboe::Config[:dalli][:collect_backtraces] = false
40
+ Oboe::Config[:memcache][:collect_backtraces] = false
41
+ Oboe::Config[:memcached][:collect_backtraces] = false
42
+ Oboe::Config[:mongo][:collect_backtraces] = true
43
+ Oboe::Config[:moped][:collect_backtraces] = true
44
+ Oboe::Config[:nethttp][:collect_backtraces] = true
45
+ Oboe::Config[:redis][:collect_backtraces] = false
46
+ Oboe::Config[:resque][:collect_backtraces] = true
47
+
48
+ # Special instrument specific flags
49
+ #
50
+ # :link_workers - associates enqueue operations with the jobs they queue by piggybacking
51
+ # an additional argument that is stripped prior to job proecessing
52
+ # !!Note: Make sure both the queue side and the Resque workers are instrumented
53
+ # or jobs will fail
54
+ # (Default: false)
55
+ @@config[:resque][:link_workers] = false
56
+
57
+ # Setup an empty host blacklist (see: Oboe::API::Util.blacklisted?)
58
+ @@config[:blacklist] = []
59
+
60
+ # Access Key is empty until loaded from config file or env var
61
+ @@config[:access_key] = ""
62
+
63
+ # The oboe Ruby client has the ability to sanitize query literals
64
+ # from SQL statements. By default this is disabled. Enable to
65
+ # avoid collecting and reporting query literals to TraceView.
66
+ @@config[:sanitize_sql] = false
67
+
68
+ if ENV.has_key?('OPENSHIFT_TRACEVIEW_TLYZER_IP')
69
+ # We're running on OpenShift
70
+ @@config[:tracing_mode] = "always"
71
+ @@config[:reporter_host] = ENV['OPENSHIFT_TRACEVIEW_TLYZER_IP']
72
+ @@config[:reporter_port] = ENV['OPENSHIFT_TRACEVIEW_TLYZER_PORT']
73
+ else
74
+ # The default configuration
75
+ @@config[:tracing_mode] = "through"
76
+ @@config[:reporter_host] = "127.0.0.1"
77
+ @@config[:reporter_port] = "7831"
78
+ end
79
+
80
+ @@config[:verbose] = false
81
+ end
82
+
83
+ def self.update!(data)
84
+ data.each do |key, value|
85
+ self[key] = value
86
+ end
87
+ end
88
+
89
+ def self.merge!(data)
90
+ self.update!(data)
91
+ end
92
+
93
+ def self.[](key)
94
+ @@config[key.to_sym]
95
+ end
96
+
97
+ def self.[]=(key, value)
98
+ @@config[key.to_sym] = value
99
+
100
+ if key == :sampling_rate
101
+ Oboe.logger.warn "WARNING: :sampling_rate is not a supported setting for Oboe::Config. Please use :sample_rate."
102
+ end
103
+
104
+ if key == :sample_rate
105
+ unless value.is_a?(Integer) or value.is_a?(Float)
106
+ raise "oboe :sample_rate must be a number between 1 and 1000000 (1m)"
107
+ end
108
+
109
+ # Validate :sample_rate value
110
+ unless value.between?(1, 1e6)
111
+ raise "oboe :sample_rate must be between 1 and 1000000 (1m)"
112
+ end
113
+
114
+ # Assure value is an integer
115
+ @@config[key.to_sym] = value.to_i
116
+
117
+ Oboe.set_sample_rate(value)
118
+ end
119
+
120
+ # Update liboboe if updating :tracing_mode
121
+ if key == :tracing_mode
122
+ Oboe.set_tracing_mode(value)
123
+ end
124
+ end
125
+
126
+ def self.method_missing(sym, *args)
127
+ if sym.to_s =~ /(.+)=$/
128
+ self[$1] = args.first
129
+ else
130
+ unless @@config.has_key?(sym)
131
+ Oboe.logger.warn "[oboe/warn] Unknown method call on Oboe::Config: #{sym}"
132
+ end
133
+ self[sym]
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+ Oboe::Config.initialize
140
+
@@ -0,0 +1,74 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ module Oboe
5
+ module Grape
6
+ module API
7
+ def self.extended(klass)
8
+ ::Oboe::Util.class_method_alias(klass, :inherited, ::Grape::API)
9
+ end
10
+
11
+ def inherited_with_oboe(subclass)
12
+ inherited_without_oboe(subclass)
13
+
14
+ subclass.use ::Oboe::Rack
15
+ end
16
+ end
17
+
18
+ module Endpoint
19
+ def self.included(klass)
20
+ ::Oboe::Util.method_alias(klass, :run, ::Grape::Endpoint)
21
+ end
22
+
23
+ def run_with_oboe(env)
24
+ if Oboe.tracing?
25
+ report_kvs = {}
26
+
27
+ report_kvs[:Controller] = self.class
28
+ report_kvs[:Action] = env['PATH_INFO']
29
+
30
+ # Fall back to the raw tracing API so we can pass KVs
31
+ # back on exit (a limitation of the Oboe::API.trace
32
+ # block method) This removes the need for an info
33
+ # event to send additonal KVs
34
+ ::Oboe::API.log_entry('grape', {})
35
+
36
+ begin
37
+ run_without_oboe(env)
38
+ ensure
39
+ ::Oboe::API.log_exit('grape', report_kvs)
40
+ end
41
+ else
42
+ run_without_oboe(env)
43
+ end
44
+ end
45
+ end
46
+
47
+ module Middleware
48
+ module Error
49
+ def self.included(klass)
50
+ ::Oboe::Util.method_alias(klass, :call, ::Grape::Middleware::Error)
51
+ end
52
+
53
+ def call_with_oboe(boom)
54
+ Oboe::API.log_exception(nil, boom) if Oboe.tracing?
55
+ call_without_oboe(boom)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ if defined?(::Grape)
63
+ require 'oboe/inst/rack'
64
+
65
+ Oboe.logger.info "[oboe/loading] Instrumenting Grape" if Oboe::Config[:verbose]
66
+
67
+ Oboe::Loading.load_access_key
68
+ Oboe::Inst.load_instrumentation
69
+
70
+ ::Oboe::Util.send_extend(::Grape::API, ::Oboe::Grape::API)
71
+ ::Oboe::Util.send_include(::Grape::Endpoint, ::Oboe::Grape::Endpoint)
72
+ ::Oboe::Util.send_include(::Grape::Middleware::Error, ::Oboe::Grape::Middleware::Error)
73
+ end
74
+
@@ -0,0 +1,66 @@
1
+ # Copyright (c) 2014 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ module Oboe
5
+ module PadrinoInst
6
+ module Routing
7
+ def self.included(klass)
8
+ ::Oboe::Util.method_alias(klass, :dispatch!, ::Padrino::Routing)
9
+ end
10
+
11
+ def dispatch_with_oboe
12
+ if Oboe.tracing?
13
+ report_kvs = {}
14
+
15
+ # Fall back to the raw tracing API so we can pass KVs
16
+ # back on exit (a limitation of the Oboe::API.trace
17
+ # block method) This removes the need for an info
18
+ # event to send additonal KVs
19
+ ::Oboe::API.log_entry('padrino', {})
20
+
21
+ begin
22
+ r = dispatch_without_oboe
23
+
24
+ # Report Controller/Action as best possible
25
+ if request.controller and not request.controller.empty?
26
+ report_kvs[:Controller] = request.controller
27
+ else
28
+ report_kvs[:Controller] = self.class
29
+ end
30
+
31
+ report_kvs[:Action] = request.action
32
+ r
33
+ ensure
34
+ ::Oboe::API.log_exit('padrino', report_kvs)
35
+ end
36
+ else
37
+ dispatch_without_oboe
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ if defined?(::Padrino)
45
+ # This instrumentation is a superset of the Sinatra instrumentation similar
46
+ # to how Padrino is a superset of Sinatra itself.
47
+ ::Oboe.logger.info "[oboe/loading] Instrumenting Padrino" if Oboe::Config[:verbose]
48
+
49
+ require 'oboe/frameworks/padrino/templates'
50
+
51
+ Padrino.after_load do
52
+ ::Oboe.logger = ::Padrino.logger if ::Padrino.respond_to?(:logger)
53
+ ::Oboe::Loading.load_access_key
54
+ ::Oboe::Inst.load_instrumentation
55
+
56
+ ::Oboe::Util.send_include(::Padrino::Routing::InstanceMethods, ::Oboe::PadrinoInst::Routing)
57
+ if defined?(::Padrino::Rendering)
58
+ ::Oboe::Util.send_include(::Padrino::Rendering::InstanceMethods, ::Oboe::PadrinoInst::Rendering)
59
+ end
60
+
61
+ # Report __Init after fork when in Heroku
62
+ Oboe::API.report_init unless Oboe.heroku?
63
+ end
64
+
65
+ end
66
+
@@ -0,0 +1,59 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ module Oboe
5
+ module PadrinoInst
6
+ module Rendering
7
+ def self.included(klass)
8
+ ::Oboe::Util.method_alias(klass, :render, ::Padrino::Rendering)
9
+ end
10
+
11
+ def render_with_oboe(engine, data=nil, options={}, locals={}, &block)
12
+ unless Oboe.tracing?
13
+ render_without_oboe(engine, data, options, locals, &block)
14
+ else
15
+ report_kvs = {}
16
+
17
+ if data
18
+ report_kvs[:engine] = engine
19
+ report_kvs[:template] = data
20
+ else
21
+ report_kvs[:template] = engine
22
+ end
23
+
24
+ if Oboe.tracing_layer_op?('render')
25
+ # For recursive calls to :render (for sub-partials and layouts),
26
+ # use method profiling.
27
+ begin
28
+ report_kvs[:FunctionName] = :render
29
+ report_kvs[:Class] = :Rendering
30
+ report_kvs[:Module] = 'Padrino'
31
+ report_kvs[:File] = __FILE__
32
+ report_kvs[:LineNumber] = __LINE__
33
+ rescue StandardError => e
34
+ ::Oboe.logger.debug e.message
35
+ ::Oboe.logger.debug e.backtrace.join(", ")
36
+ end
37
+
38
+ Oboe::API.profile(report_kvs[:template], report_kvs, false) do
39
+ render_without_oboe(engine, data, options, locals, &block)
40
+ end
41
+ else
42
+ # Fall back to the raw tracing API so we can pass KVs
43
+ # back on exit (a limitation of the Oboe::API.trace
44
+ # block method) This removes the need for an info
45
+ # event to send additonal KVs
46
+ ::Oboe::API.log_entry('render', {}, 'render')
47
+
48
+ begin
49
+ render_without_oboe(engine, data, options, locals, &block)
50
+ ensure
51
+ ::Oboe::API.log_exit('render', report_kvs)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+