instana 1.10.1-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 (125) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +23 -0
  3. data/.gitignore +16 -0
  4. data/.rubocop.yml +1156 -0
  5. data/.travis.yml +43 -0
  6. data/Configuration.md +149 -0
  7. data/Dockerfile +13 -0
  8. data/Gemfile +41 -0
  9. data/LICENSE +21 -0
  10. data/README.md +102 -0
  11. data/Rakefile +56 -0
  12. data/Tracing.md +145 -0
  13. data/Troubleshooting.md +32 -0
  14. data/benchmarks/Gemfile +7 -0
  15. data/benchmarks/id_generation.rb +12 -0
  16. data/benchmarks/opentracing.rb +26 -0
  17. data/benchmarks/rack_vanilla_vs_traced.rb +80 -0
  18. data/benchmarks/stackprof_rack_tracing.rb +77 -0
  19. data/benchmarks/time_processing.rb +12 -0
  20. data/bin/console +7 -0
  21. data/bin/setup +8 -0
  22. data/examples/opentracing.rb +31 -0
  23. data/examples/tracing.rb +80 -0
  24. data/gemfiles/libraries.gemfile +71 -0
  25. data/gemfiles/rails32.gemfile +51 -0
  26. data/gemfiles/rails42.gemfile +50 -0
  27. data/gemfiles/rails50.gemfile +52 -0
  28. data/instana.gemspec +46 -0
  29. data/lib/instana.rb +12 -0
  30. data/lib/instana/agent.rb +441 -0
  31. data/lib/instana/agent/helpers.rb +61 -0
  32. data/lib/instana/agent/hooks.rb +37 -0
  33. data/lib/instana/agent/tasks.rb +48 -0
  34. data/lib/instana/base.rb +54 -0
  35. data/lib/instana/collector.rb +116 -0
  36. data/lib/instana/collectors/gc.rb +57 -0
  37. data/lib/instana/collectors/memory.rb +34 -0
  38. data/lib/instana/collectors/thread.rb +30 -0
  39. data/lib/instana/config.rb +79 -0
  40. data/lib/instana/eum/eum-test.js.erb +16 -0
  41. data/lib/instana/eum/eum.js.erb +14 -0
  42. data/lib/instana/frameworks/cuba.rb +6 -0
  43. data/lib/instana/frameworks/instrumentation/abstract_mysql_adapter.rb +58 -0
  44. data/lib/instana/frameworks/instrumentation/action_controller.rb +183 -0
  45. data/lib/instana/frameworks/instrumentation/action_view.rb +43 -0
  46. data/lib/instana/frameworks/instrumentation/active_record.rb +27 -0
  47. data/lib/instana/frameworks/instrumentation/mysql2_adapter.rb +81 -0
  48. data/lib/instana/frameworks/instrumentation/mysql_adapter.rb +56 -0
  49. data/lib/instana/frameworks/instrumentation/postgresql_adapter.rb +71 -0
  50. data/lib/instana/frameworks/rails.rb +42 -0
  51. data/lib/instana/frameworks/roda.rb +6 -0
  52. data/lib/instana/frameworks/sinatra.rb +9 -0
  53. data/lib/instana/helpers.rb +40 -0
  54. data/lib/instana/instrumentation.rb +21 -0
  55. data/lib/instana/instrumentation/dalli.rb +78 -0
  56. data/lib/instana/instrumentation/excon.rb +74 -0
  57. data/lib/instana/instrumentation/grpc.rb +84 -0
  58. data/lib/instana/instrumentation/net-http.rb +66 -0
  59. data/lib/instana/instrumentation/rack.rb +77 -0
  60. data/lib/instana/instrumentation/redis.rb +82 -0
  61. data/lib/instana/instrumentation/resque.rb +131 -0
  62. data/lib/instana/instrumentation/rest-client.rb +34 -0
  63. data/lib/instana/instrumentation/sidekiq-client.rb +45 -0
  64. data/lib/instana/instrumentation/sidekiq-worker.rb +54 -0
  65. data/lib/instana/opentracing/carrier.rb +4 -0
  66. data/lib/instana/opentracing/tracer.rb +18 -0
  67. data/lib/instana/rack.rb +10 -0
  68. data/lib/instana/setup.rb +36 -0
  69. data/lib/instana/test.rb +40 -0
  70. data/lib/instana/thread_local.rb +15 -0
  71. data/lib/instana/tracer.rb +392 -0
  72. data/lib/instana/tracing/processor.rb +92 -0
  73. data/lib/instana/tracing/span.rb +401 -0
  74. data/lib/instana/tracing/span_context.rb +33 -0
  75. data/lib/instana/util.rb +261 -0
  76. data/lib/instana/version.rb +4 -0
  77. data/lib/oj_check.rb +16 -0
  78. data/lib/opentracing.rb +6 -0
  79. data/test/agent/agent_test.rb +143 -0
  80. data/test/apps/cuba.rb +15 -0
  81. data/test/apps/grpc_server.rb +81 -0
  82. data/test/apps/roda.rb +10 -0
  83. data/test/apps/sinatra.rb +5 -0
  84. data/test/benchmarks/bench_id_generation.rb +12 -0
  85. data/test/benchmarks/bench_opentracing.rb +13 -0
  86. data/test/config_test.rb +37 -0
  87. data/test/frameworks/cuba_test.rb +44 -0
  88. data/test/frameworks/rack_test.rb +167 -0
  89. data/test/frameworks/rails/actioncontroller_test.rb +93 -0
  90. data/test/frameworks/rails/actionview3_test.rb +255 -0
  91. data/test/frameworks/rails/actionview4_test.rb +254 -0
  92. data/test/frameworks/rails/actionview5_test.rb +221 -0
  93. data/test/frameworks/rails/activerecord3_test.rb +134 -0
  94. data/test/frameworks/rails/activerecord4_test.rb +134 -0
  95. data/test/frameworks/rails/activerecord5_test.rb +87 -0
  96. data/test/frameworks/roda_test.rb +44 -0
  97. data/test/frameworks/sinatra_test.rb +44 -0
  98. data/test/instana_test.rb +27 -0
  99. data/test/instrumentation/dalli_test.rb +253 -0
  100. data/test/instrumentation/excon_test.rb +147 -0
  101. data/test/instrumentation/grpc_test.rb +377 -0
  102. data/test/instrumentation/net-http_test.rb +160 -0
  103. data/test/instrumentation/redis_test.rb +119 -0
  104. data/test/instrumentation/resque_test.rb +128 -0
  105. data/test/instrumentation/rest-client_test.rb +55 -0
  106. data/test/instrumentation/sidekiq-client_test.rb +125 -0
  107. data/test/instrumentation/sidekiq-worker_test.rb +173 -0
  108. data/test/jobs/resque_error_job.rb +22 -0
  109. data/test/jobs/resque_fast_job.rb +20 -0
  110. data/test/jobs/sidekiq_job_1.rb +6 -0
  111. data/test/jobs/sidekiq_job_2.rb +7 -0
  112. data/test/models/block.rb +18 -0
  113. data/test/servers/grpc_50051.rb +20 -0
  114. data/test/servers/helpers/sidekiq_worker_initializer.rb +27 -0
  115. data/test/servers/rackapp_6511.rb +25 -0
  116. data/test/servers/rails_3205.rb +167 -0
  117. data/test/servers/sidekiq/worker.rb +27 -0
  118. data/test/test_helper.rb +145 -0
  119. data/test/tracing/custom_test.rb +158 -0
  120. data/test/tracing/id_management_test.rb +130 -0
  121. data/test/tracing/opentracing_test.rb +335 -0
  122. data/test/tracing/trace_test.rb +67 -0
  123. data/test/tracing/tracer_async_test.rb +198 -0
  124. data/test/tracing/tracer_test.rb +223 -0
  125. metadata +327 -0
@@ -0,0 +1,4 @@
1
+ module OpenTracing
2
+ class Carrier < Hash
3
+ end
4
+ end
@@ -0,0 +1,18 @@
1
+ module OpenTracing
2
+ class << self
3
+ # Text format for #inject and #extract
4
+ FORMAT_TEXT_MAP = 1
5
+
6
+ # Binary format for #inject and #extract
7
+ FORMAT_BINARY = 2
8
+
9
+ # Ruby Specific format to handle how Rack changes environment variables.
10
+ FORMAT_RACK = 3
11
+
12
+ attr_accessor :global_tracer
13
+
14
+ def method_missing(method_name, *args, &block)
15
+ @global_tracer.send(method_name, *args, &block)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,10 @@
1
+ # This file exists to just make the Instana::Rack require calls a bit more
2
+ # user friendly.
3
+ #
4
+ # The real file is in the instrumentation subdirectory:
5
+ # lib/instana/instrumentation/rack.rb
6
+ #
7
+ # require 'instana/rack'
8
+ # config.middleware.use ::Instana::Rack
9
+ #
10
+ require 'instana/instrumentation/rack'
@@ -0,0 +1,36 @@
1
+ require 'oj_check'
2
+
3
+ require "instana/base"
4
+ require "instana/config"
5
+ require "instana/agent"
6
+ require "instana/collector"
7
+ require "instana/tracer"
8
+ require "instana/tracing/processor"
9
+ require "instana/instrumentation"
10
+
11
+ ::Instana.setup
12
+ ::Instana.agent.setup
13
+
14
+ # Register the metric collectors
15
+ unless RUBY_PLATFORM == 'java'.freeze
16
+ require 'instana/collectors/gc'
17
+ end
18
+
19
+ require 'instana/collectors/memory'
20
+ require 'instana/collectors/thread'
21
+
22
+ # Require supported OpenTracing interfaces
23
+ require "opentracing"
24
+
25
+ # The Instana agent is now setup. The only remaining
26
+ # task for a complete boot is to call
27
+ # `Instana.agent.start` in the thread of your choice.
28
+ # This can be in a simple `Thread.new` block or
29
+ # any other thread system you may use (e.g. actor
30
+ # threads).
31
+ #
32
+ # Note that `start` should only be called once per process.
33
+ #
34
+ # Thread.new do
35
+ # ::Instana.agent.start
36
+ # end
@@ -0,0 +1,40 @@
1
+ module Instana
2
+ class Test
3
+ class << self
4
+ # Used at the start of the test suite to configure required environment
5
+ # variables (if missing)
6
+ #
7
+ def setup_environment
8
+ # Set defaults if not set
9
+ ENV['MEMCACHED_HOST'] ||= '127.0.0.1:11211'
10
+ ENV['TRAVIS_PSQL_HOST'] ||= "127.0.0.1"
11
+ ENV['TRAVIS_PSQL_USER'] ||= "postgres"
12
+ ENV['TRAVIS_MYSQL_HOST'] ||= "127.0.0.1"
13
+ ENV['TRAVIS_MYSQL_USER'] ||= "root"
14
+
15
+ if ENV['DB_FLAVOR'] == 'postgresql'
16
+ ENV['DATABASE_URL'] = "postgresql://#{ENV['TRAVIS_PSQL_USER']}:#{ENV['TRAVIS_PSQL_PASS']}@#{ENV['TRAVIS_PSQL_HOST']}:5432/travis_ci_test"
17
+ elsif ENV['DB_FLAVOR'] == 'mysql'
18
+ ENV['DATABASE_URL'] = "mysql://#{ENV['TRAVIS_MYSQL_USER']}:#{ENV['TRAVIS_MYSQL_PASS']}@#{ENV['TRAVIS_MYSQL_HOST']}:3306/travis_ci_test"
19
+ else
20
+ ENV['DB_FLAVOR'] ||= 'mysql2'
21
+ ENV['DATABASE_URL'] = "mysql2://#{ENV['TRAVIS_MYSQL_USER']}:#{ENV['TRAVIS_MYSQL_PASS']}@#{ENV['TRAVIS_MYSQL_HOST']}:3306/travis_ci_test"
22
+ end
23
+
24
+ Instana.logger.warn "Database connect string configured to: #{ENV['DATABASE_URL']}"
25
+ end
26
+
27
+ def postgresql?
28
+ ENV['DB_FLAVOR'] == 'postgresql'
29
+ end
30
+
31
+ def mysql2?
32
+ ENV['DB_FLAVOR'] == 'mysql2'
33
+ end
34
+
35
+ def mysql?
36
+ ENV['DB_FLAVOR'] == 'mysql'
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,15 @@
1
+ module Instana
2
+ module ThreadLocal
3
+ def thread_local(name)
4
+ key = "__#{self}_#{name}__".intern
5
+
6
+ define_method(name) do
7
+ Thread.current[key]
8
+ end
9
+
10
+ define_method(name.to_s + '=') do |value|
11
+ Thread.current[key] = value
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,392 @@
1
+ require "instana/thread_local"
2
+ require "instana/tracing/span"
3
+ require "instana/tracing/span_context"
4
+
5
+ module Instana
6
+ class Tracer
7
+ extend ::Instana::ThreadLocal
8
+
9
+ thread_local :current_span
10
+
11
+ # Support ::Instana::Tracer.xxx call style for the instantiated tracer
12
+ class << self
13
+ def method_missing(method, *args, &block)
14
+ if ::Instana.tracer.respond_to?(method)
15
+ ::Instana.tracer.send(method, *args, &block)
16
+ else
17
+ super
18
+ end
19
+ end
20
+ end
21
+
22
+ #######################################
23
+ # Tracing blocks API methods
24
+ #######################################
25
+
26
+ # Will start a new trace or continue an on-going one (such as
27
+ # from incoming remote requests with context headers).
28
+ #
29
+ # @param name [String] the name of the span to start
30
+ # @param kvs [Hash] list of key values to be reported in the span
31
+ # @param incoming_context [Hash] specifies the incoming context. At a
32
+ # minimum, it should specify :trace_id and :span_id from the following:
33
+ # @:trace_id the trace ID (must be an unsigned hex-string)
34
+ # :span_id the ID of the parent span (must be an unsigned hex-string)
35
+ # :level specifies data collection level (optional)
36
+ #
37
+ def start_or_continue_trace(name, kvs = {}, incoming_context = nil, &block)
38
+ log_start_or_continue(name, kvs, incoming_context)
39
+ yield
40
+ rescue Exception => e
41
+ log_error(e)
42
+ raise
43
+ ensure
44
+ log_end(name)
45
+ end
46
+
47
+ # Trace a block of code within the context of the exiting trace
48
+ #
49
+ # Example usage:
50
+ #
51
+ # ::Instana.tracer.trace(:dbwork, { :db_name => @db.name }) do
52
+ # @db.select(1)
53
+ # end
54
+ #
55
+ # @param name [String] the name of the span to start
56
+ # @param kvs [Hash] list of key values to be reported in this new span
57
+ #
58
+ def trace(name, kvs = {}, &block)
59
+ log_entry(name, kvs)
60
+ yield
61
+ rescue Exception => e
62
+ log_error(e)
63
+ raise
64
+ ensure
65
+ log_exit(name)
66
+ end
67
+
68
+ #######################################
69
+ # Lower level tracing API methods
70
+ #######################################
71
+
72
+ # Will start a new trace or continue an on-going one (such as
73
+ # from incoming remote requests with context headers).
74
+ #
75
+ # @param name [String] the name of the span to start
76
+ # @param kvs [Hash] list of key values to be reported in the span
77
+ # @param incoming_context [SpanContext or Hash] specifies the incoming context. At a
78
+ # minimum, it should specify :trace_id and :span_id from the following:
79
+ # :trace_id the trace ID (must be an unsigned hex-string)
80
+ # :span_id the ID of the parent span (must be an unsigned hex-string)
81
+ # :level specifies data collection level (optional)
82
+ #
83
+ def log_start_or_continue(name, kvs = {}, incoming_context = nil)
84
+ return if !::Instana.agent.ready? || !::Instana.config[:tracing][:enabled]
85
+ ::Instana.logger.debug { "#{__method__} passed a block. Use `start_or_continue` instead!" } if block_given?
86
+
87
+ # Handle the potential variations on `incoming_context`
88
+ if incoming_context
89
+ if incoming_context.is_a?(Hash)
90
+ if !incoming_context.empty?
91
+ parent_context = SpanContext.new(incoming_context[:trace_id], incoming_context[:span_id], incoming_context[:level])
92
+ end
93
+ else
94
+ parent_context = incoming_context
95
+ end
96
+ end
97
+
98
+ if parent_context
99
+ self.current_span = Span.new(name, parent_ctx: parent_context)
100
+ else
101
+ self.current_span = Span.new(name)
102
+ end
103
+ self.current_span.set_tags(kvs) unless kvs.empty?
104
+ self.current_span
105
+ end
106
+
107
+ # Will establish a new span as a child of the current span
108
+ # in an existing trace
109
+ #
110
+ # @param name [String] the name of the span to create
111
+ # @param kvs [Hash] list of key values to be reported in the span
112
+ #
113
+ def log_entry(name, kvs = nil, start_time = ::Instana::Util.now_in_ms, child_of = nil)
114
+ return unless self.current_span || child_of
115
+
116
+ if child_of && (child_of.is_a?(::Instana::Span) || child_of.is_a?(::Instana::SpanContext))
117
+ new_span = Span.new(name, parent_ctx: child_of, start_time: start_time)
118
+ else
119
+ new_span = Span.new(name, parent_ctx: self.current_span, start_time: start_time)
120
+ end
121
+ new_span.set_tags(kvs) if kvs
122
+ self.current_span = new_span
123
+ end
124
+
125
+ # Add info to the current span
126
+ #
127
+ # @param kvs [Hash] list of key values to be reported in the span
128
+ #
129
+ def log_info(kvs)
130
+ return unless self.current_span
131
+ self.current_span.set_tags(kvs)
132
+ end
133
+
134
+ # Add an error to the current span
135
+ #
136
+ # @param e [Exception] Add exception to the current span
137
+ #
138
+ def log_error(e)
139
+ return unless self.current_span
140
+ self.current_span.add_error(e)
141
+ end
142
+
143
+ # Closes out the current span
144
+ #
145
+ # @note `name` isn't really required but helps keep sanity that
146
+ # we're closing out the span that we really want to close out.
147
+ #
148
+ # @param name [String] the name of the span to exit (close out)
149
+ # @param kvs [Hash] list of key values to be reported in the span
150
+ #
151
+ def log_exit(name, kvs = {})
152
+ return unless self.current_span
153
+
154
+ if ENV.key?('INSTANA_DEBUG') || ENV.key?('INSTANA_TEST')
155
+ unless self.current_span.name == name
156
+ ::Instana.logger.debug "Span mismatch: Attempt to exit #{name} span but #{self.current_span.name} is active."
157
+ end
158
+ end
159
+
160
+ self.current_span.set_tags(kvs)
161
+ self.current_span.close
162
+
163
+ if self.current_span.parent
164
+ self.current_span = self.current_span.parent
165
+ else
166
+ self.current_span = nil
167
+ end
168
+ end
169
+
170
+ # Closes out the current span in the current trace
171
+ # and queues the trace for reporting
172
+ #
173
+ # @note `name` isn't really required but helps keep sanity that
174
+ # we're ending the span that we really want to close out.
175
+ #
176
+ # @param name [String] the name of the span to end
177
+ # @param kvs [Hash] list of key values to be reported in the span
178
+ #
179
+ def log_end(name, kvs = {}, end_time = ::Instana::Util.now_in_ms)
180
+ return unless self.current_span
181
+
182
+ if ENV.key?('INSTANA_DEBUG') || ENV.key?('INSTANA_TEST')
183
+ unless self.current_span.name == name
184
+ ::Instana.logger.debug "Span mismatch: Attempt to end #{name} span but #{self.current_span.name} is active."
185
+ end
186
+ end
187
+
188
+ self.current_span.set_tags(kvs)
189
+ self.current_span.close(end_time)
190
+ self.current_span = nil
191
+ end
192
+
193
+ ###########################################################################
194
+ # Asynchronous API methods
195
+ ###########################################################################
196
+
197
+ # Starts a new asynchronous span on the current trace.
198
+ #
199
+ # @param name [String] the name of the span to create
200
+ # @param kvs [Hash] list of key values to be reported in the span
201
+ #
202
+ # @return [Hash] the context: Trace ID and Span ID in the form of
203
+ # :trace_id => 12345
204
+ # :span_id => 12345
205
+ #
206
+ def log_async_entry(name, kvs)
207
+ return unless self.current_span
208
+
209
+ new_span = Span.new(name, parent_ctx: self.current_span)
210
+ new_span.set_tags(kvs) unless kvs.empty?
211
+ new_span
212
+ end
213
+
214
+ # Add info to an asynchronous span
215
+ #
216
+ # @param kvs [Hash] list of key values to be reported in the span
217
+ # @param span [Span] the span for this Async op (previously returned from `log_async_entry`)
218
+ #
219
+ def log_async_info(kvs, span)
220
+ span.set_tags(kvs)
221
+ end
222
+
223
+ # Add an error to an asynchronous span
224
+ #
225
+ # @param e [Exception] Add exception to the current span
226
+ # @param span [Span] the span for this Async op (previously returned from `log_async_entry`)
227
+ #
228
+ def log_async_error(e, span)
229
+ span.add_error(e)
230
+ end
231
+
232
+ # Closes out an asynchronous span
233
+ #
234
+ # @param name [String] the name of the async span to exit (close out)
235
+ # @param kvs [Hash] list of additional key/values to be reported in the span (or use {})
236
+ # @param span [Span] the span for this Async op (previously returned from `log_async_entry`)
237
+ #
238
+ def log_async_exit(_name, kvs, span)
239
+ span.set_tags(kvs) unless kvs.empty?
240
+ span.close
241
+ end
242
+
243
+ ###########################################################################
244
+ # OpenTracing Support
245
+ ###########################################################################
246
+
247
+ # Start a new span
248
+ #
249
+ # @param operation_name [String] The name of the operation represented by the span
250
+ # @param child_of [Span] A span to be used as the ChildOf reference
251
+ # @param start_time [Time] the start time of the span
252
+ # @param tags [Hash] Starting tags for the span
253
+ #
254
+ # @return [Span]
255
+ #
256
+ def start_span(operation_name, child_of: nil, start_time: ::Instana::Util.now_in_ms, tags: nil)
257
+ if child_of && (child_of.is_a?(::Instana::Span) || child_of.is_a?(::Instana::SpanContext))
258
+ new_span = Span.new(operation_name, parent_ctx: child_of, start_time: start_time)
259
+ else
260
+ new_span = Span.new(operation_name, start_time: start_time)
261
+ end
262
+ new_span.set_tags(tags) if tags
263
+ new_span
264
+ end
265
+
266
+ # Inject a span into the given carrier
267
+ #
268
+ # @param span_context [SpanContext]
269
+ # @param format [OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY, OpenTracing::FORMAT_RACK]
270
+ # @param carrier [Carrier]
271
+ #
272
+ def inject(span_context, format, carrier)
273
+ case format
274
+ when OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY
275
+ ::Instana.logger.debug 'Unsupported inject format'
276
+ when OpenTracing::FORMAT_RACK
277
+ carrier['X-Instana-T'] = ::Instana::Util.id_to_header(span_context.trace_id)
278
+ carrier['X-Instana-S'] = ::Instana::Util.id_to_header(span_context.span_id)
279
+ else
280
+ ::Instana.logger.debug 'Unknown inject format'
281
+ end
282
+ end
283
+
284
+ # Extract a span from a carrier
285
+ #
286
+ # @param format [OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY, OpenTracing::FORMAT_RACK]
287
+ # @param carrier [Carrier]
288
+ #
289
+ # @return [SpanContext]
290
+ #
291
+ def extract(format, carrier)
292
+ case format
293
+ when OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY
294
+ ::Instana.logger.debug 'Unsupported extract format'
295
+ when OpenTracing::FORMAT_RACK
296
+ ::Instana::SpanContext.new(::Instana::Util.header_to_id(carrier['HTTP_X_INSTANA_T']),
297
+ ::Instana::Util.header_to_id(carrier['HTTP_X_INSTANA_S']))
298
+ else
299
+ ::Instana.logger.debug 'Unknown inject format'
300
+ nil
301
+ end
302
+ end
303
+
304
+ ###########################################################################
305
+ # Helper methods
306
+ ###########################################################################
307
+
308
+ # Indicates if we're are currently in the process of
309
+ # collecting a trace. This is false when the host agent isn
310
+ # available.
311
+ #
312
+ # @return [Boolean] true or false on whether we are currently tracing or not
313
+ #
314
+ def tracing?
315
+ # The non-nil value of this instance variable
316
+ # indicates if we are currently tracing
317
+ # in this thread or not.
318
+ self.current_span ? true : false
319
+ end
320
+
321
+ # Indicates if we're tracing and the current span name matches
322
+ # <name>
323
+ #
324
+ # @param name [Symbol] the name to check against the current span
325
+ #
326
+ # @return [Boolean]
327
+ #
328
+ def tracing_span?(name)
329
+ if self.current_span
330
+ return self.current_span.name == name
331
+ end
332
+ false
333
+ end
334
+
335
+ # Retrieve the current context of the tracer.
336
+ #
337
+ # @return [SpanContext] or nil if not tracing
338
+ #
339
+ def context
340
+ return unless self.current_span
341
+ self.current_span.context
342
+ end
343
+
344
+ # Take the current trace_id and convert it to a header compatible
345
+ # format.
346
+ #
347
+ # @return [String] a hexadecimal representation of the current trace ID
348
+ #
349
+ def trace_id_header
350
+ if self.current_span
351
+ self.current_span.context.trace_id_header
352
+ else
353
+ ""
354
+ end
355
+ end
356
+
357
+ # Take the current span_id and convert it to a header compatible
358
+ # formate.
359
+ #
360
+ # @return [String] a hexadecimal representation of the current span ID
361
+ #
362
+ def span_id_header
363
+ if self.current_span
364
+ self.current_span.context.span_id_header
365
+ else
366
+ ""
367
+ end
368
+ end
369
+
370
+ # Returns the trace ID for the active trace (if there is one),
371
+ # otherwise nil.
372
+ #
373
+ def trace_id
374
+ self.current_span ? self.current_span.id : nil
375
+ ::Instana.logger.debug("tracer.trace_id will deprecated in a future version.")
376
+ end
377
+
378
+ # Returns the current [Span] ID for the active trace (if there is one),
379
+ # otherwise nil.
380
+ #
381
+ def span_id
382
+ self.current_span ? self.current_span.span_id : nil
383
+ ::Instana.logger.debug("tracer.span_id will deprecated in a future version.")
384
+ end
385
+
386
+ # Used in the test suite, this resets the tracer to non-tracing state.
387
+ #
388
+ def clear!
389
+ self.current_span = nil
390
+ end
391
+ end
392
+ end