instana 1.9.7 → 1.10.0.slimfast

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/lib/instana/agent.rb +19 -19
  3. data/lib/instana/agent/helpers.rb +2 -2
  4. data/lib/instana/agent/tasks.rb +2 -2
  5. data/lib/instana/collectors/gc.rb +1 -1
  6. data/lib/instana/collectors/memory.rb +1 -1
  7. data/lib/instana/collectors/thread.rb +1 -1
  8. data/lib/instana/frameworks/instrumentation/mysql2_adapter.rb +1 -1
  9. data/lib/instana/frameworks/instrumentation/mysql_adapter.rb +1 -1
  10. data/lib/instana/helpers.rb +2 -2
  11. data/lib/instana/instrumentation.rb +1 -1
  12. data/lib/instana/instrumentation/excon.rb +8 -5
  13. data/lib/instana/instrumentation/rack.rb +2 -2
  14. data/lib/instana/instrumentation/resque.rb +3 -3
  15. data/lib/instana/tracer.rb +92 -117
  16. data/lib/instana/tracing/processor.rb +18 -133
  17. data/lib/instana/tracing/span.rb +40 -35
  18. data/lib/instana/tracing/span_context.rb +3 -1
  19. data/lib/instana/util.rb +5 -5
  20. data/lib/instana/version.rb +1 -1
  21. data/lib/opentracing.rb +1 -1
  22. data/test/frameworks/rack_test.rb +6 -11
  23. data/test/frameworks/rails/actioncontroller_test.rb +32 -62
  24. data/test/frameworks/rails/actionview5_test.rb +91 -132
  25. data/test/frameworks/rails/activerecord5_test.rb +14 -17
  26. data/test/instrumentation/dalli_test.rb +51 -72
  27. data/test/instrumentation/excon_test.rb +70 -94
  28. data/test/instrumentation/grpc_test.rb +164 -126
  29. data/test/instrumentation/net-http_test.rb +48 -57
  30. data/test/instrumentation/redis_test.rb +4 -6
  31. data/test/instrumentation/resque_test.rb +41 -41
  32. data/test/instrumentation/rest-client_test.rb +25 -31
  33. data/test/instrumentation/sidekiq-client_test.rb +12 -20
  34. data/test/instrumentation/sidekiq-worker_test.rb +48 -63
  35. data/test/jobs/resque_error_job.rb +7 -1
  36. data/test/jobs/resque_fast_job.rb +7 -1
  37. data/test/servers/sidekiq/worker.rb +1 -3
  38. data/test/test_helper.rb +58 -0
  39. data/test/tracing/custom_test.rb +11 -19
  40. data/test/tracing/opentracing_test.rb +48 -156
  41. data/test/tracing/trace_test.rb +67 -67
  42. data/test/tracing/tracer_async_test.rb +75 -175
  43. data/test/tracing/tracer_test.rb +75 -75
  44. metadata +4 -5
  45. data/lib/instana/tracing/trace.rb +0 -316
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 556dea91963ad3942c67bd242df34c6121623f74055a09e88891adbabe7aff5a
4
- data.tar.gz: 2de597f123eaf230c7cf6733efe8d4622e59300b69597478c99fe878d665849e
3
+ metadata.gz: 636d84b9e35dfd6f03f1186ecda22b22b96105725007ca2f48dccc41198782f7
4
+ data.tar.gz: 16842c4bacc3cac2c347babee2653fbfd3462fb0ee466b5317d22167465088ab
5
5
  SHA512:
6
- metadata.gz: 14a5cfc91e47192e928eb6fc407ad0dc5788f8471c593fcfdc34617c9e20f58c7509e3ffaa6eecc4a004f5c9af58d6af9adb9be71794c3bd14cce3ecd110370d
7
- data.tar.gz: a3b2301b94d016965d054b66c383edd8823b340390114a1f011a1874281a61e19bd4c0be0aca7ce40f7ced5c36fa2f265e3c67f81bd7bbe836335e8914fbdd25
6
+ metadata.gz: e30db43f11f5b3574405ef02ce18c1bb755bad5b0b5e28bd3f8d5a74846b9feeb08e0541f66a74bb174cb4c01be889ab896a34b988d26ab93577f4de2561c34a
7
+ data.tar.gz: 2cc0b8257cdb95df46fa3955c081a12188d7abf4f0a639929f50264b94961fa61bb9de4f092cf04d0144c985d4a871084114aaad14ad1b7671dea908b4a3bd43
@@ -167,8 +167,8 @@ module Instana
167
167
  @timers.wait
168
168
  end
169
169
  rescue Exception => e
170
- ::Instana.logger.warn "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
171
- ::Instana.logger.debug e.backtrace.join("\r\n")
170
+ ::Instana.logger.warn { "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" }
171
+ ::Instana.logger.debug { e.backtrace.join("\r\n") }
172
172
  ensure
173
173
  if @state == :announced
174
174
  # Pause the timers so they don't fire while we are
@@ -176,7 +176,7 @@ module Instana
176
176
  @collect_timer.pause
177
177
  @announce_timer.pause
178
178
 
179
- ::Instana.logger.debug "#{Thread.current}: Agent exiting. Reporting final #{::Instana.processor.queue_count} trace(s)."
179
+ ::Instana.logger.debug { "#{Thread.current}: Agent exiting. Reporting final #{::Instana.processor.queue_count} trace(s)." }
180
180
  ::Instana.processor.send
181
181
  end
182
182
  end
@@ -211,7 +211,7 @@ module Instana
211
211
  req = Net::HTTP::Put.new(uri)
212
212
  req.body = Oj.dump(announce_payload, OJ_OPTIONS)
213
213
 
214
- ::Instana.logger.debug "Announce: http://#{@discovered[:agent_host]}:#{@discovered[:agent_port]}/#{DISCOVERY_PATH} - payload: #{req.body}"
214
+ ::Instana.logger.debug { "Announce: http://#{@discovered[:agent_host]}:#{@discovered[:agent_port]}/#{DISCOVERY_PATH} - payload: #{req.body}" }
215
215
 
216
216
  response = make_host_agent_request(req)
217
217
 
@@ -228,8 +228,8 @@ module Instana
228
228
  false
229
229
  end
230
230
  rescue => e
231
- Instana.logger.info "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
232
- Instana.logger.debug e.backtrace.join("\r\n")
231
+ Instana.logger.info { "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" }
232
+ Instana.logger.debug { e.backtrace.join("\r\n") }
233
233
  return false
234
234
  ensure
235
235
  socket.close if socket
@@ -269,8 +269,8 @@ module Instana
269
269
  end
270
270
  false
271
271
  rescue => e
272
- Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
273
- Instana.logger.debug e.backtrace.join("\r\n")
272
+ Instana.logger.debug { "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" }
273
+ Instana.logger.debug { e.backtrace.join("\r\n") }
274
274
  end
275
275
 
276
276
  # Accept and report spans to the host agent.
@@ -304,8 +304,8 @@ module Instana
304
304
  end
305
305
  false
306
306
  rescue => e
307
- Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
308
- Instana.logger.debug e.backtrace.join("\r\n")
307
+ Instana.logger.debug { "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" }
308
+ Instana.logger.debug { e.backtrace.join("\r\n") }
309
309
  end
310
310
 
311
311
  # Check that the host agent is available and can be contacted. This will
@@ -328,8 +328,8 @@ module Instana
328
328
  end
329
329
  false
330
330
  rescue => e
331
- Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
332
- Instana.logger.debug e.backtrace.join("\r\n") unless ENV.key?('INSTANA_TEST')
331
+ Instana.logger.debug { "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" }
332
+ Instana.logger.debug { e.backtrace.join("\r\n") } unless ENV.key?('INSTANA_TEST')
333
333
  return false
334
334
  end
335
335
 
@@ -342,20 +342,20 @@ module Instana
342
342
  def run_discovery
343
343
  discovered = {}
344
344
 
345
- ::Instana.logger.debug "#{__method__}: Running agent discovery..."
345
+ ::Instana.logger.debug { "#{__method__}: Running agent discovery..." }
346
346
 
347
347
  # Try default location or manually configured (if so)
348
348
  uri = URI.parse("http://#{::Instana.config[:agent_host]}:#{::Instana.config[:agent_port]}/")
349
349
  req = Net::HTTP::Get.new(uri)
350
350
 
351
- ::Instana.logger.debug "#{__method__}: Trying #{::Instana.config[:agent_host]}:#{::Instana.config[:agent_port]}"
351
+ ::Instana.logger.debug { "#{__method__}: Trying #{::Instana.config[:agent_host]}:#{::Instana.config[:agent_port]}" }
352
352
 
353
353
  response = make_host_agent_request(req)
354
354
 
355
355
  if response && (response.code.to_i == 200)
356
356
  discovered[:agent_host] = ::Instana.config[:agent_host]
357
357
  discovered[:agent_port] = ::Instana.config[:agent_port]
358
- ::Instana.logger.debug "#{__method__}: Found #{discovered[:agent_host]}:#{discovered[:agent_port]}"
358
+ ::Instana.logger.debug { "#{__method__}: Found #{discovered[:agent_host]}:#{discovered[:agent_port]}" }
359
359
  return discovered
360
360
  end
361
361
 
@@ -366,14 +366,14 @@ module Instana
366
366
  uri = URI.parse("http://#{@default_gateway}:#{::Instana.config[:agent_port]}/")
367
367
  req = Net::HTTP::Get.new(uri)
368
368
 
369
- ::Instana.logger.debug "#{__method__}: Trying default gateway #{@default_gateway}:#{::Instana.config[:agent_port]}"
369
+ ::Instana.logger.debug { "#{__method__}: Trying default gateway #{@default_gateway}:#{::Instana.config[:agent_port]}" }
370
370
 
371
371
  response = make_host_agent_request(req)
372
372
 
373
373
  if response && (response.code.to_i == 200)
374
374
  discovered[:agent_host] = @default_gateway
375
375
  discovered[:agent_port] = ::Instana.config[:agent_port]
376
- ::Instana.logger.debug "#{__method__}: Found #{discovered[:agent_host]}:#{discovered[:agent_port]}"
376
+ ::Instana.logger.debug { "#{__method__}: Found #{discovered[:agent_host]}:#{discovered[:agent_port]}" }
377
377
  return discovered
378
378
  end
379
379
 
@@ -434,8 +434,8 @@ module Instana
434
434
  rescue Errno::ECONNREFUSED
435
435
  return nil
436
436
  rescue => e
437
- Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
438
- Instana.logger.debug e.backtrace.join("\r\n") unless ENV.key?('INSTANA_TEST')
437
+ Instana.logger.debug { "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" }
438
+ Instana.logger.debug { e.backtrace.join("\r\n") } unless ENV.key?('INSTANA_TEST')
439
439
  return nil
440
440
  end
441
441
  end
@@ -51,8 +51,8 @@ module AgentHelpers
51
51
 
52
52
  @state == :announced
53
53
  rescue => e
54
- Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
55
- Instana.logger.debug e.backtrace.join("\r\n") unless ENV.key?('INSTANA_TEST')
54
+ Instana.logger.debug { "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" }
55
+ Instana.logger.debug { e.backtrace.join("\r\n") } unless ENV.key?('INSTANA_TEST')
56
56
  return false
57
57
  end
58
58
  end
@@ -42,7 +42,7 @@ module AgentTasks
42
42
  make_host_agent_request(req)
43
43
 
44
44
  rescue StandardError => e
45
- Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
46
- Instana.logger.debug e.backtrace.join("\r\n")
45
+ Instana.logger.debug { "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" }
46
+ Instana.logger.debug { e.backtrace.join("\r\n") }
47
47
  end
48
48
  end
@@ -45,7 +45,7 @@ module Instana
45
45
  @this_gc
46
46
  rescue => e
47
47
  ::Instana.logger.info "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
48
- ::Instana.logger.debug e.backtrace.join("\r\n")
48
+ ::Instana.logger.debug { e.backtrace.join("\r\n") }
49
49
  end
50
50
  end
51
51
  end
@@ -22,7 +22,7 @@ module Instana
22
22
  @this_mem
23
23
  rescue => e
24
24
  ::Instana.logger.info "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
25
- ::Instana.logger.debug e.backtrace.join("\r\n")
25
+ ::Instana.logger.debug { e.backtrace.join("\r\n") }
26
26
  end
27
27
  end
28
28
  end
@@ -18,7 +18,7 @@ module Instana
18
18
  @this_count
19
19
  rescue => e
20
20
  ::Instana.logger.info "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
21
- ::Instana.logger.debug e.backtrace.join("\r\n")
21
+ ::Instana.logger.debug { e.backtrace.join("\r\n") }
22
22
  end
23
23
  end
24
24
  end
@@ -67,7 +67,7 @@ module Instana
67
67
 
68
68
  def exec_query_with_instana(sql, name = 'SQL', binds = [], *args)
69
69
  if !::Instana.tracer.tracing? || ignore_payload?(name, sql) ||
70
- ::Instana.tracer.current_span_name?(:activerecord)
70
+ ::Instana.tracer.current_span[:n] == :activerecord
71
71
  return exec_query_without_instana(sql, name, binds, *args)
72
72
  end
73
73
 
@@ -42,7 +42,7 @@ module Instana
42
42
 
43
43
  def exec_query_with_instana(sql, name = 'SQL', binds = [], *args)
44
44
  if !::Instana.tracer.tracing? || ignore_payload?(name, sql) ||
45
- ::Instana.tracer.current_span_name?(:activerecord)
45
+ ::Instana.tracer.current_span[:n] == :activerecord
46
46
  return exec_query_without_instana(sql, name, binds, *args)
47
47
  end
48
48
 
@@ -16,7 +16,7 @@ module Instana
16
16
  ERB.new(EUM_SNIPPET).result
17
17
  rescue => e
18
18
  Instana.logger.info "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
19
- Instana.logger.debug e.backtrace.join("\r\n")
19
+ Instana.logger.debug { e.backtrace.join("\r\n") }
20
20
  return nil
21
21
  end
22
22
 
@@ -32,7 +32,7 @@ module Instana
32
32
  ERB.new(EUM_TEST_SNIPPET).result
33
33
  rescue => e
34
34
  Instana.logger.info "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
35
- Instana.logger.debug e.backtrace.join("\r\n")
35
+ Instana.logger.debug { e.backtrace.join("\r\n") }
36
36
  return nil
37
37
  end
38
38
  end
@@ -14,7 +14,7 @@ if !ENV.key?('INSTANA_DISABLE_AUTO_INSTR') || ENV['INSTANA_DISABLE_AUTO_INSTR']
14
14
  require f
15
15
  rescue => e
16
16
  Instana.logger.error "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
17
- Instana.logger.debug e.backtrace.join("\r\n")
17
+ Instana.logger.debug { e.backtrace.join("\r\n") }
18
18
  end
19
19
  end
20
20
  end
@@ -13,13 +13,14 @@ if defined?(::Excon) && ::Instana.config[:excon][:enabled]
13
13
  if datum[:pipeline] == true
14
14
  # Pass the context along in the datum so we get back on response
15
15
  # and can close out the async span
16
- datum[:instana_context] = ::Instana.tracer.log_async_entry(:excon, payload)
16
+ datum[:instana_span] = ::Instana.tracer.log_async_entry(:excon, payload)
17
+ t_context = datum[:instana_span].context
17
18
  else
18
19
  ::Instana.tracer.log_entry(:excon, payload)
20
+ t_context = ::Instana.tracer.context
19
21
  end
20
22
 
21
23
  # Set request headers; encode IDs as hexadecimal strings
22
- t_context = ::Instana.tracer.context
23
24
  datum[:headers]['X-Instana-T'] = t_context.trace_id_header
24
25
  datum[:headers]['X-Instana-S'] = t_context.span_id_header
25
26
 
@@ -30,7 +31,7 @@ if defined?(::Excon) && ::Instana.config[:excon][:enabled]
30
31
  return @stack.error_call(datum) unless ::Instana.tracer.tracing?
31
32
 
32
33
  if datum[:pipeline] == true
33
- ::Instana.tracer.log_async_error(datum[:error], datum[:instana_context])
34
+ ::Instana.tracer.log_async_error(datum[:error], datum[:instana_span])
34
35
  else
35
36
  ::Instana.tracer.log_error(datum[:error])
36
37
  end
@@ -38,6 +39,8 @@ if defined?(::Excon) && ::Instana.config[:excon][:enabled]
38
39
  end
39
40
 
40
41
  def response_call(datum)
42
+ # FIXME: Will connect exceptions call a response?
43
+ #
41
44
  return @stack.response_call(datum) unless ::Instana.tracer.tracing?
42
45
 
43
46
  result = @stack.response_call(datum)
@@ -54,8 +57,8 @@ if defined?(::Excon) && ::Instana.config[:excon][:enabled]
54
57
  end
55
58
 
56
59
  if datum[:pipeline] == true
57
- # Pickup context of this async span from datum[:instana_id]
58
- ::Instana.tracer.log_async_exit(:excon, { :http => {:status => status } }, datum[:instana_context])
60
+ # Pickup context of this async span from datum[:instana_span]
61
+ ::Instana.tracer.log_async_exit(:excon, { :http => {:status => status } }, datum[:instana_span])
59
62
  else
60
63
  ::Instana.tracer.log_exit(:excon, { :http => {:status => status } })
61
64
  end
@@ -57,8 +57,8 @@ module Instana
57
57
 
58
58
  # Save the IDs before the trace ends so we can place
59
59
  # them in the response headers in the ensure block
60
- trace_id = ::Instana.tracer.trace_id
61
- span_id = ::Instana.tracer.span_id
60
+ trace_id = ::Instana.tracer.current_span.trace_id
61
+ span_id = ::Instana.tracer.current_span.id
62
62
  end
63
63
 
64
64
  [status, headers, response]
@@ -17,7 +17,7 @@ module Instana
17
17
  kvs[:job] = klass.to_s
18
18
  kvs[:queue] = klass.instance_variable_get(:@queue)
19
19
  rescue => e
20
- Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
20
+ Instana.logger.debug { "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" }
21
21
  end
22
22
 
23
23
  { :'resque-client' => kvs }
@@ -77,7 +77,7 @@ module Instana
77
77
  kvs[:'resque-worker'][:job] = job.payload['class'].to_s
78
78
  kvs[:'resque-worker'][:queue] = job.queue
79
79
  rescue => e
80
- ::Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if Instana::Config[:verbose]
80
+ ::Instana.logger.debug { "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" } if Instana::Config[:verbose]
81
81
  end
82
82
 
83
83
  Instana.tracer.start_or_continue_trace(:'resque-worker', kvs) do
@@ -97,7 +97,7 @@ module Instana
97
97
  ::Instana.tracer.log_error(exception)
98
98
  end
99
99
  rescue Exception => e
100
- ::Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if Instana::Config[:verbose]
100
+ ::Instana.logger.debug { "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" } if Instana::Config[:verbose]
101
101
  ensure
102
102
  fail_without_instana(exception)
103
103
  end
@@ -1,5 +1,4 @@
1
1
  require "instana/thread_local"
2
- require "instana/tracing/trace"
3
2
  require "instana/tracing/span"
4
3
  require "instana/tracing/span_context"
5
4
 
@@ -7,7 +6,7 @@ module Instana
7
6
  class Tracer
8
7
  extend ::Instana::ThreadLocal
9
8
 
10
- thread_local :current_trace
9
+ thread_local :current_span
11
10
 
12
11
  # Support ::Instana::Tracer.xxx call style for the instantiated tracer
13
12
  class << self
@@ -35,7 +34,7 @@ module Instana
35
34
  # :span_id the ID of the parent span (must be an unsigned hex-string)
36
35
  # :level specifies data collection level (optional)
37
36
  #
38
- def start_or_continue_trace(name, kvs = {}, incoming_context = {}, &block)
37
+ def start_or_continue_trace(name, kvs = {}, incoming_context = nil, &block)
39
38
  log_start_or_continue(name, kvs, incoming_context)
40
39
  yield
41
40
  rescue Exception => e
@@ -75,16 +74,34 @@ module Instana
75
74
  #
76
75
  # @param name [String] the name of the span to start
77
76
  # @param kvs [Hash] list of key values to be reported in the span
78
- # @param incoming_context [Hash] specifies the incoming context. At a
77
+ # @param incoming_context [SpanContext or Hash] specifies the incoming context. At a
79
78
  # minimum, it should specify :trace_id and :span_id from the following:
80
79
  # :trace_id the trace ID (must be an unsigned hex-string)
81
80
  # :span_id the ID of the parent span (must be an unsigned hex-string)
82
81
  # :level specifies data collection level (optional)
83
82
  #
84
- def log_start_or_continue(name, kvs = {}, incoming_context = {})
83
+ def log_start_or_continue(name, kvs = {}, incoming_context = nil)
85
84
  return if !::Instana.agent.ready? || !::Instana.config[:tracing][:enabled]
86
85
  ::Instana.logger.debug "#{__method__} passed a block. Use `start_or_continue` instead!" if block_given?
87
- self.current_trace = ::Instana::Trace.new(name, kvs, incoming_context)
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])
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
88
105
  end
89
106
 
90
107
  # Will establish a new span as a child of the current span
@@ -93,9 +110,16 @@ module Instana
93
110
  # @param name [String] the name of the span to create
94
111
  # @param kvs [Hash] list of key values to be reported in the span
95
112
  #
96
- def log_entry(name, kvs = {})
97
- return unless tracing?
98
- self.current_trace.new_span(name, kvs)
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
99
123
  end
100
124
 
101
125
  # Add info to the current span
@@ -103,8 +127,8 @@ module Instana
103
127
  # @param kvs [Hash] list of key values to be reported in the span
104
128
  #
105
129
  def log_info(kvs)
106
- return unless tracing?
107
- self.current_trace.add_info(kvs)
130
+ return unless self.current_span
131
+ self.current_span.set_tags(kvs)
108
132
  end
109
133
 
110
134
  # Add an error to the current span
@@ -112,8 +136,8 @@ module Instana
112
136
  # @param e [Exception] Add exception to the current span
113
137
  #
114
138
  def log_error(e)
115
- return unless tracing?
116
- self.current_trace.add_error(e)
139
+ return unless self.current_span
140
+ self.current_span.add_error(e)
117
141
  end
118
142
 
119
143
  # Closes out the current span
@@ -125,15 +149,22 @@ module Instana
125
149
  # @param kvs [Hash] list of key values to be reported in the span
126
150
  #
127
151
  def log_exit(name, kvs = {})
128
- return unless tracing?
152
+ return unless self.current_span
129
153
 
130
154
  if ENV.key?('INSTANA_DEBUG') || ENV.key?('INSTANA_TEST')
131
- unless current_span_name?(name)
132
- ::Instana.logger.debug "Span mismatch: Attempt to exit #{name} span but #{current_span.name} is active."
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."
133
157
  end
134
158
  end
135
159
 
136
- self.current_trace.end_span(kvs)
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
137
168
  end
138
169
 
139
170
  # Closes out the current span in the current trace
@@ -146,28 +177,17 @@ module Instana
146
177
  # @param kvs [Hash] list of key values to be reported in the span
147
178
  #
148
179
  def log_end(name, kvs = {}, end_time = ::Instana::Util.now_in_ms)
149
- return unless tracing?
180
+ return unless self.current_span
150
181
 
151
182
  if ENV.key?('INSTANA_DEBUG') || ENV.key?('INSTANA_TEST')
152
- unless current_span_name?(name)
153
- ::Instana.logger.debug "Span mismatch: Attempt to end #{name} span but #{current_span.name} is active."
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."
154
185
  end
155
186
  end
156
187
 
157
- self.current_trace.finish(kvs, end_time)
158
-
159
- if ::Instana.agent.ready?
160
- if !self.current_trace.has_async? ||
161
- (self.current_trace.has_async? && self.current_trace.complete?)
162
- Instana.processor.add(self.current_trace)
163
- else
164
- # This trace still has outstanding/uncompleted asynchronous spans.
165
- # Put it in the staging queue until the async span closes out or
166
- # 5 minutes has passed. Whichever comes first.
167
- Instana.processor.stage(self.current_trace)
168
- end
169
- end
170
- self.current_trace = nil
188
+ self.current_span.set_tags(kvs)
189
+ self.current_span.close(end_time)
190
+ self.current_span = nil
171
191
  end
172
192
 
173
193
  ###########################################################################
@@ -184,80 +204,40 @@ module Instana
184
204
  # :span_id => 12345
185
205
  #
186
206
  def log_async_entry(name, kvs)
187
- return unless tracing?
188
- self.current_trace.new_async_span(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
189
212
  end
190
213
 
191
214
  # Add info to an asynchronous span
192
215
  #
193
216
  # @param kvs [Hash] list of key values to be reported in the span
194
- # @param span [Span] the span for this Async op (previously returned
195
- # from `log_async_entry`)
217
+ # @param span [Span] the span for this Async op (previously returned from `log_async_entry`)
196
218
  #
197
219
  def log_async_info(kvs, span)
198
- # Asynchronous spans can persist longer than the parent
199
- # trace. With the trace ID, we check the current trace
200
- # but otherwise, we search staged traces.
201
-
202
- if tracing? && self.current_trace.id == span.context.trace_id
203
- self.current_trace.add_async_info(kvs, span)
204
- else
205
- trace = ::Instana.processor.staged_trace(span.context.trace_id)
206
- if trace
207
- trace.add_async_info(kvs, span)
208
- else
209
- ::Instana.logger.debug "#{__method__}: Couldn't find staged trace. #{span.inspect}"
210
- end
211
- end
220
+ span.set_tags(kvs)
212
221
  end
213
222
 
214
223
  # Add an error to an asynchronous span
215
224
  #
216
225
  # @param e [Exception] Add exception to the current span
217
- # @param span [Span] the span for this Async op (previously returned
218
- # from `log_async_entry`)
226
+ # @param span [Span] the span for this Async op (previously returned from `log_async_entry`)
219
227
  #
220
228
  def log_async_error(e, span)
221
- # Asynchronous spans can persist longer than the parent
222
- # trace. With the trace ID, we check the current trace
223
- # but otherwise, we search staged traces.
224
-
225
- if tracing? && self.current_trace.id == span.context.trace_id
226
- self.current_trace.add_async_error(e, span)
227
- else
228
- trace = ::Instana.processor.staged_trace(span.context.trace_id)
229
- if trace
230
- trace.add_async_error(e, span)
231
- else
232
- ::Instana.logger.debug "#{__method__}: Couldn't find staged trace. #{span.inspect}"
233
- end
234
- end
229
+ span.add_error(e)
235
230
  end
236
231
 
237
232
  # Closes out an asynchronous span
238
233
  #
239
234
  # @param name [String] the name of the async span to exit (close out)
240
- # @param kvs [Hash] list of key values to be reported in the span
241
- # @param span [Span] the span for this Async op (previously returned
242
- # from `log_async_entry`)
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`)
243
237
  #
244
238
  def log_async_exit(_name, kvs, span)
245
- # An asynchronous span can end after the current trace has
246
- # already completed so we make sure that we end the span
247
- # on the right trace.
248
-
249
- if tracing? && self.current_trace.id == span.context.trace_id
250
- self.current_trace.end_async_span(kvs, span)
251
- else
252
- # Different trace from current so find the staged trace
253
- # and close out the span on it.
254
- trace = ::Instana.processor.staged_trace(span.context.trace_id)
255
- if trace
256
- trace.end_async_span(kvs, span)
257
- else
258
- ::Instana.logger.debug "#{__method__}: Couldn't find staged trace. #{span.inspect}"
259
- end
260
- end
239
+ span.set_tags(kvs) unless kvs.empty?
240
+ span.close
261
241
  end
262
242
 
263
243
  ###########################################################################
@@ -274,16 +254,13 @@ module Instana
274
254
  # @return [Span]
275
255
  #
276
256
  def start_span(operation_name, child_of: nil, start_time: ::Instana::Util.now_in_ms, tags: nil)
277
- # return unless ::Instana.agent.ready?
278
-
279
- if tracing?
280
- span = self.current_trace.new_span(operation_name, tags, start_time, child_of)
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)
281
259
  else
282
- self.current_trace = ::Instana::Trace.new(operation_name, tags, nil, start_time)
283
- span = self.current_trace.current_span
260
+ new_span = Span.new(operation_name, start_time: start_time)
284
261
  end
285
- span.set_tags(tags)
286
- span
262
+ new_span.set_tags(tags) if tags
263
+ new_span
287
264
  end
288
265
 
289
266
  # Inject a span into the given carrier
@@ -338,7 +315,7 @@ module Instana
338
315
  # The non-nil value of this instance variable
339
316
  # indicates if we are currently tracing
340
317
  # in this thread or not.
341
- self.current_trace ? true : false
318
+ self.current_span ? true : false
342
319
  end
343
320
 
344
321
  # Indicates if we're tracing and the current span name matches
@@ -349,8 +326,8 @@ module Instana
349
326
  # @return [Boolean]
350
327
  #
351
328
  def tracing_span?(name)
352
- if self.current_trace
353
- return self.current_trace.current_span.name == name
329
+ if self.current_span
330
+ return self.current_span.name == name
354
331
  end
355
332
  false
356
333
  end
@@ -360,8 +337,8 @@ module Instana
360
337
  # @return [SpanContext] or nil if not tracing
361
338
  #
362
339
  def context
363
- return nil unless tracing?
364
- self.current_trace.current_span.context
340
+ return unless self.current_span
341
+ self.current_span.context
365
342
  end
366
343
 
367
344
  # Take the current trace_id and convert it to a header compatible
@@ -370,7 +347,11 @@ module Instana
370
347
  # @return [String] a hexadecimal representation of the current trace ID
371
348
  #
372
349
  def trace_id_header
373
- ::Instana::Util.id_to_header(trace_id)
350
+ if self.current_span
351
+ self.current_span.context.trace_id_header
352
+ else
353
+ ""
354
+ end
374
355
  end
375
356
 
376
357
  # Take the current span_id and convert it to a header compatible
@@ -379,39 +360,33 @@ module Instana
379
360
  # @return [String] a hexadecimal representation of the current span ID
380
361
  #
381
362
  def span_id_header
382
- ::Instana::Util.id_to_header(span_id)
363
+ if self.current_span
364
+ self.current_span.context.span_id_header
365
+ else
366
+ ""
367
+ end
383
368
  end
384
369
 
385
370
  # Returns the trace ID for the active trace (if there is one),
386
371
  # otherwise nil.
387
372
  #
388
373
  def trace_id
389
- self.current_trace ? self.current_trace.id : nil
374
+ self.current_span ? self.current_span.id : nil
375
+ ::Instana.logger.debug("tracer.trace_id will deprecated in a future version.")
390
376
  end
391
377
 
392
378
  # Returns the current [Span] ID for the active trace (if there is one),
393
379
  # otherwise nil.
394
380
  #
395
381
  def span_id
396
- self.current_trace ? current_trace.current_span_id : nil
397
- end
398
-
399
- # Helper method to retrieve the currently active span for the active trace.
400
- #
401
- def current_span
402
- self.current_trace ? self.current_trace.current_span : nil
403
- end
404
-
405
- # Indicates if the name of the current span matches <candidate>
406
- #
407
- def current_span_name?(candidate)
408
- self.current_trace && self.current_trace.current_span.name == candidate.to_sym
382
+ self.current_span ? self.current_span.span_id : nil
383
+ ::Instana.logger.debug("tracer.span_id will deprecated in a future version.")
409
384
  end
410
385
 
411
386
  # Used in the test suite, this resets the tracer to non-tracing state.
412
387
  #
413
388
  def clear!
414
- self.current_trace = nil
389
+ self.current_span = nil
415
390
  end
416
391
  end
417
392
  end