traceview 3.0.0-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 (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/README +2 -0
  34. data/lib/oboe/backward_compatibility.rb +59 -0
  35. data/lib/oboe/inst/rack.rb +11 -0
  36. data/lib/oboe.rb +7 -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/api/layerinit.rb +51 -0
  41. data/lib/traceview/api/logging.rb +209 -0
  42. data/lib/traceview/api/memcache.rb +31 -0
  43. data/lib/traceview/api/profiling.rb +50 -0
  44. data/lib/traceview/api/tracing.rb +135 -0
  45. data/lib/traceview/api/util.rb +121 -0
  46. data/lib/traceview/api.rb +18 -0
  47. data/lib/traceview/base.rb +225 -0
  48. data/lib/traceview/config.rb +238 -0
  49. data/lib/traceview/frameworks/grape.rb +97 -0
  50. data/lib/traceview/frameworks/padrino/templates.rb +58 -0
  51. data/lib/traceview/frameworks/padrino.rb +64 -0
  52. data/lib/traceview/frameworks/rails/helpers/rum/rum_ajax_header.js.erb +5 -0
  53. data/lib/traceview/frameworks/rails/helpers/rum/rum_footer.js.erb +1 -0
  54. data/lib/traceview/frameworks/rails/helpers/rum/rum_header.js.erb +3 -0
  55. data/lib/traceview/frameworks/rails/inst/action_controller.rb +216 -0
  56. data/lib/traceview/frameworks/rails/inst/action_view.rb +56 -0
  57. data/lib/traceview/frameworks/rails/inst/action_view_2x.rb +54 -0
  58. data/lib/traceview/frameworks/rails/inst/action_view_30.rb +48 -0
  59. data/lib/traceview/frameworks/rails/inst/active_record.rb +24 -0
  60. data/lib/traceview/frameworks/rails/inst/connection_adapters/mysql.rb +43 -0
  61. data/lib/traceview/frameworks/rails/inst/connection_adapters/mysql2.rb +28 -0
  62. data/lib/traceview/frameworks/rails/inst/connection_adapters/oracle.rb +18 -0
  63. data/lib/traceview/frameworks/rails/inst/connection_adapters/postgresql.rb +30 -0
  64. data/lib/traceview/frameworks/rails/inst/connection_adapters/utils.rb +117 -0
  65. data/lib/traceview/frameworks/rails.rb +145 -0
  66. data/lib/traceview/frameworks/sinatra/templates.rb +56 -0
  67. data/lib/traceview/frameworks/sinatra.rb +95 -0
  68. data/lib/traceview/inst/cassandra.rb +279 -0
  69. data/lib/traceview/inst/dalli.rb +86 -0
  70. data/lib/traceview/inst/em-http-request.rb +99 -0
  71. data/lib/traceview/inst/excon.rb +111 -0
  72. data/lib/traceview/inst/faraday.rb +73 -0
  73. data/lib/traceview/inst/http.rb +87 -0
  74. data/lib/traceview/inst/httpclient.rb +173 -0
  75. data/lib/traceview/inst/memcache.rb +102 -0
  76. data/lib/traceview/inst/memcached.rb +94 -0
  77. data/lib/traceview/inst/mongo.rb +238 -0
  78. data/lib/traceview/inst/moped.rb +474 -0
  79. data/lib/traceview/inst/rack.rb +122 -0
  80. data/lib/traceview/inst/redis.rb +271 -0
  81. data/lib/traceview/inst/resque.rb +192 -0
  82. data/lib/traceview/inst/rest-client.rb +38 -0
  83. data/lib/traceview/inst/sequel.rb +162 -0
  84. data/lib/traceview/inst/typhoeus.rb +102 -0
  85. data/lib/traceview/instrumentation.rb +21 -0
  86. data/lib/traceview/loading.rb +94 -0
  87. data/lib/traceview/logger.rb +41 -0
  88. data/lib/traceview/method_profiling.rb +84 -0
  89. data/lib/traceview/ruby.rb +36 -0
  90. data/lib/traceview/support.rb +113 -0
  91. data/lib/traceview/thread_local.rb +26 -0
  92. data/lib/traceview/util.rb +250 -0
  93. data/lib/traceview/version.rb +16 -0
  94. data/lib/traceview/xtrace.rb +90 -0
  95. data/lib/traceview.rb +62 -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 +248 -0
@@ -0,0 +1,11 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ require 'oboe'
5
+
6
+ r = Oboe::UdpReporter.new('127.0.0.1')
7
+ Oboe::Context.init()
8
+ e = Oboe::Context.createEvent()
9
+ e.addInfo("TestKey", "TestValue")
10
+ r.sendReport(e)
11
+
@@ -0,0 +1,33 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "dalli"
6
+ gem "memcache-client"
7
+ gem "memcached", "1.7.2"
8
+ gem "cassandra"
9
+ gem "mongo"
10
+ gem "bson"
11
+ gem "moped", "~> 1.5"
12
+ gem "resque"
13
+ gem "redis"
14
+ gem "sinatra"
15
+ gem "padrino", "0.12.0"
16
+ gem "grape"
17
+
18
+ group :development, :test do
19
+ gem "minitest"
20
+ gem "minitest-reporters"
21
+ gem "rack-test"
22
+ gem "appraisal"
23
+ end
24
+
25
+ group :development do
26
+ gem "ruby-debug", :platform => :mri_18
27
+ gem "debugger", :platform => :mri_19
28
+ gem "byebug", :platforms => [:mri_20, :mri_21]
29
+ gem "perftools.rb", :platforms => [:mri_20, :mri_21], :require => "perftools"
30
+ gem "pry"
31
+ end
32
+
33
+ gemspec :name => "oboe", :path => "../"
@@ -0,0 +1,33 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "dalli"
6
+ gem "memcache-client"
7
+ gem "memcached", "1.7.2"
8
+ gem "cassandra"
9
+ gem "mongo"
10
+ gem "bson"
11
+ gem "moped", "~> 1.5"
12
+ gem "resque"
13
+ gem "redis"
14
+ gem "sinatra"
15
+ gem "padrino", "0.12.0"
16
+ gem "grape"
17
+
18
+ group :development, :test do
19
+ gem "minitest"
20
+ gem "minitest-reporters"
21
+ gem "rack-test"
22
+ gem "appraisal"
23
+ end
24
+
25
+ group :development do
26
+ gem "ruby-debug", :platform => :mri_18
27
+ gem "debugger", :platform => :mri_19
28
+ gem "byebug", :platforms => [:mri_20, :mri_21]
29
+ gem "perftools.rb", :platforms => [:mri_20, :mri_21], :require => "perftools"
30
+ gem "pry"
31
+ end
32
+
33
+ gemspec :name => "oboe", :path => "../"
data/get_version.rb ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + '/lib/oboe/version.rb'
4
+
5
+ puts Oboe::Version::STRING
data/init.rb ADDED
@@ -0,0 +1,4 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ require 'traceview'
@@ -0,0 +1,206 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ module Oboe_metal
5
+ include_package 'com.tracelytics.joboe'
6
+ java_import 'com.tracelytics.joboe.LayerUtil'
7
+ java_import 'com.tracelytics.joboe.SettingsReader'
8
+ java_import 'com.tracelytics.joboe.Context'
9
+ java_import 'com.tracelytics.joboe.Event'
10
+ java_import 'com.tracelytics.agent.Agent'
11
+
12
+ class Context
13
+ class << self
14
+ def toString
15
+ getMetadata.toHexString
16
+ end
17
+
18
+ def fromString(xtrace)
19
+ Context.setMetadata(xtrace)
20
+ end
21
+
22
+ def clear
23
+ clearMetadata
24
+ end
25
+
26
+ def get
27
+ getMetadata
28
+ end
29
+ end
30
+ end
31
+
32
+ class Event
33
+ def self.metadataString(evt)
34
+ evt.getMetadata.toHexString
35
+ end
36
+ end
37
+
38
+ def UdpReporter
39
+ Java::ComTracelyticsJoboe
40
+ end
41
+
42
+ module Metadata
43
+ Java::ComTracelyticsJoboeMetaData
44
+ end
45
+
46
+ module Reporter
47
+ ##
48
+ # Initialize the TraceView Context, reporter and report the initialization
49
+ #
50
+ def self.start
51
+ return unless TraceView.loaded
52
+
53
+ if ENV.key?('TRACEVIEW_GEM_TEST')
54
+ TraceView.reporter = Java::ComTracelyticsJoboe::TestReporter.new
55
+ else
56
+ TraceView.reporter = Java::ComTracelyticsJoboe::ReporterFactory.getInstance.buildUdpReporter
57
+ end
58
+
59
+
60
+ begin
61
+ # Import the tracing mode and sample rate settings
62
+ # from the Java agent (user configured in
63
+ # /usr/local/tracelytics/javaagent.json when under JRuby)
64
+ cfg = LayerUtil.getLocalSampleRate(nil, nil)
65
+
66
+ if cfg.hasSampleStartFlag
67
+ TraceView::Config.tracing_mode = 'always'
68
+ elsif cfg.hasSampleThroughFlag
69
+ TraceView::Config.tracing_mode = 'through'
70
+ else
71
+ TraceView::Config.tracing_mode = 'never'
72
+ end
73
+
74
+ TraceView.sample_rate = cfg.getSampleRate
75
+ TraceView::Config.sample_rate = cfg.sampleRate
76
+ TraceView::Config.sample_source = cfg.sampleRateSourceValue
77
+ rescue => e
78
+ TraceView.logger.debug "[traceview/debug] Couldn't retrieve/acces joboe sampleRateCfg"
79
+ TraceView.logger.debug "[traceview/debug] #{e.message}"
80
+ end
81
+
82
+ # Only report __Init from here if we are not instrumenting a framework.
83
+ # Otherwise, frameworks will handle reporting __Init after full initialization
84
+ unless defined?(::Rails) || defined?(::Sinatra) || defined?(::Padrino) || defined?(::Grape)
85
+ TraceView::API.report_init unless ENV.key?('TRACEVIEW_GEM_TEST')
86
+ end
87
+ end
88
+
89
+ ##
90
+ # clear_all_traces
91
+ #
92
+ # Truncates the trace output file to zero
93
+ #
94
+ def self.clear_all_traces
95
+ TraceView.reporter.reset if TraceView.loaded
96
+ end
97
+
98
+ ##
99
+ # get_all_traces
100
+ #
101
+ # Retrieves all traces written to the trace file
102
+ #
103
+ def self.get_all_traces
104
+ return [] unless TraceView.loaded
105
+
106
+ # Joboe TestReporter returns a Java::ComTracelyticsExtEbson::DefaultDocument
107
+ # document for traces which doesn't correctly support things like has_key? which
108
+ # raises an unhandled exception on non-existent key (duh). Here we convert
109
+ # the Java::ComTracelyticsExtEbson::DefaultDocument doc to a pure array of Ruby
110
+ # hashes
111
+ traces = []
112
+ TraceView.reporter.getSentEventsAsBsonDocument.to_a.each do |e|
113
+ t = {}
114
+ e.each_pair { |k, v|
115
+ t[k] = v
116
+ }
117
+ traces << t
118
+ end
119
+ traces
120
+ end
121
+
122
+ def self.sendReport(evt)
123
+ evt.report(TraceView.reporter)
124
+ end
125
+ end
126
+ end
127
+
128
+ module TraceView
129
+ extend TraceViewBase
130
+ include Oboe_metal
131
+
132
+ class << self
133
+ def sample?(opts = {})
134
+ begin
135
+ return false unless TraceView.always? && TraceView.loaded
136
+
137
+ return true if ENV.key?('TRACEVIEW_GEM_TEST')
138
+
139
+ # Validation to make Joboe happy. Assure that we have the KVs and that they
140
+ # are not empty strings.
141
+ opts[:layer] = nil if opts[:layer].is_a?(String) && opts[:layer].empty?
142
+ opts[:xtrace] = nil if opts[:xtrace].is_a?(String) && opts[:xtrace].empty?
143
+ opts['X-TV-Meta'] = nil if opts['X-TV-Meta'].is_a?(String) && opts['X-TV-Meta'].empty?
144
+
145
+ opts[:layer] ||= nil
146
+ opts[:xtrace] ||= nil
147
+ opts['X-TV-Meta'] ||= nil
148
+
149
+ sr_cfg = Java::ComTracelyticsJoboe::LayerUtil.shouldTraceRequest(
150
+ opts[:layer],
151
+ { 'X-Trace' => opts[:xtrace], 'X-TV-Meta' => opts['X-TV-Meta'] })
152
+
153
+ # Store the returned SampleRateConfig into TraceView::Config
154
+ if sr_cfg
155
+ begin
156
+ TraceView::Config.sample_rate = cfg.sampleRate
157
+ TraceView::Config.sample_source = cfg.sampleRateSourceValue
158
+ # If we fail here, we do so quietly. This was we don't spam logs
159
+ # on every request
160
+ end
161
+ else
162
+ TraceView.sample_rate = -1
163
+ TraceView.sample_source = -1
164
+ end
165
+
166
+ sr_cfg ? true : false
167
+ rescue => e
168
+ TraceView.logger.debug "[traceview/debug] #{e.message}"
169
+ false
170
+ end
171
+ end
172
+
173
+ def set_tracing_mode(_mode)
174
+ TraceView.logger.warn 'When using JRuby set the tracing mode in /usr/local/tracelytics/javaagent.json instead'
175
+ end
176
+
177
+ def set_sample_rate(_rate)
178
+ # N/A
179
+ end
180
+ end
181
+ end
182
+
183
+ # Assure that the Joboe Java Agent was loaded via premain
184
+ case Java::ComTracelyticsAgent::Agent.getStatus
185
+ when Java::ComTracelyticsAgent::Agent::AgentStatus::INITIALIZED_SUCCESSFUL
186
+ TraceView.loaded = true
187
+
188
+ when Java::ComTracelyticsAgent::Agent::AgentStatus::INITIALIZED_FAILED
189
+ TraceView.loaded = false
190
+ $stderr.puts '=============================================================='
191
+ $stderr.puts 'TraceView Java Agent not initialized properly.'
192
+ $stderr.puts 'Possibly misconfigured? Going into no-op mode.'
193
+ $stderr.puts 'See: http://bit.ly/1zwS5xj'
194
+ $stderr.puts '=============================================================='
195
+
196
+ when Java::ComTracelyticsAgent::Agent::AgentStatus::UNINITIALIZED
197
+ TraceView.loaded = false
198
+ $stderr.puts '=============================================================='
199
+ $stderr.puts 'TraceView Java Agent not loaded. Going into no-op mode.'
200
+ $stderr.puts 'To preload the TraceView java agent see:'
201
+ $stderr.puts 'https://support.appneta.com/cloud/installing-jruby-instrumentation'
202
+ $stderr.puts '=============================================================='
203
+
204
+ else
205
+ TraceView.loaded = false
206
+ end
data/lib/oboe/README ADDED
@@ -0,0 +1,2 @@
1
+ This directory is kept for backward compatibility for applications
2
+ making calls to Oboe modules.
@@ -0,0 +1,59 @@
1
+ require 'traceview/thread_local'
2
+
3
+ module Oboe
4
+ extend TraceViewBase
5
+ include Oboe_metal
6
+
7
+ #
8
+ # Support for Oboe::API calls
9
+ #
10
+ module API
11
+ include TraceView::API
12
+ extend ::TraceView::ThreadLocal
13
+ thread_local :deprecation_notified
14
+
15
+ def self.method_missing(sym, *args, &blk)
16
+ # Notify of deprecation only once
17
+ unless @deprecated_notified
18
+ TraceView.logger.warn "[traceview/warn] Note that Oboe::API has been renamed to TraceView::API. (#{sym}:#{args})"
19
+ TraceView.logger.warn "[traceview/warn] Oboe::API will be deprecated in a future version."
20
+ @deprecated_notified = true
21
+ end
22
+ TraceView::API.send(sym, *args, &blk)
23
+ end
24
+ end
25
+
26
+
27
+ #
28
+ # Support for Oboe::Config calls
29
+ #
30
+ module Config
31
+ extend ::TraceView::ThreadLocal
32
+ thread_local :deprecation_notified
33
+
34
+ def self.method_missing(sym, *args)
35
+ # Notify of deprecation only once
36
+ unless @deprecated_notified
37
+ TraceView.logger.warn "[traceview/warn] Note that Oboe::Config has been renamed to TraceView::Config. (#{sym}:#{args})"
38
+ TraceView.logger.warn "[traceview/warn] Oboe::Config will be deprecated in a future version."
39
+ @deprecated_notified = true
40
+ end
41
+ TraceView::Config.send(sym, *args)
42
+ end
43
+ end
44
+ end
45
+
46
+
47
+ #
48
+ # Support for OboeMethodProfiling
49
+ #
50
+ module OboeMethodProfiling
51
+ def self.included(klass)
52
+ klass.extend ClassMethods
53
+ end
54
+
55
+ module ClassMethods
56
+ include TraceViewMethodProfiling::ClassMethods
57
+ end
58
+ end
59
+
@@ -0,0 +1,11 @@
1
+ require 'traceview/inst/rack'
2
+
3
+ module Oboe
4
+ class Rack < TraceView::Rack
5
+ # This simply makes Oboe::Rack available (and a clone of TraceView::Rack) for
6
+ # backward compatibility
7
+ #
8
+ # Provided for pre-existing apps (sinatra, padrino, grape etc..) that may still
9
+ # call `use Oboe::Rack`
10
+ end
11
+ end
data/lib/oboe.rb ADDED
@@ -0,0 +1,7 @@
1
+ # Copyright (c) 2015 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ # This module is provided for backward compatibility.
5
+ # It simply redirects to the traceview module which will
6
+ # also load backward compatibility support.
7
+ require 'traceview'
data/lib/oboe_metal.rb ADDED
@@ -0,0 +1,151 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ # Disable docs and Camelcase warns since we're implementing
5
+ # an interface here. See OboeBase for details.
6
+ # rubocop:disable Style/Documentation, Style/MethodName
7
+ module TraceView
8
+ extend TraceViewBase
9
+ include Oboe_metal
10
+
11
+ class Reporter
12
+ ##
13
+ # Initialize the TraceView Context, reporter and report the initialization
14
+ #
15
+ def self.start
16
+ return unless TraceView.loaded
17
+
18
+ begin
19
+ Oboe_metal::Context.init
20
+
21
+ if ENV.key?('TRACEVIEW_GEM_TEST')
22
+ TraceView.reporter = TraceView::FileReporter.new('/tmp/trace_output.bson')
23
+ else
24
+ TraceView.reporter = TraceView::UdpReporter.new(TraceView::Config[:reporter_host], TraceView::Config[:reporter_port])
25
+ end
26
+
27
+ # Only report __Init from here if we are not instrumenting a framework.
28
+ # Otherwise, frameworks will handle reporting __Init after full initialization
29
+ unless defined?(::Rails) || defined?(::Sinatra) || defined?(::Padrino) || defined?(::Grape)
30
+ TraceView::API.report_init unless ENV.key?('TRACEVIEW_GEM_TEST')
31
+ end
32
+
33
+ rescue => e
34
+ $stderr.puts e.message
35
+ raise
36
+ end
37
+ end
38
+
39
+ def self.sendReport(evt)
40
+ TraceView.reporter.sendReport(evt)
41
+ end
42
+
43
+ ##
44
+ # clear_all_traces
45
+ #
46
+ # Truncates the trace output file to zero
47
+ #
48
+ def self.clear_all_traces
49
+ File.truncate($trace_file, 0)
50
+ end
51
+
52
+ ##
53
+ # get_all_traces
54
+ #
55
+ # Retrieves all traces written to the trace file
56
+ #
57
+ def self.get_all_traces
58
+ io = File.open($trace_file, 'r')
59
+ contents = io.readlines(nil)
60
+
61
+ return contents if contents.empty?
62
+
63
+ s = StringIO.new(contents[0])
64
+
65
+ traces = []
66
+
67
+ until s.eof?
68
+ if ::BSON.respond_to? :read_bson_document
69
+ traces << BSON.read_bson_document(s)
70
+ else
71
+ traces << BSON::Document.from_bson(s)
72
+ end
73
+ end
74
+
75
+ traces
76
+ end
77
+ end
78
+
79
+ class Event
80
+ def self.metadataString(evt)
81
+ evt.metadataString
82
+ end
83
+ end
84
+
85
+ class << self
86
+ def sample?(opts = {})
87
+ begin
88
+ return false unless TraceView.always? && TraceView.loaded
89
+
90
+ # Assure defaults since SWIG enforces Strings
91
+ layer = opts[:layer] ? opts[:layer].strip : ''
92
+ xtrace = opts[:xtrace] ? opts[:xtrace].strip : ''
93
+ tv_meta = opts['X-TV-Meta'] ? opts['X-TV-Meta'].strip : ''
94
+
95
+ rv = TraceView::Context.sampleRequest(layer, xtrace, tv_meta)
96
+
97
+ if rv == 0
98
+ if ENV.key?('TRACEVIEW_GEM_TEST')
99
+ # When in test, always trace and don't clear
100
+ # the stored sample rate/source
101
+ true
102
+ else
103
+ TraceView.sample_rate = -1
104
+ TraceView.sample_source = -1
105
+ false
106
+ end
107
+ else
108
+ # liboboe version > 1.3.1 returning a bit masked integer with SampleRate and
109
+ # source embedded
110
+ TraceView.sample_rate = (rv & SAMPLE_RATE_MASK)
111
+ TraceView.sample_source = (rv & SAMPLE_SOURCE_MASK) >> 24
112
+ true
113
+ end
114
+ rescue StandardError => e
115
+ TraceView.logger.debug "[oboe/error] sample? error: #{e.inspect}"
116
+ false
117
+ end
118
+ end
119
+
120
+ def set_tracing_mode(mode)
121
+ return unless TraceView.loaded
122
+
123
+ value = mode.to_sym
124
+
125
+ case value
126
+ when :never
127
+ TraceView::Context.setTracingMode(OBOE_TRACE_NEVER)
128
+
129
+ when :always
130
+ TraceView::Context.setTracingMode(OBOE_TRACE_ALWAYS)
131
+
132
+ when :through
133
+ TraceView::Context.setTracingMode(OBOE_TRACE_THROUGH)
134
+
135
+ else
136
+ TraceView.logger.fatal "[oboe/error] Invalid tracing mode set: #{mode}"
137
+ TraceView::Context.setTracingMode(OBOE_TRACE_THROUGH)
138
+ end
139
+ end
140
+
141
+ def set_sample_rate(rate)
142
+ return unless TraceView.loaded
143
+
144
+ # Update liboboe with the new SampleRate value
145
+ TraceView::Context.setDefaultSampleRate(rate.to_i)
146
+ end
147
+ end
148
+ end
149
+ # rubocop:enable Style/Documentation
150
+
151
+ TraceView.loaded = true
@@ -0,0 +1,76 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ module Oboe
5
+ class InstallGenerator < ::Rails::Generators::Base
6
+ source_root File.join(File.dirname(__FILE__), 'templates')
7
+ desc "Copies an oboe initializer files to your application."
8
+
9
+ def copy_initializer
10
+ # Set defaults
11
+ @tracing_mode = 'through'
12
+ @sample_rate = '300000'
13
+ @verbose = 'false'
14
+
15
+ print_header
16
+
17
+ while true do
18
+ print_body
19
+
20
+ user_tracing_mode = ask shell.set_color "* Tracing Mode? [through]:", :yellow
21
+ user_tracing_mode.downcase!
22
+
23
+ break if user_tracing_mode.blank?
24
+ valid = ['always', 'through', 'never'].include?(user_tracing_mode)
25
+
26
+ say shell.set_color "Valid values are 'always', 'through' or 'never'", :red, :bold unless valid
27
+ if valid
28
+ @tracing_mode = user_tracing_mode
29
+ break
30
+ end
31
+ end
32
+
33
+ print_footer
34
+
35
+ template "oboe_initializer.rb", "config/initializers/traceview.rb"
36
+ end
37
+
38
+ private
39
+
40
+ def print_header
41
+ say ""
42
+ say shell.set_color "Welcome to the TraceView Ruby instrumentation setup.", :green, :bold
43
+ say ""
44
+ say "To instrument your Rails application, you can setup your tracing strategy here."
45
+ say ""
46
+ say shell.set_color "Documentation Links", :magenta
47
+ say "-------------------"
48
+ say ""
49
+ say "Details on configuring your sample rate:"
50
+ say "https://support.appneta.com/cloud/configuring-sampling"
51
+ say ""
52
+ say "More information on instrumenting Ruby applications can be found here:"
53
+ say "https://support.appneta.com/cloud/installing-ruby-instrumentation"
54
+ end
55
+
56
+ def print_body
57
+ say ""
58
+ say shell.set_color "Tracing Mode", :magenta
59
+ say "------------"
60
+ say "Tracing Mode determines when traces should be initiated for incoming requests. Valid"
61
+ say "options are #{shell.set_color "always", :yellow}, #{shell.set_color "through", :yellow} (when using an instrumented Apache or Nginx) and #{shell.set_color "never", :yellow}."
62
+ say ""
63
+ say "If you're not using an instrumented Apache or Nginx, set this directive to #{shell.set_color "always", :yellow} in"
64
+ say "order to initiate tracing from Ruby."
65
+ say ""
66
+ end
67
+
68
+ def print_footer
69
+ say ""
70
+ say "You can change configuration values in the future by modifying config/initializers/traceview.rb"
71
+ say ""
72
+ say "Thanks! Creating the TraceView initializer..."
73
+ say ""
74
+ end
75
+ end
76
+ end