instana 0.9.1 → 0.9.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: 44dfa9b5e6bf4088a5d81a201a997e64f3b1feaa
4
- data.tar.gz: e25c83640f80026b17ae78c53534a730c4253f00
3
+ metadata.gz: e4e0afa7990ec121d8542873c665d2ddda7e1ee9
4
+ data.tar.gz: 33143dc761cf85e27ab21ed22c9f64f8670c3a2b
5
5
  SHA512:
6
- metadata.gz: 969b07b8f027aaf3dacc2453f8ad0775eec5d028a625874602cb9d283682227443a9f5e32d9a31b2c377878d12b29a7326dea3cd1f659b52d3bdeb8cfa6ce0cd
7
- data.tar.gz: 607287d232068842330e7e0ac8d959d6e4d55b58870fad5a21b3df69e513f1ae833493b39ed87392ecab2d5c017e051da454b627f7c0ed189f2c9bbbe01a2884
6
+ metadata.gz: 85b7857890a0da50ef837027a1c5e0e7f413189b60175d1f26e682f5c109c7f98534efa2a84ef0f2cbf0e1162eb00f88b10604118fc18ca8036b3aef94e4c02e
7
+ data.tar.gz: 57d956387066525d20f4e6efc108115f4b02d001418fdad0cdf639143be00e32bfc26173eccc96cfed2bf63be36dbc3b0e09fd96db9209c1037f44ff27a36801
@@ -22,6 +22,9 @@ module Instana
22
22
  # Supported two states (unannounced & announced)
23
23
  @state = :unannounced
24
24
 
25
+ # Store the pid from process boot so we can detect forks
26
+ @pid = Process.pid
27
+
25
28
  # Snapshot data is collected once per process but resent
26
29
  # every 10 minutes along side process metrics.
27
30
  @snapshot = take_snapshot
@@ -39,8 +42,9 @@ module Instana
39
42
  @announce_timer = nil
40
43
  @collect_timer = nil
41
44
 
42
- # Detect if we're on linux or not (used in host_agent_ready?)
45
+ # Detect platform flags
43
46
  @is_linux = (RUBY_PLATFORM =~ /linux/i) ? true : false
47
+ @is_osx = (RUBY_PLATFORM =~ /darwin/i) ? true : false
44
48
 
45
49
  # In case we're running in Docker, have the default gateway available
46
50
  # to check in case we're running in bridged network mode
@@ -53,16 +57,57 @@ module Instana
53
57
  # The agent UUID returned from the host agent
54
58
  @agent_uuid = nil
55
59
 
60
+ collect_process_info
61
+ end
62
+
63
+ # Used in class initialization and after a fork, this method
64
+ # collects up process information and stores it in @process
65
+ #
66
+ def collect_process_info
56
67
  @process = {}
57
68
  cmdline = ProcTable.ps(Process.pid).cmdline.split("\0")
58
69
  @process[:name] = cmdline.shift
59
70
  @process[:arguments] = cmdline
60
- @process[:original_pid] = Process.pid
71
+
72
+ if @is_osx
73
+ # Handle OSX bug where env vars show up at the end of process name
74
+ # such as MANPATH etc..
75
+ @process[:name].gsub!(/[_A-Z]+=\S+/, '')
76
+ @process[:name].rstrip!
77
+ end
78
+
79
+ @process[:original_pid] = @pid
61
80
  # This is usually Process.pid but in the case of docker, the host agent
62
81
  # will return to us the true host pid in which we use to report data.
63
82
  @process[:report_pid] = nil
64
83
  end
65
84
 
85
+ # Determine whether the pid has changed since Agent start.
86
+ #
87
+ # @ return [Boolean] true or false to indicate if forked
88
+ #
89
+ def forked?
90
+ @pid != Process.pid
91
+ end
92
+
93
+ # Used post fork to re-initialize state and restart communications with
94
+ # the host agent.
95
+ #
96
+ def after_fork
97
+ ::Instana.logger.debug "after_fork hook called. Falling back to unannounced state."
98
+
99
+ # Re-collect process information post fork
100
+ @pid = Process.pid
101
+ collect_process_info
102
+
103
+ # Set last snapshot to 10 minutes ago
104
+ # so we send a snapshot sooner than later
105
+ @last_snapshot = Time.now - 600
106
+
107
+ transition_to(:unannounced)
108
+ start
109
+ end
110
+
66
111
  # Sets up periodic timers and starts the agent in a background thread.
67
112
  #
68
113
  def start
@@ -70,6 +115,10 @@ module Instana
70
115
  # We attempt to announce this ruby sensor to the host agent.
71
116
  # In case of failure, we try again in 30 seconds.
72
117
  @announce_timer = @timers.now_and_every(30) do
118
+ if forked?
119
+ after_fork
120
+ break
121
+ end
73
122
  if host_agent_ready? && announce_sensor
74
123
  ::Instana.logger.debug "Announce successful. Switching to metrics collection."
75
124
  transition_to(:announced)
@@ -81,6 +130,10 @@ module Instana
81
130
  # every ::Instana::Collector.interval seconds.
82
131
  @collect_timer = @timers.every(::Instana::Collector.interval) do
83
132
  if @state == :announced
133
+ if forked?
134
+ after_fork
135
+ break
136
+ end
84
137
  unless ::Instana::Collector.collect_and_report
85
138
  # If report has been failing for more than 1 minute,
86
139
  # fall back to unannounced state
@@ -27,19 +27,21 @@ module Instana
27
27
 
28
28
  status, headers, response = @app.call(env)
29
29
 
30
- kvs[:http][:status] = status
30
+ if ::Instana.tracer.tracing?
31
+ kvs[:http][:status] = status
31
32
 
32
- # Save the IDs before the trace ends so we can place
33
- # them in the response headers in the ensure block
34
- trace_id = ::Instana.tracer.trace_id
35
- span_id = ::Instana.tracer.span_id
33
+ # Save the IDs before the trace ends so we can place
34
+ # them in the response headers in the ensure block
35
+ trace_id = ::Instana.tracer.trace_id
36
+ span_id = ::Instana.tracer.span_id
37
+ end
36
38
 
37
39
  [status, headers, response]
38
40
  rescue Exception => e
39
41
  ::Instana.tracer.log_error(e)
40
42
  raise
41
43
  ensure
42
- if headers
44
+ if headers && ::Instana.tracer.tracing?
43
45
  # Set reponse headers; encode as hex string
44
46
  headers['X-Instana-T'] = ::Instana.tracer.id_to_header(trace_id)
45
47
  headers['X-Instana-S'] = ::Instana.tracer.id_to_header(span_id)
@@ -1,3 +1,3 @@
1
1
  module Instana
2
- VERSION = "0.9.1"
2
+ VERSION = "0.9.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: instana
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Giacomo Lombardo