hoss-agent 1.0.4 → 1.0.9

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
  SHA256:
3
- metadata.gz: 8dd2239031e74d5f25fafa6f441f51b3e0d58b9bc751fd71969991fa0761e261
4
- data.tar.gz: db69f9d259c944bfbc935ab0967d20e39403fbaa86169188c597bcc9fff31fcb
3
+ metadata.gz: eb17fe11c7d97d41c4cb2c5a701286233ea53255092a89a3924793e5d2a6a3c4
4
+ data.tar.gz: babeee044660be9fcb0f6c4d8a26f6204abfb2f539fa83497bac97d1b461a54b
5
5
  SHA512:
6
- metadata.gz: a05a2e06817b1535ad21b76c0a72ca7bcf148ab3cfce2aeb5e9f96052d4cc3be9e8d6eb802cb270fe65ab08ace0befe92f446236d4ae468428923c9f9716b821
7
- data.tar.gz: 50b283758201a779aa3648cb8f7928682a8fbfd0cb53d8280d89d65956064bed5e4cb4225875d4c2efa3e124848011a1a12c2cef10eee98bc524e143a5d755d5
6
+ metadata.gz: 70b395a9f4e36e3677bbe82148ff0a3ad13844c1a281184148ed22b5f8204414a6e22e0d27f98addeb723e68da4bcf89f97ab3da0248c6bc967baae48691b65e
7
+ data.tar.gz: d05143b093eab36c8f034fe9e05eae9b863b4fca370f1b7c8e04d28d3eba8a69c770f4c0ef137fedde869761401c7617a74f998caa2e91fc559ae707c44550ac
@@ -103,6 +103,10 @@ module Hoss
103
103
  def_delegator :@central_config, :config
104
104
 
105
105
  def start
106
+ unless config.api_key
107
+ config.logger.warn "Hoss API Key missing, not starting."
108
+ return
109
+ end
106
110
  unless config.disable_start_message?
107
111
  config.logger.info format(
108
112
  '[%s] Starting agent, reporting to %s',
@@ -41,7 +41,7 @@ module Hoss
41
41
  option :remote_config_fetch_interval, type: :int, default: 300
42
42
  option :agentConfig, type: :dict
43
43
  option :debug, type: :boolean, default: ENV['HOSS_DEBUG']
44
-
44
+ option :disable_reporting, type: :boolean, default: ENV['HOSS_DISABLE_REPORTING'] == 'true'
45
45
 
46
46
  option :central_config, type: :bool, default: true
47
47
  option :capture_body, type: :string, default: 'off'
@@ -101,10 +101,6 @@ module Hoss
101
101
  assign(load_config_file)
102
102
  assign(env)
103
103
 
104
- if self.log_level == Logger::DEBUG
105
- assign(debug: true)
106
- end
107
-
108
104
  if self.debug == true || self.debug == 'true'
109
105
  assign(
110
106
  log_level: Logger::DEBUG,
@@ -113,7 +109,9 @@ module Hoss
113
109
  )
114
110
  end
115
111
 
116
- warn '[HOSS] No API Key provided' unless self.api_key
112
+ unless self.disable_reporting.nil?
113
+ self.disable_reporting = self.disable_reporting == 'true' || self.disable_reporting == true
114
+ end
117
115
 
118
116
  yield self if block_given?
119
117
 
@@ -39,57 +39,61 @@ module Hoss
39
39
  alias run_request_without_apm run_request
40
40
 
41
41
  def run_request(method, url, body, headers, &block)
42
- Hoss.with_event do |event|
43
- Hoss::Spies::FaradaySpy.without_net_http do
44
- begin
45
- uri = URI(build_url(url))
46
- result = run_request_without_apm(method, url, body, headers) do |req|
47
- if block_given?
48
- yield req
49
- new_path = req.path
50
- new_query = URI.encode_www_form(req.params)
51
- if uri.path != new_path || uri.query != new_query
52
- test_uri = uri
53
- test_uri.query = nil
54
- begin
55
- test_uri.path = new_path
56
- rescue Exception => e
42
+ begin
43
+ Hoss.with_event do |event|
44
+ Hoss::Spies::FaradaySpy.without_net_http do
45
+ begin
46
+ uri = URI(build_url(url))
47
+ result = run_request_without_apm(method, url, body, headers) do |req|
48
+ if block_given?
49
+ yield req
50
+ new_path = req.path
51
+ new_query = URI.encode_www_form(req.params)
52
+ if uri.path != new_path || uri.query != new_query
53
+ test_uri = uri
54
+ test_uri.query = nil
55
+ begin
56
+ test_uri.path = new_path
57
+ rescue Exception => e
58
+ end
59
+ # The original url can be set to path if Faraday.get used
60
+ if test_uri.to_s != uri.to_s
61
+ uri.path = new_path
62
+ end
63
+ uri.query = new_query
57
64
  end
58
- # The original url can be set to path if Faraday.get used
59
- if test_uri.to_s != uri.to_s
60
- uri.path = new_path
61
- end
62
- uri.query = new_query
63
65
  end
66
+ event.request.method = method.to_s.upcase
67
+ event.request.url = uri.to_s
68
+ event.request.received_at = DateTime.now.strftime('%Q').to_i
69
+ event.request.headers['host'] = uri.hostname
70
+ req.headers.each {|n,v| event.request.headers[n] = v}
71
+ event.request.url = uri.to_s
72
+ event.request.body = req.body
64
73
  end
65
- event.request.method = method.to_s.upcase
66
- event.request.url = uri.to_s
67
- event.request.received_at = DateTime.now.strftime('%Q').to_i
68
- event.request.headers['host'] = uri.hostname
69
- req.headers.each {|n,v| event.request.headers[n] = v}
70
- event.request.url = uri.to_s
71
- event.request.body = req.body
72
- end
73
74
 
74
- if result
75
- event.response = Hoss::Event::Response.new
76
- event.response.received_at = DateTime.now.strftime('%Q').to_i
77
- event.response.status_code = result.status.to_i
78
- result.headers.each {|n,v| event.response.headers[n] = v}
79
- event.response.body = result.body
80
- end
75
+ if result
76
+ event.response = Hoss::Event::Response.new
77
+ event.response.received_at = DateTime.now.strftime('%Q').to_i
78
+ event.response.status_code = result.status.to_i
79
+ result.headers.each {|n,v| event.response.headers[n] = v}
80
+ event.response.body = result.body
81
+ end
81
82
 
82
- result
83
- rescue Exception => e
84
- if e.wrapped_exception.is_a? Net::OpenTimeout
85
- event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionTimeout)
86
- else
87
- event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionError)
83
+ result
84
+ rescue Exception => e
85
+ if e.respond_to?(:wrapped_exception) && e.wrapped_exception.is_a?(Net::OpenTimeout)
86
+ event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionTimeout)
87
+ else
88
+ event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionError)
89
+ end
90
+ event.error.received_at = DateTime.now.strftime('%Q').to_i
91
+ raise
88
92
  end
89
- event.error.received_at = DateTime.now.strftime('%Q').to_i
90
- raise
91
93
  end
92
94
  end
95
+ rescue
96
+ run_request_without_apm(method, url, body, headers, &block)
93
97
  end
94
98
  end
95
99
  end
@@ -44,32 +44,37 @@ module Hoss
44
44
  if req.headers['HOSS-SKIP-INSTRUMENTATION'] == 'true'
45
45
  return perform_without_apm(req, options)
46
46
  end
47
- Hoss.with_event do |event|
48
- event.request.headers['host'] = req.uri.host
49
- req.headers.each {|n,v| event.request.headers[n] = v}
50
- event.request.method = req.verb.to_s.upcase
51
- event.request.url = req.uri.to_s
52
- event.request.body = Hoss::Spies::HTTPSpy::copy_request_body(req.body)
53
- event.request.received_at = DateTime.now.strftime('%Q').to_i
54
- begin
55
- result = perform_without_apm(req, options)
56
- if result
57
- event.response = Hoss::Event::Response.new
58
- event.response.received_at = DateTime.now.strftime('%Q').to_i
59
- event.response.status_code = result.code.to_i
60
- result.headers.each {|n,v| event.response.headers[n] = v}
61
- event.response.body = result.body.dup.to_s
47
+
48
+ begin
49
+ Hoss.with_event do |event|
50
+ event.request.headers['host'] = req.uri.host
51
+ req.headers.each {|n,v| event.request.headers[n] = v}
52
+ event.request.method = req.verb.to_s.upcase
53
+ event.request.url = req.uri.to_s
54
+ event.request.body = Hoss::Spies::HTTPSpy::copy_request_body(req.body)
55
+ event.request.received_at = DateTime.now.strftime('%Q').to_i
56
+ begin
57
+ result = perform_without_apm(req, options)
58
+ if result
59
+ event.response = Hoss::Event::Response.new
60
+ event.response.received_at = DateTime.now.strftime('%Q').to_i
61
+ event.response.status_code = result.code.to_i
62
+ result.headers.each {|n,v| event.response.headers[n] = v}
63
+ event.response.body = result.body.to_s
64
+ end
65
+ result
66
+ rescue HTTP::TimeoutError => e
67
+ event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionTimeout)
68
+ event.error.received_at = DateTime.now.strftime('%Q').to_i
69
+ raise
70
+ rescue Exception => e
71
+ event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionError)
72
+ event.error.received_at = DateTime.now.strftime('%Q').to_i
73
+ raise
62
74
  end
63
- result
64
- rescue HTTP::TimeoutError => e
65
- event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionTimeout)
66
- event.error.received_at = DateTime.now.strftime('%Q').to_i
67
- raise
68
- rescue Exception => e
69
- event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionError)
70
- event.error.received_at = DateTime.now.strftime('%Q').to_i
71
- raise
72
75
  end
76
+ rescue
77
+ return perform_without_apm(req, options)
73
78
  end
74
79
  end
75
80
  end
@@ -56,35 +56,39 @@ module Hoss
56
56
  return request_without_apm(req, body, &block)
57
57
  end
58
58
 
59
- host = req['host']&.split(':')&.first || address
60
- method = req.method.to_s.upcase
61
- path, query = req.path.split('?')
62
-
63
- url = use_ssl? ? +'https://' : +'http://'
64
- url << host
65
- url << ":#{port}" if port
66
- url << path
67
- url << "?#{query}" if query
68
- uri = URI(url)
69
-
70
- Hoss.with_event do |event|
71
- # Record request
72
- event.request.headers['host'] = uri.hostname
73
- req.each_header {|n,v| event.request.headers[n] = v}
74
- event.request.method = method
75
- event.request.url = uri.to_s
76
- event.request.body = req.body
77
- event.request.received_at = DateTime.now.strftime('%Q').to_i
78
-
79
- result = request_without_apm(req, body, &block)
80
- if result
81
- event.response = Hoss::Event::Response.new
82
- event.response.received_at = DateTime.now.strftime('%Q').to_i
83
- event.response.status_code = result.code.to_i
84
- result.each_header {|n,v| event.response.headers[n] = v}
85
- event.response.body = result.body
59
+ begin
60
+ host = req['host']&.split(':')&.first || address
61
+ method = req.method.to_s.upcase
62
+ path, query = req.path.split('?')
63
+
64
+ url = use_ssl? ? +'https://' : +'http://'
65
+ url << host
66
+ url << ":#{port}" if port
67
+ url << path
68
+ url << "?#{query}" if query
69
+ uri = URI(url)
70
+
71
+ Hoss.with_event do |event|
72
+ # Record request
73
+ event.request.headers['host'] = uri.hostname
74
+ req.each_header {|n,v| event.request.headers[n] = v}
75
+ event.request.method = method
76
+ event.request.url = uri.to_s
77
+ event.request.body = req.body
78
+ event.request.received_at = DateTime.now.strftime('%Q').to_i
79
+
80
+ result = request_without_apm(req, body, &block)
81
+ if result
82
+ event.response = Hoss::Event::Response.new
83
+ event.response.received_at = DateTime.now.strftime('%Q').to_i
84
+ event.response.status_code = result.code.to_i
85
+ result.each_header {|n,v| event.response.headers[n] = v}
86
+ event.response.body = result.body
87
+ end
88
+ result
86
89
  end
87
- result
90
+ rescue
91
+ return request_without_apm(req, body, &block)
88
92
  end
89
93
  end
90
94
  end
@@ -61,100 +61,108 @@ module Hoss
61
61
 
62
62
  done = false
63
63
  while (!done && msg = queue.pop)
64
- debug 'working message', msg
64
+ begin
65
+ debug 'working message', msg
65
66
 
66
- # wait if we don't have a config
67
- while config.agentConfig.nil?
68
- sleep 0.1
69
- end
70
-
71
- case msg
72
- when StopMessage
73
- debug 'Stopping worker -- %s', self
74
- done = true
75
- break
76
- else
77
- batch = []
78
- current_batch_size = 0
79
-
80
- # Use this as the first message in the batch
81
- event = msg.filtered ? msg : filter_resource(msg)
82
- unless event.nil?
83
- event_size = resource_size(event)
84
- if current_batch_size + event_size <= @config.batch_size
85
- unless host_blacklisted(event)
86
- current_batch_size += event_size
87
- if event.retries < @config.max_event_retries
88
- batch.push(event)
89
- else
90
- debug "max retries hit for event"
67
+ # wait if we don't have a config
68
+ while config.agentConfig.nil?
69
+ sleep 0.1
70
+ end
71
+
72
+ case msg
73
+ when StopMessage
74
+ debug 'Stopping worker -- %s', self
75
+ done = true
76
+ break
77
+ else
78
+ batch = []
79
+ current_batch_size = 0
80
+
81
+ # Use this as the first message in the batch
82
+ event = msg.filtered ? msg : filter_resource(msg)
83
+ unless event.nil?
84
+ event_size = resource_size(event)
85
+ if current_batch_size + event_size <= @config.batch_size
86
+ unless host_blacklisted(event)
87
+ current_batch_size += event_size
88
+ if event.retries < @config.max_event_retries
89
+ batch.push(event)
90
+ else
91
+ debug "max retries hit for event"
92
+ end
91
93
  end
94
+ else
95
+ debug "Event is too large, body needs to be truncated"
92
96
  end
93
- else
94
- debug "Event is too large, body needs to be truncated"
95
97
  end
96
- end
97
98
 
98
- # Do inner loop reading queue to build report
99
- requeue_messages = []
100
- while current_batch_size < @config.batch_size && !queue.empty?
101
- next_msg = queue.pop
102
- case next_msg
103
- when StopMessage
104
- debug 'Stopping worker -- %s', self
105
- done = true
106
- break
107
- else
108
- event = next_msg.filtered ? next_msg : filter_resource(next_msg) unless
109
- unless event.nil?
110
- event_size = resource_size(event)
111
- if current_batch_size + event_size <= @config.batch_size
112
- unless host_blacklisted(event)
113
- current_batch_size += event_size
114
- if event.retries < @config.max_event_retries
115
- batch.push(event)
116
- else
117
- debug "max retries hit for event"
99
+ # Do inner loop reading queue to build report
100
+ requeue_messages = []
101
+ while current_batch_size < @config.batch_size && !queue.empty?
102
+ next_msg = queue.pop
103
+ case next_msg
104
+ when StopMessage
105
+ debug 'Stopping worker -- %s', self
106
+ done = true
107
+ break
108
+ else
109
+ event = next_msg.filtered ? next_msg : filter_resource(next_msg)
110
+ unless event.nil?
111
+ event_size = resource_size(event)
112
+ if current_batch_size + event_size <= @config.batch_size
113
+ unless host_blacklisted(event)
114
+ current_batch_size += event_size
115
+ if event.retries < @config.max_event_retries
116
+ batch.push(event)
117
+ else
118
+ debug "max retries hit for event"
119
+ end
118
120
  end
121
+ else
122
+ debug "Event too large for this batch, requeue"
123
+ requeue_messages.push(event)
119
124
  end
120
- else
121
- debug "Event too large for this batch, requeue"
122
- requeue_messages.push(event)
123
125
  end
124
126
  end
125
127
  end
126
- end
127
-
128
- if batch.length == 0
129
- debug "batch is empty, breaking"
130
- break
131
- end
132
128
 
133
- debug "Requeue #{requeue_messages.length} messages" if requeue_messages.length > 0
134
- requeue_messages.each {|msg| queue.push(msg, false) }
129
+ if batch.length == 0
130
+ debug "batch is empty, breaking"
131
+ break
132
+ end
135
133
 
136
- report = Report.new
137
- report.events = batch.map {|event| serializers.serialize(event) }
134
+ debug "Requeue #{requeue_messages.length} messages" if requeue_messages.length > 0
135
+ requeue_messages.each {|msg| queue.push(msg, false) }
138
136
 
139
- debug "Finished building report"
140
- data = serializers.serialize(report)
141
- json = JSON.fast_generate(data)
142
- begin
143
- debug json
144
- rescue Exception => e
145
- debug 'unable to print body'
146
- puts json if config.debug
147
- end
148
- begin
149
- connection.write(json)
150
- rescue Exception => e
151
- error format('Failed send report: %s %s', e.inspect, e.backtrace)
152
- batch.each do |m|
153
- m.retries += 1
154
- queue.push(m, false)
137
+ report = Report.new
138
+ report.events = batch.map {|event| serializers.serialize(event) }
139
+
140
+ debug "Finished building report"
141
+ data = serializers.serialize(report)
142
+ json = JSON.fast_generate(data)
143
+ begin
144
+ debug json
145
+ rescue Exception => e
146
+ debug 'unable to print body'
147
+ puts json if config.debug
148
+ end
149
+ begin
150
+ if config.disable_reporting
151
+ debug "Reprting disabled, skipping"
152
+ else
153
+ connection.write(json)
154
+ end
155
+ rescue Exception => e
156
+ error format('Failed send report: %s %s', e.inspect, e.backtrace)
157
+ batch.each do |m|
158
+ m.retries += 1
159
+ queue.push(m, false)
160
+ end
161
+ sleep 1
155
162
  end
156
- sleep 1
157
163
  end
164
+ rescue Exception => e
165
+ debug "error in worker #{e.inspect}"
158
166
  end
159
167
  end
160
168
  rescue Exception => e
@@ -183,6 +191,9 @@ module Hoss
183
191
  else
184
192
  body
185
193
  end
194
+ rescue Exception => e
195
+ debug "unable to decompress body #{e.inspect}"
196
+ return nil
186
197
  end
187
198
 
188
199
  def get_header(headers, name)
@@ -18,5 +18,5 @@
18
18
  # frozen_string_literal: true
19
19
 
20
20
  module Hoss
21
- VERSION = '1.0.4'
21
+ VERSION = '1.0.9'
22
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hoss-agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cameron Cooper
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-17 00:00:00.000000000 Z
11
+ date: 2020-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby