traceview 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rubocop.yml +5 -0
  4. data/.travis.yml +58 -0
  5. data/Appraisals +10 -0
  6. data/CHANGELOG.md +490 -0
  7. data/CONFIG.md +16 -0
  8. data/Gemfile +95 -0
  9. data/LICENSE +199 -0
  10. data/README.md +380 -0
  11. data/Rakefile +109 -0
  12. data/examples/DNT.md +35 -0
  13. data/examples/carrying_context.rb +225 -0
  14. data/examples/instrumenting_metal_controller.rb +8 -0
  15. data/examples/puma_on_heroku_config.rb +17 -0
  16. data/examples/tracing_async_threads.rb +125 -0
  17. data/examples/tracing_background_jobs.rb +52 -0
  18. data/examples/tracing_forked_processes.rb +100 -0
  19. data/examples/unicorn_on_heroku_config.rb +28 -0
  20. data/ext/oboe_metal/extconf.rb +61 -0
  21. data/ext/oboe_metal/noop/noop.c +7 -0
  22. data/ext/oboe_metal/src/bson/bson.h +221 -0
  23. data/ext/oboe_metal/src/bson/platform_hacks.h +91 -0
  24. data/ext/oboe_metal/src/oboe.h +275 -0
  25. data/ext/oboe_metal/src/oboe.hpp +352 -0
  26. data/ext/oboe_metal/src/oboe_wrap.cxx +3886 -0
  27. data/ext/oboe_metal/tests/test.rb +11 -0
  28. data/gemfiles/mongo.gemfile +33 -0
  29. data/gemfiles/moped.gemfile +33 -0
  30. data/get_version.rb +5 -0
  31. data/init.rb +4 -0
  32. data/lib/joboe_metal.rb +206 -0
  33. data/lib/oboe.rb +7 -0
  34. data/lib/oboe/README +2 -0
  35. data/lib/oboe/backward_compatibility.rb +59 -0
  36. data/lib/oboe/inst/rack.rb +11 -0
  37. data/lib/oboe_metal.rb +151 -0
  38. data/lib/rails/generators/traceview/install_generator.rb +76 -0
  39. data/lib/rails/generators/traceview/templates/traceview_initializer.rb +159 -0
  40. data/lib/traceview.rb +62 -0
  41. data/lib/traceview/api.rb +18 -0
  42. data/lib/traceview/api/layerinit.rb +51 -0
  43. data/lib/traceview/api/logging.rb +209 -0
  44. data/lib/traceview/api/memcache.rb +31 -0
  45. data/lib/traceview/api/profiling.rb +50 -0
  46. data/lib/traceview/api/tracing.rb +135 -0
  47. data/lib/traceview/api/util.rb +121 -0
  48. data/lib/traceview/base.rb +225 -0
  49. data/lib/traceview/config.rb +238 -0
  50. data/lib/traceview/frameworks/grape.rb +97 -0
  51. data/lib/traceview/frameworks/padrino.rb +64 -0
  52. data/lib/traceview/frameworks/padrino/templates.rb +58 -0
  53. data/lib/traceview/frameworks/rails.rb +145 -0
  54. data/lib/traceview/frameworks/rails/helpers/rum/rum_ajax_header.js.erb +5 -0
  55. data/lib/traceview/frameworks/rails/helpers/rum/rum_footer.js.erb +1 -0
  56. data/lib/traceview/frameworks/rails/helpers/rum/rum_header.js.erb +3 -0
  57. data/lib/traceview/frameworks/rails/inst/action_controller.rb +216 -0
  58. data/lib/traceview/frameworks/rails/inst/action_view.rb +56 -0
  59. data/lib/traceview/frameworks/rails/inst/action_view_2x.rb +54 -0
  60. data/lib/traceview/frameworks/rails/inst/action_view_30.rb +48 -0
  61. data/lib/traceview/frameworks/rails/inst/active_record.rb +24 -0
  62. data/lib/traceview/frameworks/rails/inst/connection_adapters/mysql.rb +43 -0
  63. data/lib/traceview/frameworks/rails/inst/connection_adapters/mysql2.rb +28 -0
  64. data/lib/traceview/frameworks/rails/inst/connection_adapters/oracle.rb +18 -0
  65. data/lib/traceview/frameworks/rails/inst/connection_adapters/postgresql.rb +30 -0
  66. data/lib/traceview/frameworks/rails/inst/connection_adapters/utils.rb +117 -0
  67. data/lib/traceview/frameworks/sinatra.rb +95 -0
  68. data/lib/traceview/frameworks/sinatra/templates.rb +56 -0
  69. data/lib/traceview/inst/cassandra.rb +279 -0
  70. data/lib/traceview/inst/dalli.rb +86 -0
  71. data/lib/traceview/inst/em-http-request.rb +99 -0
  72. data/lib/traceview/inst/excon.rb +111 -0
  73. data/lib/traceview/inst/faraday.rb +73 -0
  74. data/lib/traceview/inst/http.rb +87 -0
  75. data/lib/traceview/inst/httpclient.rb +173 -0
  76. data/lib/traceview/inst/memcache.rb +102 -0
  77. data/lib/traceview/inst/memcached.rb +94 -0
  78. data/lib/traceview/inst/mongo.rb +238 -0
  79. data/lib/traceview/inst/moped.rb +474 -0
  80. data/lib/traceview/inst/rack.rb +122 -0
  81. data/lib/traceview/inst/redis.rb +271 -0
  82. data/lib/traceview/inst/resque.rb +192 -0
  83. data/lib/traceview/inst/rest-client.rb +38 -0
  84. data/lib/traceview/inst/sequel.rb +162 -0
  85. data/lib/traceview/inst/typhoeus.rb +102 -0
  86. data/lib/traceview/instrumentation.rb +21 -0
  87. data/lib/traceview/loading.rb +94 -0
  88. data/lib/traceview/logger.rb +41 -0
  89. data/lib/traceview/method_profiling.rb +84 -0
  90. data/lib/traceview/ruby.rb +36 -0
  91. data/lib/traceview/support.rb +113 -0
  92. data/lib/traceview/thread_local.rb +26 -0
  93. data/lib/traceview/util.rb +250 -0
  94. data/lib/traceview/version.rb +16 -0
  95. data/lib/traceview/xtrace.rb +90 -0
  96. data/test/frameworks/apps/grape_nested.rb +30 -0
  97. data/test/frameworks/apps/grape_simple.rb +24 -0
  98. data/test/frameworks/apps/padrino_simple.rb +45 -0
  99. data/test/frameworks/apps/sinatra_simple.rb +24 -0
  100. data/test/frameworks/grape_test.rb +142 -0
  101. data/test/frameworks/padrino_test.rb +30 -0
  102. data/test/frameworks/sinatra_test.rb +30 -0
  103. data/test/instrumentation/cassandra_test.rb +380 -0
  104. data/test/instrumentation/dalli_test.rb +171 -0
  105. data/test/instrumentation/em_http_request_test.rb +86 -0
  106. data/test/instrumentation/excon_test.rb +207 -0
  107. data/test/instrumentation/faraday_test.rb +235 -0
  108. data/test/instrumentation/http_test.rb +140 -0
  109. data/test/instrumentation/httpclient_test.rb +296 -0
  110. data/test/instrumentation/memcache_test.rb +251 -0
  111. data/test/instrumentation/memcached_test.rb +226 -0
  112. data/test/instrumentation/mongo_test.rb +462 -0
  113. data/test/instrumentation/moped_test.rb +496 -0
  114. data/test/instrumentation/rack_test.rb +116 -0
  115. data/test/instrumentation/redis_hashes_test.rb +265 -0
  116. data/test/instrumentation/redis_keys_test.rb +318 -0
  117. data/test/instrumentation/redis_lists_test.rb +310 -0
  118. data/test/instrumentation/redis_misc_test.rb +160 -0
  119. data/test/instrumentation/redis_sets_test.rb +293 -0
  120. data/test/instrumentation/redis_sortedsets_test.rb +325 -0
  121. data/test/instrumentation/redis_strings_test.rb +333 -0
  122. data/test/instrumentation/resque_test.rb +62 -0
  123. data/test/instrumentation/rest-client_test.rb +294 -0
  124. data/test/instrumentation/sequel_mysql2_test.rb +326 -0
  125. data/test/instrumentation/sequel_mysql_test.rb +326 -0
  126. data/test/instrumentation/sequel_pg_test.rb +330 -0
  127. data/test/instrumentation/typhoeus_test.rb +285 -0
  128. data/test/minitest_helper.rb +187 -0
  129. data/test/profiling/method_test.rb +198 -0
  130. data/test/servers/rackapp_8101.rb +22 -0
  131. data/test/support/backcompat_test.rb +269 -0
  132. data/test/support/config_test.rb +128 -0
  133. data/test/support/dnt_test.rb +73 -0
  134. data/test/support/liboboe_settings_test.rb +104 -0
  135. data/test/support/xtrace_test.rb +35 -0
  136. data/traceview.gemspec +29 -0
  137. metadata +250 -0
@@ -0,0 +1,31 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ module TraceView
5
+ module API
6
+ ##
7
+ # Utility methods for the Memcache instrumentation
8
+ module Memcache
9
+ MEMCACHE_OPS = %w(add append cas decr decrement delete fetch get incr increment prepend replace set)
10
+
11
+ def memcache_hit?(result)
12
+ result.nil? ? 0 : 1
13
+ end
14
+
15
+ def remote_host(key)
16
+ return unless defined?(Lib.memcached_server_by_key) \
17
+ && defined?(@struct) && defined?(is_unix_socket?)
18
+
19
+ server_as_array = Lib.memcached_server_by_key(@struct, key.to_s)
20
+ if server_as_array.is_a?(Array)
21
+ server = server_as_array.first
22
+ if is_unix_socket?(server)
23
+ return 'localhost'
24
+ elsif defined?(server.hostname)
25
+ return server.hostname
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,50 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ module TraceView
5
+ module API
6
+ ##
7
+ # Module that provides profiling of arbitrary blocks of code
8
+ module Profiling
9
+ ##
10
+ # Public: Profile a given block of code. Detect any exceptions thrown by
11
+ # the block and report errors.
12
+ #
13
+ # profile_name - A name used to identify the block being profiled.
14
+ # report_kvs - A hash containing key/value pairs that will be reported along
15
+ # with the event of this profile (optional).
16
+ # with_backtrace - Boolean to indicate whether a backtrace should
17
+ # be collected with this trace event.
18
+ #
19
+ # Example
20
+ #
21
+ # def computation(n)
22
+ # TraceView::API.profile('fib', { :n => n }) do
23
+ # fib(n)
24
+ # end
25
+ # end
26
+ #
27
+ # Returns the result of the block.
28
+ def profile(profile_name, report_kvs = {}, with_backtrace = false)
29
+ report_kvs[:Language] ||= :ruby
30
+ report_kvs[:ProfileName] ||= profile_name
31
+ report_kvs[:Backtrace] = TraceView::API.backtrace if with_backtrace
32
+
33
+ TraceView::API.log(nil, 'profile_entry', report_kvs)
34
+
35
+ begin
36
+ yield
37
+ rescue => e
38
+ log_exception(nil, e)
39
+ raise
40
+ ensure
41
+ exit_kvs = {}
42
+ exit_kvs[:Language] = :ruby
43
+ exit_kvs[:ProfileName] = report_kvs[:ProfileName]
44
+
45
+ TraceView::API.log(nil, 'profile_exit', exit_kvs)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,135 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ module TraceView
5
+ module API
6
+ ##
7
+ # Provides the higher-level tracing interface for the API.
8
+ module Tracing
9
+ # Public: Trace a given block of code. Detect any exceptions thrown by
10
+ # the block and report errors.
11
+ #
12
+ # layer - The layer the block of code belongs to.
13
+ # opts - A hash containing key/value pairs that will be reported along
14
+ # with the first event of this layer (optional).
15
+ # protect_op - specify the operation being traced. Used to avoid
16
+ # double tracing between operations that call each other
17
+ #
18
+ # Example
19
+ #
20
+ # def computation(n)
21
+ # fib(n)
22
+ # raise Exception.new
23
+ # end
24
+ #
25
+ # def computation_with_oboe(n)
26
+ # trace('fib', { :number => n }) do
27
+ # computation(n)
28
+ # end
29
+ # end
30
+ #
31
+ # result = computation_with_oboe(1000)
32
+ #
33
+ # Returns the result of the block.
34
+ def trace(layer, opts = {}, protect_op = nil)
35
+ log_entry(layer, opts, protect_op)
36
+ begin
37
+ yield
38
+ rescue Exception => e
39
+ log_exception(layer, e)
40
+ raise
41
+ ensure
42
+ log_exit(layer, {}, protect_op)
43
+ end
44
+ end
45
+
46
+ # Public: Trace a given block of code which can start a trace depending
47
+ # on configuration and probability. Detect any exceptions thrown by the
48
+ # block and report errors.
49
+ #
50
+ # When start_trace returns control to the calling context, the oboe
51
+ # context will be cleared.
52
+ #
53
+ # layer - The layer the block of code belongs to.
54
+ # opts - A hash containing key/value pairs that will be reported along
55
+ # with the first event of this layer (optional).
56
+ #
57
+ # Example
58
+ #
59
+ # def handle_request(request, response)
60
+ # # ... code that modifies request and response ...
61
+ # end
62
+ #
63
+ # def handle_request_with_oboe(request, response)
64
+ # result, xtrace = start_trace('rails', request['X-Trace']) do
65
+ # handle_request(request, response)
66
+ # end
67
+ # result
68
+ # rescue Exception => e
69
+ # xtrace = e.xtrace
70
+ # ensure
71
+ # response['X-trace'] = xtrace
72
+ # end
73
+ #
74
+ # Returns a list of length two, the first element of which is the result
75
+ # of the block, and the second element of which is the oboe context that
76
+ # was set when the block completed execution.
77
+ def start_trace(layer, xtrace = nil, opts = {})
78
+ log_start(layer, xtrace, opts)
79
+ begin
80
+ result = yield
81
+ rescue Exception => e
82
+ log_exception(layer, e)
83
+ e.instance_variable_set(:@xtrace, log_end(layer))
84
+ raise
85
+ end
86
+ xtrace = log_end(layer)
87
+
88
+ [result, xtrace]
89
+ end
90
+
91
+ # Public: Trace a given block of code which can start a trace depending
92
+ # on configuration and probability. Detect any exceptions thrown by the
93
+ # block and report errors. Insert the oboe metadata into the provided for
94
+ # later user.
95
+ #
96
+ # The motivating use case for this is HTTP streaming in rails3. We need
97
+ # access to the exit event's trace id so we can set the header before any
98
+ # work is done, and before any headers are sent back to the client.
99
+ #
100
+ # layer - The layer the block of code belongs to.
101
+ # target - The target object in which to place the oboe metadata.
102
+ # opts - A hash containing key/value pairs that will be reported along
103
+ # with the first event of this layer (optional).
104
+ #
105
+ # Example:
106
+ #
107
+ # def handle_request(request, response)
108
+ # # ... code that does something with request and response ...
109
+ # end
110
+ #
111
+ # def handle_request_with_oboe(request, response)
112
+ # start_trace_with_target('rails', request['X-Trace'], response) do
113
+ # handle_request(request, response)
114
+ # end
115
+ # end
116
+ #
117
+ # Returns the result of the block.
118
+ def start_trace_with_target(layer, xtrace, target, opts = {})
119
+ log_start(layer, xtrace, opts)
120
+ exit_evt = TraceView::Context.createEvent
121
+ begin
122
+ target['X-Trace'] = TraceView::Event.metadataString(exit_evt) if TraceView.tracing?
123
+ yield
124
+ rescue Exception => e
125
+ log_exception(layer, e)
126
+ raise
127
+ ensure
128
+ exit_evt.addEdge(TraceView::Context.get)
129
+ log_event(layer, 'exit', exit_evt)
130
+ TraceView::Context.clear
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,121 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ require 'pp'
5
+
6
+ module TraceView
7
+ module API
8
+ ##
9
+ # General utility methods for the gem
10
+ module Util
11
+ BACKTRACE_CUTOFF = 200
12
+
13
+ # Internal: Check whether the provided key is reserved or not. Reserved
14
+ # keys are either keys that are handled by liboboe calls or the traceview gem.
15
+ #
16
+ # key - the key to check.
17
+ #
18
+ # Return a boolean indicating whether or not key is reserved.
19
+ def valid_key?(key)
20
+ !%w(Label Layer Edge Timestamp Timestamp_u).include? key.to_s
21
+ end
22
+
23
+ # Internal: Get the current backtrace.
24
+ #
25
+ # ignore - Number of frames to ignore at the end of the backtrace. Use
26
+ # when you know how many layers deep in oboe the call is being
27
+ # made.
28
+ #
29
+ # Returns a string with each frame of the backtrace separated by '\r\n'.
30
+ #
31
+ # FIXME: ignore is not currently used (see BACKTRACE_CUTOFF)
32
+ def backtrace(_ignore = 1)
33
+ trim_backtrace(Kernel.caller).join("\r\n")
34
+ end
35
+
36
+ # Internal: Trim a backtrace to a manageable size
37
+ #
38
+ # backtrace - the backtrace (an array of stack frames/from Kernel.caller)
39
+ #
40
+ # Returns a trimmed backtrace
41
+ def trim_backtrace(backtrace)
42
+ return backtrace unless backtrace.is_a?(Array)
43
+
44
+ length = backtrace.size
45
+ if length > BACKTRACE_CUTOFF
46
+ # Trim backtraces by getting the first 180 and last 20 lines
47
+ trimmed = backtrace[0, 180] + ['...[snip]...'] + backtrace[length - 20, 20]
48
+ else
49
+ trimmed = backtrace
50
+ end
51
+ trimmed
52
+ end
53
+
54
+ # Internal: Check if a host is blacklisted from tracing
55
+ #
56
+ # addr_port - the addr_port from Net::HTTP although this method
57
+ # can be used from any component in reality
58
+ #
59
+ # Returns a boolean on blacklisted state
60
+ def blacklisted?(addr_port)
61
+ return false unless TraceView::Config.blacklist
62
+
63
+ # Ensure that the blacklist is an array
64
+ unless TraceView::Config.blacklist.is_a?(Array)
65
+ val = TraceView::Config[:blacklist]
66
+ TraceView::Config[:blacklist] = [val.to_s]
67
+ end
68
+
69
+ TraceView::Config.blacklist.each do |h|
70
+ return true if addr_port.to_s.match(h.to_s)
71
+ end
72
+
73
+ false
74
+ end
75
+
76
+ # Internal: Pretty print a list of arguments for reporting
77
+ #
78
+ # args - the list of arguments to work on
79
+ #
80
+ # Returns a pretty string representation of arguments
81
+ def pps(*args)
82
+ old_out = $stdout
83
+ begin
84
+ s = StringIO.new
85
+ $stdout = s
86
+ pp(*args)
87
+ ensure
88
+ $stdout = old_out
89
+ end
90
+ s.string
91
+ end
92
+
93
+ # Internal: Determine a string to report representing klass
94
+ #
95
+ # args - an instance of a Class, a Class or a Module
96
+ #
97
+ # Returns a string representation of klass
98
+ def get_class_name(klass)
99
+ kv = {}
100
+
101
+ if klass.to_s =~ /::/
102
+ klass.class.to_s.rpartition('::').last
103
+ else
104
+ if klass.is_a?(Class) && klass.is_a?(Module)
105
+ # Class
106
+ kv['Class'] = klass.to_s
107
+
108
+ elsif (!klass.is_a?(Class) && !klass.is_a?(Module))
109
+ # Class instance
110
+ kv['Class'] = klass.class.to_s
111
+
112
+ else
113
+ # Module
114
+ kv['Module'] = klass.to_s
115
+ end
116
+ end
117
+ kv
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,225 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ # Constants from liboboe
5
+ OBOE_TRACE_NEVER = 0
6
+ OBOE_TRACE_ALWAYS = 1
7
+ OBOE_TRACE_THROUGH = 2
8
+
9
+ OBOE_SAMPLE_RATE_SOURCE_FILE = 1
10
+ OBOE_SAMPLE_RATE_SOURCE_DEFAULT = 2
11
+ OBOE_SAMPLE_RATE_SOURCE_OBOE = 3
12
+ OBOE_SAMPLE_RATE_SOURCE_LAST_OBOE = 4
13
+ OBOE_SAMPLE_RATE_SOURCE_DEFAULT_MISCONFIGURED = 5
14
+ OBOE_SAMPLE_RATE_SOURCE_OBOE_DEFAULT = 6
15
+
16
+ # Masks for bitwise ops
17
+ ZERO_MASK = 0b0000000000000000000000000000
18
+
19
+ SAMPLE_RATE_MASK = 0b0000111111111111111111111111
20
+ SAMPLE_SOURCE_MASK = 0b1111000000000000000000000000
21
+
22
+ ZERO_SAMPLE_RATE_MASK = 0b1111000000000000000000000000
23
+ ZERO_SAMPLE_SOURCE_MASK = 0b0000111111111111111111111111
24
+
25
+ ##
26
+ # This module is the base module for the various implementations of TraceView reporting.
27
+ # Current variations as of 2014-09-10 are a c-extension, JRuby (using TraceView Java
28
+ # instrumentation) and a Heroku c-extension (with embedded tracelyzer)
29
+ module TraceViewBase
30
+ extend ::TraceView::ThreadLocal
31
+
32
+ attr_accessor :reporter
33
+ attr_accessor :loaded
34
+ thread_local :sample_source
35
+ thread_local :sample_rate
36
+ thread_local :layer
37
+ thread_local :layer_op
38
+
39
+ # The following accessors indicate the incoming tracing state received
40
+ # by the rack layer. These are primarily used to identify state
41
+ # between the Ruby and JTraceView instrumentation under JRuby.
42
+ #
43
+ # This is because that even though there may be an incoming
44
+ # X-Trace request header, tracing may have already been started
45
+ # by Joboe. Such a scenario occurs when the application is being
46
+ # hosted by a Java container (such as Tomcat or Glassfish) and
47
+ # JTraceView has already initiated tracing. In this case, we shouldn't
48
+ # pickup the X-Trace context in the X-Trace header and we shouldn't
49
+ # set the outgoing response X-Trace header or clear context.
50
+ # Yeah I know. Yuck.
51
+
52
+ # Occurs only on Jruby. Indicates that Joboe (the java instrumentation)
53
+ # has already started tracing before it hit the JRuby instrumentation.
54
+ thread_local :has_incoming_context
55
+
56
+ # Indicates the existence of a valid X-Trace request header
57
+ thread_local :has_xtrace_header
58
+
59
+ # This indicates that this trace was continued from
60
+ # an incoming X-Trace request header or in the case
61
+ # of JRuby, a trace already started by JTraceView.
62
+ thread_local :is_continued_trace
63
+
64
+ ##
65
+ # extended
66
+ #
67
+ # Invoked when this module is extended.
68
+ # e.g. extend TraceViewBase
69
+ #
70
+ def self.extended(cls)
71
+ cls.loaded = true
72
+
73
+ # This gives us pretty accessors with questions marks at the end
74
+ # e.g. is_continued_trace --> is_continued_trace?
75
+ TraceView.methods.select{ |m| m =~ /^is_|^has_/ }.each do |c|
76
+ unless c =~ /\?$|=$/
77
+ # TraceView.logger.debug "aliasing #{c}? to #{c}"
78
+ alias_method "#{c}?", c
79
+ end
80
+ end
81
+ end
82
+
83
+ ##
84
+ # pickup_context
85
+ #
86
+ # Determines whether we should pickup context
87
+ # from an incoming X-Trace request header. The answer
88
+ # is generally yes but there are cases in JRuby under
89
+ # Tomcat (or Glassfish etc.) where tracing may have
90
+ # been already started by the Java instrumentation (Joboe)
91
+ # in which case we don't want to do this.
92
+ #
93
+ def pickup_context?(xtrace)
94
+ return false unless TraceView::XTrace.valid?(xtrace)
95
+
96
+ if defined?(JRUBY_VERSION) && TraceView.tracing?
97
+ return false
98
+ else
99
+ return true
100
+ end
101
+ end
102
+
103
+ ##
104
+ # tracing_layer?
105
+ #
106
+ # Queries the thread local variable about the current
107
+ # layer being traced. This is used in cases of recursive
108
+ # operation tracing or one instrumented operation calling another.
109
+ #
110
+ def tracing_layer?(layer)
111
+ return TraceView.layer == layer
112
+ end
113
+
114
+ ##
115
+ # tracing_layer_op?
116
+ #
117
+ # Queries the thread local variable about the current
118
+ # operation being traced. This is used in cases of recursive
119
+ # operation tracing or one instrumented operation calling another.
120
+ #
121
+ # In such cases, we only want to trace the outermost operation.
122
+ #
123
+ def tracing_layer_op?(operation)
124
+ if operation.is_a?(Array)
125
+ return operation.include?(TraceView.layer_op)
126
+ else
127
+ return TraceView.layer_op == operation
128
+ end
129
+ end
130
+
131
+ ##
132
+ # Returns true if the tracing_mode is set to always.
133
+ # False otherwise
134
+ #
135
+ def always?
136
+ TraceView::Config[:tracing_mode].to_s == 'always'
137
+ end
138
+
139
+ ##
140
+ # Returns true if the tracing_mode is set to never.
141
+ # False otherwise
142
+ #
143
+ def never?
144
+ TraceView::Config[:tracing_mode].to_s == 'never'
145
+ end
146
+
147
+ ##
148
+ # Returns true if the tracing_mode is set to always or through.
149
+ # False otherwise
150
+ #
151
+ def passthrough?
152
+ %w(always through).include?(TraceView::Config[:tracing_mode])
153
+ end
154
+
155
+ ##
156
+ # Returns true if the tracing_mode is set to through.
157
+ # False otherwise
158
+ #
159
+ def through?
160
+ TraceView::Config[:tracing_mode] == 'through'
161
+ end
162
+
163
+ ##
164
+ # Returns true if we are currently tracing a request
165
+ # False otherwise
166
+ #
167
+ def tracing?
168
+ return false unless TraceView.loaded
169
+
170
+ TraceView::Context.isValid && !TraceView.never?
171
+ end
172
+
173
+ def log(layer, label, options = {})
174
+ # WARN: TraceView.log will be deprecated in a future release. Please use TraceView::API.log instead.
175
+ TraceView::API.log(layer, label, options)
176
+ end
177
+
178
+ def heroku?
179
+ ENV.key?('TRACEVIEW_URL')
180
+ end
181
+
182
+ ##
183
+ # Determines if we are running under a forking webserver
184
+ #
185
+ def forking_webserver?
186
+ if (defined?(::Unicorn) && ($PROGRAM_NAME =~ /unicorn/i)) ||
187
+ (defined?(::Puma) && ($PROGRAM_NAME =~ /puma/i))
188
+ true
189
+ else
190
+ false
191
+ end
192
+ end
193
+
194
+ ##
195
+ # Indicates whether a supported framework is in use
196
+ # or not
197
+ #
198
+ def framework?
199
+ defined?(::Rails) or defined?(::Sinatra) or defined?(::Padrino) or defined?(::Grape)
200
+ end
201
+
202
+ ##
203
+ # These methods should be implemented by the descendants
204
+ # (Oboe_metal, JOboe_metal (JRuby), Heroku_metal)
205
+ #
206
+ def sample?(_opts = {})
207
+ fail 'sample? should be implemented by metal layer.'
208
+ end
209
+
210
+ def log(_layer, _label, _options = {})
211
+ fail 'log should be implemented by metal layer.'
212
+ end
213
+
214
+ def set_tracing_mode(_mode)
215
+ fail 'set_tracing_mode should be implemented by metal layer.'
216
+ end
217
+
218
+ def set_sample_rate(_rate)
219
+ fail 'set_sample_rate should be implemented by metal layer.'
220
+ end
221
+ end
222
+
223
+ module TraceView
224
+ extend TraceViewBase
225
+ end