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.
- checksums.yaml +4 -4
- data/lib/instana/agent.rb +19 -19
- data/lib/instana/agent/helpers.rb +2 -2
- data/lib/instana/agent/tasks.rb +2 -2
- data/lib/instana/collectors/gc.rb +1 -1
- data/lib/instana/collectors/memory.rb +1 -1
- data/lib/instana/collectors/thread.rb +1 -1
- data/lib/instana/frameworks/instrumentation/mysql2_adapter.rb +1 -1
- data/lib/instana/frameworks/instrumentation/mysql_adapter.rb +1 -1
- data/lib/instana/helpers.rb +2 -2
- data/lib/instana/instrumentation.rb +1 -1
- data/lib/instana/instrumentation/excon.rb +8 -5
- data/lib/instana/instrumentation/rack.rb +2 -2
- data/lib/instana/instrumentation/resque.rb +3 -3
- data/lib/instana/tracer.rb +92 -117
- data/lib/instana/tracing/processor.rb +18 -133
- data/lib/instana/tracing/span.rb +40 -35
- data/lib/instana/tracing/span_context.rb +3 -1
- data/lib/instana/util.rb +5 -5
- data/lib/instana/version.rb +1 -1
- data/lib/opentracing.rb +1 -1
- data/test/frameworks/rack_test.rb +6 -11
- data/test/frameworks/rails/actioncontroller_test.rb +32 -62
- data/test/frameworks/rails/actionview5_test.rb +91 -132
- data/test/frameworks/rails/activerecord5_test.rb +14 -17
- data/test/instrumentation/dalli_test.rb +51 -72
- data/test/instrumentation/excon_test.rb +70 -94
- data/test/instrumentation/grpc_test.rb +164 -126
- data/test/instrumentation/net-http_test.rb +48 -57
- data/test/instrumentation/redis_test.rb +4 -6
- data/test/instrumentation/resque_test.rb +41 -41
- data/test/instrumentation/rest-client_test.rb +25 -31
- data/test/instrumentation/sidekiq-client_test.rb +12 -20
- data/test/instrumentation/sidekiq-worker_test.rb +48 -63
- data/test/jobs/resque_error_job.rb +7 -1
- data/test/jobs/resque_fast_job.rb +7 -1
- data/test/servers/sidekiq/worker.rb +1 -3
- data/test/test_helper.rb +58 -0
- data/test/tracing/custom_test.rb +11 -19
- data/test/tracing/opentracing_test.rb +48 -156
- data/test/tracing/trace_test.rb +67 -67
- data/test/tracing/tracer_async_test.rb +75 -175
- data/test/tracing/tracer_test.rb +75 -75
- metadata +4 -5
- data/lib/instana/tracing/trace.rb +0 -316
data/test/tracing/tracer_test.rb
CHANGED
@@ -30,15 +30,11 @@ class TracerTest < Minitest::Test
|
|
30
30
|
sleep 0.1
|
31
31
|
end
|
32
32
|
|
33
|
-
|
34
|
-
assert_equal 1,
|
35
|
-
t = traces.first
|
36
|
-
assert_equal 1, t.spans.size
|
37
|
-
assert t.valid?
|
33
|
+
spans = ::Instana.processor.queued_spans
|
34
|
+
assert_equal 1, spans.length
|
38
35
|
|
39
|
-
first_span =
|
36
|
+
first_span = spans.first
|
40
37
|
assert_equal :rack, first_span[:n]
|
41
|
-
assert_equal :ruby, first_span[:ta]
|
42
38
|
assert first_span[:ts].is_a?(Integer)
|
43
39
|
assert first_span[:d].is_a?(Integer)
|
44
40
|
assert first_span[:d].between?(100, 130)
|
@@ -63,15 +59,11 @@ class TracerTest < Minitest::Test
|
|
63
59
|
|
64
60
|
assert exception_raised
|
65
61
|
|
66
|
-
|
67
|
-
assert_equal 1,
|
68
|
-
t = traces.first
|
69
|
-
assert_equal 1, t.spans.size
|
70
|
-
assert t.valid?
|
62
|
+
spans = ::Instana.processor.queued_spans
|
63
|
+
assert_equal 1, spans.length
|
71
64
|
|
72
|
-
first_span =
|
65
|
+
first_span = spans.first
|
73
66
|
assert_equal :rack, first_span[:n]
|
74
|
-
assert_equal :ruby, first_span[:ta]
|
75
67
|
assert first_span[:ts].is_a?(Integer)
|
76
68
|
assert first_span[:ts] > 0
|
77
69
|
assert first_span[:d].is_a?(Integer)
|
@@ -82,7 +74,8 @@ class TracerTest < Minitest::Test
|
|
82
74
|
assert first_span[:f].key?(:e)
|
83
75
|
assert first_span[:f].key?(:h)
|
84
76
|
assert_equal ::Instana.agent.agent_uuid, first_span[:f][:h]
|
85
|
-
|
77
|
+
assert_equal first_span[:error], true
|
78
|
+
assert_equal first_span[:ec], 1
|
86
79
|
end
|
87
80
|
|
88
81
|
def test_complex_trace_block
|
@@ -94,11 +87,22 @@ class TracerTest < Minitest::Test
|
|
94
87
|
end
|
95
88
|
end
|
96
89
|
|
97
|
-
|
98
|
-
assert_equal
|
99
|
-
|
100
|
-
|
101
|
-
|
90
|
+
spans = ::Instana.processor.queued_spans
|
91
|
+
assert_equal 2, spans.length
|
92
|
+
|
93
|
+
rack_span = find_first_span_by_name(spans, :rack)
|
94
|
+
sdk_span = find_first_span_by_name(spans, :sub_block)
|
95
|
+
|
96
|
+
assert_equal rack_span[:n], :rack
|
97
|
+
assert_equal rack_span[:p], nil
|
98
|
+
assert_equal rack_span[:t], rack_span[:s]
|
99
|
+
assert_equal rack_span[:data][:one], 1
|
100
|
+
|
101
|
+
assert_equal sdk_span[:n], :sdk
|
102
|
+
assert_equal sdk_span[:data][:sdk][:name], :sub_block
|
103
|
+
assert_equal sdk_span[:data][:sdk][:type], :intermediate
|
104
|
+
assert_equal sdk_span[:k], 3
|
105
|
+
assert_equal sdk_span[:data][:sdk][:custom][:tags][:sub_two], 2
|
102
106
|
end
|
103
107
|
|
104
108
|
def test_basic_low_level_tracing
|
@@ -113,11 +117,8 @@ class TracerTest < Minitest::Test
|
|
113
117
|
::Instana.tracer.log_end(:rack, {:close_one => 1})
|
114
118
|
assert_equal false, ::Instana.tracer.tracing?
|
115
119
|
|
116
|
-
|
117
|
-
assert_equal 1,
|
118
|
-
t = traces.first
|
119
|
-
assert_equal 1, t.spans.size
|
120
|
-
assert t.valid?
|
120
|
+
spans = ::Instana.processor.queued_spans
|
121
|
+
assert_equal 1, spans.length
|
121
122
|
end
|
122
123
|
|
123
124
|
def test_complex_low_level_tracing
|
@@ -142,22 +143,30 @@ class TracerTest < Minitest::Test
|
|
142
143
|
::Instana.tracer.log_end(:rack, {:close_one => 1})
|
143
144
|
assert_equal false, ::Instana.tracer.tracing?
|
144
145
|
|
145
|
-
|
146
|
-
assert_equal
|
146
|
+
spans = ::Instana.processor.queued_spans
|
147
|
+
assert_equal 2, spans.length
|
147
148
|
|
148
|
-
|
149
|
-
|
150
|
-
|
149
|
+
rack_span = find_first_span_by_name(spans, :rack)
|
150
|
+
sdk_span = find_first_span_by_name(spans, :sub_task)
|
151
|
+
|
152
|
+
assert_equal :rack, rack_span[:n]
|
153
|
+
assert rack_span.key?(:data)
|
154
|
+
assert_equal rack_span[:data][:one], 1
|
155
|
+
assert_equal rack_span[:data][:info_logged], 1
|
156
|
+
assert_equal rack_span[:data][:close_one], 1
|
157
|
+
|
158
|
+
assert rack_span.key?(:f)
|
159
|
+
assert rack_span[:f].key?(:e)
|
160
|
+
assert rack_span[:f].key?(:h)
|
161
|
+
assert_equal ::Instana.agent.agent_uuid, rack_span[:f][:h]
|
162
|
+
|
163
|
+
assert_equal sdk_span[:n], :sdk
|
164
|
+
assert_equal sdk_span[:data][:sdk][:name], :sub_task
|
165
|
+
assert_equal sdk_span[:data][:sdk][:type], :intermediate
|
166
|
+
assert_equal sdk_span[:k], 3
|
167
|
+
assert_equal sdk_span[:data][:sdk][:custom][:tags][:sub_task_info], 1
|
168
|
+
assert_equal sdk_span[:data][:sdk][:custom][:tags][:sub_task_exit_info], 1
|
151
169
|
|
152
|
-
first_span = t.spans.first
|
153
|
-
assert_equal :rack, first_span[:n]
|
154
|
-
assert_equal :ruby, first_span[:ta]
|
155
|
-
assert first_span.key?(:data)
|
156
|
-
assert_equal 1, first_span[:data][:one]
|
157
|
-
assert first_span.key?(:f)
|
158
|
-
assert first_span[:f].key?(:e)
|
159
|
-
assert first_span[:f].key?(:h)
|
160
|
-
assert_equal ::Instana.agent.agent_uuid, first_span[:f][:h]
|
161
170
|
end
|
162
171
|
|
163
172
|
def test_block_tracing_error_capture
|
@@ -173,13 +182,19 @@ class TracerTest < Minitest::Test
|
|
173
182
|
|
174
183
|
assert exception_raised
|
175
184
|
|
176
|
-
|
177
|
-
assert_equal 1,
|
185
|
+
spans = ::Instana.processor.queued_spans
|
186
|
+
assert_equal 1, spans.length
|
187
|
+
|
188
|
+
sdk_span = spans[0]
|
178
189
|
|
179
|
-
|
180
|
-
assert_equal
|
181
|
-
|
182
|
-
|
190
|
+
assert_equal sdk_span[:n], :sdk
|
191
|
+
assert_equal sdk_span[:data][:sdk][:name], :test_trace
|
192
|
+
assert_equal sdk_span[:data][:sdk][:type], :intermediate
|
193
|
+
assert_equal sdk_span[:k], 3
|
194
|
+
assert_equal sdk_span[:data][:sdk][:custom][:tags][:one], 1
|
195
|
+
assert_equal sdk_span[:error], true
|
196
|
+
assert_equal sdk_span[:ec], 1
|
197
|
+
assert_equal sdk_span.key?(:stack), true
|
183
198
|
end
|
184
199
|
|
185
200
|
def test_low_level_error_logging
|
@@ -189,35 +204,20 @@ class TracerTest < Minitest::Test
|
|
189
204
|
::Instana.tracer.log_error(Exception.new("Low level tracing api error"))
|
190
205
|
::Instana.tracer.log_end(:test_trace, {:close_one => 1})
|
191
206
|
|
192
|
-
|
193
|
-
assert_equal 1,
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
traces = ::Instana.processor.queued_traces
|
208
|
-
assert_equal 1, traces.length
|
209
|
-
t = traces.first
|
210
|
-
assert_equal 1, t.spans.size
|
211
|
-
assert t.valid?
|
212
|
-
|
213
|
-
first_span = t.spans.first
|
214
|
-
assert_equal :rack, first_span[:n]
|
215
|
-
assert_equal :ruby, first_span[:ta]
|
216
|
-
assert first_span.key?(:data)
|
217
|
-
assert_equal 1, first_span[:data][:one]
|
218
|
-
assert first_span.key?(:f)
|
219
|
-
assert first_span[:f].key?(:e)
|
220
|
-
assert first_span[:f].key?(:h)
|
221
|
-
assert_equal ::Instana.agent.agent_uuid, first_span[:f][:h]
|
207
|
+
spans = ::Instana.processor.queued_spans
|
208
|
+
assert_equal 1, spans.length
|
209
|
+
|
210
|
+
sdk_span = spans[0]
|
211
|
+
|
212
|
+
assert_equal sdk_span[:n], :sdk
|
213
|
+
assert_equal sdk_span[:data][:sdk][:name], :test_trace
|
214
|
+
assert_equal sdk_span[:data][:sdk][:type], :intermediate
|
215
|
+
assert_equal sdk_span[:k], 3
|
216
|
+
assert_equal sdk_span[:data][:sdk][:custom][:tags][:one], 1
|
217
|
+
assert_equal sdk_span[:data][:sdk][:custom][:tags][:info_logged], 1
|
218
|
+
assert_equal sdk_span[:data][:sdk][:custom][:tags][:close_one], 1
|
219
|
+
assert_equal sdk_span[:error], true
|
220
|
+
assert_equal sdk_span[:ec], 1
|
221
|
+
assert_equal sdk_span.key?(:stack), false
|
222
222
|
end
|
223
223
|
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.
|
4
|
+
version: 1.10.0.slimfast
|
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: 2019-08-
|
11
|
+
date: 2019-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -245,7 +245,6 @@ files:
|
|
245
245
|
- lib/instana/tracing/processor.rb
|
246
246
|
- lib/instana/tracing/span.rb
|
247
247
|
- lib/instana/tracing/span_context.rb
|
248
|
-
- lib/instana/tracing/trace.rb
|
249
248
|
- lib/instana/util.rb
|
250
249
|
- lib/instana/version.rb
|
251
250
|
- lib/opentracing.rb
|
@@ -311,9 +310,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
311
310
|
version: '2.1'
|
312
311
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
313
312
|
requirements:
|
314
|
-
- - "
|
313
|
+
- - ">"
|
315
314
|
- !ruby/object:Gem::Version
|
316
|
-
version:
|
315
|
+
version: 1.3.1
|
317
316
|
requirements: []
|
318
317
|
rubygems_version: 3.0.3
|
319
318
|
signing_key:
|
@@ -1,316 +0,0 @@
|
|
1
|
-
module Instana
|
2
|
-
class Trace
|
3
|
-
# @return [Integer] the ID for this trace
|
4
|
-
attr_reader :id
|
5
|
-
|
6
|
-
# The collection of `Span` for this trace
|
7
|
-
# @return [Set] the collection of spans for this trace
|
8
|
-
attr_reader :spans
|
9
|
-
|
10
|
-
# The currently active span
|
11
|
-
attr_reader :current_span
|
12
|
-
|
13
|
-
# Initializes a new instance of Trace
|
14
|
-
#
|
15
|
-
# @param name [String] the name of the span to start
|
16
|
-
# @param kvs [Hash] list of key values to be reported in the span
|
17
|
-
# @param incoming_context [Hash] specifies the incoming context. At a
|
18
|
-
# minimum, it should specify :trace_id and :span_id from the following:
|
19
|
-
# :trace_id the trace ID (must be an unsigned hex-string)
|
20
|
-
# :span_id the ID of the parent span (must be an unsigned hex-string)
|
21
|
-
# :level specifies data collection level (optional)
|
22
|
-
#
|
23
|
-
def initialize(name, kvs = nil, incoming_context = {}, start_time = ::Instana::Util.now_in_ms)
|
24
|
-
# The collection of spans that make
|
25
|
-
# up this trace.
|
26
|
-
@spans = Set.new
|
27
|
-
|
28
|
-
# Generate a random 64bit ID for this trace
|
29
|
-
@id = ::Instana::Util.generate_id
|
30
|
-
|
31
|
-
# Indicates the time when this trace was started. Used to timeout
|
32
|
-
# traces that have asynchronous spans that never close out.
|
33
|
-
@started_at = Time.now
|
34
|
-
|
35
|
-
# Indicates if this trace has any asynchronous spans within it
|
36
|
-
@has_async = false
|
37
|
-
|
38
|
-
# This is a new trace so open the first span with the proper
|
39
|
-
# root span IDs.
|
40
|
-
@current_span = Span.new(name, @id, start_time: start_time)
|
41
|
-
@current_span.set_tags(kvs) if kvs
|
42
|
-
|
43
|
-
# Handle potential incoming context
|
44
|
-
if !incoming_context || incoming_context.empty?
|
45
|
-
# No incoming context. Set trace ID the same
|
46
|
-
# as this first span.
|
47
|
-
@current_span[:s] = @id
|
48
|
-
else
|
49
|
-
@id = incoming_context[:trace_id]
|
50
|
-
@current_span[:t] = incoming_context[:trace_id]
|
51
|
-
@current_span[:p] = incoming_context[:span_id]
|
52
|
-
end
|
53
|
-
|
54
|
-
@spans.add(@current_span)
|
55
|
-
end
|
56
|
-
|
57
|
-
# Start a new span as a child of @current_span
|
58
|
-
#
|
59
|
-
# @param name [String] the name of the span to start
|
60
|
-
# @param kvs [Hash] list of key values to be reported in the span
|
61
|
-
#
|
62
|
-
def new_span(name, kvs = nil, start_time = ::Instana::Util.now_in_ms, child_of = nil)
|
63
|
-
return unless @current_span
|
64
|
-
|
65
|
-
if child_of && child_of.is_a?(::Instana::Span)
|
66
|
-
new_span = Span.new(name, @id, parent_id: child_of.id, start_time: start_time)
|
67
|
-
new_span.parent = child_of
|
68
|
-
new_span.baggage = child_of.baggage.dup
|
69
|
-
else
|
70
|
-
new_span = Span.new(name, @id, parent_id: @current_span.id, start_time: start_time)
|
71
|
-
new_span.parent = @current_span
|
72
|
-
new_span.baggage = @current_span.baggage.dup
|
73
|
-
end
|
74
|
-
new_span.set_tags(kvs) if kvs
|
75
|
-
|
76
|
-
@spans.add(new_span)
|
77
|
-
@current_span = new_span
|
78
|
-
end
|
79
|
-
|
80
|
-
# Add KVs to the current span
|
81
|
-
#
|
82
|
-
# @param span [Span] the span to add kvs to or otherwise the current span
|
83
|
-
# @param kvs [Hash] list of key values to be reported in the span
|
84
|
-
#
|
85
|
-
def add_info(kvs, span = nil)
|
86
|
-
return unless @current_span
|
87
|
-
span ||= @current_span
|
88
|
-
|
89
|
-
# Pass on to the OT span interface which will properly
|
90
|
-
# apply KVs based on span type
|
91
|
-
span.set_tags(kvs)
|
92
|
-
end
|
93
|
-
|
94
|
-
# Log an error into the current span
|
95
|
-
#
|
96
|
-
# @param e [Exception] Add exception to the current span
|
97
|
-
#
|
98
|
-
def add_error(e, span = nil)
|
99
|
-
# Return if we've already logged this exception and it
|
100
|
-
# is just propogating up the spans.
|
101
|
-
return if e && e.instance_variable_get(:@instana_logged) || @current_span.nil?
|
102
|
-
span ||= @current_span
|
103
|
-
span.add_error(e)
|
104
|
-
end
|
105
|
-
|
106
|
-
# Close out the current span and set the parent as
|
107
|
-
# the current span
|
108
|
-
#
|
109
|
-
# @param kvs [Hash] list of key values to be reported in the span
|
110
|
-
#
|
111
|
-
def end_span(kvs = {}, end_time = ::Instana::Util.now_in_ms)
|
112
|
-
return unless @current_span
|
113
|
-
|
114
|
-
@current_span.close(end_time)
|
115
|
-
add_info(kvs) if kvs && !kvs.empty?
|
116
|
-
@current_span = @current_span.parent unless @current_span.is_root?
|
117
|
-
end
|
118
|
-
alias finish end_span
|
119
|
-
|
120
|
-
###########################################################################
|
121
|
-
# Asynchronous Methods
|
122
|
-
###########################################################################
|
123
|
-
|
124
|
-
# Start a new asynchronous span
|
125
|
-
#
|
126
|
-
# The major differentiator between this method and simple new_span is that
|
127
|
-
# this method doesn't affect @current_trace and instead returns an
|
128
|
-
# ID pair that can be used later to close out the created async span.
|
129
|
-
#
|
130
|
-
# @param name [String] the name of the span to start
|
131
|
-
# @param kvs [Hash] list of key values to be reported in the span
|
132
|
-
#
|
133
|
-
def new_async_span(name, kvs = {})
|
134
|
-
new_span = Span.new(name, @id, parent_id: @current_span.id)
|
135
|
-
new_span.set_tags(kvs) unless kvs.empty?
|
136
|
-
new_span.parent = @current_span
|
137
|
-
new_span[:deferred] = @has_async = true
|
138
|
-
|
139
|
-
# Add the new span to the span collection
|
140
|
-
@spans.add(new_span)
|
141
|
-
new_span
|
142
|
-
end
|
143
|
-
|
144
|
-
# Log info into an asynchronous span
|
145
|
-
#
|
146
|
-
# @param kvs [Hash] list of key values to be reported in the span
|
147
|
-
# @param span [Span] the span of this Async op (previously returned
|
148
|
-
# from `log_async_entry`)
|
149
|
-
#
|
150
|
-
def add_async_info(kvs, span)
|
151
|
-
span.set_tags(kvs)
|
152
|
-
end
|
153
|
-
|
154
|
-
# Log an error into an asynchronous span
|
155
|
-
#
|
156
|
-
# @param e [Exception] Add exception to the current span
|
157
|
-
# @param span [Span] the span of this Async op (previously returned
|
158
|
-
# from `log_async_entry`)
|
159
|
-
#
|
160
|
-
def add_async_error(e, span)
|
161
|
-
span.add_error(e)
|
162
|
-
end
|
163
|
-
|
164
|
-
# End an asynchronous span
|
165
|
-
#
|
166
|
-
# @param name [Symbol] the name of the span
|
167
|
-
# @param kvs [Hash] list of key values to be reported in the span
|
168
|
-
# @param span [Span] the span of this Async op (previously returned
|
169
|
-
# from `log_async_entry`)
|
170
|
-
#
|
171
|
-
def end_async_span(kvs = {}, span)
|
172
|
-
span.set_tags(kvs) unless kvs.empty?
|
173
|
-
span.close
|
174
|
-
end
|
175
|
-
|
176
|
-
###########################################################################
|
177
|
-
# Validator and Helper Methods
|
178
|
-
###########################################################################
|
179
|
-
|
180
|
-
# Indicates whether all seems ok with this trace in it's current state.
|
181
|
-
# Should be only called on finished traces.
|
182
|
-
#
|
183
|
-
# @return [Boolean] true or false on whether this trace is valid
|
184
|
-
#
|
185
|
-
def valid?
|
186
|
-
@spans.each do |span|
|
187
|
-
unless span.key?(:d)
|
188
|
-
return false
|
189
|
-
end
|
190
|
-
end
|
191
|
-
true
|
192
|
-
end
|
193
|
-
|
194
|
-
# Indicates if every span of this trace has completed. Useful when
|
195
|
-
# asynchronous spans potentially could run longer than the parent trace.
|
196
|
-
#
|
197
|
-
def complete?
|
198
|
-
@spans.each do |span|
|
199
|
-
if !span.duration
|
200
|
-
return false
|
201
|
-
end
|
202
|
-
end
|
203
|
-
true
|
204
|
-
end
|
205
|
-
|
206
|
-
# Indicates whether this trace has any asynchronous spans.
|
207
|
-
#
|
208
|
-
def has_async?
|
209
|
-
@has_async
|
210
|
-
end
|
211
|
-
|
212
|
-
# Searches the set of spans and indicates if there
|
213
|
-
# is an error logged in one of them.
|
214
|
-
#
|
215
|
-
# @return [Boolean] true or false indicating the presence
|
216
|
-
# of an error
|
217
|
-
#
|
218
|
-
def has_error?
|
219
|
-
@spans.each do |s|
|
220
|
-
if s.key?(:error)
|
221
|
-
if s[:error] == true
|
222
|
-
return true
|
223
|
-
end
|
224
|
-
end
|
225
|
-
end
|
226
|
-
false
|
227
|
-
end
|
228
|
-
|
229
|
-
# Get the ID of the current span for this trace.
|
230
|
-
# Used often to place in HTTP response headers.
|
231
|
-
#
|
232
|
-
# @return [Integer] a random 64bit integer
|
233
|
-
#
|
234
|
-
def current_span_id
|
235
|
-
@current_span.id
|
236
|
-
end
|
237
|
-
|
238
|
-
# Get the name of the current span. Supports both registered spans
|
239
|
-
# and custom sdk spans.
|
240
|
-
#
|
241
|
-
def current_span_name
|
242
|
-
@current_span.name
|
243
|
-
end
|
244
|
-
|
245
|
-
# Check if the current span has the name value of <name>
|
246
|
-
#
|
247
|
-
# @param name [Symbol] The name to be checked against.
|
248
|
-
#
|
249
|
-
# @return [Boolean]
|
250
|
-
#
|
251
|
-
def current_span_name?(name)
|
252
|
-
@current_span.name == name
|
253
|
-
end
|
254
|
-
|
255
|
-
# For traces that have asynchronous spans, this method indicates
|
256
|
-
# whether we have hit the timeout on waiting for those async
|
257
|
-
# spans to close out.
|
258
|
-
#
|
259
|
-
# @return [Boolean]
|
260
|
-
#
|
261
|
-
def discard?
|
262
|
-
# If this trace has async spans that have not closed
|
263
|
-
# out in 5 minutes, then it's discarded.
|
264
|
-
if has_async? && (Time.now.to_i - @started_at.to_i) > 601
|
265
|
-
return true
|
266
|
-
end
|
267
|
-
false
|
268
|
-
end
|
269
|
-
|
270
|
-
private
|
271
|
-
|
272
|
-
# Configure @current_span to be a custom span per the
|
273
|
-
# SDK generic span type.
|
274
|
-
#
|
275
|
-
# @param span [Span] the span to configure or nil
|
276
|
-
# @param name [String] name of the span
|
277
|
-
# @param kvs [Hash] list of key values to be reported in the span
|
278
|
-
#
|
279
|
-
def configure_custom_span(span, name, kvs = {})
|
280
|
-
span ||= @current_span
|
281
|
-
span.configure_custom(name, kvs)
|
282
|
-
end
|
283
|
-
|
284
|
-
# Adds the passed in backtrace to the specified span. Backtrace can be one
|
285
|
-
# generated from Kernel.caller or one attached to an exception
|
286
|
-
#
|
287
|
-
# @param bt [Array] the backtrace
|
288
|
-
# @param limit [Integer] Limit the backtrace to the top <limit> frames
|
289
|
-
# @param span [Span] the span to add the backtrace to or if unspecified
|
290
|
-
# the current span
|
291
|
-
#
|
292
|
-
def add_backtrace_to_span(bt, limit = nil, span)
|
293
|
-
frame_count = 0
|
294
|
-
span[:stack] = []
|
295
|
-
|
296
|
-
bt.each do |i|
|
297
|
-
# If the stack has the full instana gem version in it's path
|
298
|
-
# then don't include that frame. Also don't exclude the Rack module.
|
299
|
-
if !i.match(/instana\/instrumentation\/rack.rb/).nil? ||
|
300
|
-
(i.match(::Instana::VERSION_FULL).nil? && i.match('lib/instana/').nil?)
|
301
|
-
|
302
|
-
break if limit && frame_count >= limit
|
303
|
-
|
304
|
-
x = i.split(':')
|
305
|
-
|
306
|
-
span[:stack] << {
|
307
|
-
:f => x[0],
|
308
|
-
:n => x[1],
|
309
|
-
:m => x[2]
|
310
|
-
}
|
311
|
-
frame_count = frame_count + 1 if limit
|
312
|
-
end
|
313
|
-
end
|
314
|
-
end
|
315
|
-
end
|
316
|
-
end
|