instana 1.8.3 → 1.9.0.daftrabbit

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dfcd505f3b03f60468ec22cc0b83f7db3d8247ab6d43d64fc2102b1998eb125c
4
- data.tar.gz: c89980fb311fa8106cdf5cfe63f12c517ebd91f0971d26bec2f7f53d03b2629e
3
+ metadata.gz: 8b11875e63a40db84acb015973cfcf38b0f7b5d86a3c92a6ca4178582d525a0a
4
+ data.tar.gz: 78e31a128e0bed068b84a195e06f205a917b6ded8ac018e5493320dcbb202fa3
5
5
  SHA512:
6
- metadata.gz: 6e1107b870b00d6b5c488a9def75a77daab3b9250b879ff9a6b5c0265a239e5397f564dd879b404b2fb3c4c46b414ccea49e67a9e7677efb4e9efe791168651b
7
- data.tar.gz: 92f5f8acbd672ac8c5b0984a85cbb69944aaaab372007f105819cdfb29ec5ca40415d6ff14fa4751fc3a1bd62cf27a1fe000a93c353383b7a2d7331d40c6752d
6
+ metadata.gz: 645484fc592fc9578e4d7378b198ea867d61dabe25b51365a3545485e7f0a8b8454e4766104b0009178d2e009da64624f9fc8959fd73b6509162188a4ee55839
7
+ data.tar.gz: c6d2c36eeea6be0b0b09107a10cc9af56a9d12ec4960efe28dc151ff7570fec3ea8638ba6dc4e40a4699d7caf5dc9d79aab2e039e2982809c9286b92aba6bbb3
@@ -49,6 +49,7 @@ gem 'excon'
49
49
 
50
50
  # Memcache
51
51
  gem 'dalli'
52
+ gem 'redis', '< 4.0.0'
52
53
 
53
54
  # Background Job queuing and processing
54
55
  if RUBY_VERSION < '2.2'
@@ -57,6 +58,8 @@ else
57
58
  gem 'sidekiq', '> 5.0'
58
59
  end
59
60
 
61
+ gem 'resque'
62
+
60
63
  # Rack v2 dropped support for Ruby 2.2 and higher.
61
64
  if RUBY_VERSION < '2.2'
62
65
  gem 'rack', '< 2.0'
@@ -5,12 +5,21 @@ require 'sys/proctable'
5
5
  require 'timers'
6
6
  require 'uri'
7
7
  require 'thread'
8
+
9
+ require 'instana/agent/helpers'
10
+ require 'instana/agent/hooks'
11
+ require 'instana/agent/tasks'
12
+
8
13
  include Sys
9
14
 
10
15
  Oj.default_options = {:mode => :strict}
11
16
 
12
17
  module Instana
13
18
  class Agent
19
+ include AgentHelpers
20
+ include AgentHooks
21
+ include AgentTasks
22
+
14
23
  attr_accessor :state
15
24
  attr_accessor :agent_uuid
16
25
  attr_accessor :process
@@ -70,21 +79,6 @@ module Instana
70
79
  @extra_headers = nil
71
80
  end
72
81
 
73
- # Used post fork to re-initialize state and restart communications with
74
- # the host agent.
75
- #
76
- def after_fork
77
- ::Instana.logger.debug "after_fork hook called. Falling back to unannounced state and spawning a new background agent thread."
78
-
79
- # Reseed the random number generator for this
80
- # new thread.
81
- srand
82
-
83
- transition_to(:unannounced)
84
- setup
85
- spawn_background_thread
86
- end
87
-
88
82
  # Spawns the background thread and calls start. This method is separated
89
83
  # out for those who wish to control which thread the background agent will
90
84
  # run in.
@@ -120,7 +114,7 @@ module Instana
120
114
  # In case of failure, we try again in 30 seconds.
121
115
  @announce_timer = @timers.every(30) do
122
116
  if @state == :unannounced
123
- if host_agent_ready? && announce_sensor
117
+ if host_agent_available? && announce_sensor
124
118
  transition_to(:announced)
125
119
  ::Instana.logger.info "Host agent available. We're in business. (#{@state} pid:#{Process.pid} #{@process[:name]})"
126
120
  end
@@ -156,7 +150,7 @@ module Instana
156
150
  # called from an already initialized background thread.
157
151
  #
158
152
  def start
159
- if !host_agent_ready?
153
+ if !host_agent_available?
160
154
  if !ENV.key?("INSTANA_QUIET")
161
155
  ::Instana.logger.warn "Host agent not available. Will retry periodically. (Set env INSTANA_QUIET=1 to shut these messages off)"
162
156
  end
@@ -279,50 +273,6 @@ module Instana
279
273
  Instana.logger.debug e.backtrace.join("\r\n")
280
274
  end
281
275
 
282
- # When request(s) are received by the host agent, it is sent here
283
- # for handling & processing.
284
- #
285
- # @param json_string [String] the requests from the host agent
286
- #
287
- def handle_agent_tasks(json_string)
288
- tasks = Oj.load(json_string)
289
-
290
- if tasks.is_a?(Hash)
291
- process_agent_task(tasks)
292
- elsif tasks.is_a?(Array)
293
- tasks.each do |t|
294
- process_agent_task(t)
295
- end
296
- end
297
- end
298
-
299
- # Process a task sent from the host agent.
300
- #
301
- # @param task [String] the request json from the host agent
302
- #
303
- def process_agent_task(task)
304
- if task.key?("action")
305
- if task["action"] == "ruby.source"
306
- payload = ::Instana::Util.get_rb_source(task["args"]["file"])
307
- else
308
- payload = { :error => "Unrecognized action: #{task["action"]}. An newer Instana gem may be required for this. Current version: #{::Instana::VERSION}" }
309
- end
310
- else
311
- payload = { :error => "Instana Ruby: No action specified in request." }
312
- end
313
-
314
- path = "com.instana.plugin.ruby/response.#{@process[:report_pid]}?messageId=#{URI.encode(task['messageId'])}"
315
- uri = URI.parse("http://#{@discovered[:agent_host]}:#{@discovered[:agent_port]}/#{path}")
316
- req = Net::HTTP::Post.new(uri)
317
- req.body = Oj.dump(payload)
318
- ::Instana.logger.debug "Responding to agent request: #{req.inspect}"
319
- make_host_agent_request(req)
320
-
321
- rescue StandardError => e
322
- Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
323
- Instana.logger.debug e.backtrace.join("\r\n")
324
- end
325
-
326
276
  # Accept and report spans to the host agent.
327
277
  #
328
278
  # @param traces [Array] An array of [Span]
@@ -340,7 +290,7 @@ module Instana
340
290
  uri = URI.parse("http://#{@discovered[:agent_host]}:#{@discovered[:agent_port]}/#{path}")
341
291
  req = Net::HTTP::Post.new(uri)
342
292
 
343
- req.body = Oj.dump(spans)
293
+ req.body = Oj.dump(spans, :omit_nil => true)
344
294
  response = make_host_agent_request(req)
345
295
 
346
296
  if response
@@ -360,7 +310,7 @@ module Instana
360
310
  # first check localhost and if not, then attempt on the default gateway
361
311
  # for docker in bridged mode.
362
312
  #
363
- def host_agent_ready?
313
+ def host_agent_available?
364
314
  @discovered ||= run_discovery
365
315
 
366
316
  if @discovered
@@ -428,31 +378,6 @@ module Instana
428
378
  nil
429
379
  end
430
380
 
431
- # Returns the PID that we are reporting to
432
- #
433
- def report_pid
434
- @process[:report_pid]
435
- end
436
-
437
- # Indicates if the agent is ready to send metrics
438
- # and/or data.
439
- #
440
- def ready?
441
- # In test, we're always ready :-)
442
- return true if ENV['INSTANA_GEM_TEST']
443
-
444
- if forked?
445
- ::Instana.logger.debug "Instana: detected fork. Calling after_fork"
446
- after_fork
447
- end
448
-
449
- @state == :announced
450
- rescue => e
451
- Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
452
- Instana.logger.debug e.backtrace.join("\r\n") unless ::Instana.test?
453
- return false
454
- end
455
-
456
381
  private
457
382
 
458
383
  # Handles any/all steps required in the transtion
@@ -511,37 +436,5 @@ module Instana
511
436
  Instana.logger.debug e.backtrace.join("\r\n") unless ::Instana.test?
512
437
  return nil
513
438
  end
514
-
515
- # Indicates whether we are running in a pid namespace (such as
516
- # Docker).
517
- #
518
- def pid_namespace?
519
- return false unless @is_linux
520
- Process.pid != get_real_pid
521
- end
522
-
523
- # Attempts to determine the true process ID by querying the
524
- # /proc/<pid>/sched file. This works on linux currently.
525
- #
526
- def get_real_pid
527
- raise RuntimeError.new("Unsupported platform: get_real_pid") unless @is_linux
528
-
529
- sched_file = "/proc/#{Process.pid}/sched"
530
- pid = Process.pid
531
-
532
- if File.exist?(sched_file)
533
- v = File.open(sched_file, &:readline)
534
- pid = v.match(/\d+/).to_s.to_i
535
- end
536
- pid
537
- end
538
-
539
- # Determine whether the pid has changed since Agent start.
540
- #
541
- # @ return [Boolean] true or false to indicate if forked
542
- #
543
- def forked?
544
- @process[:pid] != Process.pid
545
- end
546
439
  end
547
440
  end
@@ -0,0 +1,58 @@
1
+ module AgentHelpers
2
+ # Indicates whether we are running in a pid namespace (such as
3
+ # Docker).
4
+ #
5
+ def pid_namespace?
6
+ return false unless @is_linux
7
+ Process.pid != get_real_pid
8
+ end
9
+
10
+ # Attempts to determine the true process ID by querying the
11
+ # /proc/<pid>/sched file. This works on linux currently.
12
+ #
13
+ def get_real_pid
14
+ raise RuntimeError.new("Unsupported platform: get_real_pid") unless @is_linux
15
+
16
+ sched_file = "/proc/#{Process.pid}/sched"
17
+ pid = Process.pid
18
+
19
+ if File.exist?(sched_file)
20
+ v = File.open(sched_file, &:readline)
21
+ pid = v.match(/\d+/).to_s.to_i
22
+ end
23
+ pid
24
+ end
25
+
26
+ # Returns the PID that we are reporting to
27
+ #
28
+ def report_pid
29
+ @process[:report_pid]
30
+ end
31
+
32
+ # Determine whether the pid has changed since Agent start.
33
+ #
34
+ # @ return [Boolean] true or false to indicate if forked
35
+ #
36
+ def forked?
37
+ @process[:pid] != Process.pid
38
+ end
39
+
40
+ # Indicates if the agent is ready to send metrics
41
+ # and/or data.
42
+ #
43
+ def ready?
44
+ # In test, we're always ready :-)
45
+ return true if ENV['INSTANA_GEM_TEST']
46
+
47
+ if !@is_resque_worker && forked?
48
+ ::Instana.logger.debug "Instana: detected fork. (this pid: #{Process.pid}/#{Process.ppid}) Calling after_fork"
49
+ after_fork
50
+ end
51
+
52
+ @state == :announced
53
+ rescue => e
54
+ Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
55
+ Instana.logger.debug e.backtrace.join("\r\n") unless ::Instana.test?
56
+ return false
57
+ end
58
+ end
@@ -0,0 +1,37 @@
1
+ module AgentHooks
2
+ # Used post fork to re-initialize state and restart communications with
3
+ # the host agent.
4
+ #
5
+ def after_fork
6
+ ::Instana.logger.debug "after_fork hook called. Falling back to unannounced state and spawning a new background agent thread."
7
+
8
+ # Reseed the random number generator for this
9
+ # new thread.
10
+ srand
11
+
12
+ transition_to(:unannounced)
13
+
14
+ setup
15
+ spawn_background_thread
16
+ end
17
+
18
+ def before_resque_fork
19
+ ::Instana.logger.debug "before_resque_fork hook called. pid/ppid: #{Process.pid}/#{Process.ppid}"
20
+ @is_resque_worker = true
21
+ end
22
+
23
+ def after_resque_fork
24
+ ::Instana.logger.debug "after_resque_fork hook called. pid/ppid: #{Process.pid}/#{Process.ppid}"
25
+
26
+ # Reseed the random number generator for this
27
+ # new thread.
28
+ srand
29
+
30
+ ::Instana.config[:metrics][:enabled] = false
31
+
32
+ @process[:pid] = Process.pid
33
+
34
+ setup
35
+ spawn_background_thread
36
+ end
37
+ end
@@ -0,0 +1,45 @@
1
+ module AgentTasks
2
+ # When request(s) are received by the host agent, it is sent here
3
+ # for handling & processing.
4
+ #
5
+ # @param json_string [String] the requests from the host agent
6
+ #
7
+ def handle_agent_tasks(json_string)
8
+ tasks = Oj.load(json_string)
9
+
10
+ if tasks.is_a?(Hash)
11
+ process_agent_task(tasks)
12
+ elsif tasks.is_a?(Array)
13
+ tasks.each do |t|
14
+ process_agent_task(t)
15
+ end
16
+ end
17
+ end
18
+
19
+ # Process a task sent from the host agent.
20
+ #
21
+ # @param task [String] the request json from the host agent
22
+ #
23
+ def process_agent_task(task)
24
+ if task.key?("action")
25
+ if task["action"] == "ruby.source"
26
+ payload = ::Instana::Util.get_rb_source(task["args"]["file"])
27
+ else
28
+ payload = { :error => "Unrecognized action: #{task["action"]}. An newer Instana gem may be required for this. Current version: #{::Instana::VERSION}" }
29
+ end
30
+ else
31
+ payload = { :error => "Instana Ruby: No action specified in request." }
32
+ end
33
+
34
+ path = "com.instana.plugin.ruby/response.#{@process[:report_pid]}?messageId=#{URI.encode(task['messageId'])}"
35
+ uri = URI.parse("http://#{@discovered[:agent_host]}:#{@discovered[:agent_port]}/#{path}")
36
+ req = Net::HTTP::Post.new(uri)
37
+ req.body = Oj.dump(payload)
38
+ ::Instana.logger.debug "Responding to agent request: #{req.inspect}"
39
+ make_host_agent_request(req)
40
+
41
+ rescue StandardError => e
42
+ Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
43
+ Instana.logger.debug e.backtrace.join("\r\n")
44
+ end
45
+ end
@@ -49,12 +49,14 @@ module Instana
49
49
  @config[:active_record] = { :enabled => true }
50
50
  @config[:dalli] = { :enabled => true }
51
51
  @config[:excon] = { :enabled => true }
52
+ @config[:grpc] = { :enabled => true }
52
53
  @config[:nethttp] = { :enabled => true }
54
+ @config[:redis] = { :enabled => true }
55
+ @config[:'resque-client'] = { :enabled => true }
56
+ @config[:'resque-worker'] = { :enabled => true }
53
57
  @config[:'rest-client'] = { :enabled => true }
54
- @config[:grpc] = { :enabled => true }
55
58
  @config[:'sidekiq-client'] = { :enabled => true }
56
59
  @config[:'sidekiq-worker'] = { :enabled => true }
57
- @config[:redis] = { :enabled => true }
58
60
  end
59
61
 
60
62
  def [](key)
@@ -1,26 +1,40 @@
1
1
  require "instana/rack"
2
2
 
3
3
  if defined?(::Rails)
4
- # In Rails, let's use the Rails logger
5
- ::Instana.logger = ::Rails.logger if ::Rails.logger
6
4
 
7
5
  if ::Rails::VERSION::MAJOR < 3
8
6
  ::Rails.configuration.after_initialize do
9
- ::Instana.logger.info "Instrumenting Rack"
10
- ::Rails.configuration.middleware.insert 0, ::Instana::Rack
7
+ # In Rails, let's use the Rails logger
8
+ ::Instana.logger = ::Rails.logger if ::Rails.logger
9
+
10
+ if ::Instana.config[:tracing][:enabled]
11
+ ::Instana.logger.info "Instrumenting Rack"
12
+ ::Rails.configuration.middleware.insert 0, ::Instana::Rack
13
+ else
14
+ ::Instana.logger.info "Rack: Tracing disabled via config. Not enabling middleware."
15
+ end
11
16
  end
12
17
  else
13
18
  module ::Instana
14
19
  class Railtie < ::Rails::Railtie
15
20
  initializer 'instana.rack' do |app|
16
- ::Instana.logger.info "Instrumenting Rack"
17
- app.config.middleware.insert 0, ::Instana::Rack
21
+ # In Rails, let's use the Rails logger
22
+ ::Instana.logger = ::Rails.logger if ::Rails.logger
23
+
24
+ if ::Instana.config[:tracing][:enabled]
25
+ ::Instana.logger.info "Instrumenting Rack"
26
+ app.config.middleware.insert 0, ::Instana::Rack
27
+ else
28
+ ::Instana.logger.info "Rack: Tracing disabled via config. Not enabling middleware."
29
+ end
18
30
  end
19
31
 
20
- config.after_initialize do
21
- require "instana/frameworks/instrumentation/active_record"
22
- require "instana/frameworks/instrumentation/action_controller"
23
- require "instana/frameworks/instrumentation/action_view"
32
+ if ::Instana.config[:tracing][:enabled]
33
+ config.after_initialize do
34
+ require "instana/frameworks/instrumentation/active_record"
35
+ require "instana/frameworks/instrumentation/action_controller"
36
+ require "instana/frameworks/instrumentation/action_view"
37
+ end
24
38
  end
25
39
  end
26
40
  end
@@ -0,0 +1,127 @@
1
+ require 'socket'
2
+
3
+ module Instana
4
+ module Instrumentation
5
+ module ResqueClient
6
+ def self.included(klass)
7
+ klass.send :extend, ::Resque
8
+ ::Instana::Util.method_alias(klass, :enqueue)
9
+ ::Instana::Util.method_alias(klass, :enqueue_to)
10
+ ::Instana::Util.method_alias(klass, :dequeue)
11
+ end
12
+
13
+ def collect_kvs(op, klass, args)
14
+ kvs = {}
15
+
16
+ begin
17
+ kvs[:job] = klass.to_s
18
+ kvs[:queue] = klass.instance_variable_get(:@queue)
19
+ rescue => e
20
+ Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
21
+ end
22
+
23
+ { :'resque-client' => kvs }
24
+ end
25
+
26
+ def enqueue_with_instana(klass, *args)
27
+ if Instana.tracer.tracing?
28
+ kvs = collect_kvs(:enqueue, klass, args)
29
+
30
+ Instana.tracer.trace(:'resque-client', kvs) do
31
+ enqueue_without_instana(klass, *args)
32
+ end
33
+ else
34
+ enqueue_without_instana(klass, *args)
35
+ end
36
+ end
37
+
38
+ def enqueue_to_with_instana(queue, klass, *args)
39
+ if Instana.tracer.tracing? && !Instana.tracer.tracing_span?(:'resque-client')
40
+ kvs = collect_kvs(:enqueue_to, klass, args)
41
+ kvs[:Queue] = queue.to_s if queue
42
+
43
+ Instana.tracer.trace(:'resque-client', kvs) do
44
+ enqueue_to_without_instana(queue, klass, *args)
45
+ end
46
+ else
47
+ enqueue_to_without_instana(queue, klass, *args)
48
+ end
49
+ end
50
+
51
+ def dequeue_with_instana(klass, *args)
52
+ if Instana.tracer.tracing?
53
+ kvs = collect_kvs(:dequeue, klass, args)
54
+
55
+ Instana.tracer.trace(:'resque-client', kvs) do
56
+ dequeue_without_instana(klass, *args)
57
+ end
58
+ else
59
+ dequeue_without_instana(klass, *args)
60
+ end
61
+ end
62
+ end
63
+
64
+ module ResqueWorker
65
+ def self.included(klass)
66
+ ::Instana::Util.method_alias(klass, :perform)
67
+ end
68
+
69
+ def perform_with_instana(job)
70
+ kvs = {}
71
+
72
+ begin
73
+ kvs[:job] = job.payload['class'].to_s
74
+ kvs[:queue] = job.queue
75
+ rescue => e
76
+ ::Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if Instana::Config[:verbose]
77
+ end
78
+
79
+ Instana.tracer.start_or_continue_trace(:'resque-worker', { :'resque-worker' => kvs }) do
80
+ perform_without_instana(job)
81
+ end
82
+ end
83
+ end
84
+
85
+ module ResqueJob
86
+ def self.included(klass)
87
+ ::Instana::Util.method_alias(klass, :fail)
88
+ end
89
+
90
+ def fail_with_instana(exception)
91
+ if Instana.tracer.tracing?
92
+ ::Instana.tracer.log_info(:'resque-worker' => { :error => "#{exception.class}: #{exception}"})
93
+ ::Instana.tracer.log_error(exception)
94
+ end
95
+ rescue Exception => e
96
+ ::Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if Instana::Config[:verbose]
97
+ ensure
98
+ fail_without_instana(exception)
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ if defined?(::Resque) && RUBY_VERSION >= '1.9.3'
105
+
106
+ if ::Instana.config[:'resque-client'][:enabled]
107
+ ::Instana.logger.info 'Instrumenting Resque Client'
108
+ ::Instana::Util.send_include(::Resque, ::Instana::Instrumentation::ResqueClient)
109
+ end
110
+
111
+ if ::Instana.config[:'resque-worker'][:enabled]
112
+ ::Instana.logger.info 'Instrumenting Resque Worker'
113
+
114
+ ::Instana::Util.send_include(::Resque::Worker, ::Instana::Instrumentation::ResqueWorker)
115
+ ::Instana::Util.send_include(::Resque::Job, ::Instana::Instrumentation::ResqueJob)
116
+
117
+ ::Resque.before_fork do |job|
118
+ ::Instana.agent.before_resque_fork
119
+ end
120
+ ::Resque.after_fork do |job|
121
+ ::Instana.agent.after_resque_fork
122
+ end
123
+
124
+ # Set this so we assure that any remaining collected traces are reported at_exit
125
+ ENV['RUN_AT_EXIT_HOOKS'] = "1"
126
+ end
127
+ end
@@ -2,9 +2,11 @@ module Instana
2
2
  class Span
3
3
  REGISTERED_SPANS = [ :actioncontroller, :actionview, :activerecord, :excon,
4
4
  :memcache, :'net-http', :rack, :render, :'rpc-client',
5
- :'rpc-server', :'sidekiq-client', :'sidekiq-worker', :redis].freeze
6
- ENTRY_SPANS = [ :rack, :'rpc-server', :'sidekiq-worker' ].freeze
7
- EXIT_SPANS = [ :activerecord, :excon, :'net-http', :'rpc-client', :'sidekiq-client', :redis ].freeze
5
+ :'rpc-server', :'sidekiq-client', :'sidekiq-worker',
6
+ :redis, :'resque-client', :'resque-worker' ].freeze
7
+ ENTRY_SPANS = [ :rack, :'resque-worker', :'rpc-server', :'sidekiq-worker' ].freeze
8
+ EXIT_SPANS = [ :activerecord, :excon, :'net-http', :'resque-client',
9
+ :'rpc-client', :'sidekiq-client', :redis ].freeze
8
10
  HTTP_SPANS = [ :rack, :excon, :'net-http' ].freeze
9
11
 
10
12
  attr_accessor :parent
@@ -160,16 +160,19 @@ module Instana
160
160
  #
161
161
  def get_app_name
162
162
  if ENV.key?('INSTANA_SERVICE_NAME')
163
- name = ENV['INSTANA_SERVICE_NAME']
163
+ return ENV['INSTANA_SERVICE_NAME']
164
+ end
164
165
 
165
- elsif defined?(::RailsLts) || defined?(::Rails)
166
- name = Rails.application.class.to_s.split('::')[0]
167
166
 
168
- else
169
- name = File.basename($0)
167
+ if defined?(::Resque) && ($0 =~ /resque-#{Resque::Version}/)
168
+ return "Resque Worker"
169
+ end
170
+
171
+ if defined?(::RailsLts) || defined?(::Rails)
172
+ return Rails.application.class.to_s.split('::')[0]
170
173
  end
171
174
 
172
- return name
175
+ return File.basename($0)
173
176
  rescue Exception => e
174
177
  Instana.logger.info "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
175
178
  Instana.logger.debug e.backtrace.join("\r\n")
@@ -1,4 +1,4 @@
1
1
  module Instana
2
- VERSION = "1.8.3"
2
+ VERSION = "1.9.0.daftrabbit"
3
3
  VERSION_FULL = "instana-#{VERSION}"
4
4
  end
@@ -7,7 +7,7 @@ class AgentTest < Minitest::Test
7
7
  def test_agent_host_detection
8
8
  url = "http://#{::Instana.config[:agent_host]}:#{::Instana.config[:agent_port]}/"
9
9
  stub_request(:get, url)
10
- assert_equal true, ::Instana.agent.host_agent_ready?
10
+ assert_equal true, ::Instana.agent.host_agent_available?
11
11
  end
12
12
 
13
13
  def test_successful_discovery
@@ -57,7 +57,7 @@ class AgentTest < Minitest::Test
57
57
  stub_request(:get, localhost_url).to_raise(Errno::ECONNREFUSED)
58
58
  docker_url = "http://#{::Instana.agent.instance_variable_get(:@default_gateway)}:#{::Instana.config[:agent_port]}/"
59
59
  stub_request(:get, docker_url).to_timeout
60
- assert_equal false, ::Instana.agent.host_agent_ready?
60
+ assert_equal false, ::Instana.agent.host_agent_available?
61
61
  end
62
62
 
63
63
  def test_announce_sensor
@@ -137,6 +137,6 @@ class AgentTest < Minitest::Test
137
137
  stub_request(:get, localhost_url).to_timeout
138
138
  docker_url = "http://#{::Instana.agent.instance_variable_get(:@default_gateway)}:#{::Instana.config[:agent_port]}/"
139
139
  stub_request(:get, docker_url).to_timeout
140
- assert_equal false, ::Instana.agent.host_agent_ready?
140
+ assert_equal false, ::Instana.agent.host_agent_available?
141
141
  end
142
142
  end
@@ -0,0 +1,128 @@
1
+ require 'test_helper'
2
+ require_relative "../jobs/resque_fast_job"
3
+ require_relative "../jobs/resque_error_job"
4
+ require 'resque'
5
+
6
+ if ENV.key?('REDIS_URL')
7
+ ::Resque.redis = ENV['REDIS_URL']
8
+ else
9
+ ::Resque.redis = 'localhost:6379'
10
+ end
11
+
12
+ class ResqueClientTest < Minitest::Test
13
+ def setup
14
+ clear_all!
15
+ ENV['FORK_PER_JOB'] = 'false'
16
+ Resque.redis.redis.flushall
17
+ @worker = Resque::Worker.new(:critical)
18
+ end
19
+
20
+ def teardown
21
+ end
22
+
23
+ def test_enqueue
24
+ ::Instana.tracer.start_or_continue_trace('resque-client_test') do
25
+ ::Resque.enqueue(FastJob)
26
+ end
27
+
28
+ traces = Instana.processor.queued_traces
29
+ assert_equal 1, traces.count
30
+
31
+ spans = traces[0].spans.to_a
32
+ assert_equal 3, spans.count
33
+
34
+ assert_equal :'resque-client_test', spans[0][:data][:sdk][:name]
35
+
36
+ assert_equal :"resque-client", spans[1][:n]
37
+ assert_equal "FastJob", spans[1][:data][:'resque-client'][:job]
38
+ assert_equal :critical, spans[1][:data][:'resque-client'][:queue]
39
+ assert_equal false, spans[1][:data][:'resque-client'].key?(:error)
40
+
41
+ assert_equal :redis, spans[2][:n]
42
+ end
43
+
44
+ def test_enqueue_to
45
+ ::Instana.tracer.start_or_continue_trace('resque-client_test') do
46
+ ::Resque.enqueue_to(:critical, FastJob)
47
+ end
48
+
49
+ traces = Instana.processor.queued_traces
50
+ assert_equal 1, traces.count
51
+
52
+ spans = traces[0].spans.to_a
53
+ assert_equal 3, spans.count
54
+
55
+ assert_equal :'resque-client_test', spans[0][:data][:sdk][:name]
56
+ assert_equal :"resque-client", spans[1][:n]
57
+ assert_equal "FastJob", spans[1][:data][:'resque-client'][:job]
58
+ assert_equal :critical, spans[1][:data][:'resque-client'][:queue]
59
+ assert_equal false, spans[1][:data][:'resque-client'].key?(:error)
60
+ assert_equal :redis, spans[2][:n]
61
+ end
62
+
63
+ def test_dequeue
64
+ ::Instana.tracer.start_or_continue_trace('resque-client_test', '', {}) do
65
+ ::Resque.dequeue(FastJob, { :generate => :farfalla })
66
+ end
67
+
68
+ traces = Instana.processor.queued_traces
69
+ assert_equal 1, traces.count
70
+
71
+ spans = traces[0].spans.to_a
72
+ assert_equal 3, spans.count
73
+
74
+ assert_equal :'resque-client_test', spans[0][:data][:sdk][:name]
75
+ assert_equal :"resque-client", spans[1][:n]
76
+ assert_equal "FastJob", spans[1][:data][:'resque-client'][:job]
77
+ assert_equal :critical, spans[1][:data][:'resque-client'][:queue]
78
+ assert_equal false, spans[1][:data][:'resque-client'].key?(:error)
79
+ assert_equal :redis, spans[2][:n]
80
+ end
81
+
82
+ def test_worker_job
83
+ Resque::Job.create(:critical, FastJob)
84
+ @worker.work(0)
85
+
86
+ traces = Instana.processor.queued_traces
87
+ assert_equal 1, traces.count
88
+
89
+ spans = traces[0].spans.to_a
90
+ assert_equal 3, spans.count
91
+
92
+ resque_span = spans[0]
93
+ redis1_span = spans[1]
94
+ redis2_span = spans[2]
95
+
96
+ assert_equal :'resque-worker', resque_span[:n]
97
+ assert_equal false, resque_span.key?(:error)
98
+ assert_equal false, resque_span.key?(:ec)
99
+ assert_equal "FastJob", resque_span[:data][:'resque-worker'][:job]
100
+ assert_equal "critical", resque_span[:data][:'resque-worker'][:queue]
101
+ assert_equal false, resque_span[:data][:'resque-worker'].key?(:error)
102
+
103
+ assert_equal :redis, redis1_span[:n]
104
+ assert_equal "SET", redis1_span[:data][:redis][:command]
105
+ assert_equal :redis, redis2_span[:n]
106
+ assert_equal "SET", redis2_span[:data][:redis][:command]
107
+ end
108
+
109
+ def test_worker_error_job
110
+ Resque::Job.create(:critical, ErrorJob)
111
+ @worker.work(0)
112
+
113
+ traces = Instana.processor.queued_traces
114
+ assert_equal 1, traces.count
115
+
116
+ spans = traces[0].spans.to_a
117
+ resque_span = spans[0]
118
+ assert_equal 5, spans.count
119
+
120
+ assert_equal :'resque-worker', resque_span[:n]
121
+ assert_equal true, resque_span.key?(:error)
122
+ assert_equal 1, resque_span[:ec]
123
+ assert_equal "ErrorJob", resque_span[:data][:'resque-worker'][:job]
124
+ assert_equal "critical", resque_span[:data][:'resque-worker'][:queue]
125
+ assert_equal "Exception: Silly Rabbit, Trix are for kids.", resque_span[:data][:'resque-worker'][:error]
126
+ assert_equal Array, resque_span[:stack].class
127
+ end
128
+ end
@@ -0,0 +1,16 @@
1
+ require "redis"
2
+ require "net/http"
3
+
4
+ class ErrorJob
5
+ @queue = :critical
6
+
7
+ def self.perform
8
+ redis = Redis.new(url: ENV['REDIS_URL'])
9
+
10
+ dt = Time.now
11
+ redis.set('ts', dt)
12
+
13
+ raise Exception.new("Silly Rabbit, Trix are for kids.")
14
+ redis.set(:nb_id, 2)
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ require "redis"
2
+ require "net/http"
3
+
4
+ class FastJob
5
+ @queue = :critical
6
+
7
+ def self.perform
8
+ redis = Redis.new(url: ENV['REDIS_URL'])
9
+
10
+ dt = Time.now
11
+ redis.set('ts', dt)
12
+ redis.set(:nb_id, 2)
13
+ end
14
+ end
@@ -14,12 +14,16 @@ require 'webmock/minitest'
14
14
  require "instana/test"
15
15
  ::Instana::Test.setup_environment
16
16
 
17
+ # Webmock: Whitelist local IPs
18
+ whitelist = ['127.0.0.1', 'localhost', '172.17.0.1', '172.0.12.100']
19
+ allowed_sites = lambda{|uri|
20
+ whitelist.include?(uri.host)
21
+ }
22
+ ::WebMock.disable_net_connect!(allow: allowed_sites)
23
+
17
24
  # Boot background webservers to test against.
18
25
  require "./test/servers/rackapp_6511"
19
26
 
20
- # Allow localhost calls to the internal rails servers
21
- ::WebMock.disable_net_connect!(allow_localhost: true)
22
-
23
27
  case File.basename(ENV['BUNDLE_GEMFILE'])
24
28
  when /rails50|rails42|rails32/
25
29
  require './test/servers/rails_3205'
@@ -10,7 +10,7 @@ class CustomTracingTest < Minitest::Test
10
10
  assert_equal true, ::Instana.tracer.tracing?
11
11
  ::Instana.tracer.log_info({:info_logged => 1})
12
12
  # End tracing
13
- ::Instana.tracer.log_end(:rack, {:close_one => 1})
13
+ ::Instana.tracer.log_end(:custom_trace, {:close_one => 1})
14
14
  assert_equal false, ::Instana.tracer.tracing?
15
15
 
16
16
  traces = ::Instana.processor.queued_traces
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: instana
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.3
4
+ version: 1.9.0.daftrabbit
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Giacomo Lombardo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-19 00:00:00.000000000 Z
11
+ date: 2018-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -201,6 +201,9 @@ files:
201
201
  - instana.gemspec
202
202
  - lib/instana.rb
203
203
  - lib/instana/agent.rb
204
+ - lib/instana/agent/helpers.rb
205
+ - lib/instana/agent/hooks.rb
206
+ - lib/instana/agent/tasks.rb
204
207
  - lib/instana/base.rb
205
208
  - lib/instana/collector.rb
206
209
  - lib/instana/collectors/gc.rb
@@ -228,6 +231,7 @@ files:
228
231
  - lib/instana/instrumentation/net-http.rb
229
232
  - lib/instana/instrumentation/rack.rb
230
233
  - lib/instana/instrumentation/redis.rb
234
+ - lib/instana/instrumentation/resque.rb
231
235
  - lib/instana/instrumentation/rest-client.rb
232
236
  - lib/instana/instrumentation/sidekiq-client.rb
233
237
  - lib/instana/instrumentation/sidekiq-worker.rb
@@ -272,9 +276,12 @@ files:
272
276
  - test/instrumentation/grpc_test.rb
273
277
  - test/instrumentation/net-http_test.rb
274
278
  - test/instrumentation/redis_test.rb
279
+ - test/instrumentation/resque_test.rb
275
280
  - test/instrumentation/rest-client_test.rb
276
281
  - test/instrumentation/sidekiq-client_test.rb
277
282
  - test/instrumentation/sidekiq-worker_test.rb
283
+ - test/jobs/resque_error_job.rb
284
+ - test/jobs/resque_fast_job.rb
278
285
  - test/jobs/sidekiq_job_1.rb
279
286
  - test/jobs/sidekiq_job_2.rb
280
287
  - test/models/block.rb
@@ -305,9 +312,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
305
312
  version: '2.1'
306
313
  required_rubygems_version: !ruby/object:Gem::Requirement
307
314
  requirements:
308
- - - ">="
315
+ - - ">"
309
316
  - !ruby/object:Gem::Version
310
- version: '0'
317
+ version: 1.3.1
311
318
  requirements: []
312
319
  rubyforge_project:
313
320
  rubygems_version: 2.7.6
@@ -340,9 +347,12 @@ test_files:
340
347
  - test/instrumentation/grpc_test.rb
341
348
  - test/instrumentation/net-http_test.rb
342
349
  - test/instrumentation/redis_test.rb
350
+ - test/instrumentation/resque_test.rb
343
351
  - test/instrumentation/rest-client_test.rb
344
352
  - test/instrumentation/sidekiq-client_test.rb
345
353
  - test/instrumentation/sidekiq-worker_test.rb
354
+ - test/jobs/resque_error_job.rb
355
+ - test/jobs/resque_fast_job.rb
346
356
  - test/jobs/sidekiq_job_1.rb
347
357
  - test/jobs/sidekiq_job_2.rb
348
358
  - test/models/block.rb