logstash-output-jdbc 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b88f25634e6067acc5b2bcd6bae08adae1f62a5f
4
- data.tar.gz: 6ebea2d9323ca3bae2b734b245920d026ea51709
3
+ metadata.gz: 6fc8ddfe645eb52236a43bd311160e9b1bb6cb13
4
+ data.tar.gz: e5dbdf7eaa611c69380423ec6e2d318bafd295d0
5
5
  SHA512:
6
- metadata.gz: bf46d1ecbdc8b5db28325b698385a17e742a158499b005a39ead100e86183c3a368a5cd93bf03d91d018f02a110b4b79d5064d485a02bbb95068fba1398fa532
7
- data.tar.gz: fe60eb738931dc120e2a10323548f5bad8de45945e3d1d8d3e09d7eac94e55cf5190b78c3b5a1f078bc264fec272e583ccbce9f9487cc169df97f5728821bda7
6
+ metadata.gz: 738fe21719d3f903744fa61c721ef5ec197416089d04d42be0574234d28a692792c24927bef85dd9e2bb511f0ae63bc09c23b6f161fd33b72cdf3b0c6c8ba5e7
7
+ data.tar.gz: 18652ad8984829a32fad82e7af6972b34356e6eeb07e01bade6caf71bf148f6bc8e06feb6c7568ac7df8d8328d2017acfe0705c55c30b6d2b14475df2dce781a
@@ -6,10 +6,33 @@ require "java"
6
6
  require "logstash-output-jdbc_jars"
7
7
  require "logstash-output-jdbc_ring-buffer"
8
8
 
9
+ # Write events to a SQL engine, using JDBC.
10
+ #
11
+ # It is upto the user of the plugin to correctly configure the plugin. This
12
+ # includes correctly crafting the SQL statement, and matching the number of
13
+ # parameters correctly.
9
14
  class LogStash::Outputs::Jdbc < LogStash::Outputs::Base
10
15
  # Adds buffer support
11
16
  include Stud::Buffer
12
17
 
18
+ STRFTIME_FMT = '%Y-%m-%d %T.%L'.freeze
19
+
20
+ RETRYABLE_SQLSTATE_CLASSES = [
21
+ # Classes of retryable SQLSTATE codes
22
+ # Not all in the class will be retryable. However, this is the best that
23
+ # we've got right now.
24
+ # If a custom state code is required, set it in retry_sql_states.
25
+ '08', # Connection Exception
26
+ '24', # Invalid Cursor State (Maybe retry-able in some circumstances)
27
+ '25', # Invalid Transaction State
28
+ '40', # Transaction Rollback
29
+ '53', # Insufficient Resources
30
+ '54', # Program Limit Exceeded (MAYBE)
31
+ '55', # Object Not In Prerequisite State
32
+ '57', # Operator Intervention
33
+ '58', # System Error
34
+ ].freeze
35
+
13
36
  config_name "jdbc"
14
37
 
15
38
  # Driver class - Reintroduced for https://github.com/theangryangel/logstash-output-jdbc/issues/26
@@ -196,8 +219,15 @@ class LogStash::Outputs::Jdbc < LogStash::Outputs::Base
196
219
  def safe_flush(events, teardown=false)
197
220
  connection = nil
198
221
  statement = nil
222
+
199
223
  begin
200
224
  connection = @pool.getConnection()
225
+ rescue => e
226
+ log_jdbc_exception(e)
227
+ raise
228
+ end
229
+
230
+ begin
201
231
  statement = connection.prepareStatement(@statement[0])
202
232
 
203
233
  events.each do |event|
@@ -213,6 +243,9 @@ class LogStash::Outputs::Jdbc < LogStash::Outputs::Base
213
243
  @exceptions_tracker << nil
214
244
  rescue => e
215
245
  log_jdbc_exception(e)
246
+ if retry_exception?(e)
247
+ raise
248
+ end
216
249
  ensure
217
250
  statement.close() unless statement.nil?
218
251
  connection.close() unless connection.nil?
@@ -224,7 +257,12 @@ class LogStash::Outputs::Jdbc < LogStash::Outputs::Base
224
257
  statement = nil
225
258
  begin
226
259
  connection = @pool.getConnection()
260
+ rescue => e
261
+ log_jdbc_exception(e)
262
+ raise
263
+ end
227
264
 
265
+ begin
228
266
  events.each do |event|
229
267
  next if event.cancelled?
230
268
 
@@ -240,6 +278,9 @@ class LogStash::Outputs::Jdbc < LogStash::Outputs::Base
240
278
  end
241
279
  rescue => e
242
280
  log_jdbc_exception(e)
281
+ if retry_exception?(e)
282
+ raise
283
+ end
243
284
  ensure
244
285
  statement.close() unless statement.nil?
245
286
  connection.close() unless connection.nil?
@@ -250,11 +291,17 @@ class LogStash::Outputs::Jdbc < LogStash::Outputs::Base
250
291
  @statement[1..-1].each_with_index do |i, idx|
251
292
  case event[i]
252
293
  when Time
253
- # Most reliable solution, cross JDBC driver
254
- statement.setString(idx + 1, event[i].iso8601())
294
+ # See LogStash::Timestamp, below, for the why behind strftime.
295
+ statement.setString(idx + 1, event[i].strftime(STRFTIME_FMT))
255
296
  when LogStash::Timestamp
256
- # Most reliable solution, cross JDBC driver
257
- statement.setString(idx + 1, event[i].to_iso8601())
297
+ # XXX: Using setString as opposed to setTimestamp, because setTimestamp
298
+ # doesn't behave correctly in some drivers (Known: sqlite)
299
+ #
300
+ # Additionally this does not use `to_iso8601`, since some SQL databases
301
+ # choke on the 'T' in the string (Known: Derby).
302
+ #
303
+ # strftime appears to be the most reliable across drivers.
304
+ statement.setString(idx + 1, event[i].time.strftime(STRFTIME_FMT))
258
305
  when Fixnum, Integer
259
306
  statement.setInt(idx + 1, event[i])
260
307
  when Float
@@ -285,4 +332,9 @@ class LogStash::Outputs::Jdbc < LogStash::Outputs::Base
285
332
  break if current_exception == nil
286
333
  end
287
334
  end
335
+
336
+ def retry_exception?(exception)
337
+ return (exception.class != java.sql.SQLException or
338
+ RETRYABLE_SQLSTATE_CLASSES.include?(e.getSQLState[0,2]))
339
+ end
288
340
  end # class LogStash::Outputs::jdbc
@@ -10,10 +10,7 @@ describe LogStash::Outputs::Jdbc do
10
10
  "driver_class" => "org.apache.derby.jdbc.EmbeddedDriver",
11
11
  "connection_string" => "jdbc:derby:memory:testdb;create=true",
12
12
  "driver_jar_path" => ENV['JDBC_DERBY_JAR'],
13
- # Grumble. Grumble.
14
- # Derby doesn't like 'T' in timestamps as of current writing, so for now
15
- # we'll just use CURRENT_TIMESTAMP as opposed to the event @timestamp
16
- "statement" => [ "insert into log (created_at, message) values(CURRENT_TIMESTAMP, ?)", "message" ]
13
+ "statement" => [ "insert into log (created_at, message) values(?, ?)", "@timestamp" "message" ]
17
14
  }
18
15
  end
19
16
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-jdbc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - the_angry_angel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-02 00:00:00.000000000 Z
11
+ date: 2016-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logstash-core
@@ -80,11 +80,18 @@ executables: []
80
80
  extensions: []
81
81
  extra_rdoc_files: []
82
82
  files:
83
+ - lib/com/zaxxer/HikariCP/2.4.2/HikariCP-2.4.2.jar
84
+ - lib/log4j/log4j/1.2.17/log4j-1.2.17.jar
83
85
  - lib/logstash/outputs/jdbc.rb
84
86
  - lib/logstash-output-jdbc_jars.rb
85
87
  - lib/logstash-output-jdbc_ring-buffer.rb
88
+ - lib/org/slf4j/slf4j-api/1.7.12/slf4j-api-1.7.12.jar
89
+ - lib/org/slf4j/slf4j-log4j12/1.7.13/slf4j-log4j12-1.7.13.jar
86
90
  - vendor/jar-dependencies/runtime-jars/HikariCP-2.4.2.jar
91
+ - vendor/jar-dependencies/runtime-jars/log4j-1.2.17.jar
92
+ - vendor/jar-dependencies/runtime-jars/slf4j-api-1.7.12.jar
87
93
  - vendor/jar-dependencies/runtime-jars/slf4j-api-1.7.13.jar
94
+ - vendor/jar-dependencies/runtime-jars/slf4j-log4j12-1.7.13.jar
88
95
  - vendor/jar-dependencies/runtime-jars/slf4j-nop-1.7.13.jar
89
96
  - spec/outputs/jdbc_spec.rb
90
97
  - LICENSE.txt