instana 1.0.1 → 1.0.2

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 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