instana 1.7.4 → 1.7.5
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/Gemfile +1 -0
- data/benchmarks/rack_vanilla_vs_traced.rb +80 -0
- data/benchmarks/stackprof_rack_tracing.rb +77 -0
- data/lib/instana/agent.rb +4 -1
- data/lib/instana/config.rb +6 -1
- data/lib/instana/instrumentation/net-http.rb +2 -2
- data/lib/instana/tracing/processor.rb +10 -1
- data/lib/instana/tracing/span.rb +6 -4
- data/lib/instana/version.rb +1 -1
- data/test/instrumentation/excon_test.rb +6 -6
- data/test/instrumentation/net-http_test.rb +3 -3
- data/test/tracing/trace_test.rb +19 -2
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 968b0d69a6812e078d8e16552798b28005fc9cf1
|
4
|
+
data.tar.gz: 23b3315b9dce25b258156e85e3eebbc221b81396
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f99acdde5c0fe11ca3ef729c82f43b4f8e28647a67c7f92f3f6ff04ab3c1e3967e7a89ee0466c6fd7d57ef6bc8b18fee4706690bb69c12e33e55a84d08826afb
|
7
|
+
data.tar.gz: d48ea584fd211c9a3533654155610c2ac776ca5a852ac69b34781bca374837f28203ec66d8b17f4a20793eb91a29086e90e6acefdb60ea473edac7839bd07bc3
|
data/Gemfile
CHANGED
@@ -0,0 +1,80 @@
|
|
1
|
+
require "bundler"
|
2
|
+
|
3
|
+
require 'rack'
|
4
|
+
require 'rack/builder'
|
5
|
+
require 'rack/handler/puma'
|
6
|
+
require 'net/http'
|
7
|
+
require "benchmark"
|
8
|
+
require "cgi"
|
9
|
+
Bundler.require(:default)
|
10
|
+
require "instana/rack"
|
11
|
+
|
12
|
+
Thread.new do
|
13
|
+
app = Rack::Builder.new {
|
14
|
+
map "/" do
|
15
|
+
run Proc.new { |env|
|
16
|
+
[200, {"Content-Type" => "application/json"}, ["[\"Stan\",\"is\",\"on\",\"the\",\"scene!\"]"]]
|
17
|
+
}
|
18
|
+
end
|
19
|
+
map "/error" do
|
20
|
+
run Proc.new { |env|
|
21
|
+
[500, {"Content-Type" => "application/json"}, ["[\"Stan\",\"is\",\"on\",\"the\",\"error!\"]"]]
|
22
|
+
}
|
23
|
+
end
|
24
|
+
}
|
25
|
+
|
26
|
+
Rack::Handler::Puma.run(app, {:Host => '127.0.0.1', :Port => 7011})
|
27
|
+
end
|
28
|
+
|
29
|
+
Thread.new do
|
30
|
+
app = Rack::Builder.new {
|
31
|
+
use ::Instana::Rack
|
32
|
+
map "/" do
|
33
|
+
run Proc.new { |env|
|
34
|
+
[200, {"Content-Type" => "application/json"}, ["[\"Stan\",\"is\",\"on\",\"the\",\"scene!\"]"]]
|
35
|
+
}
|
36
|
+
end
|
37
|
+
map "/error" do
|
38
|
+
run Proc.new { |env|
|
39
|
+
[500, {"Content-Type" => "application/json"}, ["[\"Stan\",\"is\",\"on\",\"the\",\"error!\"]"]]
|
40
|
+
}
|
41
|
+
end
|
42
|
+
}
|
43
|
+
|
44
|
+
Rack::Handler::Puma.run(app, {:Host => '127.0.0.1', :Port => 7012})
|
45
|
+
end
|
46
|
+
|
47
|
+
sleep(2)
|
48
|
+
puts "Rack server started in background thread on localhost:7011"
|
49
|
+
puts "Sleeping for 10 to allow announce"
|
50
|
+
sleep(10)
|
51
|
+
|
52
|
+
|
53
|
+
puts "Starting benchmarks"
|
54
|
+
Benchmark.bm do |x|
|
55
|
+
|
56
|
+
uri = URI.parse("http://127.0.0.1:7011/")
|
57
|
+
::Net::HTTP.start(uri.host, uri.port) do |hc|
|
58
|
+
x.report("vanilla") {
|
59
|
+
1_000.times {
|
60
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
61
|
+
hc.request(req)
|
62
|
+
}
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
uri = URI.parse("http://127.0.0.1:7012/")
|
67
|
+
::Net::HTTP.start(uri.host, uri.port) do |hc|
|
68
|
+
x.report("traced ") {
|
69
|
+
1_000.times {
|
70
|
+
::Instana.tracer.start_or_continue_trace(:rack_call) do
|
71
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
72
|
+
hc.request(req)
|
73
|
+
end
|
74
|
+
}
|
75
|
+
}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
sleep 10
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require "bundler"
|
2
|
+
require "stackprof"
|
3
|
+
require 'rack'
|
4
|
+
require 'rack/builder'
|
5
|
+
require 'rack/handler/puma'
|
6
|
+
require 'net/http'
|
7
|
+
require "benchmark"
|
8
|
+
require "cgi"
|
9
|
+
Bundler.require(:default)
|
10
|
+
require "instana/rack"
|
11
|
+
|
12
|
+
Thread.new do
|
13
|
+
app = Rack::Builder.new {
|
14
|
+
map "/" do
|
15
|
+
run Proc.new { |env|
|
16
|
+
[200, {"Content-Type" => "application/json"}, ["[\"Stan\",\"is\",\"on\",\"the\",\"scene!\"]"]]
|
17
|
+
}
|
18
|
+
end
|
19
|
+
map "/error" do
|
20
|
+
run Proc.new { |env|
|
21
|
+
[500, {"Content-Type" => "application/json"}, ["[\"Stan\",\"is\",\"on\",\"the\",\"error!\"]"]]
|
22
|
+
}
|
23
|
+
end
|
24
|
+
}
|
25
|
+
|
26
|
+
Rack::Handler::Puma.run(app, {:Host => '127.0.0.1', :Port => 7011})
|
27
|
+
end
|
28
|
+
|
29
|
+
Thread.new do
|
30
|
+
app = Rack::Builder.new {
|
31
|
+
use ::Instana::Rack
|
32
|
+
map "/" do
|
33
|
+
run Proc.new { |env|
|
34
|
+
[200, {"Content-Type" => "application/json"}, ["[\"Stan\",\"is\",\"on\",\"the\",\"scene!\"]"]]
|
35
|
+
}
|
36
|
+
end
|
37
|
+
map "/error" do
|
38
|
+
run Proc.new { |env|
|
39
|
+
[500, {"Content-Type" => "application/json"}, ["[\"Stan\",\"is\",\"on\",\"the\",\"error!\"]"]]
|
40
|
+
}
|
41
|
+
end
|
42
|
+
}
|
43
|
+
|
44
|
+
Rack::Handler::Puma.run(app, {:Host => '127.0.0.1', :Port => 7012})
|
45
|
+
end
|
46
|
+
|
47
|
+
sleep(2)
|
48
|
+
puts "Rack server started in background thread on localhost:7011"
|
49
|
+
puts "Sleeping for 10 to allow announce"
|
50
|
+
sleep(10)
|
51
|
+
|
52
|
+
puts "Starting profile"
|
53
|
+
uri = URI.parse("http://127.0.0.1:7011/")
|
54
|
+
StackProf.run(mode: :wall, out: 'tmp/stackprof-rack-vanilla.dump') do
|
55
|
+
::Net::HTTP.start(uri.host, uri.port) do |hc|
|
56
|
+
5_000.times {
|
57
|
+
::Instana.tracer.start_or_continue_trace(:rack_call) do
|
58
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
59
|
+
hc.request(req)
|
60
|
+
end
|
61
|
+
}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
puts "stackprof tmp/stackprof-rack-vanilla.dump --text"
|
65
|
+
|
66
|
+
uri = URI.parse("http://127.0.0.1:7012/")
|
67
|
+
StackProf.run(mode: :wall, out: 'tmp/stackprof-rack-instrumented.dump') do
|
68
|
+
::Net::HTTP.start(uri.host, uri.port) do |hc|
|
69
|
+
5_000.times {
|
70
|
+
::Instana.tracer.start_or_continue_trace(:rack_call) do
|
71
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
72
|
+
hc.request(req)
|
73
|
+
end
|
74
|
+
}
|
75
|
+
end
|
76
|
+
end
|
77
|
+
puts "stackprof tmp/stackprof-rack-instrumented.dump --text"
|
data/lib/instana/agent.rb
CHANGED
@@ -162,6 +162,9 @@ module Instana
|
|
162
162
|
end
|
163
163
|
@timers.wait
|
164
164
|
end
|
165
|
+
rescue Exception => e
|
166
|
+
::Instana.logger.warn "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
|
167
|
+
::Instana.logger.debug e.backtrace.join("\r\n")
|
165
168
|
ensure
|
166
169
|
if @state == :announced
|
167
170
|
# Pause the timers so they don't fire while we are
|
@@ -169,7 +172,7 @@ module Instana
|
|
169
172
|
@collect_timer.pause
|
170
173
|
@announce_timer.pause
|
171
174
|
|
172
|
-
::Instana.logger.debug "Agent exiting. Reporting final #{::Instana.processor.queue_count} trace(s)."
|
175
|
+
::Instana.logger.debug "#{Thread.current}: Agent exiting. Reporting final #{::Instana.processor.queue_count} trace(s)."
|
173
176
|
::Instana.processor.send
|
174
177
|
end
|
175
178
|
end
|
data/lib/instana/config.rb
CHANGED
@@ -31,7 +31,12 @@ module Instana
|
|
31
31
|
@config[:eum_api_key] = nil
|
32
32
|
@config[:eum_baggage] = {}
|
33
33
|
|
34
|
-
#
|
34
|
+
# In Ruby, backtrace collection is very expensive so it's
|
35
|
+
# (unfortunately) disabled by default. If you still want
|
36
|
+
# backtraces, it can be enabled with this config option.
|
37
|
+
# ::Instana.config[:collect_backtraces] = true
|
38
|
+
@config[:collect_backtraces] = false
|
39
|
+
|
35
40
|
@config[:action_controller] = { :enabled => true }
|
36
41
|
@config[:action_view] = { :enabled => true }
|
37
42
|
@config[:active_record] = { :enabled => true }
|
@@ -35,9 +35,9 @@ if defined?(::Net::HTTP) && ::Instana.config[:nethttp][:enabled]
|
|
35
35
|
# The core call
|
36
36
|
response = request_without_instana(*args, &block)
|
37
37
|
|
38
|
-
# Pickup response headers; convert back to base 10 integer
|
38
|
+
# Debug only check: Pickup response headers; convert back to base 10 integer and validate
|
39
39
|
if ::Instana.debug? && response.key?('X-Instana-T')
|
40
|
-
if ::Instana.tracer.trace_id != ::Instana.
|
40
|
+
if ::Instana.tracer.trace_id != ::Instana::Util.header_to_id(response.header['X-Instana-T'])
|
41
41
|
::Instana.logger.debug "#{Thread.current}: Trace ID mismatch on net/http response! ours: #{::Instana.tracer.trace_id} theirs: #{their_trace_id}"
|
42
42
|
end
|
43
43
|
end
|
@@ -18,6 +18,10 @@ module Instana
|
|
18
18
|
# No access to the @staging_queue until this lock
|
19
19
|
# is taken.
|
20
20
|
@staging_lock = Mutex.new
|
21
|
+
|
22
|
+
# This is the maximum number of spans we send to the host
|
23
|
+
# agent at once.
|
24
|
+
@batch_size = 3000
|
21
25
|
end
|
22
26
|
|
23
27
|
# Adds a trace to the queue to be processed and
|
@@ -91,7 +95,12 @@ module Instana
|
|
91
95
|
# Retrieve all spans for queued traces
|
92
96
|
spans = queued_spans
|
93
97
|
|
94
|
-
|
98
|
+
# Report spans in batches
|
99
|
+
batch = spans.shift(@batch_size)
|
100
|
+
while !batch.empty? do
|
101
|
+
::Instana.agent.report_spans(batch)
|
102
|
+
batch = spans.shift(@batch_size)
|
103
|
+
end
|
95
104
|
end
|
96
105
|
|
97
106
|
# Retrieves all of the traces in @queue and returns
|
data/lib/instana/tracing/span.rb
CHANGED
@@ -30,11 +30,13 @@ module Instana
|
|
30
30
|
|
31
31
|
@baggage = {}
|
32
32
|
|
33
|
-
|
34
|
-
|
33
|
+
if ::Instana.config[:collect_backtraces]
|
34
|
+
# For entry spans, add a backtrace fingerprint
|
35
|
+
add_stack(limit: 2) if ENTRY_SPANS.include?(name)
|
35
36
|
|
36
|
-
|
37
|
-
|
37
|
+
# Attach a backtrace to all exit spans
|
38
|
+
add_stack if EXIT_SPANS.include?(name)
|
39
|
+
end
|
38
40
|
|
39
41
|
# Check for custom tracing
|
40
42
|
if REGISTERED_SPANS.include?(name.to_sym)
|
data/lib/instana/version.rb
CHANGED
@@ -47,8 +47,8 @@ class ExconTest < Minitest::Test
|
|
47
47
|
assert_equal "http://127.0.0.1:6511/", second_span[:data][:http][:url]
|
48
48
|
assert_equal 200, second_span[:data][:http][:status]
|
49
49
|
|
50
|
-
# excon backtrace included check
|
51
|
-
assert second_span.key?(:stack)
|
50
|
+
# excon backtrace not included by default check
|
51
|
+
assert !second_span.key?(:stack)
|
52
52
|
|
53
53
|
# Rack server trace validation
|
54
54
|
assert_equal 1, rs_trace.spans.count
|
@@ -101,7 +101,7 @@ class ExconTest < Minitest::Test
|
|
101
101
|
assert_equal "http://127.0.0.1:6500/", second_span[:data][:http][:url]
|
102
102
|
assert_equal nil, second_span[:data][:http][:status]
|
103
103
|
|
104
|
-
# excon
|
104
|
+
# excon span should include an error backtrace
|
105
105
|
assert second_span.key?(:stack)
|
106
106
|
|
107
107
|
# error validation
|
@@ -154,18 +154,18 @@ class ExconTest < Minitest::Test
|
|
154
154
|
refute_nil second_span[:data].key?(:http)
|
155
155
|
assert_equal "http://127.0.0.1:6511/", second_span[:data][:http][:url]
|
156
156
|
assert_equal 200, second_span[:data][:http][:status]
|
157
|
-
assert second_span.key?(:stack)
|
157
|
+
assert !second_span.key?(:stack)
|
158
158
|
|
159
159
|
refute_nil third_span.key?(:data)
|
160
160
|
refute_nil third_span[:data].key?(:http)
|
161
161
|
assert_equal "http://127.0.0.1:6511/", third_span[:data][:http][:url]
|
162
162
|
assert_equal 200, third_span[:data][:http][:status]
|
163
|
-
assert third_span.key?(:stack)
|
163
|
+
assert !third_span.key?(:stack)
|
164
164
|
|
165
165
|
refute_nil fourth_span.key?(:data)
|
166
166
|
refute_nil fourth_span[:data].key?(:http)
|
167
167
|
assert_equal "http://127.0.0.1:6511/", fourth_span[:data][:http][:url]
|
168
168
|
assert_equal 200, fourth_span[:data][:http][:status]
|
169
|
-
assert fourth_span.key?(:stack)
|
169
|
+
assert !fourth_span.key?(:stack)
|
170
170
|
end
|
171
171
|
end
|
@@ -46,7 +46,7 @@ class NetHTTPTest < Minitest::Test
|
|
46
46
|
refute_nil second_span[:data].key?(:http)
|
47
47
|
assert_equal "http://127.0.0.1:6511/", second_span[:data][:http][:url]
|
48
48
|
assert_equal "200", second_span[:data][:http][:status]
|
49
|
-
assert second_span.key?(:stack)
|
49
|
+
assert !second_span.key?(:stack)
|
50
50
|
|
51
51
|
# Rack server trace validation
|
52
52
|
assert_equal 1, rs_trace.spans.count
|
@@ -94,7 +94,7 @@ class NetHTTPTest < Minitest::Test
|
|
94
94
|
refute_nil second_span[:data].key?(:http)
|
95
95
|
assert_equal "http://127.0.0.1:6511/", second_span[:data][:http][:url]
|
96
96
|
assert_equal "200", second_span[:data][:http][:status]
|
97
|
-
assert second_span.key?(:stack)
|
97
|
+
assert !second_span.key?(:stack)
|
98
98
|
|
99
99
|
# Rack server trace validation
|
100
100
|
assert_equal 1, rs_trace.spans.count
|
@@ -161,7 +161,7 @@ class NetHTTPTest < Minitest::Test
|
|
161
161
|
assert_equal "http://127.0.0.1:6511/error", http_span[:data][:http][:url]
|
162
162
|
assert_equal "500", http_span[:data][:http][:status]
|
163
163
|
assert_equal :'net-http', http_span.name
|
164
|
-
assert http_span.key?(:stack)
|
164
|
+
assert !http_span.key?(:stack)
|
165
165
|
|
166
166
|
WebMock.disable_net_connect!
|
167
167
|
end
|
data/test/tracing/trace_test.rb
CHANGED
@@ -34,17 +34,34 @@ class TraceTest < Minitest::Test
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
def
|
37
|
+
def test_entry_span_doesnt_have_stack_by_default
|
38
|
+
t = ::Instana::Trace.new(:rack)
|
39
|
+
first_span = t.spans.first
|
40
|
+
assert !first_span.key?(:stack)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_entry_span_has_stack_by_config
|
44
|
+
::Instana.config[:collect_backtraces] = true
|
38
45
|
t = ::Instana::Trace.new(:rack)
|
39
46
|
first_span = t.spans.first
|
40
47
|
assert first_span.key?(:stack)
|
41
48
|
assert_equal 2, first_span[:stack].count
|
49
|
+
::Instana.config[:collect_backtraces] = false
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_exit_span_doesnt_have_stack_by_default
|
53
|
+
t = ::Instana::Trace.new(:trace_test)
|
54
|
+
t.new_span(:excon)
|
55
|
+
second_span = t.spans.to_a[1]
|
56
|
+
assert !second_span.key?(:stack)
|
42
57
|
end
|
43
58
|
|
44
|
-
def
|
59
|
+
def test_exit_span_has_stack_by_config
|
60
|
+
::Instana.config[:collect_backtraces] = true
|
45
61
|
t = ::Instana::Trace.new(:trace_test)
|
46
62
|
t.new_span(:excon)
|
47
63
|
second_span = t.spans.to_a[1]
|
48
64
|
assert second_span.key?(:stack)
|
65
|
+
::Instana.config[:collect_backtraces] = false
|
49
66
|
end
|
50
67
|
end
|
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.7.
|
4
|
+
version: 1.7.5
|
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: 2017-09-
|
11
|
+
date: 2017-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -173,6 +173,8 @@ files:
|
|
173
173
|
- benchmarks/Gemfile.lock
|
174
174
|
- benchmarks/id_generation.rb
|
175
175
|
- benchmarks/opentracing.rb
|
176
|
+
- benchmarks/rack_vanilla_vs_traced.rb
|
177
|
+
- benchmarks/stackprof_rack_tracing.rb
|
176
178
|
- benchmarks/time_processing.rb
|
177
179
|
- bin/console
|
178
180
|
- bin/setup
|
@@ -292,7 +294,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
292
294
|
version: '0'
|
293
295
|
requirements: []
|
294
296
|
rubyforge_project:
|
295
|
-
rubygems_version: 2.6.
|
297
|
+
rubygems_version: 2.6.11
|
296
298
|
signing_key:
|
297
299
|
specification_version: 4
|
298
300
|
summary: Ruby sensor for Instana
|