instana 0.8.4 → 0.8.6

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: 4cb7dba41c21a606e4cdbfa46abe2f365235cd6a
4
- data.tar.gz: 45236a2a90db9f2b559808febe3bd03007c35bc3
3
+ metadata.gz: 42faa21829471a9c09aef2c82c1bdf79cee9bb2a
4
+ data.tar.gz: 7f4d358d30c2bb53b3dc97a39fbcdbfb950a0db5
5
5
  SHA512:
6
- metadata.gz: 94e3a10570b4a2513dd2ecd26bf1cae2e2d08dedcf165cbd30e549a3ce49003cc3bcca943de158959c55fed7d44cd2504a57855f97486e239561e0c6baaff4fa
7
- data.tar.gz: 4f9e776398af412dd270bfe61b6d73d140780b32217d101ed0340ef04b60fc33a7642d8f173c7fb59d649bf3c814479da7ca3bfc5294f70f6c46ecda84775cc9
6
+ metadata.gz: d1b63875713111313dae3ba16b1374df8d3d70f78074c5617728eead258311d9a65cb537e03b44dc0f2e5a4b15fea7c7a0940f86957f78d91b29fd9bce81e5f9
7
+ data.tar.gz: 602264940c06d3e4d8ebae06f56e91af16729ead2af6c3bf5add6b434d3b6bd6576d6388dbefdc8d963fe1f4f11e5310fdf4fa9c8a014a7dcd5d0840aadf61bc
@@ -6,11 +6,14 @@ cache:
6
6
  - vendor/bundle
7
7
 
8
8
  rvm:
9
- - 2.3.1
9
+ - 2.3.2
10
+ - 2.2.6
11
+ - 2.1.9
12
+ - ruby-2.0.0-p648
10
13
 
11
14
 
12
15
  before_install:
13
- - gem update --system '2.6.1'
16
+ - gem update --system
14
17
  - gem update bundler
15
18
  - gem --version
16
19
 
@@ -19,8 +19,14 @@ module Instana
19
19
  def start
20
20
  @agent = Instana::Agent.new
21
21
  @collectors = []
22
+
22
23
  @logger = Logger.new(STDOUT)
23
- @logger.info "Stan is on the scene. Starting Instana instrumentation."
24
+ if ENV.key?('INSTANA_GEM_TEST') || ENV.key?('INSTANA_GEM_DEV')
25
+ @logger.level = Logger::DEBUG
26
+ else
27
+ @logger.level = Logger::WARN
28
+ end
29
+ @logger.unknown "Stan is on the scene. Starting Instana instrumentation."
24
30
 
25
31
  # Store the current pid so we can detect a potential fork
26
32
  # later on
@@ -25,9 +25,9 @@ module Instana
25
25
  # every 10 minutes along side process metrics.
26
26
  @snapshot = take_snapshot
27
27
 
28
- # Set last snapshot to 10 minutes ago
29
- # so we send a snapshot on first report
30
- @last_snapshot = Time.now - 601
28
+ # Set last snapshot to just under 10 minutes ago
29
+ # so we send a snapshot sooner than later
30
+ @last_snapshot = Time.now - 570
31
31
 
32
32
  # Timestamp of the last successful response from
33
33
  # entity data reporting.
@@ -43,7 +43,23 @@ module Instana
43
43
 
44
44
  # In case we're running in Docker, have the default gateway available
45
45
  # to check in case we're running in bridged network mode
46
- @default_gateway = `/sbin/ip route | awk '/default/ { print $3 }'`.chomp
46
+ if @is_linux
47
+ @default_gateway = `/sbin/ip route | awk '/default/ { print $3 }'`.chomp
48
+ else
49
+ @default_gateway = nil
50
+ end
51
+
52
+ # The agent UUID returned from the host agent
53
+ @agent_uuid = nil
54
+
55
+ @process = {}
56
+ cmdline = ProcTable.ps(Process.pid).cmdline.split("\0")
57
+ @process[:name] = cmdline.shift
58
+ @process[:arguments] = cmdline
59
+ @process[:original_pid] = Process.pid
60
+ # This is usually Process.pid but in the case of docker, the host agent
61
+ # will return to us the true host pid in which we use to report data.
62
+ @process[:report_pid] = nil
47
63
  end
48
64
 
49
65
  ##
@@ -100,23 +116,30 @@ module Instana
100
116
  # the host agent.
101
117
  #
102
118
  def announce_sensor
103
- process = ProcTable.ps(Process.pid)
104
119
  announce_payload = {}
105
- announce_payload[:pid] = Process.pid
106
-
107
- arguments = process.cmdline.split(' ')
108
- arguments.shift
109
- announce_payload[:args] = arguments
120
+ announce_payload[:pid] = pid_namespace? ? get_real_pid : Process.pid
121
+ announce_payload[:args] = @process[:arguments]
110
122
 
111
123
  uri = URI.parse("http://#{@host}:#{@port}/#{DISCOVERY_PATH}")
112
124
  req = Net::HTTP::Put.new(uri)
113
125
  req.body = announce_payload.to_json
114
126
 
127
+ # ::Instana.logger.debug "Announce: http://#{@host}:#{@port}/#{DISCOVERY_PATH} - payload: #{req.body}"
128
+
115
129
  response = make_host_agent_request(req)
116
- response && (response.code.to_i == 200) ? true : false
130
+
131
+ if response && (response.code.to_i == 200)
132
+ data = JSON.parse(response.body)
133
+ @process[:report_pid] = data['pid']
134
+ @agent_uuid = data['agentUuid']
135
+ true
136
+ else
137
+ false
138
+ end
117
139
  rescue => e
118
- Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
140
+ Instana.logger.error "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
119
141
  Instana.logger.debug e.backtrace.join("\r\n")
142
+ return false
120
143
  end
121
144
 
122
145
  ##
@@ -126,7 +149,7 @@ module Instana
126
149
  #
127
150
  def report_entity_data(payload)
128
151
  with_snapshot = false
129
- path = "com.instana.plugin.ruby.#{Process.pid}"
152
+ path = "com.instana.plugin.ruby.#{@process[:report_pid]}"
130
153
  uri = URI.parse("http://#{@host}:#{@port}/#{path}")
131
154
  req = Net::HTTP::Post.new(uri)
132
155
 
@@ -134,6 +157,13 @@ module Instana
134
157
  if (Time.now - @last_snapshot) > 600
135
158
  with_snapshot = true
136
159
  payload.merge!(@snapshot)
160
+
161
+ # Add in process related that could have changed since
162
+ # snapshot was taken.
163
+ p = { :pid => @process[:report_pid] }
164
+ p[:name] = @process[:name]
165
+ p[:exec_args] = @process[:arguments]
166
+ payload.merge!(p)
137
167
  end
138
168
 
139
169
  req.body = payload.to_json
@@ -142,18 +172,18 @@ module Instana
142
172
  if response
143
173
  last_entity_response = response.code.to_i
144
174
 
175
+ #::Instana.logger.debug "entity http://#{@host}:#{@port}/#{path}: response=#{last_entity_response}: #{payload.to_json}"
176
+
145
177
  if last_entity_response == 200
146
178
  @entity_last_seen = Time.now
147
179
  @last_snapshot = Time.now if with_snapshot
148
180
 
149
- #::Instana.logger.debug "entity response #{last_entity_response}: #{payload.to_json}"
150
181
  return true
151
182
  end
152
- #::Instana.logger.debug "entity response #{last_entity_response}: #{payload.to_json}"
153
183
  end
154
184
  false
155
185
  rescue => e
156
- Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
186
+ Instana.logger.error "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
157
187
  Instana.logger.debug e.backtrace.join("\r\n")
158
188
  end
159
189
 
@@ -192,7 +222,7 @@ module Instana
192
222
  end
193
223
  false
194
224
  rescue => e
195
- Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
225
+ Instana.logger.error "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
196
226
  Instana.logger.debug e.backtrace.join("\r\n")
197
227
  return false
198
228
  end
@@ -232,8 +262,8 @@ module Instana
232
262
  # of type Net::HTTP::Get|Put|Head
233
263
  #
234
264
  def make_host_agent_request(req)
235
- req[:Accept] = MIME_JSON
236
- req[:'Content-Type'] = MIME_JSON
265
+ req['Accept'] = MIME_JSON
266
+ req['Content-Type'] = MIME_JSON
237
267
 
238
268
  response = nil
239
269
  Net::HTTP.start(req.uri.hostname, req.uri.port, :open_timeout => 1, :read_timeout => 1) do |http|
@@ -241,13 +271,36 @@ module Instana
241
271
  end
242
272
  response
243
273
  rescue Errno::ECONNREFUSED => e
244
- Instana.logger.debug "Agent not responding. Connection refused."
245
274
  return nil
246
275
  rescue => e
247
- Instana.logger.debug "Host agent request error: #{e.inspect}"
276
+ Instana.logger.error "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
277
+ Instana.logger.debug e.backtrace.join("\r\n")
248
278
  return nil
249
279
  end
250
280
 
281
+ ##
282
+ # pid_namespace?
283
+ #
284
+ # Indicates whether we are running in a pid namespace (such as
285
+ # Docker).
286
+ #
287
+ def pid_namespace?
288
+ return false unless @is_linux
289
+ Process.pid != get_real_pid
290
+ end
291
+
292
+ ##
293
+ # get_real_pid
294
+ #
295
+ # Attempts to determine the true process ID by querying the
296
+ # /proc/<pid>/sched file. This works on linux currently.
297
+ #
298
+ def get_real_pid
299
+ raise RuntimeError.new("Unsupported platform: get_real_pid") unless @is_linux
300
+ v = File.open("/proc/#{Process.pid}/sched", &:readline)
301
+ v.match(/\d+/).to_s.to_i
302
+ end
303
+
251
304
  ##
252
305
  # take_snapshot
253
306
  #
@@ -258,14 +311,8 @@ module Instana
258
311
  data = {}
259
312
 
260
313
  data[:sensorVersion] = ::Instana::VERSION
261
- data[:pid] = ::Process.pid
262
314
  data[:ruby_version] = RUBY_VERSION
263
315
 
264
- process = ::ProcTable.ps(Process.pid)
265
- arguments = process.cmdline.split(' ')
266
- data[:name] = arguments.shift
267
- data[:exec_args] = arguments
268
-
269
316
  # Since a snapshot is only taken on process boot,
270
317
  # this is ok here.
271
318
  data[:start_time] = Time.now.to_s
@@ -289,7 +336,7 @@ module Instana
289
336
 
290
337
  data
291
338
  rescue => e
292
- ::Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
339
+ ::Instana.logger.error "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
293
340
  ::Instana.logger.debug e.backtrace.join("\r\n")
294
341
  return data
295
342
  end
@@ -50,7 +50,7 @@ module Instana
50
50
  nil
51
51
  end
52
52
  rescue => e
53
- ::Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
53
+ ::Instana.logger.error "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
54
54
  ::Instana.logger.debug e.backtrace.join("\r\n")
55
55
  end
56
56
  end
@@ -28,7 +28,7 @@ module Instana
28
28
  nil
29
29
  end
30
30
  rescue => e
31
- ::Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
31
+ ::Instana.logger.error "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
32
32
  ::Instana.logger.debug e.backtrace.join("\r\n")
33
33
  end
34
34
  end
@@ -26,7 +26,7 @@ module Instana
26
26
  nil
27
27
  end
28
28
  rescue => e
29
- ::Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
29
+ ::Instana.logger.error "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
30
30
  ::Instana.logger.debug e.backtrace.join("\r\n")
31
31
  end
32
32
  end
@@ -1,3 +1,3 @@
1
1
  module Instana
2
- VERSION = "0.8.4"
2
+ VERSION = "0.8.6"
3
3
  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: 0.8.4
4
+ version: 0.8.6
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: 2016-11-15 00:00:00.000000000 Z
11
+ date: 2016-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler