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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +7 -0
  3. data/lib/logstash_writer.rb +71 -42
  4. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 646455172093377861ec1c62178b4aca74473a8a816929ddfb33aafc0df959ef
4
- data.tar.gz: dc6b57317bf8881e29606cb1fe784a3dd2e591e331156589cdfc80eb6e562862
3
+ metadata.gz: 0dddb7bf146e8698d1bdebfb0deb5b3de55be252787b7d8a888624e4c63e97b4
4
+ data.tar.gz: 988d074dcdf5023010d0f480f15431d721a8dfdaf20c527433e72c7d7e9238c9
5
5
  SHA512:
6
- metadata.gz: 8583e8677dc1c238f4030a0a5e3f63b5b75319c17b9d81249f962d9e0b33e828b1bcdd4eaebd5a2104082d014bd7abf7c5332751efa2985bc4105b4ad86dd743
7
- data.tar.gz: a99a3f8b3a0cc10033f110f9e047d30cc0d0a630cca536d36cb5502a1b3461c04721cc6ef063edd2da85ea7276f8b4b57c591b112b97f530d5f874d7bd1c8c82
6
+ metadata.gz: da8f334ad24b00e5dba960654235bab9cfe738efaed27986fa76d09730a8889b447f9db5722b370eb9a4a2c8ccca389ef28512887c315aec38546a98a01aee39
7
+ data.tar.gz: ccc715f7bc30a718d6c6383b5ee76f2da186687440a8b1e6efee3aa72793bbe8975aa50a9124aa480d525e3dcb6fbde7f5272915706d06a1804fe361ebc5af4a
data/.editorconfig ADDED
@@ -0,0 +1,7 @@
1
+ [*.rb]
2
+ indent_style = space
3
+ indent_size = 2
4
+ end_of_line = lf
5
+ insert_final_newline = true
6
+ charset = utf-8
7
+ trim_trailing_whitespace = true
@@ -74,19 +74,19 @@ class LogstashWriter
74
74
  @server_name, @logger, @backlog = server_name, logger, backlog
75
75
 
76
76
  @metrics = {
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"),
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: metrics_registry.gauge(:"#{metrics_prefix}_last_sent_event_time_seconds", "When the last event successfully sent to logstash was originally received"),
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: 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"),
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: 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"),
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 run
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
- @terminate = true
171
- @queue_cv.signal
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
- catch :terminate do
215
- loop do
216
- event = nil
246
+ until @terminate do
247
+ event = nil
217
248
 
218
- begin
219
- @queue_mutex.synchronize do
220
- while @queue.empty? && !@terminate
221
- @queue_cv.wait(@queue_mutex)
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.10
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: 2018-10-18 00:00:00.000000000 Z
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
- rubyforge_project:
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