instana 1.10.10 → 1.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +14 -11
- data/lib/instana/agent.rb +22 -9
- data/lib/instana/agent/helpers.rb +24 -4
- data/lib/instana/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d71c06463463f206e4dd8aeae47776ce792a130d3aa6daccc0477823dd7a357
|
4
|
+
data.tar.gz: bb6fe211979e648b15a48f7fbc949a4ee9408f6a46808159e32a8bf7323e8336
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20493e913bc0569334318bbfeab8590da2a3507810a51f35adaf7320d5d552aefecf12a37e29b0d47e250d5bf4eeecf81e5332d96c1bdaa784fb0ed9bc047984
|
7
|
+
data.tar.gz: d1cebdc236820122711614678d777c4d96587f3672ead7430ccb48b65743b1dfa38df8007647e39ef34fbe01ecab32dc58d4afdaa5c186903e593fffb653bba0
|
data/Dockerfile
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
# For development/testing, you can run this instrumentation
|
2
2
|
# interactively in a Docker container:
|
3
|
-
# docker build -t instana/ruby-sensor
|
4
|
-
#
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
# docker build -t instana/ruby-sensor:1.0
|
4
|
+
#
|
5
|
+
# To mount the host ruby-sensor directory in the container:
|
6
|
+
# docker run -v /host/path/to/ruby-sensor:/ruby-sensor instana/ruby-sensor:1.0 /bin/bash
|
7
|
+
#
|
8
|
+
# Once inside the container, you can run `cd /ruby-sensor && bundle install && bundle exec rake console` for a development
|
9
|
+
# console in the gem.
|
10
|
+
#
|
11
|
+
# https://github.com/instana/ruby-sensor#development
|
12
|
+
#
|
13
|
+
FROM ruby:2.6
|
14
|
+
ENV INSTANA_DEBUG=true
|
15
|
+
RUN gem install bundler
|
16
|
+
RUN apt update && apt install -y vim
|
data/lib/instana/agent.rb
CHANGED
@@ -231,25 +231,35 @@ module Instana
|
|
231
231
|
@process = ::Instana::Util.collect_process_info
|
232
232
|
|
233
233
|
announce_payload = {}
|
234
|
-
announce_payload[:pid] = pid_namespace? ? get_real_pid : Process.pid
|
235
234
|
announce_payload[:name] = @process[:name]
|
236
235
|
announce_payload[:args] = @process[:arguments]
|
237
236
|
|
237
|
+
socket = nil
|
238
238
|
if @is_linux && !@testmode
|
239
239
|
# We create an open socket to the host agent in case we are running in a container
|
240
240
|
# and the real pid needs to be detected.
|
241
|
-
socket = TCPSocket.
|
241
|
+
socket = TCPSocket.open @discovered[:agent_host], @discovered[:agent_port]
|
242
|
+
|
242
243
|
announce_payload[:fd] = socket.fileno
|
243
|
-
announce_payload[:inode] = File.readlink("/proc
|
244
|
+
announce_payload[:inode] = File.readlink("/proc/self/fd/#{socket.fileno}")
|
245
|
+
announce_payload[:cpuSetFileContent] = get_cpuset_contents
|
246
|
+
|
247
|
+
sched_pid = get_sched_pid
|
248
|
+
announce_payload[:pid] = sched_pid
|
249
|
+
announce_payload[:pidFromParentNS] = running_in_container? && (sched_pid != Process.pid)
|
250
|
+
else
|
251
|
+
announce_payload[:pid] = Process.pid
|
252
|
+
announce_payload[:pidFromParentNS] = true
|
244
253
|
end
|
245
254
|
|
246
255
|
uri = URI.parse("http://#{@discovered[:agent_host]}:#{@discovered[:agent_port]}/#{DISCOVERY_PATH}")
|
247
256
|
req = Net::HTTP::Put.new(uri)
|
248
257
|
req.body = Oj.dump(announce_payload, OJ_OPTIONS)
|
249
258
|
|
250
|
-
|
259
|
+
#::Instana.logger.debug("Announce payload: #{announce_payload}")
|
260
|
+
#::Instana.logger.debug { "Announce: http://#{@discovered[:agent_host]}:#{@discovered[:agent_port]}/#{DISCOVERY_PATH} - payload: #{req.body}" }
|
251
261
|
|
252
|
-
response = make_host_agent_request(req)
|
262
|
+
response = make_host_agent_request(req, open_timeout=3, read_timeout=3, debug=true)
|
253
263
|
|
254
264
|
if response && (response.code.to_i == 200)
|
255
265
|
data = Oj.load(response.body, OJ_OPTIONS)
|
@@ -449,18 +459,21 @@ module Instana
|
|
449
459
|
# @param req [Net::HTTP::Req] A prepared Net::HTTP request object of the type
|
450
460
|
# you wish to make (Get, Put, Post etc.)
|
451
461
|
#
|
452
|
-
def make_host_agent_request(req)
|
462
|
+
def make_host_agent_request(req, open_timeout=1, read_timeout=1, debug=false)
|
453
463
|
req['Accept'] = MIME_JSON
|
454
464
|
req['Content-Type'] = MIME_JSON
|
455
465
|
|
456
466
|
if @state == :unannounced
|
457
467
|
@httpclient = Net::HTTP.new(req.uri.hostname, req.uri.port)
|
458
|
-
@httpclient.open_timeout =
|
459
|
-
@httpclient.read_timeout =
|
468
|
+
@httpclient.open_timeout = open_timeout
|
469
|
+
@httpclient.read_timeout = read_timeout
|
460
470
|
end
|
461
471
|
|
462
472
|
response = @httpclient.request(req)
|
463
|
-
|
473
|
+
|
474
|
+
if debug
|
475
|
+
::Instana.logger.debug "#{req.method}->#{req.uri} body:(#{req.body}) Response:#{response} body:(#{response.body})"
|
476
|
+
end
|
464
477
|
|
465
478
|
response
|
466
479
|
rescue Errno::ECONNREFUSED
|
@@ -7,13 +7,20 @@ module AgentHelpers
|
|
7
7
|
Process.pid != get_real_pid
|
8
8
|
end
|
9
9
|
|
10
|
+
# Attempts to determine if we're running inside a container.
|
11
|
+
# The qualifications are:
|
12
|
+
# 1. Linux based OS
|
13
|
+
# 2. /proc/self/cpuset exists and contents include a container id
|
14
|
+
def running_in_container?
|
15
|
+
return false unless @is_linux
|
16
|
+
get_cpuset_contents == '/' ? false : true
|
17
|
+
end
|
18
|
+
|
10
19
|
# Attempts to determine the true process ID by querying the
|
11
20
|
# /proc/<pid>/sched file. This works on linux currently.
|
12
21
|
#
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
sched_file = "/proc/#{Process.pid}/sched"
|
22
|
+
def get_sched_pid
|
23
|
+
sched_file = "/proc/self/sched"
|
17
24
|
pid = Process.pid
|
18
25
|
|
19
26
|
if File.exist?(sched_file)
|
@@ -23,6 +30,19 @@ module AgentHelpers
|
|
23
30
|
pid
|
24
31
|
end
|
25
32
|
|
33
|
+
# Open and read /proc/<pid>/cpuset and return as a string. Used as
|
34
|
+
# part of the announce payload for process differentiation.
|
35
|
+
#
|
36
|
+
def get_cpuset_contents
|
37
|
+
cpuset_file = "/proc/#{Process.pid}/cpuset"
|
38
|
+
contents = ""
|
39
|
+
|
40
|
+
if File.exist?(cpuset_file)
|
41
|
+
contents = File.open(cpuset_file, "r").read
|
42
|
+
end
|
43
|
+
contents
|
44
|
+
end
|
45
|
+
|
26
46
|
# Returns the PID that we are reporting to
|
27
47
|
#
|
28
48
|
def report_pid
|
data/lib/instana/version.rb
CHANGED
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.11.0
|
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-10
|
11
|
+
date: 2019-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|