instana 1.0.1 → 1.0.2

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
  SHA1:
3
- metadata.gz: cbc400b87081fe4c927cb2f437faf8597ac217bf
4
- data.tar.gz: 247eb9b4db84239ebbf7ec934c5427f94a5b1771
3
+ metadata.gz: 68e23278bff6774c0cc9d5d3a82677044c03db4f
4
+ data.tar.gz: 0ff491c646782556866bfa6c0751e22f19f6dca8
5
5
  SHA512:
6
- metadata.gz: 9299e4b9ed9aaeabd40dd6c5df7f21b8a76e849b083a152e133b9d8f10e2e8c2787bc711cf5cae75ee9d9f4f2f624a8418bac1b38cf275ab1c1ad46045ccb42a
7
- data.tar.gz: 38ea273e84533d1a9be4e3373a0962a44fa3bf8b96c8aa4937f466b77062995b168630bf146d79d8c21f0680beb26ead6ff0ae90b06c235f3f3f19cb6789e27c
6
+ metadata.gz: b82e66f9aae2e19b921332f6daecd7e184ee6e98fa38802490bcd291ea35881ebc0b1396def590b8825542b40932513aa959ab69a488234fbf0f0bd6c99e8952
7
+ data.tar.gz: 013a6f0b98e114cfecca44c05b47b2b8af4e365398e71d3133ae796a671812e3e05ca829ae368c51d38ea068cc61364a713e10c2180bd700f9b04b9edad05275
data/lib/instana/agent.rb CHANGED
@@ -15,10 +15,6 @@ module Instana
15
15
  DISCOVERY_PATH = 'com.instana.plugin.ruby.discovery'.freeze
16
16
 
17
17
  def initialize
18
- # Host agent defaults. Can be configured via Instana.config
19
- @host = LOCALHOST
20
- @port = 42699
21
-
22
18
  # Supported two states (unannounced & announced)
23
19
  @state = :unannounced
24
20
 
@@ -54,7 +50,11 @@ module Instana
54
50
  # The agent UUID returned from the host agent
55
51
  @agent_uuid = nil
56
52
 
53
+ # Collect process information
57
54
  @process = ::Instana::Util.collect_process_info
55
+
56
+ # This will hold info on the discovered agent host
57
+ @discovered = nil
58
58
  end
59
59
 
60
60
  # Used post fork to re-initialize state and restart communications with
@@ -162,15 +162,20 @@ module Instana
162
162
  # the host agent.
163
163
  #
164
164
  def announce_sensor
165
+ unless @discovered
166
+ ::Instana.logger.agent("#{__method__} called but discovery hasn't run yet!")
167
+ return false
168
+ end
169
+
165
170
  announce_payload = {}
166
171
  announce_payload[:pid] = pid_namespace? ? get_real_pid : Process.pid
167
172
  announce_payload[:args] = @process[:arguments]
168
173
 
169
- uri = URI.parse("http://#{@host}:#{@port}/#{DISCOVERY_PATH}")
174
+ uri = URI.parse("http://#{@discovered[:agent_host]}:#{@discovered[:agent_port]}/#{DISCOVERY_PATH}")
170
175
  req = Net::HTTP::Put.new(uri)
171
176
  req.body = announce_payload.to_json
172
177
 
173
- ::Instana.logger.agent "Announce: http://#{@host}:#{@port}/#{DISCOVERY_PATH} - payload: #{req.body}"
178
+ ::Instana.logger.agent "Announce: http://#{@discovered[:agent_host]}:#{@discovered[:agent_port]}/#{DISCOVERY_PATH} - payload: #{req.body}"
174
179
 
175
180
  response = make_host_agent_request(req)
176
181
 
@@ -193,9 +198,14 @@ module Instana
193
198
  # @param paylod [Hash] The collection of metrics to report.
194
199
  #
195
200
  def report_entity_data(payload)
201
+ unless @discovered
202
+ ::Instana.logger.agent("#{__method__} called but discovery hasn't run yet!")
203
+ return false
204
+ end
205
+
196
206
  with_snapshot = false
197
207
  path = "com.instana.plugin.ruby.#{@process[:report_pid]}"
198
- uri = URI.parse("http://#{@host}:#{@port}/#{path}")
208
+ uri = URI.parse("http://#{@discovered[:agent_host]}:#{@discovered[:agent_port]}/#{path}")
199
209
  req = Net::HTTP::Post.new(uri)
200
210
 
201
211
  # Every 5 minutes, send snapshot data as well
@@ -253,7 +263,7 @@ module Instana
253
263
  end
254
264
 
255
265
  path = "com.instana.plugin.ruby/response.#{@process[:report_pid]}?messageId=#{URI.encode(their_request['messageId'])}"
256
- uri = URI.parse("http://#{@host}:#{@port}/#{path}")
266
+ uri = URI.parse("http://#{@discovered[:agent_host]}:#{@discovered[:agent_port]}/#{path}")
257
267
  req = Net::HTTP::Post.new(uri)
258
268
  req.body = payload.to_json
259
269
  ::Instana.logger.agent_response "Responding to agent: #{req.inspect}"
@@ -268,8 +278,13 @@ module Instana
268
278
  def report_spans(spans)
269
279
  return unless @state == :announced
270
280
 
281
+ unless @discovered
282
+ ::Instana.logger.agent("#{__method__} called but discovery hasn't run yet!")
283
+ return false
284
+ end
285
+
271
286
  path = "com.instana.plugin.ruby/traces.#{@process[:report_pid]}"
272
- uri = URI.parse("http://#{@host}:#{@port}/#{path}")
287
+ uri = URI.parse("http://#{@discovered[:agent_host]}:#{@discovered[:agent_port]}/#{path}")
273
288
  req = Net::HTTP::Post.new(uri)
274
289
 
275
290
  req.body = spans.to_json
@@ -290,39 +305,73 @@ module Instana
290
305
 
291
306
  # Check that the host agent is available and can be contacted. This will
292
307
  # first check localhost and if not, then attempt on the default gateway
293
- # for docker in bridged mode. It will save where it found the host agent
294
- # in @host that is used in subsequent HTTP calls.
308
+ # for docker in bridged mode.
295
309
  #
296
310
  def host_agent_ready?
297
- # Localhost
298
- uri = URI.parse("http://#{LOCALHOST}:#{@port}/")
311
+ @discovered ||= run_discovery
312
+
313
+ if @discovered
314
+ # Try default location or manually configured (if so)
315
+ uri = URI.parse("http://#{@discovered[:agent_host]}:#{@discovered[:agent_port]}/")
316
+ req = Net::HTTP::Get.new(uri)
317
+
318
+ response = make_host_agent_request(req)
319
+
320
+ if response && (response.code.to_i == 200)
321
+ return true
322
+ end
323
+ end
324
+ false
325
+ rescue => e
326
+ Instana.logger.error "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
327
+ Instana.logger.debug e.backtrace.join("\r\n") unless ::Instana.test?
328
+ return false
329
+ end
330
+
331
+ # Runs a discovery process to determine where we can contact the host agent. This is usually just
332
+ # localhost but in docker can be found on the default gateway. This also allows for manual
333
+ # configuration via ::Instana.config[:agent_host/port].
334
+ #
335
+ # @return [Hash] a hash with :agent_host, :agent_port values or empty hash
336
+ #
337
+ def run_discovery
338
+ discovered = {}
339
+
340
+ ::Instana.logger.debug "#{__method__}: Running agent discovery..."
341
+
342
+ # Try default location or manually configured (if so)
343
+ uri = URI.parse("http://#{::Instana.config[:agent_host]}:#{::Instana.config[:agent_port]}/")
299
344
  req = Net::HTTP::Get.new(uri)
300
345
 
346
+ ::Instana.logger.debug "#{__method__}: Trying #{::Instana.config[:agent_host]}:#{::Instana.config[:agent_port]}"
347
+
301
348
  response = make_host_agent_request(req)
302
349
 
303
350
  if response && (response.code.to_i == 200)
304
- @host = LOCALHOST
305
- return true
351
+ discovered[:agent_host] = ::Instana.config[:agent_host]
352
+ discovered[:agent_port] = ::Instana.config[:agent_port]
353
+ ::Instana.logger.debug "#{__method__}: Found #{discovered[:agent_host]}:#{discovered[:agent_port]}"
354
+ return discovered
306
355
  end
307
356
 
308
- return false unless @is_linux
357
+ return nil unless @is_linux
309
358
 
310
359
  # We are potentially running on Docker in bridged networking mode.
311
360
  # Attempt to contact default gateway
312
- uri = URI.parse("http://#{@default_gateway}:#{@port}/")
361
+ uri = URI.parse("http://#{@default_gateway}:#{::Instana.config[:agent_port]}/")
313
362
  req = Net::HTTP::Get.new(uri)
314
363
 
364
+ ::Instana.logger.debug "#{__method__}: Trying default gateway #{@default_gateway}:#{::Instana.config[:agent_port]}"
365
+
315
366
  response = make_host_agent_request(req)
316
367
 
317
368
  if response && (response.code.to_i == 200)
318
- @host = @default_gateway
319
- return true
369
+ discovered[:agent_host] = @default_gateway
370
+ discovered[:agent_port] = ::Instana.config[:agent_port]
371
+ ::Instana.logger.debug "#{__method__}: Found #{discovered[:agent_host]}:#{discovered[:agent_port]}"
372
+ return discovered
320
373
  end
321
- false
322
- rescue => e
323
- Instana.logger.error "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
324
- Instana.logger.debug e.backtrace.join("\r\n")
325
- return false
374
+ nil
326
375
  end
327
376
 
328
377
  # Returns the PID that we are reporting to
@@ -346,7 +395,7 @@ module Instana
346
395
  @state == :announced
347
396
  rescue => e
348
397
  Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
349
- Instana.logger.debug e.backtrace.join("\r\n")
398
+ Instana.logger.debug e.backtrace.join("\r\n") unless ::Instana.test?
350
399
  return false
351
400
  end
352
401
 
@@ -403,7 +452,7 @@ module Instana
403
452
  return nil
404
453
  rescue => e
405
454
  Instana.logger.error "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
406
- Instana.logger.debug e.backtrace.join("\r\n")
455
+ Instana.logger.debug e.backtrace.join("\r\n") unless ::Instana.test?
407
456
  return nil
408
457
  end
409
458
 
@@ -1,4 +1,4 @@
1
1
  module Instana
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  VERSION_FULL = "instana-#{VERSION}"
4
4
  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.0.1
4
+ version: 1.0.2
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-01-10 00:00:00.000000000 Z
11
+ date: 2017-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler