instana 1.1.0 → 1.2.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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +2 -0
  3. data/.gitignore +1 -0
  4. data/.travis.yml +24 -2
  5. data/Gemfile +2 -22
  6. data/README.md +1 -1
  7. data/Rakefile +15 -0
  8. data/Tracing.md +29 -2
  9. data/gemfiles/libraries.gemfile +50 -0
  10. data/gemfiles/rails32.gemfile +45 -0
  11. data/gemfiles/rails42.gemfile +44 -0
  12. data/gemfiles/rails50.gemfile +44 -0
  13. data/instana.gemspec +6 -8
  14. data/lib/instana/config.rb +7 -5
  15. data/lib/instana/frameworks/instrumentation/abstract_mysql_adapter.rb +55 -0
  16. data/lib/instana/frameworks/instrumentation/action_controller.rb +105 -0
  17. data/lib/instana/frameworks/instrumentation/active_record.rb +22 -0
  18. data/lib/instana/frameworks/instrumentation/mysql2_adapter.rb +81 -0
  19. data/lib/instana/frameworks/instrumentation/mysql_adapter.rb +56 -0
  20. data/lib/instana/frameworks/instrumentation/postgresql_adapter.rb +71 -0
  21. data/lib/instana/frameworks/rails.rb +5 -0
  22. data/lib/instana/test.rb +40 -0
  23. data/lib/instana/tracer.rb +19 -0
  24. data/lib/instana/tracing/span.rb +3 -3
  25. data/lib/instana/version.rb +1 -1
  26. data/log/.keep +0 -0
  27. data/test/agent/agent_test.rb +139 -0
  28. data/test/apps/cuba.rb +15 -0
  29. data/test/apps/roda.rb +10 -0
  30. data/test/apps/sinatra.rb +5 -0
  31. data/test/config_test.rb +17 -0
  32. data/test/frameworks/cuba_test.rb +44 -0
  33. data/test/frameworks/rack_test.rb +152 -0
  34. data/test/frameworks/rails/actioncontroller_test.rb +123 -0
  35. data/test/frameworks/rails/activerecord3_test.rb +134 -0
  36. data/test/frameworks/rails/activerecord4_test.rb +134 -0
  37. data/test/frameworks/rails/activerecord5_test.rb +90 -0
  38. data/test/frameworks/roda_test.rb +44 -0
  39. data/test/frameworks/sinatra_test.rb +44 -0
  40. data/test/instana_test.rb +27 -0
  41. data/test/instrumentation/dalli_test.rb +274 -0
  42. data/test/instrumentation/excon_test.rb +171 -0
  43. data/test/instrumentation/net-http_test.rb +140 -0
  44. data/test/instrumentation/rest-client_test.rb +61 -0
  45. data/test/models/block.rb +18 -0
  46. data/test/servers/rackapp_6511.rb +20 -0
  47. data/test/servers/rails_3205.rb +95 -0
  48. data/test/test_helper.rb +39 -0
  49. data/test/tracing/custom_test.rb +143 -0
  50. data/test/tracing/id_management_test.rb +96 -0
  51. data/test/tracing/opentracing_test.rb +377 -0
  52. data/test/tracing/trace_test.rb +50 -0
  53. data/test/tracing/tracer_async_test.rb +298 -0
  54. data/test/tracing/tracer_test.rb +202 -0
  55. metadata +114 -4
@@ -0,0 +1,27 @@
1
+ require 'test_helper'
2
+
3
+ class InstanaTest < Minitest::Test
4
+ def test_that_it_has_a_version_number
5
+ refute_nil ::Instana::VERSION
6
+ end
7
+
8
+ def test_that_it_has_a_logger
9
+ refute_nil ::Instana.logger
10
+ end
11
+
12
+ def test_that_it_has_an_agent
13
+ refute_nil ::Instana.agent
14
+ end
15
+
16
+ def test_that_it_has_a_collector
17
+ refute_nil ::Instana.collector
18
+ end
19
+
20
+ def test_that_it_has_a_tracer
21
+ refute_nil ::Instana.tracer
22
+ end
23
+
24
+ def test_that_it_has_a_config
25
+ refute_nil ::Instana.config
26
+ end
27
+ end
@@ -0,0 +1,274 @@
1
+ require 'test_helper'
2
+
3
+ class DalliTest < Minitest::Test
4
+ def setup
5
+ @memcached_host = ENV['MEMCACHED_HOST'] || '127.0.0.1:11211'
6
+ @dc = Dalli::Client.new(@memcached_host, :namespace => "instana_test")
7
+ end
8
+
9
+ def test_config_defaults
10
+ assert ::Instana.config[:dalli].is_a?(Hash)
11
+ assert ::Instana.config[:dalli].key?(:enabled)
12
+ assert_equal true, ::Instana.config[:dalli][:enabled]
13
+ end
14
+
15
+ def test_basic_get
16
+ clear_all!
17
+
18
+ @dc.set(:instana, :boom)
19
+
20
+ result = nil
21
+ ::Instana.tracer.start_or_continue_trace(:dalli_test) do
22
+ result = @dc.get(:instana)
23
+ end
24
+
25
+ assert_equal :boom, result
26
+
27
+ traces = Instana.processor.queued_traces
28
+ assert_equal 1, traces.count
29
+ trace = traces.first
30
+
31
+ # Excon validation
32
+ assert_equal 2, trace.spans.count
33
+ spans = trace.spans.to_a
34
+ first_span = spans[0]
35
+ second_span = spans[1]
36
+
37
+ assert_equal :dalli_test, first_span.name
38
+ assert_equal :memcache, second_span.name
39
+ assert_equal false, second_span.key?(:error)
40
+ assert second_span[:p] == first_span[:s]
41
+ assert first_span[:t] == first_span[:s]
42
+ assert second_span[:data].key?(:memcache)
43
+ assert second_span[:data][:memcache].key?(:command)
44
+ assert_equal :get, second_span[:data][:memcache][:command]
45
+ assert second_span[:data][:memcache].key?(:key)
46
+ assert_equal :instana, second_span[:data][:memcache][:key]
47
+ assert second_span[:data][:memcache].key?(:namespace)
48
+ assert_equal 'instana_test', second_span[:data][:memcache][:namespace]
49
+ assert second_span[:data][:memcache].key?(:server)
50
+ assert_equal ENV['MEMCACHED_HOST'], second_span[:data][:memcache][:server]
51
+ end
52
+
53
+ def test_basic_set
54
+ clear_all!
55
+
56
+ result = nil
57
+ ::Instana.tracer.start_or_continue_trace(:dalli_test) do
58
+ result = @dc.set(:instana, :rocks)
59
+ end
60
+
61
+ assert result.is_a?(Integer)
62
+
63
+ traces = Instana.processor.queued_traces
64
+ assert_equal 1, traces.count
65
+ trace = traces.first
66
+
67
+ # Excon validation
68
+ assert_equal 2, trace.spans.count
69
+ spans = trace.spans.to_a
70
+ first_span = spans[0]
71
+ second_span = spans[1]
72
+
73
+ assert_equal :dalli_test, first_span.name
74
+ assert_equal :memcache, second_span.name
75
+ assert_equal false, second_span.key?(:error)
76
+ assert second_span[:p] == first_span[:s]
77
+ assert first_span[:t] == first_span[:s]
78
+ assert second_span[:data].key?(:memcache)
79
+ assert second_span[:data][:memcache].key?(:command)
80
+ assert_equal :set, second_span[:data][:memcache][:command]
81
+ assert second_span[:data][:memcache].key?(:key)
82
+ assert_equal :instana, second_span[:data][:memcache][:key]
83
+ assert second_span[:data][:memcache].key?(:namespace)
84
+ assert_equal 'instana_test', second_span[:data][:memcache][:namespace]
85
+ assert second_span[:data][:memcache].key?(:server)
86
+ assert_equal ENV['MEMCACHED_HOST'], second_span[:data][:memcache][:server]
87
+ end
88
+
89
+ def test_replace
90
+ clear_all!
91
+
92
+ @dc.set(:instana, :rocks)
93
+ result = nil
94
+ ::Instana.tracer.start_or_continue_trace(:dalli_test) do
95
+ result = @dc.replace(:instana, :rocks)
96
+ end
97
+
98
+ assert result.is_a?(Integer)
99
+
100
+ traces = Instana.processor.queued_traces
101
+ assert_equal 1, traces.count
102
+ trace = traces.first
103
+
104
+ # Excon validation
105
+ assert_equal 2, trace.spans.count
106
+ spans = trace.spans.to_a
107
+ first_span = spans[0]
108
+ second_span = spans[1]
109
+
110
+ assert_equal :dalli_test, first_span.name
111
+ assert_equal :memcache, second_span.name
112
+ assert_equal false, second_span.key?(:error)
113
+ assert second_span[:p] == first_span[:s]
114
+ assert first_span[:t] == first_span[:s]
115
+ assert second_span[:data].key?(:memcache)
116
+ assert second_span[:data][:memcache].key?(:command)
117
+ assert_equal :replace, second_span[:data][:memcache][:command]
118
+ assert second_span[:data][:memcache].key?(:key)
119
+ assert_equal :instana, second_span[:data][:memcache][:key]
120
+ assert second_span[:data][:memcache].key?(:namespace)
121
+ assert_equal 'instana_test', second_span[:data][:memcache][:namespace]
122
+ assert second_span[:data][:memcache].key?(:server)
123
+ assert_equal ENV['MEMCACHED_HOST'], second_span[:data][:memcache][:server]
124
+ end
125
+
126
+ def test_delete
127
+ clear_all!
128
+
129
+ @dc.set(:instana, :rocks)
130
+ result = nil
131
+ ::Instana.tracer.start_or_continue_trace(:dalli_test) do
132
+ result = @dc.delete(:instana)
133
+ end
134
+
135
+ assert_equal true, result
136
+
137
+ traces = Instana.processor.queued_traces
138
+ assert_equal 1, traces.count
139
+ trace = traces.first
140
+
141
+ # Excon validation
142
+ assert_equal 2, trace.spans.count
143
+ spans = trace.spans.to_a
144
+ first_span = spans[0]
145
+ second_span = spans[1]
146
+
147
+ assert_equal :dalli_test, first_span.name
148
+ assert_equal :memcache, second_span.name
149
+ assert_equal false, second_span.key?(:error)
150
+ assert second_span[:p] == first_span[:s]
151
+ assert first_span[:t] == first_span[:s]
152
+ assert second_span[:data].key?(:memcache)
153
+ assert second_span[:data][:memcache].key?(:command)
154
+ assert_equal :delete, second_span[:data][:memcache][:command]
155
+ assert second_span[:data][:memcache].key?(:key)
156
+ assert_equal :instana, second_span[:data][:memcache][:key]
157
+ assert second_span[:data][:memcache].key?(:namespace)
158
+ assert_equal 'instana_test', second_span[:data][:memcache][:namespace]
159
+ assert second_span[:data][:memcache].key?(:server)
160
+ assert_equal ENV['MEMCACHED_HOST'], second_span[:data][:memcache][:server]
161
+ end
162
+
163
+ def test_incr
164
+ clear_all!
165
+
166
+ result = nil
167
+ @dc.set(:counter, 0, nil, :raw => true)
168
+ ::Instana.tracer.start_or_continue_trace(:dalli_test) do
169
+ result = @dc.incr(:counter, 1, nil, 0)
170
+ end
171
+
172
+ assert_equal 1, result
173
+
174
+ traces = Instana.processor.queued_traces
175
+ assert_equal 1, traces.count
176
+ trace = traces.first
177
+
178
+ # Excon validation
179
+ assert_equal 2, trace.spans.count
180
+ spans = trace.spans.to_a
181
+ first_span = spans[0]
182
+ second_span = spans[1]
183
+
184
+ assert_equal :dalli_test, first_span.name
185
+ assert_equal :memcache, second_span.name
186
+ assert_equal false, second_span.key?(:error)
187
+ assert second_span[:p] == first_span[:s]
188
+ assert first_span[:t] == first_span[:s]
189
+ assert second_span[:data].key?(:memcache)
190
+ assert second_span[:data][:memcache].key?(:command)
191
+ assert_equal :incr, second_span[:data][:memcache][:command]
192
+ assert second_span[:data][:memcache].key?(:key)
193
+ assert_equal :counter, second_span[:data][:memcache][:key]
194
+ assert second_span[:data][:memcache].key?(:namespace)
195
+ assert_equal 'instana_test', second_span[:data][:memcache][:namespace]
196
+ assert second_span[:data][:memcache].key?(:server)
197
+ assert_equal ENV['MEMCACHED_HOST'], second_span[:data][:memcache][:server]
198
+ end
199
+
200
+ def test_decr
201
+ clear_all!
202
+
203
+ result = nil
204
+ @dc.set(:counter, 0, nil, :raw => true)
205
+ ::Instana.tracer.start_or_continue_trace(:dalli_test) do
206
+ result = @dc.decr(:counter, 1, nil, 0)
207
+ end
208
+
209
+ assert_equal 0, result
210
+
211
+ traces = Instana.processor.queued_traces
212
+ assert_equal 1, traces.count
213
+ trace = traces.first
214
+
215
+ # Excon validation
216
+ assert_equal 2, trace.spans.count
217
+ spans = trace.spans.to_a
218
+ first_span = spans[0]
219
+ second_span = spans[1]
220
+
221
+ assert_equal :dalli_test, first_span.name
222
+ assert_equal :memcache, second_span.name
223
+ assert_equal false, second_span.key?(:error)
224
+ assert second_span[:p] == first_span[:s]
225
+ assert first_span[:t] == first_span[:s]
226
+ assert second_span[:data].key?(:memcache)
227
+ assert second_span[:data][:memcache].key?(:command)
228
+ assert_equal :decr, second_span[:data][:memcache][:command]
229
+ assert second_span[:data][:memcache].key?(:key)
230
+ assert_equal :counter, second_span[:data][:memcache][:key]
231
+ assert second_span[:data][:memcache].key?(:namespace)
232
+ assert_equal 'instana_test', second_span[:data][:memcache][:namespace]
233
+ assert second_span[:data][:memcache].key?(:server)
234
+ assert_equal ENV['MEMCACHED_HOST'], second_span[:data][:memcache][:server]
235
+ end
236
+
237
+ def test_get_multi
238
+ clear_all!
239
+
240
+ @dc.set(:one, 1)
241
+ @dc.set(:three, 3)
242
+
243
+ ::Instana.tracer.start_or_continue_trace(:dalli_test) do
244
+ @dc.get_multi(:one, :two, :three, :four)
245
+ end
246
+
247
+ traces = Instana.processor.queued_traces
248
+ assert_equal 1, traces.count
249
+ trace = traces.first
250
+
251
+ # Excon validation
252
+ assert_equal 2, trace.spans.count
253
+ spans = trace.spans.to_a
254
+ first_span = spans[0]
255
+ second_span = spans[1]
256
+
257
+ assert_equal :dalli_test, first_span.name
258
+ assert_equal :memcache, second_span.name
259
+ assert_equal false, second_span.key?(:error)
260
+ assert second_span[:p] == first_span[:s]
261
+ assert first_span[:t] == first_span[:s]
262
+ assert second_span[:data].key?(:memcache)
263
+ assert second_span[:data][:memcache].key?(:command)
264
+ assert_equal :get_multi, second_span[:data][:memcache][:command]
265
+ assert second_span[:data][:memcache].key?(:keys)
266
+ assert_equal "one, two, three, four", second_span[:data][:memcache][:keys]
267
+ assert second_span[:data][:memcache].key?(:namespace)
268
+ assert_equal 'instana_test', second_span[:data][:memcache][:namespace]
269
+ assert second_span[:data][:memcache].key?(:server)
270
+ assert_equal ENV['MEMCACHED_HOST'], second_span[:data][:memcache][:server]
271
+ assert second_span[:data][:memcache].key?(:hits)
272
+ assert_equal 2, second_span[:data][:memcache][:hits]
273
+ end
274
+ end
@@ -0,0 +1,171 @@
1
+ require 'test_helper'
2
+
3
+ class ExconTest < Minitest::Test
4
+ def test_config_defaults
5
+ assert ::Instana.config[:excon].is_a?(Hash)
6
+ assert ::Instana.config[:excon].key?(:enabled)
7
+ assert_equal true, ::Instana.config[:excon][:enabled]
8
+ end
9
+
10
+ def test_basic_get
11
+ clear_all!
12
+
13
+ # A slight hack but webmock chokes with pipelined requests.
14
+ # Delete their excon middleware
15
+ Excon.defaults[:middlewares].delete ::WebMock::HttpLibAdapters::ExconAdapter
16
+ Excon.defaults[:middlewares].delete ::Excon::Middleware::Mock
17
+
18
+ url = "http://127.0.0.1:6511"
19
+
20
+ connection = Excon.new(url)
21
+ Instana.tracer.start_or_continue_trace('excon-test') do
22
+ connection.get(:path => '/?basic_get')
23
+ end
24
+
25
+ traces = Instana.processor.queued_traces
26
+ assert_equal 2, traces.count
27
+ rs_trace = traces[0]
28
+ http_trace = traces[1]
29
+
30
+ # Excon validation
31
+ assert_equal 2, http_trace.spans.count
32
+ spans = http_trace.spans.to_a
33
+ first_span = spans[0]
34
+ second_span = spans[1]
35
+
36
+ # Span name validation
37
+ assert_equal :sdk, first_span[:n]
38
+ assert_equal :"excon-test", first_span[:data][:sdk][:name]
39
+ assert_equal :excon, second_span[:n]
40
+
41
+ # first_span is the parent of second_span
42
+ assert_equal first_span.id, second_span[:p]
43
+
44
+ # data keys/values
45
+ refute_nil second_span.key?(:data)
46
+ refute_nil second_span[:data].key?(:http)
47
+ assert_equal "http://127.0.0.1:6511/", second_span[:data][:http][:url]
48
+ assert_equal 200, second_span[:data][:http][:status]
49
+
50
+ # excon backtrace included check
51
+ assert second_span.key?(:stack)
52
+
53
+ # Rack server trace validation
54
+ assert_equal 1, rs_trace.spans.count
55
+ rs_span = rs_trace.spans.to_a[0]
56
+
57
+ # Rack server trace should have the same trace ID
58
+ assert_equal http_trace.id, rs_span[:t].to_i
59
+ assert_equal rs_span[:p].to_i, second_span[:s]
60
+ end
61
+
62
+ def test_basic_get_with_error
63
+ clear_all!
64
+
65
+ # A slight hack but webmock chokes with pipelined requests.
66
+ # Delete their excon middleware
67
+ Excon.defaults[:middlewares].delete ::WebMock::HttpLibAdapters::ExconAdapter
68
+ Excon.defaults[:middlewares].delete ::Excon::Middleware::Mock
69
+
70
+ url = "http://127.0.0.1:6500"
71
+
72
+ begin
73
+ connection = Excon.new(url)
74
+ Instana.tracer.start_or_continue_trace('excon-test') do
75
+ connection.get(:path => '/?basic_get')
76
+ end
77
+ rescue
78
+ end
79
+
80
+ traces = Instana.processor.queued_traces
81
+ assert_equal 1, traces.count
82
+ http_trace = traces.first
83
+
84
+ # Excon validation
85
+ assert_equal 2, http_trace.spans.count
86
+ spans = http_trace.spans.to_a
87
+ first_span = spans[0]
88
+ second_span = spans[1]
89
+
90
+ # Span name validation
91
+ assert_equal :sdk, first_span[:n]
92
+ assert_equal :"excon-test", first_span[:data][:sdk][:name]
93
+ assert_equal :excon, second_span[:n]
94
+
95
+ # first_span is the parent of second_span
96
+ assert_equal first_span.id, second_span[:p]
97
+
98
+ # data keys/values
99
+ refute_nil second_span.key?(:data)
100
+ refute_nil second_span[:data].key?(:http)
101
+ assert_equal "http://127.0.0.1:6500/", second_span[:data][:http][:url]
102
+ assert_equal nil, second_span[:data][:http][:status]
103
+
104
+ # excon backtrace included check
105
+ assert second_span.key?(:stack)
106
+
107
+ # error validation
108
+ assert_equal true, second_span[:error]
109
+ #assert_equal 1, second_span[:ec]
110
+ end
111
+
112
+ def test_pipelined_requests
113
+ clear_all!
114
+
115
+ # A slight hack but webmock chokes with pipelined requests.
116
+ # Delete their excon middleware
117
+ Excon.defaults[:middlewares].delete ::WebMock::HttpLibAdapters::ExconAdapter
118
+ Excon.defaults[:middlewares].delete ::Excon::Middleware::Mock
119
+
120
+ url = "http://127.0.0.1:6511"
121
+
122
+ connection = Excon.new(url)
123
+ request = { :method => :get, :path => '/?pipelined_request' }
124
+ Instana.tracer.start_or_continue_trace('excon-test') do
125
+ connection.requests([request, request, request])
126
+ end
127
+
128
+ traces = Instana.processor.queued_traces
129
+ assert_equal 4, traces.count
130
+ http_trace = traces[3]
131
+
132
+ # Excon validation
133
+ assert_equal 4, http_trace.spans.count
134
+ spans = http_trace.spans.to_a
135
+ first_span = spans[0]
136
+ second_span = spans[1]
137
+ third_span = spans[2]
138
+ fourth_span = spans[3]
139
+
140
+ # Span name validation
141
+ assert_equal :sdk, first_span[:n]
142
+ assert_equal :"excon-test", first_span[:data][:sdk][:name]
143
+ assert_equal :excon, second_span[:n]
144
+ assert_equal :excon, third_span[:n]
145
+ assert_equal :excon, fourth_span[:n]
146
+
147
+ # first_span is the parent of second/third/fourth_span
148
+ assert_equal first_span.id, second_span[:p]
149
+ assert_equal first_span.id, third_span[:p]
150
+ assert_equal first_span.id, fourth_span[:p]
151
+
152
+ # data keys/values
153
+ refute_nil second_span.key?(:data)
154
+ refute_nil second_span[:data].key?(:http)
155
+ assert_equal "http://127.0.0.1:6511/", second_span[:data][:http][:url]
156
+ assert_equal 200, second_span[:data][:http][:status]
157
+ assert second_span.key?(:stack)
158
+
159
+ refute_nil third_span.key?(:data)
160
+ refute_nil third_span[:data].key?(:http)
161
+ assert_equal "http://127.0.0.1:6511/", third_span[:data][:http][:url]
162
+ assert_equal 200, third_span[:data][:http][:status]
163
+ assert third_span.key?(:stack)
164
+
165
+ refute_nil fourth_span.key?(:data)
166
+ refute_nil fourth_span[:data].key?(:http)
167
+ assert_equal "http://127.0.0.1:6511/", fourth_span[:data][:http][:url]
168
+ assert_equal 200, fourth_span[:data][:http][:status]
169
+ assert fourth_span.key?(:stack)
170
+ end
171
+ end