logstash_writer 0.0.10 → 0.0.11
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/.editorconfig +7 -0
- data/lib/logstash_writer.rb +71 -42
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0dddb7bf146e8698d1bdebfb0deb5b3de55be252787b7d8a888624e4c63e97b4
|
4
|
+
data.tar.gz: 988d074dcdf5023010d0f480f15431d721a8dfdaf20c527433e72c7d7e9238c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da8f334ad24b00e5dba960654235bab9cfe738efaed27986fa76d09730a8889b447f9db5722b370eb9a4a2c8ccca389ef28512887c315aec38546a98a01aee39
|
7
|
+
data.tar.gz: ccc715f7bc30a718d6c6383b5ee76f2da186687440a8b1e6efee3aa72793bbe8975aa50a9124aa480d525e3dcb6fbde7f5272915706d06a1804fe361ebc5af4a
|
data/.editorconfig
ADDED
data/lib/logstash_writer.rb
CHANGED
@@ -74,19 +74,19 @@ class LogstashWriter
|
|
74
74
|
@server_name, @logger, @backlog = server_name, logger, backlog
|
75
75
|
|
76
76
|
@metrics = {
|
77
|
-
received:
|
78
|
-
sent:
|
79
|
-
queue_size:
|
80
|
-
dropped:
|
77
|
+
received: metrics_registry.counter(:"#{metrics_prefix}_events_received_total", "The number of logstash events which have been submitted for delivery"),
|
78
|
+
sent: metrics_registry.counter(:"#{metrics_prefix}_events_written_total", "The number of logstash events which have been delivered to the logstash server"),
|
79
|
+
queue_size: metrics_registry.gauge(:"#{metrics_prefix}_queue_size", "The number of events currently in the queue to be sent"),
|
80
|
+
dropped: metrics_registry.counter(:"#{metrics_prefix}_events_dropped_total", "The number of events which have been dropped from the queue"),
|
81
81
|
|
82
|
-
lag:
|
82
|
+
lag: metrics_registry.gauge(:"#{metrics_prefix}_last_sent_event_time_seconds", "When the last event successfully sent to logstash was originally received"),
|
83
83
|
|
84
|
-
connected:
|
85
|
-
connect_exception:
|
86
|
-
write_exception:
|
84
|
+
connected: metrics_registry.gauge(:"#{metrics_prefix}_connected_to_server", "Boolean flag indicating whether we are currently connected to a logstash server"),
|
85
|
+
connect_exception: metrics_registry.counter(:"#{metrics_prefix}_connect_exceptions_total", "The number of exceptions that have occurred whilst attempting to connect to a logstash server"),
|
86
|
+
write_exception: metrics_registry.counter(:"#{metrics_prefix}_write_exceptions_total", "The number of exceptions that have occurred whilst attempting to write an event to a logstash server"),
|
87
87
|
|
88
88
|
write_loop_exception: metrics_registry.counter(:"#{metrics_prefix}_write_loop_exceptions_total", "The number of exceptions that have occurred in the writing loop"),
|
89
|
-
write_loop_ok:
|
89
|
+
write_loop_ok: metrics_registry.gauge(:"#{metrics_prefix}_write_loop_ok", "Boolean flag indicating whether the writing loop is currently operating correctly, or is in a post-apocalyptic hellscape of never-ending exceptions"),
|
90
90
|
}
|
91
91
|
|
92
92
|
@metrics[:lag].set({}, 0)
|
@@ -136,6 +136,33 @@ class LogstashWriter
|
|
136
136
|
nil
|
137
137
|
end
|
138
138
|
|
139
|
+
# Send events.
|
140
|
+
#
|
141
|
+
# Does not return until `#shutdown` is called (in another thread).
|
142
|
+
#
|
143
|
+
def run
|
144
|
+
@queue_mutex.synchronize do
|
145
|
+
@terminate = false
|
146
|
+
end
|
147
|
+
|
148
|
+
write_loop
|
149
|
+
end
|
150
|
+
|
151
|
+
# Tell the LogstashWriter to flush its queue and terminate operation.
|
152
|
+
#
|
153
|
+
# Returns immediately.
|
154
|
+
#
|
155
|
+
def shutdown
|
156
|
+
#:nocov:
|
157
|
+
@worker_mutex.synchronize do
|
158
|
+
@queue_mutex.synchronize do
|
159
|
+
@terminate = true
|
160
|
+
@queue_cv.signal
|
161
|
+
end
|
162
|
+
end
|
163
|
+
#:nocov:
|
164
|
+
end
|
165
|
+
|
139
166
|
# Start sending events.
|
140
167
|
#
|
141
168
|
# This method will return almost immediately, and actual event
|
@@ -143,11 +170,14 @@ class LogstashWriter
|
|
143
170
|
#
|
144
171
|
# @return [NilClass]
|
145
172
|
#
|
146
|
-
def
|
173
|
+
def start!
|
147
174
|
@worker_mutex.synchronize do
|
148
175
|
if @worker_thread.nil?
|
176
|
+
@queue_mutex.synchronize do
|
177
|
+
@terminate = false
|
178
|
+
end
|
179
|
+
|
149
180
|
@worker_thread = Thread.new do
|
150
|
-
Thread.current.name = "LogstashWriter"
|
151
181
|
write_loop
|
152
182
|
end
|
153
183
|
end
|
@@ -164,18 +194,19 @@ class LogstashWriter
|
|
164
194
|
#
|
165
195
|
# @return [NilClass]
|
166
196
|
#
|
167
|
-
def stop
|
197
|
+
def stop!
|
168
198
|
@worker_mutex.synchronize do
|
169
199
|
if @worker_thread
|
170
|
-
@
|
171
|
-
|
200
|
+
@queue_mutex.synchronize do
|
201
|
+
@terminate = true
|
202
|
+
@queue_cv.signal
|
203
|
+
end
|
172
204
|
begin
|
173
|
-
@worker_thread.join
|
205
|
+
@worker_thread.join unless @worker_thread == Thread.current
|
174
206
|
rescue Exception => ex
|
175
207
|
@logger.error("LogstashWriter") { (["Worker thread terminated with exception: #{ex.message} (#{ex.class})"] + ex.backtrace).join("\n ") }
|
176
208
|
end
|
177
209
|
@worker_thread = nil
|
178
|
-
@socket_mutex.synchronize { (@current_target.close; @current_target = nil) if @current_target }
|
179
210
|
end
|
180
211
|
end
|
181
212
|
|
@@ -210,45 +241,43 @@ class LogstashWriter
|
|
210
241
|
#
|
211
242
|
def write_loop
|
212
243
|
error_wait = INITIAL_RETRY_WAIT
|
244
|
+
Thread.current.name = "LogstashWriter"
|
213
245
|
|
214
|
-
|
215
|
-
|
216
|
-
event = nil
|
246
|
+
until @terminate do
|
247
|
+
event = nil
|
217
248
|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
end
|
223
|
-
|
224
|
-
if @queue.empty? && @terminate
|
225
|
-
@terminate = false
|
226
|
-
throw :terminate
|
227
|
-
end
|
228
|
-
|
229
|
-
event = @queue.shift
|
249
|
+
begin
|
250
|
+
@queue_mutex.synchronize do
|
251
|
+
while @queue.empty? && !@terminate
|
252
|
+
@queue_cv.wait(@queue_mutex)
|
230
253
|
end
|
231
254
|
|
255
|
+
event = @queue.shift
|
256
|
+
end
|
257
|
+
|
258
|
+
if event
|
232
259
|
current_target do |t|
|
233
260
|
t.socket.puts event[:content].to_json
|
234
261
|
stat_sent(t.to_s, event[:arrival_timestamp])
|
235
262
|
@metrics[:write_loop_ok].set({}, 1)
|
236
263
|
error_wait = INITIAL_RETRY_WAIT
|
237
264
|
end
|
238
|
-
rescue StandardError => ex
|
239
|
-
@logger.error("LogstashWriter") { (["Exception in write_loop: #{ex.message} (#{ex.class})"] + ex.backtrace).join("\n ") }
|
240
|
-
@queue_mutex.synchronize { @queue.unshift(event) if event }
|
241
|
-
@metrics[:write_loop_exception].increment(class: ex.class.to_s)
|
242
|
-
@metrics[:write_loop_ok].set({}, 0)
|
243
|
-
sleep error_wait
|
244
|
-
# Increase the error wait timeout for next time, up to a maximum
|
245
|
-
# interval of about 60 seconds
|
246
|
-
error_wait *= 1.1
|
247
|
-
error_wait = 60 if error_wait > 60
|
248
|
-
error_wait += rand / 0.5
|
249
265
|
end
|
266
|
+
rescue StandardError => ex
|
267
|
+
@logger.error("LogstashWriter") { (["Exception in write_loop: #{ex.message} (#{ex.class})"] + ex.backtrace).join("\n ") }
|
268
|
+
@queue_mutex.synchronize { @queue.unshift(event) if event }
|
269
|
+
@metrics[:write_loop_exception].increment(class: ex.class.to_s)
|
270
|
+
@metrics[:write_loop_ok].set({}, 0)
|
271
|
+
sleep error_wait
|
272
|
+
# Increase the error wait timeout for next time, up to a maximum
|
273
|
+
# interval of about 60 seconds
|
274
|
+
error_wait *= 1.1
|
275
|
+
error_wait = 60 if error_wait > 60
|
276
|
+
error_wait += rand / 0.5
|
250
277
|
end
|
251
278
|
end
|
279
|
+
|
280
|
+
force_disconnect!
|
252
281
|
end
|
253
282
|
|
254
283
|
# Yield a Target connected to the server we currently believe to be
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash_writer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Palmer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-07-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: prometheus-client
|
@@ -202,6 +202,7 @@ executables: []
|
|
202
202
|
extensions: []
|
203
203
|
extra_rdoc_files: []
|
204
204
|
files:
|
205
|
+
- ".editorconfig"
|
205
206
|
- ".gitignore"
|
206
207
|
- ".rubocop.yml"
|
207
208
|
- ".travis.yml"
|
@@ -230,8 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
230
231
|
- !ruby/object:Gem::Version
|
231
232
|
version: '0'
|
232
233
|
requirements: []
|
233
|
-
|
234
|
-
rubygems_version: 2.7.7
|
234
|
+
rubygems_version: 3.0.1
|
235
235
|
signing_key:
|
236
236
|
specification_version: 4
|
237
237
|
summary: Opinionated logstash event pump
|