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 +4 -4
- data/lib/hoss/agent.rb +4 -0
- data/lib/hoss/config.rb +4 -6
- data/lib/hoss/spies/faraday.rb +47 -43
- data/lib/hoss/spies/http.rb +29 -24
- data/lib/hoss/spies/net_http.rb +32 -28
- data/lib/hoss/transport/worker.rb +90 -79
- data/lib/hoss/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: eb17fe11c7d97d41c4cb2c5a701286233ea53255092a89a3924793e5d2a6a3c4
|
4
|
+
data.tar.gz: babeee044660be9fcb0f6c4d8a26f6204abfb2f539fa83497bac97d1b461a54b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70b395a9f4e36e3677bbe82148ff0a3ad13844c1a281184148ed22b5f8204414a6e22e0d27f98addeb723e68da4bcf89f97ab3da0248c6bc967baae48691b65e
|
7
|
+
data.tar.gz: d05143b093eab36c8f034fe9e05eae9b863b4fca370f1b7c8e04d28d3eba8a69c770f4c0ef137fedde869761401c7617a74f998caa2e91fc559ae707c44550ac
|
data/lib/hoss/agent.rb
CHANGED
@@ -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',
|
data/lib/hoss/config.rb
CHANGED
@@ -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
|
-
|
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
|
|
data/lib/hoss/spies/faraday.rb
CHANGED
@@ -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
|
-
|
43
|
-
Hoss
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
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
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
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
|
data/lib/hoss/spies/http.rb
CHANGED
@@ -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
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
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
|
data/lib/hoss/spies/net_http.rb
CHANGED
@@ -56,35 +56,39 @@ module Hoss
|
|
56
56
|
return request_without_apm(req, body, &block)
|
57
57
|
end
|
58
58
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
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
|
-
|
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
|
-
|
64
|
+
begin
|
65
|
+
debug 'working message', msg
|
65
66
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
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
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
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
|
-
|
134
|
-
|
129
|
+
if batch.length == 0
|
130
|
+
debug "batch is empty, breaking"
|
131
|
+
break
|
132
|
+
end
|
135
133
|
|
136
|
-
|
137
|
-
|
134
|
+
debug "Requeue #{requeue_messages.length} messages" if requeue_messages.length > 0
|
135
|
+
requeue_messages.each {|msg| queue.push(msg, false) }
|
138
136
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
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)
|
data/lib/hoss/version.rb
CHANGED
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
|
+
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-
|
11
|
+
date: 2020-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|