instana 1.11.4 → 1.12.0
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.
- checksums.yaml +4 -4
- data/.circleci/config.yml +168 -0
- data/README.md +1 -1
- data/lib/instana/frameworks/cuba.rb +33 -0
- data/lib/instana/frameworks/instrumentation/action_controller.rb +11 -0
- data/lib/instana/frameworks/roda.rb +41 -0
- data/lib/instana/frameworks/sinatra.rb +17 -0
- data/lib/instana/instrumentation/rack.rb +23 -3
- data/lib/instana/instrumentation/redis.rb +41 -53
- data/lib/instana/test.rb +4 -3
- data/lib/instana/tracer.rb +26 -5
- data/lib/instana/tracing/span.rb +9 -0
- data/lib/instana/version.rb +1 -1
- data/test/apps/cuba.rb +4 -0
- data/test/apps/roda.rb +3 -0
- data/test/apps/sinatra.rb +4 -0
- data/test/frameworks/cuba_test.rb +14 -1
- data/test/frameworks/rack_test.rb +125 -65
- data/test/frameworks/rails/actioncontroller_test.rb +12 -0
- data/test/frameworks/roda_test.rb +14 -0
- data/test/frameworks/sinatra_test.rb +37 -15
- data/test/instrumentation/grpc_test.rb +1 -1
- data/test/instrumentation/redis_test.rb +25 -28
- data/test/instrumentation/resque_test.rb +9 -16
- data/test/instrumentation/sidekiq-client_test.rb +7 -0
- data/test/instrumentation/sidekiq-worker_test.rb +6 -0
- data/test/jobs/resque_error_job.rb +2 -2
- data/test/jobs/resque_fast_job.rb +2 -2
- data/test/test_helper.rb +3 -8
- data/test/tracing/opentracing_test.rb +21 -0
- data/test/tracing/tracer_test.rb +31 -1
- metadata +4 -6
- data/.travis.yml +0 -43
- data/test/tracing/trace_test.rb +0 -67
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require 'sinatra'
|
2
2
|
if defined?(::Sinatra)
|
3
3
|
require 'test_helper'
|
4
4
|
require File.expand_path(File.dirname(__FILE__) + '/../apps/sinatra')
|
@@ -17,28 +17,50 @@ if defined?(::Sinatra)
|
|
17
17
|
r = get '/'
|
18
18
|
assert last_response.ok?
|
19
19
|
|
20
|
-
assert r.headers.key?("X-Instana-T")
|
21
|
-
assert r.headers.key?("X-Instana-S")
|
22
20
|
|
23
21
|
spans = ::Instana.processor.queued_spans
|
24
22
|
assert_equal 1, spans.count
|
25
23
|
|
26
|
-
|
27
|
-
assert_equal :rack,
|
28
|
-
|
29
|
-
assert first_span[:data].key?(:http)
|
24
|
+
rack_span = spans.first
|
25
|
+
assert_equal :rack, rack_span[:n]
|
26
|
+
# ::Instana::Util.pry!
|
30
27
|
|
31
|
-
assert
|
32
|
-
|
28
|
+
assert r.headers.key?("X-Instana-T")
|
29
|
+
assert r.headers["X-Instana-T"] == ::Instana::Util.id_to_header(rack_span[:t])
|
30
|
+
assert r.headers.key?("X-Instana-S")
|
31
|
+
assert r.headers["X-Instana-S"] == ::Instana::Util.id_to_header(rack_span[:s])
|
32
|
+
assert r.headers.key?("X-Instana-L")
|
33
|
+
assert r.headers["X-Instana-L"] == '1'
|
34
|
+
assert r.headers.key?("Server-Timing")
|
35
|
+
assert r.headers["Server-Timing"] == "intid;desc=#{::Instana::Util.id_to_header(rack_span[:t])}"
|
36
|
+
|
37
|
+
assert rack_span.key?(:data)
|
38
|
+
assert rack_span[:data].key?(:http)
|
39
|
+
assert rack_span[:data][:http].key?(:method)
|
40
|
+
assert_equal "GET", rack_span[:data][:http][:method]
|
33
41
|
|
34
|
-
assert
|
35
|
-
assert_equal "/",
|
42
|
+
assert rack_span[:data][:http].key?(:url)
|
43
|
+
assert_equal "/", rack_span[:data][:http][:url]
|
36
44
|
|
37
|
-
assert
|
38
|
-
assert_equal 200,
|
45
|
+
assert rack_span[:data][:http].key?(:status)
|
46
|
+
assert_equal 200, rack_span[:data][:http][:status]
|
39
47
|
|
40
|
-
assert
|
41
|
-
assert_equal "example.org",
|
48
|
+
assert rack_span[:data][:http].key?(:host)
|
49
|
+
assert_equal "example.org", rack_span[:data][:http][:host]
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_path_template
|
53
|
+
clear_all!
|
54
|
+
|
55
|
+
r = get '/greet/instana'
|
56
|
+
assert last_response.ok?
|
57
|
+
|
58
|
+
spans = ::Instana.processor.queued_spans
|
59
|
+
assert_equal 1, spans.count
|
60
|
+
|
61
|
+
first_span = spans.first
|
62
|
+
assert_equal :rack, first_span[:n]
|
63
|
+
assert_equal '/greet/:name', first_span[:data][:http][:path_tpl]
|
42
64
|
end
|
43
65
|
end
|
44
66
|
end
|
@@ -1,40 +1,44 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class RedisTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
if ENV.key?('REDIS_URL')
|
6
|
+
@redis_url = ENV['REDIS_URL']
|
7
|
+
else
|
8
|
+
@redis_url = "redis://localhost:6379"
|
9
|
+
end
|
10
|
+
@redis_client = Redis.new(url: @redis_url)
|
11
|
+
end
|
12
|
+
|
4
13
|
def test_normal_call
|
5
14
|
clear_all!
|
6
|
-
redis_client = create_redis_client
|
7
15
|
|
8
16
|
Instana.tracer.start_or_continue_trace(:redis_test) do
|
9
|
-
redis_client.set('hello', 'world')
|
17
|
+
@redis_client.set('hello', 'world')
|
10
18
|
end
|
11
|
-
redis_client.disconnect!
|
12
19
|
|
13
20
|
assert_redis_trace('SET')
|
14
21
|
end
|
15
22
|
|
16
23
|
def test_normal_call_with_error
|
17
24
|
clear_all!
|
18
|
-
redis_client = create_redis_client
|
19
25
|
|
20
26
|
Instana.tracer.start_or_continue_trace(:redis_test) do
|
21
27
|
begin
|
22
|
-
redis_client.zadd('hello', 'invalid', 'value')
|
28
|
+
@redis_client.zadd('hello', 'invalid', 'value')
|
23
29
|
rescue; end
|
24
30
|
end
|
25
|
-
redis_client.disconnect!
|
26
31
|
|
27
32
|
assert_redis_trace('ZADD', with_error: 'ERR value is not a valid float')
|
28
33
|
end
|
29
34
|
|
30
35
|
def test_pipeline_call
|
31
36
|
clear_all!
|
32
|
-
redis_client = create_redis_client
|
33
37
|
|
34
38
|
Instana.tracer.start_or_continue_trace(:redis_test) do
|
35
|
-
redis_client.pipelined do
|
36
|
-
redis_client.set('hello', 'world')
|
37
|
-
redis_client.set('other', 'world')
|
39
|
+
@redis_client.pipelined do
|
40
|
+
@redis_client.set('hello', 'world')
|
41
|
+
@redis_client.set('other', 'world')
|
38
42
|
end
|
39
43
|
end
|
40
44
|
|
@@ -43,13 +47,12 @@ class RedisTest < Minitest::Test
|
|
43
47
|
|
44
48
|
def test_pipeline_call_with_error
|
45
49
|
clear_all!
|
46
|
-
redis_client = create_redis_client
|
47
50
|
|
48
51
|
Instana.tracer.start_or_continue_trace(:redis_test) do
|
49
52
|
begin
|
50
|
-
redis_client.pipelined do
|
51
|
-
redis_client.set('other', 'world')
|
52
|
-
redis_client.call('invalid')
|
53
|
+
@redis_client.pipelined do
|
54
|
+
@redis_client.set('other', 'world')
|
55
|
+
@redis_client.call('invalid')
|
53
56
|
end
|
54
57
|
rescue; end
|
55
58
|
end
|
@@ -59,12 +62,11 @@ class RedisTest < Minitest::Test
|
|
59
62
|
|
60
63
|
def test_multi_call
|
61
64
|
clear_all!
|
62
|
-
redis_client = create_redis_client
|
63
65
|
|
64
66
|
Instana.tracer.start_or_continue_trace(:redis_test) do
|
65
|
-
redis_client.multi do
|
66
|
-
redis_client.set('hello', 'world')
|
67
|
-
redis_client.set('other', 'world')
|
67
|
+
@redis_client.multi do
|
68
|
+
@redis_client.set('hello', 'world')
|
69
|
+
@redis_client.set('other', 'world')
|
68
70
|
end
|
69
71
|
end
|
70
72
|
|
@@ -73,13 +75,12 @@ class RedisTest < Minitest::Test
|
|
73
75
|
|
74
76
|
def test_multi_call_with_error
|
75
77
|
clear_all!
|
76
|
-
redis_client = create_redis_client
|
77
78
|
|
78
79
|
Instana.tracer.start_or_continue_trace(:redis_test) do
|
79
80
|
begin
|
80
|
-
redis_client.multi do
|
81
|
-
redis_client.set('other', 'world')
|
82
|
-
redis_client.call('invalid')
|
81
|
+
@redis_client.multi do
|
82
|
+
@redis_client.set('other', 'world')
|
83
|
+
@redis_client.call('invalid')
|
83
84
|
end
|
84
85
|
rescue; end
|
85
86
|
end
|
@@ -89,10 +90,6 @@ class RedisTest < Minitest::Test
|
|
89
90
|
|
90
91
|
private
|
91
92
|
|
92
|
-
def create_redis_client
|
93
|
-
Redis.new(url: ENV['I_REDIS_URL'])
|
94
|
-
end
|
95
|
-
|
96
93
|
def assert_redis_trace(command, with_error: nil)
|
97
94
|
spans = ::Instana.processor.queued_spans
|
98
95
|
assert_equal 2, spans.length
|
@@ -105,10 +102,10 @@ class RedisTest < Minitest::Test
|
|
105
102
|
|
106
103
|
data = second_span[:data]
|
107
104
|
|
108
|
-
uri = URI.parse(
|
105
|
+
uri = URI.parse(@redis_url)
|
109
106
|
assert_equal "#{uri.host}:#{uri.port}", data[:redis][:connection]
|
110
107
|
|
111
|
-
assert_equal 0, data[:redis][:db]
|
108
|
+
assert_equal "0", data[:redis][:db]
|
112
109
|
assert_equal command, data[:redis][:command]
|
113
110
|
|
114
111
|
if with_error
|
@@ -5,8 +5,8 @@ require 'resque'
|
|
5
5
|
|
6
6
|
if ENV.key?('REDIS_URL')
|
7
7
|
::Resque.redis = ENV['REDIS_URL']
|
8
|
-
elsif ENV.key?('
|
9
|
-
::Resque.redis = ENV['
|
8
|
+
elsif ENV.key?('REDIS_URL')
|
9
|
+
::Resque.redis = ENV['REDIS_URL']
|
10
10
|
else
|
11
11
|
::Resque.redis = 'localhost:6379'
|
12
12
|
end
|
@@ -23,16 +23,15 @@ class ResqueClientTest < Minitest::Test
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def test_enqueue
|
26
|
-
::Instana.tracer.start_or_continue_trace('resque-client_test') do
|
26
|
+
::Instana.tracer.start_or_continue_trace(:'resque-client_test') do
|
27
27
|
::Resque.enqueue(FastJob)
|
28
28
|
end
|
29
29
|
|
30
30
|
spans = ::Instana.processor.queued_spans
|
31
|
-
assert_equal
|
31
|
+
assert_equal 2, spans.length
|
32
32
|
|
33
33
|
sdk_span = find_first_span_by_name(spans, :'resque-client_test')
|
34
34
|
resque_span = find_first_span_by_name(spans, :'resque-client')
|
35
|
-
redis_span = find_first_span_by_name(spans, :redis)
|
36
35
|
|
37
36
|
assert_equal :'resque-client_test', sdk_span[:data][:sdk][:name]
|
38
37
|
|
@@ -40,48 +39,42 @@ class ResqueClientTest < Minitest::Test
|
|
40
39
|
assert_equal "FastJob", resque_span[:data][:'resque-client'][:job]
|
41
40
|
assert_equal :critical, resque_span[:data][:'resque-client'][:queue]
|
42
41
|
assert_equal false, resque_span[:data][:'resque-client'].key?(:error)
|
43
|
-
|
44
|
-
assert_equal :redis, redis_span[:n]
|
45
42
|
end
|
46
43
|
|
47
44
|
def test_enqueue_to
|
48
|
-
::Instana.tracer.start_or_continue_trace('resque-client_test') do
|
45
|
+
::Instana.tracer.start_or_continue_trace(:'resque-client_test') do
|
49
46
|
::Resque.enqueue_to(:critical, FastJob)
|
50
47
|
end
|
51
48
|
|
52
49
|
spans = ::Instana.processor.queued_spans
|
53
|
-
assert_equal
|
50
|
+
assert_equal 2, spans.length
|
54
51
|
|
55
52
|
sdk_span = find_first_span_by_name(spans, :'resque-client_test')
|
56
53
|
resque_span = find_first_span_by_name(spans, :'resque-client')
|
57
|
-
redis_span = find_first_span_by_name(spans, :redis)
|
58
54
|
|
59
55
|
assert_equal :'resque-client_test', sdk_span[:data][:sdk][:name]
|
60
56
|
assert_equal :"resque-client", resque_span[:n]
|
61
57
|
assert_equal "FastJob", resque_span[:data][:'resque-client'][:job]
|
62
58
|
assert_equal :critical, resque_span[:data][:'resque-client'][:queue]
|
63
59
|
assert_equal false, resque_span[:data][:'resque-client'].key?(:error)
|
64
|
-
assert_equal :redis, redis_span[:n]
|
65
60
|
end
|
66
61
|
|
67
62
|
def test_dequeue
|
68
|
-
::Instana.tracer.start_or_continue_trace('resque-client_test', '', {}) do
|
63
|
+
::Instana.tracer.start_or_continue_trace(:'resque-client_test', '', {}) do
|
69
64
|
::Resque.dequeue(FastJob, { :generate => :farfalla })
|
70
65
|
end
|
71
66
|
|
72
67
|
spans = ::Instana.processor.queued_spans
|
73
|
-
assert_equal
|
68
|
+
assert_equal 2, spans.length
|
74
69
|
|
75
70
|
sdk_span = find_first_span_by_name(spans, :'resque-client_test')
|
76
71
|
resque_span = find_first_span_by_name(spans, :'resque-client')
|
77
|
-
redis_span = find_first_span_by_name(spans, :redis)
|
78
72
|
|
79
73
|
assert_equal :'resque-client_test', sdk_span[:data][:sdk][:name]
|
80
|
-
assert_equal :"resque-client",
|
74
|
+
assert_equal :"resque-client", resque_span[:n]
|
81
75
|
assert_equal "FastJob", resque_span[:data][:'resque-client'][:job]
|
82
76
|
assert_equal :critical, resque_span[:data][:'resque-client'][:queue]
|
83
77
|
assert_equal false, resque_span[:data][:'resque-client'].key?(:error)
|
84
|
-
assert_equal :redis, redis_span[:n]
|
85
78
|
end
|
86
79
|
|
87
80
|
def test_worker_job
|
@@ -1,6 +1,13 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class SidekiqClientTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
Sidekiq.configure_client do |config|
|
6
|
+
config.redis = { url: ENV["REDIS_URL"] }
|
7
|
+
end
|
8
|
+
::Sidekiq::Queue.new('some_random_queue').clear
|
9
|
+
end
|
10
|
+
|
4
11
|
def test_config_defaults
|
5
12
|
assert ::Instana.config[:'sidekiq-client'].is_a?(Hash)
|
6
13
|
assert ::Instana.config[:'sidekiq-client'].key?(:enabled)
|
@@ -1,6 +1,12 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class SidekiqServerTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
Sidekiq.configure_client do |config|
|
6
|
+
config.redis = { url: ENV["REDIS_URL"] }
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
4
10
|
def test_config_defaults
|
5
11
|
assert ::Instana.config[:'sidekiq-worker'].is_a?(Hash)
|
6
12
|
assert ::Instana.config[:'sidekiq-worker'].key?(:enabled)
|
@@ -7,8 +7,8 @@ class ErrorJob
|
|
7
7
|
def self.perform
|
8
8
|
if ENV.key?('REDIS_URL')
|
9
9
|
redis = Redis.new(:url => ENV['REDIS_URL'])
|
10
|
-
elsif ENV.key?('
|
11
|
-
redis = Redis.new(:url => ENV['
|
10
|
+
elsif ENV.key?('REDIS_URL')
|
11
|
+
redis = Redis.new(:url => ENV['REDIS_URL'])
|
12
12
|
else
|
13
13
|
redis = Redis.new(:url => 'localhost:6379')
|
14
14
|
end
|
@@ -7,8 +7,8 @@ class FastJob
|
|
7
7
|
def self.perform
|
8
8
|
if ENV.key?('REDIS_URL')
|
9
9
|
redis = Redis.new(:url => ENV['REDIS_URL'])
|
10
|
-
elsif ENV.key?('
|
11
|
-
redis = Redis.new(:url => ENV['
|
10
|
+
elsif ENV.key?('REDIS_URL')
|
11
|
+
redis = Redis.new(:url => ENV['REDIS_URL'])
|
12
12
|
else
|
13
13
|
redis = Redis.new(:url => 'redis://localhost:6379')
|
14
14
|
end
|
data/test/test_helper.rb
CHANGED
@@ -39,27 +39,23 @@ when /libraries/
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
ENV['
|
42
|
+
ENV['REDIS_URL'] ||= 'redis://127.0.0.1:6379'
|
43
43
|
|
44
44
|
# Configure redis for sidekiq client
|
45
45
|
Sidekiq.configure_client do |config|
|
46
|
-
config.redis = { url: ENV['
|
46
|
+
config.redis = { url: ENV['REDIS_URL'] }
|
47
47
|
end
|
48
48
|
|
49
49
|
# Configure redis for sidekiq worker
|
50
50
|
$sidekiq_mode = :server
|
51
51
|
::Sidekiq.configure_server do |config|
|
52
|
-
config.redis = { url: ENV['
|
52
|
+
config.redis = { url: ENV['REDIS_URL'] }
|
53
53
|
end
|
54
54
|
$sidekiq_mode = :client
|
55
55
|
|
56
56
|
require './test/servers/sidekiq/worker'
|
57
57
|
end
|
58
58
|
|
59
|
-
if defined?(::Redis)
|
60
|
-
$redis = Redis.new(url: ENV['I_REDIS_URL'])
|
61
|
-
end
|
62
|
-
|
63
59
|
Minitest::Reporters.use! MiniTest::Reporters::SpecReporter.new
|
64
60
|
|
65
61
|
# Used to reset the gem to boot state. It clears out any queued and/or staged
|
@@ -68,7 +64,6 @@ Minitest::Reporters.use! MiniTest::Reporters::SpecReporter.new
|
|
68
64
|
def clear_all!
|
69
65
|
::Instana.processor.clear!
|
70
66
|
::Instana.tracer.clear!
|
71
|
-
$redis.flushall if $redis
|
72
67
|
nil
|
73
68
|
end
|
74
69
|
|
@@ -332,4 +332,25 @@ class OpenTracerTest < Minitest::Test
|
|
332
332
|
assert_equal({:my_bag=>1}, ac_span.context.baggage)
|
333
333
|
assert_equal(nil, av_span.context.baggage)
|
334
334
|
end
|
335
|
+
|
336
|
+
def test_start_active_span
|
337
|
+
clear_all!
|
338
|
+
|
339
|
+
span = OpenTracing.start_active_span(:rack)
|
340
|
+
assert_equal ::Instana::Tracer.current_span, span
|
341
|
+
|
342
|
+
sleep 0.1
|
343
|
+
|
344
|
+
span.finish
|
345
|
+
|
346
|
+
spans = ::Instana.processor.queued_spans
|
347
|
+
assert_equal 1, spans.length
|
348
|
+
end
|
349
|
+
|
350
|
+
def test_active_span
|
351
|
+
clear_all!
|
352
|
+
|
353
|
+
span = OpenTracing.start_active_span(:rack)
|
354
|
+
assert_equal OpenTracing.active_span, span
|
355
|
+
end
|
335
356
|
end
|
data/test/tracing/tracer_test.rb
CHANGED
@@ -46,6 +46,37 @@ class TracerTest < Minitest::Test
|
|
46
46
|
assert_equal ::Instana.agent.agent_uuid, first_span[:f][:h]
|
47
47
|
end
|
48
48
|
|
49
|
+
def test_exotic_tag_types
|
50
|
+
clear_all!
|
51
|
+
|
52
|
+
assert_equal false, ::Instana.tracer.tracing?
|
53
|
+
|
54
|
+
require 'resolv'
|
55
|
+
r = Resolv::DNS.new
|
56
|
+
ipv4 = r.getaddress("www.pwpush.com")
|
57
|
+
|
58
|
+
::Instana.tracer.start_or_continue_trace(:rack, {:ipaddr => ipv4}) do
|
59
|
+
assert_equal true, ::Instana.tracer.tracing?
|
60
|
+
sleep 0.1
|
61
|
+
end
|
62
|
+
|
63
|
+
spans = ::Instana.processor.queued_spans
|
64
|
+
assert_equal 1, spans.length
|
65
|
+
|
66
|
+
first_span = spans.first
|
67
|
+
assert_equal :rack, first_span[:n]
|
68
|
+
assert first_span[:ts].is_a?(Integer)
|
69
|
+
assert first_span[:d].is_a?(Integer)
|
70
|
+
assert first_span[:d].between?(100, 130)
|
71
|
+
assert first_span.key?(:data)
|
72
|
+
assert first_span[:data].key?(:ipaddr)
|
73
|
+
assert first_span[:data][:ipaddr].is_a?(String)
|
74
|
+
assert first_span.key?(:f)
|
75
|
+
assert first_span[:f].key?(:e)
|
76
|
+
assert first_span[:f].key?(:h)
|
77
|
+
assert_equal ::Instana.agent.agent_uuid, first_span[:f][:h]
|
78
|
+
end
|
79
|
+
|
49
80
|
def test_errors_are_properly_propagated
|
50
81
|
clear_all!
|
51
82
|
exception_raised = false
|
@@ -198,7 +229,6 @@ class TracerTest < Minitest::Test
|
|
198
229
|
assert_equal sdk_span[:k], 3
|
199
230
|
assert_equal sdk_span[:data][:sdk][:custom][:tags][:sub_task_info], 1
|
200
231
|
assert_equal sdk_span[:data][:sdk][:custom][:tags][:sub_task_exit_info], 1
|
201
|
-
|
202
232
|
end
|
203
233
|
|
204
234
|
def test_block_tracing_error_capture
|